Python और Excel का संगम: नेटवर्क मॉनिटरिंग टूल का विकास और कार्यान्वयन

Excel में Python: कार्यक्षमता का नया युग

काम करते समय Excel का उपयोग करते हुए अक्सर एक विचार आता है – “क्या Python से यह काम और तेज़ी से हो सकता है?” लेकिन हर बार Excel से डेटा निकालकर CSV फाइल बनाना और फिर Python से प्रोसेस करना भी झंझट भरा काम है।

मैं भी इस “Excel और Python की दुविधा” से परेशान था। डेटा एनालिसिस के क्षेत्र में हर कोई चाहता है कि Excel और Python के फायदों को एक साथ मिलाया जा सके।

इसलिए यह खुशखबरी है कि 16 सितंबर 2024 को माइक्रोसॉफ्ट ने आधिकारिक तौर पर “Python in Excel” फीचर लॉन्च किया। वास्तव में, यह फीचर अगस्त 2023 से कुछ उपयोगकर्ताओं के लिए पब्लिक प्रीव्यू के रूप में उपलब्ध था।

अपेक्षा से अधिक उपयोगी नई सुविधा

शुरू में मुझे लगा कि “शायद यह भी कोई सामान्य अपडेट होगा”, लेकिन जब मैंने इसका उपयोग किया तो मैं वास्तव में प्रभावित हुआ।

विशेष रूप से मुझे पसंद आया कि Anaconda पहले से ही इसमें एकीकृत है। Python उपयोगकर्ताओं के लिए यह बहुत सुविधाजनक है क्योंकि जब आप किसी लाइब्रेरी का उपयोग करना चाहते हैं, तो आपको अलग से इंस्टॉल करने की आवश्यकता नहीं है। डेटा विज़ुअलाइज़ेशन और मॉडलिंग के लिए, आप सीधे Excel सेल में Python कोड लिख सकते हैं।

शुरुआत में कुछ चुनौतियां

हालांकि, इस सुविधा का उपयोग करने के लिए कुछ आवश्यकताएं हैं। इस फीचर का उपयोग करने के लिए आपको Microsoft 365 सब्सक्रिप्शन की आवश्यकता होगी और साथ ही Insider प्रोग्राम में भी शामिल होना पड़ेगा। थोड़ा निराशाजनक है कि Office 2019 या 2021 जैसे एकमुश्त खरीदे गए वर्ज़न में यह सुविधा उपलब्ध नहीं है।

📌 महत्वपूर्ण जानकारी: Microsoft 365 सब्सक्रिप्शन की वर्तमान कीमत व्यक्तिगत उपयोगकर्ताओं के लिए लगभग 6,199 रुपये प्रति वर्ष से शुरू होती है, जबकि व्यावसायिक उपयोगकर्ताओं के लिए विभिन्न प्लान उपलब्ध हैं।

मेरा ईमानदार अनुभव

हाल ही में, मैं अक्सर सोचता था “काश मैंने Python को अच्छे से सीखा होता…”। लेकिन इस नए फीचर की वजह से, Excel उपयोगकर्ताओं के लिए Python की दुनिया में प्रवेश करना अब बहुत आसान हो गया है।

वास्तव में, मैं इस अवसर का लाभ उठाकर Python को गहराई से सीखने का निर्णय ले रहा हूं। क्योंकि आने वाले व्यावसायिक परिदृश्य में, वे लोग जो Excel और Python दोनों में कुशल हैं, निश्चित रूप से अधिक मूल्यवान साबित होंगे।

Python in Excel के व्यावहारिक उपयोग

Excel और Python का यह संयोजन कई तरह से फायदेमंद हो सकता है:

  1. डेटा विश्लेषण: बड़े डेटासेट पर सांख्यिकीय विश्लेषण करें जो सिर्फ Excel से मुश्किल होगा
  2. मशीन लर्निंग: Excel डेटा पर सीधे प्रेडिक्टिव मॉडल बनाएं
  3. उन्नत चार्ट और ग्राफ: Python के matplotlib या seaborn जैसे लाइब्रेरी से अधिक आकर्षक विज़ुअलाइज़ेशन
  4. API इंटीग्रेशन: Excel से सीधे वेब सेवाओं से डेटा प्राप्त करें

यह सुविधा अभी भी विकसित हो रही है, लेकिन मुझे उम्मीद है कि आने वाले अपडेट इसे और भी उपयोगी बनाएंगे। क्या आप भी इस सुविधा का उपयोग करके Excel और Python की नई संभावनाओं का पता लगाने के लिए उत्सुक हैं?

विषयसूची

Python से Excel नियंत्रण: नेटवर्क मॉनिटरिंग टूल विकसित करते समय की अंतर्दृष्टि

वास्तव में, मैं Microsoft 365 का सब्सक्रिप्शन 5 साल से अधिक समय से ले रहा हूँ, लेकिन मैंने कभी Python in Excel का उपयोग नहीं किया। मैं हमेशा की तरह, VSCode में Python स्क्रिप्ट लिखकर Excel को नियंत्रित करने का तरीका पसंद करता हूँ। इस बार भी, मैंने नेटवर्क की स्थिति को रीयल-टाइम में Excel में प्रदर्शित करने और विज़ुअलाइज़ करने के लिए एक स्क्रिप्ट बनाने का फैसला किया।

विकास के दौरान “रहस्यमय खाली Excel” समस्या का सामना

प्रोग्राम चलाते समय, मैंने देखा कि एक पल के लिए एक खाली Excel विंडो दिखाई देती है। शुरू में मुझे लगा कि यह कोई बग हो सकता है, लेकिन जांच करने पर पता चला कि इसके पीछे एक तकनीकी कारण था।

क्यों दो Excel विंडो आवश्यक हैं?

इस प्रोग्राम में, मुख्य रूप से दो प्रकार की प्रक्रियाएं होती हैं:

  1. सेटिंग्स लोड करना और टेम्प्लेट बनाना
  2. नेटवर्क स्थिति का रीयल-टाइम अपडेट

यदि आप इन दोनों प्रक्रियाओं को एक ही Excel विंडो में करने का प्रयास करते हैं, तो काफी जटिल समस्याएं उत्पन्न हो सकती हैं। Excel के COM (Component Object Model) की विशेषताओं के कारण, अलग-अलग थ्रेड्स से एक ही Excel विंडो को नियंत्रित करने का प्रयास करने पर अप्रत्याशित त्रुटियां हो सकती हैं।

समस्या का समाधान

सैद्धांतिक रूप से, एक ही विंडो में सभी प्रक्रियाओं को करना संभव है, लेकिन ऐसा करने पर:

  • COM मार्शलिंग त्रुटियों का जोखिम
  • थ्रेड सुरक्षा की समस्याएं
  • कार्यान्वयन की जटिलता

इसलिए मैंने निम्नलिखित दृष्टिकोण अपनाया:

  1. सेटिंग्स लोड करने के लिए एक अस्थायी Excel विंडो खोलना
  2. आवश्यक सेटिंग्स लोड होने के बाद तुरंत इसे बंद करना
  3. मुख्य प्रक्रिया को रीयल-टाइम अपडेट वाली विंडो में करना

इसका परिणाम यह है कि उपयोगकर्ता वास्तव में केवल मुख्य विंडो ही देखता है। प्रारंभ में एक पल के लिए दिखाई देने वाली खाली विंडो प्रोग्राम की स्थिरता सुनिश्चित करने के लिए एक “आवश्यक समझौता” है।

🔍 तकनीकी विवरण: COM इंटरफेस के माध्यम से Excel को नियंत्रित करते समय, अलग-अलग थ्रेड्स से एक ही COM ऑब्जेक्ट का उपयोग करना समस्याग्रस्त हो सकता है। इसलिए अलग-अलग कार्यों के लिए अलग-अलग COM ऑब्जेक्ट (Excel इंस्टेंस) का उपयोग करना एक सुरक्षित दृष्टिकोण है।

Excel और Python से बनाया नेटवर्क मॉनिटरिंग टूल

जैसा कि मैंने पहले बताया, यह टूल Python स्क्रिप्ट का उपयोग करके Excel में नेटवर्क की स्थिति को विज़ुअलाइज़ करता है। कोड को देखने से पहले, मैं इस टूल की मुख्य विशेषताओं के बारे में संक्षेप में बताना चाहूंगा।

टूल की प्रमुख विशेषताएं

  • नेटवर्क की स्थिति का रीयल-टाइम मॉनिटरिंग
  • परिणामों को Excel शीट में स्पष्ट रूप से प्रदर्शित करना
  • किसी भी असामान्यता के मामले में स्वचालित रंग-कोडिंग
  • इतिहास डेटा का संग्रहण और संदर्भ

Excel का उपयोग क्यों करें?

“आखिर क्यों Excel का उपयोग करें?” यह प्रश्न आपके मन में आ सकता है। इसके मुख्य कारण हैं:

  1. उच्च डेटा दृश्यता: तालिका प्रारूप में आसानी से देखा जा सकता है, और रंग-कोडिंग सहज ज्ञान युक्त है
  2. डेटा का आसान पुन: उपयोग: Excel प्रारूप अन्य विश्लेषणों के लिए भी उपयोगी है
  3. गैर-इंजीनियरों के लिए उपयोग में आसान: परिचित Excel इंटरफेस का उपयोग

आवश्यक पर्यावरण और सेटअप

आवश्यक सामग्रीविवरण
Python 3.8 या उससे ऊपरआधुनिक Python संस्करण बेहतर प्रदर्शन देते हैं
pip (Python पैकेज मैनेजर)आवश्यक लाइब्रेरी इंस्टॉल करने के लिए
Microsoft Excel (2019 या उससे नया)पुराने संस्करणों में कुछ विशेषताएं काम नहीं कर सकती हैं
व्यवस्थापक अधिकार (Windows के मामले में)कुछ नेटवर्क संचालन के लिए आवश्यक

पैकेज इंस्टॉलेशन

pip install pywin32  # Windows वातावरण में Excel स्वचालित संचालन के लिए 'pythoncom' आदि शामिल हैं
pip install xlwings   # Excel के साथ इंटरैक्शन के लिए उपयोग किया जाता है

अन्य मॉड्यूल (socket, platform, subprocess, os, sys, time, threading, datetime, ipaddress, re, concurrent.futures) Python के मानक लाइब्रेरी में शामिल हैं, इसलिए आमतौर पर अतिरिक्त इंस्टॉलेशन की आवश्यकता नहीं है।

निष्पादन विधि

  1. कमांड प्रॉम्प्ट को व्यवस्थापक अधिकारों के साथ खोलें
  2. स्क्रिप्ट वाले निर्देशिका में जाएं
  3. निम्न कमांड से निष्पादित करें:
python excellan.py

यदि आप स्क्रिप्ट को excellan.py के रूप में सहेजते हैं, तो उपरोक्त कमांड दर्ज करें।

सामान्य त्रुटियां और समाधान

  • “COM ऑब्जेक्ट प्रारंभ करने में विफल” → सुनिश्चित करें कि Excel चालू नहीं है
  • “अनुमति त्रुटि” → जांचें कि क्या आप व्यवस्थापक अधिकारों के साथ चला रहे हैं
  • “मॉड्यूल नहीं मिला” → जांचें कि आवश्यक पैकेज सही ढंग से इंस्टॉल किए गए हैं

बोनस टिप्स: नेटवर्क मॉनिटरिंग में Excel का उपयोग करते समय विचार करने योग्य बातें

  • डेटा रिफ्रेश रेट: बहुत अधिक बार रिफ्रेश करने से Excel धीमा हो सकता है, 30-60 सेकंड का अंतराल आदर्श है
  • रंग-कोडिंग: विभिन्न स्थितियों के लिए स्पष्ट रंग योजना का उपयोग करें, लेकिन रंग अंधापन के लिए वैकल्पिक संकेतक भी प्रदान करें
  • मेमोरी प्रबंधन: लंबे समय तक चलने वाले मॉनिटरिंग के लिए पुराने डेटा को अलग शीट में भेजना या आर्काइव करना सुनिश्चित करें
  • नेटवर्क आईपी रेंज: मॉनिटर करने के लिए प्रासंगिक आईपी रेंज को पहले से कॉन्फ़िगर करें ताकि आवश्यक डिवाइस न छूटें

कोड का कार्यान्वयन

निम्नलिखित वास्तविक कोड है। मैंने विस्तृत टिप्पणियां लिखी हैं, ताकि Python से परिचित न होने वाले लोग भी इसे समझ सकें।

मुख्य फ़ंक्शन और क्लास

import socket
import platform
import subprocess
import os
import sys
import time
import threading
from datetime import datetime
import xlwings as xw
import ipaddress
import re
from concurrent.futures import ThreadPoolExecutor, as_completed

def get_shared_folders(ip_address: str) -> str:
    """
    Retrieve a list of shared folders for the specified IP address.
    For Windows, use the 'net view' command.
    """
    if platform.system().lower() == "windows":
        cmd = f'net view \\\\{ip_address}'
        try:
            output = subprocess.check_output(cmd, shell=True, universal_newlines=True, stderr=subprocess.DEVNULL)
            shares = re.findall(r'\\\\\S+\s+(\S+)', output)
            return ", ".join(shares) if shares else ""
        except subprocess.CalledProcessError:
            return ""
        except Exception:
            return ""
    else:
        return ""

class ImprovedNetworkMonitor:
    def __init__(self, excel_file='improved_lan_monitor.xlsx'):
        self.excel_file = excel_file
        self.should_run = False
        self.monitor_thread = None
        self.refresh_interval = 30  # Regular refresh interval (seconds)
        self.full_scan_interval = 600  # Full scan interval (seconds)
        self.known_devices = {}       # Dictionary of known devices keyed by IP address
        self.active_ips = set()       # Set of active IPs
        self.priority_ips = set()     # IPs to scan with priority
        self.check_shared_folders = False  # Whether to detect shared folders (toggle in settings)
        self.thread_app = None      # Excel app for background thread
        self.monitor_wb = None      # Workbook kept open continuously
        self.close_excel_on_stop = True  # Close Excel on exit (True on exit, False on stop)

        # If the Excel file does not exist, create a template; otherwise, load settings.
        if not os.path.exists(self.excel_file):
            self.create_excel_template()
        else:
            self.load_settings()
    
    def create_excel_template(self):
        """Create an Excel template for monitoring (performed in the main thread)"""
        try:
            app = xw.App(visible=False)
            wb = app.books.add()
            try:
                main_sheet = wb.sheets['Network Monitor']
            except Exception:
                main_sheet = wb.sheets.add(name='Network Monitor')
            try:
                status_sheet = wb.sheets['Status History']
            except Exception:
                status_sheet = wb.sheets.add(name='Status History')
            try:
                config_sheet = wb.sheets['Settings']
            except Exception:
                config_sheet = wb.sheets.add(name='Settings')
            
            main_sheet.range('A1').value = [
                'IP', 'Hostname', 'Device Type', 'Status', 'Response Time (ms)', 'Last Seen', 'Detection Count', 'Shared Folders'
            ]
            main_sheet.range('A1:H1').api.Font.Bold = True
            main_sheet.range('A1:H1').color = (200, 200, 250)
            
            status_sheet.range('A1').value = ['Timestamp', 'Online Devices', 'Offline Devices', 'Network Status', 'Scan Mode']
            status_sheet.range('A1:E1').api.Font.Bold = True
            status_sheet.range('A1:E1').color = (200, 200, 250)
            
            network_info = self.get_network_info()
            config_sheet.range('A1').value = 'Regular Refresh Interval (seconds)'
            config_sheet.range('B1').value = 30
            config_sheet.range('A2').value = 'Full Scan Interval (seconds)'
            config_sheet.range('B2').value = 600
            config_sheet.range('A3').value = 'Network Range'
            config_sheet.range('B3').value = network_info['network_range']
            config_sheet.range('A4').value = 'DHCP Range Start'
            config_sheet.range('B4').value = 100
            config_sheet.range('A5').value = 'DHCP Range End'
            config_sheet.range('B5').value = 200
            config_sheet.range('A6').value = 'Priority IP Addresses (comma-separated)'
            config_sheet.range('B6').value = f"{network_info['gateway']},{network_info['local_ip']}"
            config_sheet.range('A7').value = 'Detailed Display'
            config_sheet.range('B7').value = False
            config_sheet.range('A8').value = 'Shared Folder Detection'
            config_sheet.range('B8').value = False
            config_sheet.range('C8').value = 'Note: Set to True to retrieve shared folder information'
            
            config_sheet.range('C1').value = 'Note: Too short intervals increase load (minimum 10 seconds)'
            config_sheet.range('C2').value = 'Note: Interval for detecting all devices on the network'
            config_sheet.range('C4').value = "Note: Router's DHCP configuration range"
            config_sheet.range('C6').value = 'Note: IP addresses to always scan'
            config_sheet.range('C7').value = 'Note: If True, display debug information in Excel'
            
            main_sheet.autofit()
            status_sheet.autofit()
            config_sheet.autofit()
            
            for sheet in wb.sheets:
                if sheet.name not in ['Network Monitor', 'Status History', 'Settings']:
                    sheet.delete()
            
            wb.save(self.excel_file)
            wb.close()
            app.quit()
            print(f"Template created: {self.excel_file}")
            self.load_settings()
        except Exception as e:
            print(f"Template creation error: {e}")
    
    def load_settings(self):
        """Load settings from the Excel file (performed in the main thread)"""
        try:
            app = xw.App(visible=False)
            wb = app.books.open(self.excel_file)
            config_sheet = wb.sheets['Settings']
            try:
                interval = config_sheet.range('B1').value
                if isinstance(interval, (int, float)) and interval >= 10:
                    self.refresh_interval = int(interval)
            except:
                pass
            try:
                full_interval = config_sheet.range('B2').value
                if isinstance(full_interval, (int, float)) and full_interval >= 60:
                    self.full_scan_interval = int(full_interval)
            except:
                pass
            try:
                priority_ips_str = config_sheet.range('B6').value
                if priority_ips_str and isinstance(priority_ips_str, str):
                    for ip in priority_ips_str.split(','):
                        ip = ip.strip()
                        if self.is_valid_ip(ip):
                            self.priority_ips.add(ip)
            except:
                pass
            network_info = self.get_network_info()
            self.priority_ips.add(network_info['local_ip'])
            if network_info['gateway'] != "Unknown":
                self.priority_ips.add(network_info['gateway'])
            try:
                shared_option = config_sheet.range('B8').value
                self.check_shared_folders = bool(shared_option)
            except:
                pass
            wb.close()
            app.quit()
        except Exception as e:
            print(f"Error reading settings: {e}")
    
    def is_valid_ip(self, ip):
        pattern = re.compile(r'^(\d{1,3}\.){3}\d{1,3}$')
        if not pattern.match(ip):
            return False
        return all(0 <= int(octet) <= 255 for octet in ip.split('.'))
    
    def get_network_info(self):
        # Get local hostname from environment variables (e.g., n4060)
        hostname = os.environ.get("COMPUTERNAME", socket.gethostname())
        try:
            local_ip = socket.gethostbyname(hostname)
        except:
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            try:
                s.connect(('8.8.8.8', 1))
                local_ip = s.getsockname()[0]
            except:
                local_ip = '127.0.0.1'
            finally:
                s.close()
        gateway = "Unknown"
        try:
            if platform.system() == "Windows":
                output = subprocess.check_output("ipconfig", universal_newlines=True)
                for line in output.split('\n'):
                    if "Default Gateway" in line or "デフォルト ゲートウェイ" in line:
                        gw = line.split(":")[-1].strip()
                        if gw:
                            gateway = gw
                            break
            else:
                try:
                    output = subprocess.check_output("ip route | grep default", shell=True, universal_newlines=True)
                    gateway = output.split()[2]
                except:
                    output = subprocess.check_output("netstat -nr | grep default", shell=True, universal_newlines=True)
                    gateway = output.split()[1]
        except:
            pass
        ip_parts = local_ip.split('.')
        network_prefix = '.'.join(ip_parts[:3]) + '.'
        network_range = f"{network_prefix}0/24"
        return {
            "hostname": hostname,
            "local_ip": local_ip,
            "gateway": gateway,
            "network_range": network_range,
            "network_prefix": network_prefix,
            "scan_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
    
    def ping_device(self, ip_address, count=1):
        try:
            if platform.system().lower() == "windows":
                ping_cmd = f"ping -n {count} -w 500 {ip_address}"
            else:
                ping_cmd = f"ping -c {count} -W 0.5 {ip_address}"
            start_time = time.time()
            result = subprocess.run(ping_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True)
            response_time_ms = round((time.time() - start_time) * 1000)
            if result.returncode == 0:
                return {"status": "Online", "response_time_ms": response_time_ms}
            else:
                return {"status": "Offline", "response_time_ms": None}
        except Exception as e:
            print(f"Ping error ({ip_address}): {e}")
            return {"status": "Error", "response_time_ms": None}
    
    def get_hostname(self, ip_address):
        try:
            socket.setdefaulttimeout(1)
            hostname = socket.getfqdn(ip_address)
            if hostname == ip_address:
                return "Unknown"
            return hostname
        except:
            return "Unknown"
    
    def get_device_type(self, ip_address, network_info):
        if ip_address == network_info["local_ip"]:
            return "This PC"
        elif ip_address == network_info["gateway"]:
            return "Gateway"
        if ip_address in self.known_devices:
            hostname = self.known_devices[ip_address].get("hostname_base", "").lower()
            if "printer" in hostname or "print" in hostname:
                return "Printer"
            elif "phone" in hostname or "mobile" in hostname or "android" in hostname or "iphone" in hostname:
                return "Mobile"
            elif "tv" in hostname or "television" in hostname or "smart-tv" in hostname:
                return "TV/Media"
        return "Other"
    
    def get_scan_targets(self, network_info, mode="regular"):
        targets = set()
        network_prefix = network_info["network_prefix"]
        if mode == "full":
            try:
                network = ipaddress.IPv4Network(network_info["network_range"])
                for ip in network.hosts():
                    targets.add(str(ip))
            except Exception as e:
                print(f"IP network analysis error: {e}")
                for i in range(1, 255):
                    targets.add(f"{network_prefix}{i}")
        elif mode == "dhcp":
            try:
                config_sheet = self.monitor_wb.sheets['Settings']
                start_range = int(config_sheet.range('B4').value or 100)
                end_range = int(config_sheet.range('B5').value or 200)
                if start_range < 1:
                    start_range = 1
                if end_range > 254:
                    end_range = 254
                for i in range(start_range, end_range + 1):
                    targets.add(f"{network_prefix}{i}")
            except Exception as e:
                for i in range(100, 201):
                    targets.add(f"{network_prefix}{i}")
        else:  # regular
            targets.update(self.active_ips)
            targets.update(self.priority_ips)
        targets.update(self.priority_ips)
        return list(targets)
    
    def scan_network(self, mode="regular"):
        network_info = self.get_network_info()
        targets = self.get_scan_targets(network_info, mode)
        print(f"Scanning network: {mode} mode ({len(targets)} IPs)...")
        devices = []
        new_active_ips = set()
        results = {}
        # Execute ping in parallel using a thread pool
        with ThreadPoolExecutor(max_workers=min(50, len(targets))) as executor:
            future_to_ip = {executor.submit(self.ping_device, ip): ip for ip in targets}
            for future in as_completed(future_to_ip):
                ip = future_to_ip[future]
                try:
                    results[ip] = future.result()
                except Exception as e:
                    results[ip] = {"status": "Error", "response_time_ms": None}
        # Update device information based on results
        for ip in targets:
            ping_result = results.get(ip, {"status": "Error", "response_time_ms": None})
            if ping_result["status"] == "Online":
                new_active_ips.add(ip)
                if ip not in self.known_devices or self.known_devices[ip].get("status") != "Online":
                    hostname_base = self.get_hostname(ip)
                else:
                    hostname_base = self.known_devices[ip].get("hostname_base", "Unknown")
                device_type = self.get_device_type(ip, network_info)
                device = {
                    "ip": ip,
                    "hostname": hostname_base,
                    "hostname_base": hostname_base,
                    "device_type": device_type,
                    "status": ping_result["status"],
                    "response_time_ms": ping_result["response_time_ms"],
                    "last_seen": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                    "detection_count": self.known_devices.get(ip, {}).get("detection_count", 0) + 1
                }
                self.known_devices[ip] = device
                devices.append(device)
            elif ip in self.known_devices:
                offline_device = self.known_devices[ip].copy()
                offline_device["status"] = "Offline"
                offline_device["response_time_ms"] = None
                offline_device["last_seen"] = self.known_devices[ip].get("last_seen", "Unknown")
                devices.append(offline_device)
        self.active_ips = new_active_ips
        return devices
    
    def update_excel(self, devices, scan_mode):
        max_retries = 5
        while max_retries > 0:
            try:
                wb = self.monitor_wb
                app = wb.app
                app.screen_updating = False
                try:
                    sheet = wb.sheets['Network Monitor']
                except Exception:
                    sheet = wb.sheets.add(name='Network Monitor')
                sheet.range("A2:H1000").clear()
                unique_devices = {}
                for device in devices:
                    ip = device.get('ip')
                    if ip not in unique_devices or device.get('detection_count', 0) > unique_devices[ip].get('detection_count', 0):
                        unique_devices[ip] = device
                device_data = []
                for device in unique_devices.values():
                    if self.check_shared_folders and device.get('status') == 'Online':
                        shared_folders = get_shared_folders(device.get('ip'))
                    else:
                        shared_folders = ""
                    device_data.append([
                        device.get('ip', 'Unknown'),
                        device.get('hostname', 'Unknown'),
                        device.get('device_type', 'Other'),
                        device.get('status', 'Unknown'),
                        device.get('response_time_ms', '-'),
                        device.get('last_seen', datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
                        device.get('detection_count', 1),
                        shared_folders
                    ])
                if device_data:
                    device_data.sort(key=lambda x: [int(octet) for octet in x[0].split('.')])
                    sheet.range('A2').value = device_data
                    for i, row_data in enumerate(device_data, start=2):
                        status = row_data[3]
                        if status == 'Online':
                            sheet.range(f'D{i}').color = (198, 239, 206)
                        else:
                            sheet.range(f'D{i}').color = (255, 199, 206)
                        device_type = row_data[2]
                        if device_type == 'Gateway':
                            sheet.range(f'C{i}').color = (255, 230, 153)
                        elif device_type == 'This PC':
                            sheet.range(f'C{i}').color = (197, 217, 241)
                        elif device_type == 'Printer':
                            sheet.range(f'C{i}').color = (216, 191, 216)
                        elif device_type == 'Mobile':
                            sheet.range(f'C{i}').color = (255, 204, 153)
                try:
                    status_sheet = wb.sheets['Status History']
                except Exception:
                    try:
                        status_sheet = wb.sheets.add(name='Status History')
                        status_sheet.range('A1').value = ['Timestamp', 'Online Devices', 'Offline Devices', 'Network Status', 'Scan Mode']
                        status_sheet.range('A1:E1').api.Font.Bold = True
                        status_sheet.range('A1:E1').color = (200, 200, 250)
                    except:
                        status_sheet = None
                if status_sheet:
                    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                    online_count = sum(1 for d in unique_devices.values() if d['status'] == 'Online')
                    offline_count = sum(1 for d in unique_devices.values() if d['status'] == 'Offline')
                    if online_count == 0:
                        network_status = "No network connection"
                    elif online_count < 2:
                        network_status = "Issues - Too few devices found"
                    else:
                        network_status = "Normal"
                    last_status_row = status_sheet.range('A' + str(status_sheet.cells.last_cell.row)).end('up').row
                    status_sheet.range(f'A{last_status_row+1}').value = [timestamp, online_count, offline_count, network_status, scan_mode]
                    if last_status_row > 30:
                        status_sheet.range(f'A2:E{last_status_row-29}').delete()
                try:
                    config_sheet = wb.sheets['Settings']
                    show_details = bool(config_sheet.range('B7').value)
                except:
                    show_details = False
                current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                try:
                    info_text = f"Last update: {current_time} ({scan_mode} scan)"
                    if show_details:
                        info_text += f" | Active IPs: {len(self.active_ips)} | Priority IPs: {len(self.priority_ips)}"
                    sheet.range('A1').offset(-1, 0).value = info_text
                except:
                    pass
                wb.save()
                app.screen_updating = True
                print(f"Excel updated: {current_time} ({scan_mode} mode)")
                return True
            except Exception as e:
                if "0x800ac472" in str(e):
                    print("Excel is busy. Retrying.")
                    time.sleep(1)
                    max_retries -= 1
                    continue
                else:
                    print(f"Excel update error: {e}")
                    return False
        print("Failed to update Excel after retrying.")
        return False
    
    def monitor_loop(self):
        import pythoncom
        pythoncom.CoInitialize()
        self.thread_app = xw.App(visible=True)
        try:
            self.monitor_wb = self.thread_app.books.open(self.excel_file)
            last_scan_time = 0
            last_full_scan_time = 0
            while self.should_run:
                try:
                    current_time = time.time()
                    scan_mode = "regular"
                    if current_time - last_full_scan_time >= self.full_scan_interval:
                        scan_mode = "full"
                        last_full_scan_time = current_time
                    elif len(self.active_ips) < 3 and current_time - last_full_scan_time >= 60:
                        scan_mode = "dhcp"
                    if (current_time - last_scan_time >= self.refresh_interval) or scan_mode != "regular":
                        try:
                            devices = self.scan_network(mode=scan_mode)
                            if devices:
                                self.update_excel(devices, scan_mode)
                            last_scan_time = current_time
                        except Exception as e:
                            print(f"Monitoring cycle error: {e}")
                    time.sleep(5)
                except Exception as e:
                    print(f"Monitoring loop error: {e}")
                    time.sleep(10)
        finally:
            if self.close_excel_on_stop:
                if self.monitor_wb:
                    self.monitor_wb.save()
                    self.monitor_wb.close()
                    self.monitor_wb = None
                self.thread_app.quit()
                self.thread_app = None
            else:
                if self.monitor_wb:
                    self.monitor_wb.save()
            pythoncom.CoUninitialize()
    
    def start_monitoring(self):
        if self.monitor_thread and self.monitor_thread.is_alive():
            print("Monitoring is already running")
            return False
        self.load_settings()
        self.close_excel_on_stop = True
        self.should_run = True
        self.monitor_thread = threading.Thread(target=self.monitor_loop)
        self.monitor_thread.start()
        print("Network monitoring started")
        return True
    
    def stop_monitoring(self, close_excel=False):
        self.close_excel_on_stop = close_excel
        self.should_run = False
        if self.monitor_thread:
            try:
                self.monitor_thread.join(timeout=5)
            except:
                pass
        print("Network monitoring stopped")
        return True

def main():
    run_now = False
    excel_file = 'improved_lan_monitor.xlsx'
    if len(sys.argv) > 1:
        for arg in sys.argv[1:]:
            if arg == '--run':
                run_now = True
            elif arg.startswith('--excel='):
                excel_file = arg.split('=')[1]
    monitor = ImprovedNetworkMonitor(excel_file=excel_file)
    if run_now:
        monitor.start_monitoring()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            print("Exiting...")
            monitor.stop_monitoring(close_excel=True)
            sys.exit(0)
    else:
        print(f"Improved LAN Monitoring Tool v1.0")
        print(f"Excel file: {monitor.excel_file}")
        print("Commands: start - start monitoring, stop - stop monitoring (Excel remains open), exit - exit (closes Excel)")
        while True:
            try:
                cmd = input("> ").strip().lower()
                if cmd == "start":
                    monitor.start_monitoring()
                elif cmd == "stop":
                    monitor.stop_monitoring(close_excel=False)
                elif cmd == "exit":
                    if monitor.should_run:
                        monitor.stop_monitoring(close_excel=True)
                    sys.exit(0)
                else:
                    print("Unknown command. Please enter one of start, stop, exit.")
            except EOFError:
                break
            except KeyboardInterrupt:
                print("\nExiting...")
                if monitor.should_run:
                    monitor.stop_monitoring(close_excel=True)
                sys.exit(0)

if __name__ == "__main__":
    main()

साझा फ़ोल्डर प्राप्त करने के लिए फ़ंक्शन

def get_shared_folders(ip_address: str) -> str:
    # यहां get_shared_folders फ़ंक्शन का कोड शामिल करें

यह फ़ंक्शन किसी विशिष्ट IP पते पर साझा फ़ोल्डर की सूची प्राप्त करता है। Windows में, यह ‘net view’ कमांड का उपयोग करता है और नेटवर्क पर उपलब्ध साझा संसाधनों को प्रदर्शित करता है।

मुख्य क्लास: ImprovedNetworkMonitor

class ImprovedNetworkMonitor:
    # यहां ImprovedNetworkMonitor क्लास का कोड शामिल करें

कोड की मुख्य विशेषताएं

1. टेम्प्लेट निर्माण और सेटिंग्स लोडिंग

वास्तविक मॉनिटरिंग शुरू करने से पहले, कोड निम्न कार्य करता है:

  • यदि Excel फ़ाइल मौजूद नहीं है, तो एक नया टेम्प्लेट बनाता है
  • मौजूदा फ़ाइल से सेटिंग्स लोड करता है
  • वर्कशीट और सेल स्वरूपण को सेट करता है

2. नेटवर्क डिवाइस स्कैनिंग

मॉनिटरिंग प्रक्रिया में तीन प्रकार के स्कैन शामिल हैं:

  • नियमित स्कैन: केवल ज्ञात सक्रिय डिवाइस
  • DHCP स्कैन: DHCP रेंज में सभी संभावित IP पते
  • पूर्ण स्कैन: नेटवर्क में सभी संभावित IP पते (1-254)

3. समानांतर प्रसंस्करण

बड़े नेटवर्क पर कुशल स्कैनिंग के लिए, कोड ThreadPoolExecutor का उपयोग करता है:

with ThreadPoolExecutor(max_workers=min(50, len(targets))) as executor:
    future_to_ip = {executor.submit(self.ping_device, ip): ip for ip in targets}
    # अन्य कोड यहां...

यह तकनीक एक ही समय में कई IP पतों को स्कैन करके प्रदर्शन को महत्वपूर्ण रूप से बढ़ाती है।

4. Excel में अपडेट

स्कैन के परिणामों को Excel में सुंदर ढंग से प्रदर्शित किया जाता है:

  • स्थिति के अनुसार पंक्तियों का रंग-कोडिंग
  • डिवाइस प्रकार के अनुसार वर्गीकरण
  • इतिहास शीट में परिवर्तनों का ट्रैकिंग

कोड समझने की मुख्य बातें

यहां कुछ महत्वपूर्ण कोडिंग तकनीकें हैं जो इस प्रोजेक्ट में उपयोग की गई हैं:

तकनीकउद्देश्यफायदे
थ्रेडिंगसमानांतर नेटवर्क स्कैनिंगबहुत तेज़ स्कैन समय, बेहतर प्रदर्शन
त्रुटि हैंडलिंगअप्रत्याशित स्थितियों को संभालनाप्रोग्राम का स्थिर संचालन
COM ऑब्जेक्ट प्रबंधनExcel के साथ सुरक्षित इंटरैक्शनमेमोरी लीक से बचना, बेहतर स्थिरता
अनुकूली स्कैनिंगपरिस्थितियों के अनुसार स्कैन रणनीति को समायोजित करनासंसाधन उपयोग और निगरानी प्रभावशीलता का संतुलन

उन्नत तकनीकी व्याख्या

कोड का सबसे महत्वपूर्ण पहलू इसकी COM ऑब्जेक्ट प्रबंधन रणनीति है। COM (Component Object Model) Microsoft की एक तकनीक है जो अलग-अलग प्रोग्रामिंग भाषाओं के बीच संचार की अनुमति देती है, इस मामले में Python और Excel के बीच।

Excel का COM इंटरफेस थ्रेड-सेफ नहीं है, जिसका अर्थ है कि एक ही COM ऑब्जेक्ट को एक से अधिक थ्रेड से एक्सेस करना खतरनाक हो सकता है। इस समस्या से बचने के लिए, कोड में निम्न रणनीतियां अपनाई गई हैं:

  1. अलग-अलग थ्रेड के लिए अलग-अलग Excel अनुप्रयोग: मुख्य मॉनिटरिंग थ्रेड के लिए एक समर्पित Excel अनुप्रयोग इंस्टेंस
  2. भूल-सुधार प्रणाली: Excel के व्यस्त होने पर पुनः प्रयास करना
  3. सावधानीपूर्वक साधन मुक्ति: मेमोरी लीक से बचने के लिए COM ऑब्जेक्ट्स को सही ढंग से बंद करना

कोड की व्याख्या

इस कोड के मुख्य बिंदु निम्नलिखित हैं:

1. COM ऑब्जेक्ट्स का प्रबंधन

  • दो Excel इंस्टेंस का उचित प्रबंधन
  • थ्रेड-सेफ कार्यान्वयन पर ध्यान केंद्रित
  • मेमोरी लीक को रोकने के लिए संसाधनों का सही विमोचन

💡 क्या आप जानते हैं? COM (Component Object Model) माइक्रोसॉफ्ट की एक प्रौद्योगिकी है जो विभिन्न प्रोग्रामिंग भाषाओं और अनुप्रयोगों के बीच इंटरऑपरेबिलिटी प्रदान करती है। Python से Excel तक पहुंचने के लिए आप इसी तकनीक का उपयोग करते हैं।

2. डेटा अपडेट प्रक्रिया

  • असिंक्रोनस प्रोसेसिंग से प्रदर्शन सुनिश्चित करना
  • त्रुटि होने पर उचित हैंडलिंग
  • दृश्य प्रतिक्रिया प्रदान करने के लिए अपडेट के दौरान स्क्रीन अपडेटिंग का प्रबंधन

3. उपयोगकर्ता इंटरफेस

  • सहज रंग-कोडिंग प्रदर्शन
  • स्थिति परिवर्तन की दृश्यता पर जोर
  • स्पष्ट डेटा संगठन और अलग-अलग वर्कशीट्स में कार्यक्षमता का विभाजन

4. परीक्षण और संगतता

Excel के साथ काम करते समय, हमने निम्नलिखित संगतता परीक्षण किए:

परीक्षण वातावरणपरिणामटिप्पणियां
Excel 2019✅ पूर्ण रूप से कार्यशीलसभी विशेषताएं उपलब्ध
Excel 2021✅ पूर्ण रूप से कार्यशीलअनुकूलित प्रदर्शन
Excel 365✅ पूर्ण रूप से कार्यशीलसर्वोत्तम प्रदर्शन और संगतता
Excel 2016⚠️ आंशिक रूप से कार्यशीलकुछ उन्नत विशेषताएं अनुपलब्ध
Excel 2013❌ असमर्थितआवश्यक COM इंटरफेस अनुपलब्ध

उपयोग करने के लिए नोट्स

  • Excel 2019 या उसके बाद के संस्करण पर काम करने की पुष्टि की गई है
  • Windows वातावरण के लिए डिज़ाइन किया गया है
  • कुछ मामलों में व्यवस्थापक अधिकार आवश्यक हो सकते हैं

अनुकूलन के अवसर

इस कोड को निम्नलिखित तरीकों से बढ़ाया जा सकता है:

  1. मॉनिटरिंग मापदंडों का विस्तार:
    • अतिरिक्त नेटवर्क मीट्रिक्स जैसे प्रतिक्रिया समय ट्रेंड्स, पैकेट लॉस, और बैंडविड्थ उपयोग
    • डिवाइस विवरण के लिए SNMP इंटीग्रेशन
  2. अलर्ट तंत्र में सुधार:
    • ईमेल या SMS नोटिफिकेशन
    • सीमा-आधारित अलर्ट कस्टमाइज़ेशन
    • अलर्ट इतिहास और प्रवृत्ति विश्लेषण
  3. डेटा भंडारण विकल्पों का विस्तार:
    • SQL डेटाबेस इंटीग्रेशन
    • लॉग रोटेशन और आर्काइविंग
    • डेटा एक्सपोर्ट फॉर्मेट्स (CSV, JSON, आदि)

मूल कार्यान्वयन में इन अतिरिक्त विशेषताओं को शामिल नहीं किया गया है, लेकिन वर्तमान कोड आधार इन विस्तारों के लिए एक मजबूत नींव प्रदान करता है। आवश्यकतानुसार आप इन विशेषताओं को जोड़ सकते हैं।

सावधानियां और विचार

Excel और Python के साथ काम करते समय, इन सावधानियों को ध्यान में रखें:

  • मेमोरी प्रबंधन: लंबे समय तक चलने वाले प्रोग्राम में सभी COM ऑब्जेक्ट्स को ठीक से बंद करना सुनिश्चित करें
  • परफॉरमेंस ट्यूनिंग: बड़े नेटवर्क पर स्कैन फ्रीक्वेंसी को समायोजित करें
  • त्रुटि लॉगिंग: समस्या निवारण के लिए उचित लॉगिंग सुनिश्चित करें

Excel फ़ाइल स्वचालित निर्माण और डिज़ाइन विचार

यह स्क्रिप्ट स्वचालित रूप से Excel फ़ाइल बनाती है। अपने अनुभव से मैंने पाया है कि Excel में पहले से डिज़ाइन बनाना अंतिम लेआउट और फॉर्मेटिंग को स्पष्ट करने के लिए बहुत उपयोगी है। इससे आप देख सकते हैं कि कौन-सा डेटा कहां रखा जाएगा, कौन-सा फॉर्मेट लागू होगा, और किन हिस्सों में समायोजन की आवश्यकता है।

दो दृष्टिकोणों का तुलनात्मक विश्लेषण

दृष्टिकोणफायदेचुनौतियां
Excel में मैन्युअल डिज़ाइन• दृश्य रूप से देख कर डिज़ाइन करना आसान
• विशेष फॉर्मेटिंग और शर्तों का आसान उपयोग
• त्वरित परिवर्तन और परीक्षण
• ऑटोमेशन की कमी
• मैन्युअल अपडेट की आवश्यकता
• स्केलेबिलिटी सीमित
Python स्क्रिप्ट से स्वचालित निर्माण• पूर्ण स्वचालन
• डायनामिक डेटा जनरेशन
• बैच प्रोसेसिंग संभव
• विज़ुअल डिज़ाइनिंग करना मुश्किल
• जटिल फॉर्मेटिंग के लिए अधिक कोड
• डिबगिंग चुनौतीपूर्ण
हाइब्रिड दृष्टिकोण (टेम्प्लेट + स्क्रिप्ट)• पूर्व-डिज़ाइन टेम्प्लेट का उपयोग
• स्वचालित डेटा अपडेट
• दोनों दुनिया का सर्वश्रेष्ठ
• अतिरिक्त सेटअप समय
• टेम्प्लेट रखरखाव
• संभावित संगतता मुद्दे

हमारे मामले में, हाइब्रिड दृष्टिकोण सबसे अच्छा विकल्प है – Excel टेम्प्लेट को पहले से डिज़ाइन करके, और फिर उसमें Python से डेटा भरना। इससे लेआउट और फॉर्मेटिंग का नियंत्रण बरकरार रहता है, जबकि डेटा अपडेट स्वचालित रूप से होता है।

डिज़ाइन की सर्वोत्तम प्रथाएं

नेटवर्क मॉनिटरिंग के लिए Excel शीट डिज़ाइन करते समय इन दिशानिर्देशों का पालन करें:

  1. स्पष्ट विभाजन: अलग-अलग कार्यक्षमता के लिए अलग-अलग शीट्स का उपयोग करें (डेटा, कॉन्फिगरेशन, रिपोर्ट)
  2. रंग कोडिंग: स्थिति को तुरंत पहचानने के लिए सुसंगत रंग योजना का उपयोग करें
  3. फ्रीज पेन: बड़े डेटासेट्स के लिए शीर्ष पंक्तियों को फ्रीज करें
  4. शर्तीय स्वरूपण: महत्वपूर्ण मूल्यों को हाइलाइट करने के लिए शर्तीय स्वरूपण का उपयोग करें
  5. डेटा सत्यापन: गलतियों को कम करने के लिए इनपुट सेल पर डेटा सत्यापन जोड़ें

नेटवर्क मॉनिटरिंग टूल को ब्राउज़र में उपयोग करने का अनुभव

Excel आधारित नेटवर्क मॉनिटरिंग टूल का उपयोग करते समय, मुझे एहसास हुआ कि “अगर मैं इसे किसी अन्य कंप्यूटर से भी देख पाता तो कितना अच्छा होता!” इसलिए मैंने इसे अपग्रेड करके ब्राउज़र-आधारित मॉनिटरिंग टूल बनाने का फैसला किया।

विकास वातावरण को व्यवस्थित करना

पिछला कोड लिखते समय, मैंने महसूस किया कि मेरा कंप्यूटर थोड़ा अव्यवस्थित हो रहा था। Python पैकेज इंस्टॉल करते-करते, मैं अक्सर भूल जाता था कि “यह पैकेज किस प्रोजेक्ट के लिए था?” इसलिए इस बार मैंने वर्चुअल एनवायरनमेंट बनाकर विकास करने का निर्णय लिया।

वर्चुअल एनवायरनमेंट का महत्व

वर्चुअल एनवायरनमेंट का उपयोग करना Python विकास में एक सर्वोत्तम अभ्यास है। यह आपके प्रोजेक्ट को अलग-थलग रखता है और निम्नलिखित लाभ प्रदान करता है:

  • प्रोजेक्ट-विशिष्ट निर्भरताएं
  • संघर्षों से बचाव
  • आसान प्रोजेक्ट पैकेजिंग
  • परिवहनीयता में सुधार

वर्चुअल एनवायरनमेंट बनाना

python -m venv venv

इस सरल कमांड से एक नया वर्चुअल एनवायरनमेंट बन जाता है। एक ‘venv’ नामक फोल्डर आपके प्रोजेक्ट डायरेक्टरी में दिखाई देगा।

इसे सक्रिय करने के लिए:

venv/scripts/activate

यह सक्रिय होने पर, कमांड प्रॉम्प्ट के शुरू में ‘(venv)’ दिखाई देगा।

Streamlit – ब्राउज़र-आधारित टूल के लिए आदर्श विकल्प

ब्राउज़र-आधारित टूल बनाने के लिए, मैंने Streamlit फ्रेमवर्क चुना। आमतौर पर, “ब्राउज़र में देखने योग्य” ऐप बनाने के लिए लोग Django या Flask जैसे वेब फ्रेमवर्क का उपयोग करते हैं, लेकिन मैंने एक अलग दृष्टिकोण अपनाया।

Streamlit को क्यों चुना?

Streamlit डेटा विश्लेषण या मशीन लर्निंग परिणामों को आसानी से वेब पर प्रदर्शित करने के लिए डिज़ाइन किया गया एक फ्रेमवर्क है। इसकी प्रमुख विशेषताएं हैं:

  • केवल Python में लिखा जा सकता है (HTML या JavaScript ज्ञान की आवश्यकता नहीं)
  • डेटा विज़ुअलाइज़ेशन सरल है
  • रीयल-टाइम अपडेट आसान है
  • सेटअप अत्यंत सरल है

संक्षेप में, यह “सिर्फ Python कोड लिखकर जल्दी से वेब ऐप बनाने” का एक आदर्श टूल है। यह मेरे जैसे “आलसी” डेवलपर्स के लिए बिल्कुल सही है!

Streamlit की अंतर्निहित विशेषताएं

Streamlit में पहले से ही कई उपयोगी सुविधाएं शामिल हैं:

  • UI कंपोनेंट्स: बटन, स्लाइडर, टेक्स्ट इनपुट जैसे विजेट्स
  • लेआउट प्रबंधन: स्वचालित रूप से सुव्यवस्थित लेआउट
  • रीयल-टाइम अपडेट: डेटा परिवर्तन पर स्वचालित अपडेट
  • इंटरैक्टिव विजेट्स: उपयोगकर्ता इनपुट के लिए बिल्ट-इन समर्थन

आवश्यक पैकेज इंस्टॉल करना

जब आप VSCode में स्क्रिप्ट खोलते हैं, तो कुछ मॉड्यूल पर पीले रंग की लहरदार रेखाएं दिखाई देती हैं। यह VSCode का एक मित्रवत चेतावनी है, जो कहती है “यह पैकेज नहीं मिला!”

मूल आवश्यकताओं की स्थापना

सबसे पहले, अनुपस्थित पैकेज इंस्टॉल करें:

pip install openpyxl netifaces

openpyxl Excel फ़ाइल्स को पढ़ने और लिखने के लिए एक शक्तिशाली लाइब्रेरी है, जबकि netifaces नेटवर्क इंटरफेस की जानकारी प्राप्त करने में मदद करता है।

ब्राउज़र-आधारित टूल के लिए अतिरिक्त पैकेज

अब, ब्राउज़र-आधारित टूल के लिए आवश्यक पैकेज इंस्टॉल करें:

pip install streamlit pandas streamlit_autorefresh

इन पैकेज का उपयोग निम्न कारणों से किया जाता है:

  • streamlit: इंटरैक्टिव वेब एप्लिकेशन बनाने के लिए मुख्य फ्रेमवर्क
  • pandas: डेटा मैनिपुलेशन और विश्लेषण के लिए
  • streamlit_autorefresh: पेज को स्वचालित रूप से रिफ्रेश करने के लिए विशेष कंपोनेंट

📌 नोट: यदि आपके पास अन्य पैकेज जैसे matplotlib या plotly इंस्टॉल हैं, तो आप डेटा को आकर्षक चार्ट और ग्राफ के रूप में भी प्रदर्शित कर सकते हैं।

निष्पादन वातावरण के बारे में

सामान्य तौर पर, VSCode में विकास करते समय, हम एक ही विंडो में सब कुछ पूरा करते हैं। लेकिन इस मामले में, हमें दो प्रोग्राम एक साथ चलाने की आवश्यकता है।

दो प्रोग्राम एक साथ क्यों?

हमारे मॉनिटरिंग सिस्टम में दो अलग-अलग घटक हैं:

  1. बैकएंड मॉनिटरिंग इंजन: यह नेटवर्क स्कैन करता है और डेटा एकत्र करता है
  2. फ्रंटएंड इंटरफेस: यह एकत्रित डेटा को ब्राउज़र में प्रदर्शित करता है

इन दोनों को एक साथ चलाना आवश्यक है ताकि रीयल-टाइम मॉनिटरिंग संभव हो सके।

समानांतर निष्पादन विकल्प

VSCode में समान फोल्डर की कई विंडो चलाना थोड़ा चुनौतीपूर्ण है। हालांकि वर्कस्पेस या टैब ग्रुप का उपयोग करके ऐसा करना संभव है, लेकिन सरलता के लिए हम दूसरे प्रोग्राम को PowerShell में चलाने का तरीका अपनाएंगे।

विकल्पप्रोसकॉन्स
VSCode टैब ग्रुपएकीकृत वातावरण, आसान स्विचिंगसेटअप जटिल, संसाधन अधिक खपत
अलग-अलग VSCode विंडोबेहतर स्क्रीन स्पेस, स्वतंत्र विजिबिलिटीडिफ़ॉल्ट रूप से एक ही फोल्डर के लिए प्रतिबंधित
VSCode + PowerShell (हमारा विकल्प)सरल, त्वरित, कम सेटअप आवश्यकएकीकृत डिबगिंग अनुपलब्ध
दो टर्मिनल विंडोहल्का, सिस्टम संसाधनों का कम उपयोगकोड एडिटिंग क्षमता सीमित

निष्पादन प्रक्रिया

फ़ाइल तैयारी

सबसे पहले, दो Python फ़ाइलें तैयार करें:

  1. realtime_lan_monitor.py: नेटवर्क मॉनिटरिंग का मुख्य प्रोग्राम
  2. app.py: ब्राउज़र में प्रदर्शित करने के लिए Streamlit ऐप

इन फ़ाइलों को C:\lan फोल्डर में सहेजें (आप अन्य स्थान भी चुन सकते हैं, लेकिन आगे की व्याख्या C:\lan को मानकर है)।

चरण-दर-चरण निष्पादन गाइड

1. मुख्य प्रोग्राम निष्पादित करें (VSCode में)

VSCode के टर्मिनल में निम्न कमांड निष्पादित करें:

python realtime_lan_monitor.py

इससे नेटवर्क की निगरानी शुरू हो जाएगी।

2. ब्राउज़र टूल लॉन्च करें (PowerShell में)

नया PowerShell खोलें और निम्न कमांड क्रमशः निष्पादित करें:

cd\
cd lan
venv/scripts/activate
streamlit run app.py

महत्वपूर्ण नोट: PowerShell नया खोला जाता है, इसलिए वर्चुअल एनवायरनमेंट को फिर से सक्रिय करना आवश्यक है। अगर आप ऐसा नहीं करते हैं, तो “streamlit कमांड नहीं मिला” जैसी त्रुटि दिखाई देगी।

निष्पादन के बाद क्या होगा?

सफल लॉन्च होने पर निम्न होगा:

  • ब्राउज़र स्वचालित रूप से खुलेगा और मॉनिटरिंग स्क्रीन दिखाई देगी
  • lan_monitor.log नामक लॉग फ़ाइल उत्पन्न होगी
  • Excel फ़ाइल भी उत्पन्न होगी, लेकिन यह अस्थायी है

ब्राउज़र स्क्रीन स्वचालित रूप से अपडेट होती है, जिससे आप नेटवर्क की स्थिति को रीयल-टाइम में देख सकते हैं।

समस्या निवारण

सामान्य समस्याएं और उनके समाधान:

  1. “streamlit कमांड नहीं मिला”
    • संभावित कारण: वर्चुअल एनवायरनमेंट सक्रिय नहीं है
    • समाधान: venv/scripts/activate चलाएं
  2. “पोर्ट पहले से ही उपयोग में है”
    • संभावित कारण: पिछला निष्पादन अभी भी चल रहा है
    • समाधान: PC को रीस्टार्ट करें या टास्क मैनेजर से Python प्रोसेस को समाप्त करें
  3. “अनुमति नहीं है” त्रुटि
    • समाधान: PowerShell को व्यवस्थापक अधिकारों के साथ चलाएं

नेटवर्क मॉनिटरिंग टूल के कोड की व्याख्या

पिछले भाग में हमने पर्यावरण सेटअप और निष्पादन प्रक्रिया के बारे में बात की। अब हम वास्तविक कोड को देखेंगे, विशेष रूप से कैसे हम ब्राउज़र में नेटवर्क की स्थिति प्रदर्शित कर रहे हैं।

ब्राउज़र प्रदर्शन के लिए कोड (app.py)

पहले हम छोटी फ़ाइल app.py से शुरुआत करेंगे। यह फ़ाइल आश्चर्यजनक रूप से सरल है:

import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

import logging
import time
import pandas as pd
import streamlit as st
from streamlit_autorefresh import st_autorefresh

from realtime_lan_monitor_csv import ImprovedNetworkMonitorCSV

# --------------------------------
# लॉग कॉन्फिगरेशन: INFO स्तर और उससे ऊपर
# --------------------------------
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

# --------------------------------
# Streamlit पेज कॉन्फिगरेशन
# --------------------------------
st.set_page_config(
    page_title="LAN मॉनिटरिंग",
    layout="wide"
)

# --------------------------------
# ऑटो रिफ्रेश (5 सेकंड)
# --------------------------------
st_autorefresh(interval=5000, limit=100, key="fizzbuzz")

# --------------------------------
# सेशन स्टेट से मॉनिटर प्रबंधन
# --------------------------------
if 'monitor' not in st.session_state:
    try:
        monitor = ImprovedNetworkMonitorCSV()
        monitor.start_monitoring()
        st.session_state.monitor = monitor
    except Exception as e:
        st.error(f"नेटवर्क मॉनिटर इनिशियलाइजेशन त्रुटि: {e}")

st.title("रीयल-टाइम नेटवर्क मॉनिटरिंग (CSV संस्करण)")

monitor = st.session_state.get('monitor', None)
if monitor is None:
    st.error("नेटवर्क मॉनिटर इनिशियलाइज नहीं किया गया है।")
else:
    # स्थिति प्रदर्शन
    if monitor.should_run:
        st.success("मॉनिटरिंग वर्तमान स्थिति: चल रहा है")
    else:
        st.warning("मॉनिटरिंग वर्तमान स्थिति: रुका हुआ है")

    # रोकने का बटन
    if st.button("मॉनिटरिंग बंद करें"):
        monitor.stop_monitoring()
        st.warning("मॉनिटरिंग बंद कर दी गई है। यदि आवश्यक हो तो ऐप को बंद करें।")

    # पुनः प्रारंभ बटन
    if st.button("मॉनिटरिंग फिर से शुरू करें"):
        if not monitor.should_run:
            monitor.start_monitoring()
            st.success("मॉनिटरिंग फिर से शुरू कर दी गई है।")
        else:
            st.info("मॉनिटरिंग पहले से ही चल रही है।")

    # डिवाइस सूची प्रदर्शन
    devices = monitor.last_devices if hasattr(monitor, "last_devices") else []
    if devices:
        df = pd.DataFrame(devices)
        st.dataframe(df)
    else:
        st.info("अभी तक कोई डिवाइस जानकारी प्राप्त नहीं हुई है। स्कैन होने तक प्रतीक्षा करें।")

    st.write(f"अंतिम अपडेट: {time.strftime('%Y-%m-%d %H:%M:%S')}")

कोड की विशेषताएं और चतुर तकनीकें

इस कोड में कई चतुराईपूर्ण तकनीकें शामिल हैं:

1. स्वचालित अपडेट का कार्यान्वयन

st_autorefresh(interval=5000, limit=100, key="fizzbuzz")

यह पंक्ति हर 5 सेकंड (5000 मिलीसेकंड) में पेज को स्वचालित रूप से रिफ्रेश करती है। इससे रीयल-टाइम स्थिति निगरानी संभव होती है।

🔍 गहरी जानकारी: limit=100 का अर्थ है कि पेज अधिकतम 100 बार स्वतः रिफ्रेश होगा, जिसके बाद मैन्युअल रिफ्रेश की आवश्यकता होगी। इससे ब्राउज़र में अनावश्यक लोड से बचा जा सकता है।

2. सेशन स्टेट का प्रबंधन

if 'monitor' not in st.session_state:
    monitor = ImprovedNetworkMonitorCSV()
    # ...

Streamlit में, पेज हर अंतरक्रिया पर पुनः लोड होता है। सेशन स्टेट का उपयोग करके, हम सुनिश्चित करते हैं कि पेज रिफ्रेश होने पर मॉनिटरिंग स्थिति बनी रहे। यह Streamlit ऐप्स में डेटा पर्सिस्टेंस का एक महत्वपूर्ण पैटर्न है।

3. इंटरैक्टिव नियंत्रण

if st.button("मॉनिटरिंग बंद करें"):
    monitor.stop_monitoring()

इस सरल कोड से उपयोगकर्ता ब्राउज़र में बटन के माध्यम से मॉनिटरिंग को नियंत्रित कर सकता है। Streamlit का सबसे बड़ा लाभ यह है कि हमें इंटरैक्टिव UI बनाने के लिए JavaScript या HTML लिखने की आवश्यकता नहीं है।

4. डेटा का सुंदर प्रदर्शन

df = pd.DataFrame(devices)
st.dataframe(df)

सिर्फ दो पंक्तियों में, हम डिवाइस जानकारी को सुंदर तालिका प्रारूप में प्रदर्शित कर सकते हैं। Pandas DataFrame और Streamlit का संयोजन डेटा विज़ुअलाइज़ेशन के लिए बहुत शक्तिशाली है।

पारंपरिक वेब फ्रेमवर्क की तुलना में Streamlit के लाभ

विशेषतापारंपरिक फ्रेमवर्क (Django/Flask)Streamlit
सेटअप समयघंटों से दिनों तकमिनटों में
कोड की मात्रासैकड़ों पंक्तियांदर्जनों पंक्तियां
आवश्यक भाषाएंPython + HTML + CSS + JavaScriptकेवल Python
स्टेट मैनेजमेंटजटिल (सेशन, कुकीज़, डेटाबेस)सरल (st.session_state)
डेटा विज़ुअलाइज़ेशनअतिरिक्त लाइब्रेरी और कॉन्फिगरेशनबिल्ट-इन
डिप्लॉयमेंट जटिलताउच्चनिम्न

ब्राउज़र इंटरफेस के विभिन्न भाग और उनकी कार्यक्षमता

मॉनिटरिंग ऐप के निम्नलिखित प्रमुख घटक हैं:

1. स्टेटस एरिया

यह वर्तमान में मॉनिटरिंग चल रही है या नहीं, यह दर्शाता है। स्थिति को रंग-कोडित (हरा = चालू, पीला = बंद) किया गया है ताकि उपयोगकर्ता एक नज़र में स्थिति समझ सके।

2. कंट्रोल बटन

मॉनिटरिंग बंद करने या पुनः प्रारंभ करने के लिए बटन। इनका उपयोग नेटवर्क निगरानी को उपयोगकर्ता के नियंत्रण में रखने के लिए किया जा सकता है।

3. डिवाइस डेटा ग्रिड

सभी पता लगाए गए नेटवर्क डिवाइसों की जानकारी दिखाने वाली इंटरैक्टिव तालिका। इसमें शामिल हैं:

  • IP पता
  • होस्टनेम
  • डिवाइस प्रकार
  • स्थिति (ऑनलाइन/ऑफलाइन)
  • प्रतिक्रिया समय
  • अंतिम बार देखे जाने का समय
  • डिटेक्शन काउंट

4. टाइमस्टैंप

पेज के अंतिम अपडेट का समय दिखाता है, जिससे उपयोगकर्ता को पता चलता है कि डेटा कितना ताज़ा है।

मोबाइल दृश्य अनुकूलन

Streamlit के एक अन्य महत्वपूर्ण लाभ यह है कि यह मोबाइल उपकरणों के लिए अपने आप अनुकूलित हो जाता है। कोई अतिरिक्त प्रयास नहीं करते हुए, आप अपने स्मार्टफोन से भी नेटवर्क मॉनिटरिंग कर सकते हैं। layout="wide" विकल्प बड़े स्क्रीन पर अधिकतम स्थान का उपयोग करता है, जबकि मोबाइल पर यह स्वचालित रूप से एक उपयुक्त लेआउट में बदल जाता है।

नेटवर्क मॉनिटरिंग के मूल कोड की व्याख्या

पिछले भाग में हमने ब्राउज़र प्रदर्शन के लिए कोड देखा। अब मैं वास्तविक नेटवर्क मॉनिटरिंग करने वाले मुख्य कोड (realtime_lan_monitor.py) पर चर्चा करूंगा।

कोड की समग्र संरचना

इस कोड को निम्नलिखित प्रमुख खंडों में विभाजित किया गया है:

  • कॉन्फिगरेशन और लॉगिंग फ़ंक्शन
  • नेटवर्क जानकारी प्राप्ति
  • डिवाइस मॉनिटरिंग कार्यान्वयन
  • CSV/Excel आउटपुट प्रोसेसिंग
  • मुख्य लूप नियंत्रण

आइए इन महत्वपूर्ण भागों को एक-एक करके देखें।

1. कॉन्फिगरेशन और लॉगिंग सिस्टम

import logging
logging.basicConfig(
    filename='lan_monitor.log',
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s',
    encoding='utf-8'
)

CONFIG_FILE = "config.json"

def load_config():
    config = {
        "excel_file": "improved_lan_monitor.xlsx",
        "refresh_interval": 30,
        "full_scan_interval": 600,
        "dhcp_range_start": 100,
        "dhcp_range_end": 200,
        "priority_ips": [],
        "check_shared_folders": True
    }
    # यदि कॉन्फिग फाइल मौजूद हो तो उसे लोड करें
    if os.path.exists(CONFIG_FILE):
        try:
            with open(CONFIG_FILE, "r", encoding="utf-8") as f:
                file_conf = json.load(f)
            config.update(file_conf)
        except Exception as e:
            logging.error(f"कॉन्फिग फाइल लोडिंग त्रुटि: {e}", exc_info=True)
    return config

इस भाग के मुख्य बिंदु:

  • दोहरी लॉगिंग: लॉग फाइल और कंसोल दोनों पर आउटपुट
  • डिफॉल्ट कॉन्फिगरेशन: मूल सेटिंग्स साथ में ही, JSON फाइल से ओवरराइड संभव
  • त्रुटि सहनशीलता: त्रुटि होने पर भी डिफॉल्ट मान के साथ कार्य जारी रखना

🧠 सुझाव: अपने मॉनिटरिंग ऐप में लॉगिंग को हल्के से न लें। एक अच्छा लॉगिंग सिस्टम समस्या निवारण का आधार है। रोटेटिंग लॉग फाइल्स का उपयोग करके डिस्क स्पेस बचाएं। उदाहरण के लिए, logging.handlers.RotatingFileHandler उपयोग करें।

2. कुशल नेटवर्क स्कैनिंग का कार्यान्वयन

def scan_network(self, mode="regular"):
    net_info = get_network_info()
    targets = self.get_scan_targets(net_info, mode)
    devices = []
    new_active = set()

    with ThreadPoolExecutor(max_workers=20) as executor:
        futures = {executor.submit(ping_and_collect, ip, net_info, 
                  self.known_devices, self.check_shared_folders): ip 
                  for ip in targets}
        for future in as_completed(futures):
            ip = futures[future]
            try:
                _, status, device = future.result()
                if status == "ऑनलाइन" and device:
                    new_active.add(ip)
                    self.known_devices[ip] = device
                    devices.append(device)

यह कोड का सबसे महत्वपूर्ण हिस्सा है, जो नेटवर्क स्कैनिंग को समानांतर रूप से करता है। यहां कुछ प्रमुख विशेषताएं हैं:

  • ThreadPoolExecutor का उपयोग: समानांतर प्रोसेसिंग द्वारा ध्वनि प्रतिक्रिया
  • अधिकतम 20 थ्रेड्स: एक साथ Ping की समानांतर निष्पादन
  • प्रतिक्रिया के इंतज़ार से होने वाले विलंब को कम करना: समानांतर प्रोसेसिंग से बेहतर प्रदर्शन

3. स्मार्ट स्कैनिंग रणनीति

स्कैनिंग में तीन मोड हैं:

स्कैन मोडविवरणउपयोग का समयनेटवर्क लोड
सामान्य स्कैनकेवल ज्ञात सक्रिय IP और प्राथमिकता वाले IP की जांचअधिकतर समयन्यूनतम
फुल स्कैनपूरे नेटवर्क (1-254) को स्कैनहर 10 मिनट (600 सेकंड)उच्च
DHCP रेंज स्कैनकेवल DHCP रेंज को स्कैन (डिफॉल्ट: 100-200)सक्रिय डिवाइस कम होने परमध्यम

यह कोड स्कैन टारगेट निर्धारित करता है:

def get_scan_targets(self, network_info, mode="regular"):
    targets = set()
    prefix = network_info["network_prefix"]
    
    if mode == "full":
        try:
            net = ipaddress.IPv4Network(network_info["network_range"])
            for ip in net.hosts():
                targets.add(str(ip))
        except Exception as e:
            logging.error(f"फुल स्कैन त्रुटि: {e}", exc_info=True)
            # फॉलबैक मैन्युअल स्कैन रेंज
            for i in range(1, 255):
                targets.add(f"{prefix}{i}")

4. रीयल-टाइम मॉनिटरिंग कार्यान्वयन

मॉनिटरिंग लूप एक अलग थ्रेड में चलता है और हमेशा नवीनतम स्थिति बनाए रखता है:

def monitor_loop(self):
    last_scan_time = 0
    last_full_scan_time = 0

    while self.should_run:
        try:
            now = time.time()
            scan_mode = "regular"
            # फुल स्कैन निर्धारण
            if now - last_full_scan_time >= self.full_scan_interval:
                scan_mode = "full"
                last_full_scan_time = now
            # DHCP स्कैन निर्धारण
            elif len(self.active_ips) < 3 and now - last_full_scan_time >= 60:
                scan_mode = "dhcp"

यह डिज़ाइन क्यों प्रभावशाली है?

संसाधन अनुकूलित डिज़ाइन

  • स्मार्ट स्कैनिंग: सामान्य स्थिति में, केवल ज्ञात डिवाइसों की जांच
  • आवश्यकतानुसार फुल स्कैन: नियमित अंतराल पर पूर्ण स्कैन
  • स्व-अनुकूलित रणनीति: परिस्थितियों के अनुसार अपनी स्कैनिंग रणनीति समायोजित करता है

अनुकूली स्कैनिंग

  • डिवाइस कम होने पर DHCP रेंज चेक: अधिक डिवाइसों की खोज के लिए
  • न्यूनतम नेटवर्क लोड: केवल आवश्यक IP पर ध्यान केंद्रित

त्रुटि सहनशीलता

  • प्रत्येक प्रक्रिया में try-except: त्रुटि होने पर भी कार्य जारी रखना
  • मजबूत त्रुटि हैंडलिंग: अप्रत्याशित स्थितियों में भी स्थिर रहना

उन्नत तकनीकी अंतर्दृष्टि: थ्रेडिंग मैनेजमेंट

इस प्रोजेक्ट की एक प्रमुख तकनीकी चुनौती है थ्रेड सुरक्षित कोड लिखना। जब आप समानांतर प्रोसेसिंग करते हैं, तो डेटा संघर्ष आम होते हैं। यह कोड इसे कैसे संभालता है:

def scan_network(self, mode="regular"):
    # ...
    with self.lock:  # थ्रेड लॉक का उपयोग 
        old_status = self.known_devices.get(ip, {}).get("status", "अज्ञात")
    # ...
    with self.lock:  # थ्रेड लॉक का उपयोग
        self.known_devices[ip] = dev_info

threading.Lock का उपयोग साझा डेटा संरचनाओं (जैसे known_devices डिक्शनरी) तक अभिगमन को नियंत्रित करता है, जिससे थ्रेड के बीच संघर्ष से बचा जाता है।

लॉक का सही उपयोग

  • महत्वपूर्ण खंडों के लिए लॉक: केवल आवश्यक डेटा संशोधन के दौरान लॉक का उपयोग करें
  • लॉक की न्यूनतम अवधि: प्रदर्शन प्रभाव को कम करने के लिए लॉक की अवधि को न्यूनतम रखें
  • डेडलॉक से बचें: लॉक को दूर के प्रकार्यों के भीतर पास न करें

बोनस: गतिशील ये स्थिर कॉन्फिगरेशन का निर्णय

हमारी नेटवर्क मॉनिटरिंग को और भी प्रभावी बनाने के लिए, प्रोग्राम स्वयं निर्णय ले सकता है:

# स्वयं समायोजित करने वाली स्कैन आवृत्ति
if network_load > 80:  # नेटवर्क लोड अधिक है
    current_refresh_interval = min(self.refresh_interval * 2, 120)  # दोगुना करें, अधिकतम 2 मिनट 
elif network_load < 20:  # नेटवर्क लोड कम है
    current_refresh_interval = max(self.refresh_interval / 2, 15)  # आधा करें, न्यूनतम 15 सेकंड
else:
    current_refresh_interval = self.refresh_interval  # सामान्य आवृत्ति

यह कोड मॉड्यूल में नहीं है, लेकिन यह एक उन्नत तकनीक है जिसे आप अपनी स्वयं की कार्यान्वयन में जोड़ सकते हैं।

उन्नत नेटवर्क मॉनिटरिंग टूल: CSV संस्करण का विश्लेषण

अब तक हमने Excel का उपयोग करने वाले नेटवर्क मॉनिटरिंग टूल और Streamlit द्वारा इसके ब्राउज़र प्रदर्शन के बारे में चर्चा की है। अब हम एक अधिक हल्के और विस्तारित CSV संस्करण के स्क्रिप्ट का परिचय देंगे। इस संस्करण में, Excel फ़ाइल के बजाय CSV फ़ाइलों का उपयोग किया गया है, जिससे अधिक कुशल लॉगिंग और स्थिति प्रबंधन संभव हुआ है।

CSV संस्करण की विशेषताएं

Excel संस्करण की तुलना में, CSV संस्करण में निम्नलिखित विशेषताएं हैं:

हल्का रिकॉर्डिंग तरीका

  • Excel के स्थान पर CSV फ़ाइलों का उपयोग
  • घटना लॉग और स्नैपशॉट को अलग-अलग रिकॉर्ड करना
  • UTF-8 with BOM में एकरूप एन्कोडिंग

📝 जानकारी: CSV फ़ाइलें बड़े डेटासेट के लिए Excel की तुलना में बहुत अधिक कार्यकुशल हैं। 10,000 से अधिक पंक्तियों वाले डेटासेट के लिए, CSV फ़ाइलें Excel की तुलना में लगभग 5-10 गुना तेज़ी से प्रोसेस की जा सकती हैं।

विस्तारित कार्यक्षमता

  • स्थिति परिवर्तन की घटना लॉगिंग
  • नियमित नेटवर्क स्नैपशॉट
  • बेहतर त्रुटि हैंडलिंग

केंद्रीकृत कॉन्फिगरेशन

  • सभी सेटिंग्स CONFIG डिक्शनरी में केंद्रित
  • भविष्य के कॉन्फिगरेशन फ़ाइल के लिए तैयारी

Excel और CSV के बीच तुलना: व्यावहारिक दृष्टिकोण

Excel और Python के संयोजन में एक प्रमुख समस्या फ़ाइल फॉर्मेटिंग और जटिल आंतरिक संरचना के कारण त्रुटियां हैं। इसके विपरीत, CSV प्रारूप टेक्स्ट-आधारित और सरल है, जिससे डेटा पढ़ना और लिखना आसान हो जाता है और त्रुटियां कम होती हैं।

पहलूExcel आधारित दृष्टिकोणCSV आधारित दृष्टिकोण
फाइल आकारबड़ा (~500KB+)छोटा (~50KB)
प्रोसेसिंग स्पीडधीमी (COM इंटरफेस के कारण)तेज़ (सरल टेक्स्ट प्रोसेसिंग)
फॉर्मेटिंग क्षमताएंउन्नत (रंगीन सेल, स्वरूपण)सीमित (सिर्फ प्लेन टेक्स्ट)
त्रुटि संभावनाउच्च (COM इंटरफेस की जटिलता)निम्न (सरल फाइल हैंडलिंग)
क्रॉस-प्लेटफॉर्म समर्थनसीमित (Windows केंद्रित)व्यापक (सभी OS पर अच्छा काम करता है)
थ्रेड सुरक्षाकम (COM थ्रेड-सेफ नहीं है)उच्च (सरल फाइल लॉकिंग)

हालांकि, Excel-विशिष्ट विशेषताओं (जैसे सेल फॉर्मेटिंग और फॉर्मूला) को CSV में संरक्षित नहीं किया जा सकता है, इसलिए इस बात पर ध्यान देना आवश्यक है।

कोड में महत्वपूर्ण परिवर्तन

1. केंद्रीकृत कॉन्फिगरेशन

CONFIG = {
    "EVENT_LOG_FILE": "event_log.csv",       # स्थिति परिवर्तन का इतिहास
    "SNAPSHOT_LOG_FILE": "snapshot_log.csv", # स्नैपशॉट का इतिहास
    "CSV_ENCODING": "utf-8-sig",
    "REFRESH_INTERVAL": 30,       # सामान्य अपडेट अंतराल (सेकंड)
    "FULL_SCAN_INTERVAL": 600,    # फुल स्कैन अंतराल (सेकंड)
    "SNAPSHOT_INTERVAL": 600,     # स्नैपशॉट अंतराल (सेकंड)
    "DHCP_RANGE_START": 100,
    "DHCP_RANGE_END": 200,
    "PRIORITY_IPS": ["192.168.1.1"],  # उदाहरण: राउटर आदि, हमेशा स्कैन करने वाले IP
    "CHECK_SHARED_FOLDERS": True,
    "EXCEL_FILE": "improved_lan_monitor.xlsx",
    "PING_CONCURRENCY": 20,  # एक साथ Ping करने के लिए थ्रेड्स की संख्या
}

सभी सेटिंग्स को एक स्थान पर केंद्रित करने से परिवर्तन करना आसान हो जाता है और कोड रखरखाव में सुधार होता है।

2. घटना लॉगिंग का कार्यान्वयन

def append_event_log(ip, old_status, new_status, response_time, shared):
    now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    file_exists = os.path.exists(CONFIG["EVENT_LOG_FILE"])
    try:
        with open(CONFIG["EVENT_LOG_FILE"], "a", newline="", encoding=CONFIG["CSV_ENCODING"]) as f:
            writer = csv.writer(f)
            if not file_exists:
                writer.writerow(["timestamp", "ip", "old_status", "new_status", "response_time_ms", "shared"])
            writer.writerow([now_str, ip, old_status, new_status, response_time, shared])
    except Exception as e:
        logging.error(f"IP {ip} के लिए घटना लॉग जोड़ने में विफलता: {e}")

केवल डिवाइस की स्थिति परिवर्तन (ऑनलाइन→ऑफलाइन आदि) होने पर ही रिकॉर्ड करके, महत्वपूर्ण परिवर्तनों को पकड़ते हुए, लॉग फ़ाइल का आकार सीमित रखा जाता है।

3. स्नैपशॉट का कार्यान्वयन

def append_snapshot(devices, scan_mode):
    now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    online = [d for d in devices if d["status"] == "ऑनलाइन"]
    offline = [d for d in devices if d["status"] == "ऑफलाइन"]

    total_online = len(online)
    total_offline = len(offline)
    online_ips_str = ",".join([d["ip"] for d in online])

    file_exists = os.path.exists(CONFIG["SNAPSHOT_LOG_FILE"])
    try:
        with open(CONFIG["SNAPSHOT_LOG_FILE"], "a", newline="", encoding=CONFIG["CSV_ENCODING"]) as f:
            writer = csv.writer(f)
            if not file_exists:
                writer.writerow(["timestamp", "total_online", "total_offline", "online_ips", "scan_mode"])
            writer.writerow([now_str, total_online, total_offline, online_ips_str, scan_mode])
    except Exception as e:
        logging.error(f"स्नैपशॉट लॉग जोड़ने में विफलता: {e}")

नियमित स्नैपशॉट, नेटवर्क की समग्र स्थिति को रिकॉर्ड करते हैं। यह समय के साथ डिवाइसों की संख्या में परिवर्तन या कौन से IP कब ऑनलाइन थे, इसका पता लगाने में मदद करता है।

ग्राफ़िकल नेटवर्क लॉग विश्लेषण

Excel के बजाय CSV का उपयोग करने से हम अतिरिक्त डेटा विश्लेषण क्षमताओं को सक्षम करते हैं। उदाहरण के लिए, निम्न Python कोड उपयोग करके आप नेटवर्क स्नैपशॉट से सरल ग्राफ बना सकते हैं:

import pandas as pd
import matplotlib.pyplot as plt

# स्नैपशॉट डेटा लोड करें
df = pd.read_csv('snapshot_log.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])

# ऑनलाइन डिवाइसों का ग्राफ
plt.figure(figsize=(12, 6))
plt.plot(df['timestamp'], df['total_online'], 'g-', label='ऑनलाइन डिवाइस')
plt.plot(df['timestamp'], df['total_offline'], 'r--', label='ऑफलाइन डिवाइस')
plt.xlabel('समय')
plt.ylabel('डिवाइस की संख्या')
plt.title('नेटवर्क डिवाइस की स्थिति समय के साथ')
plt.legend()
plt.grid(True)
plt.savefig('network_trend.png')

इस प्रकार के विश्लेषण से, आप आसानी से:

  • समय के साथ नेटवर्क गतिविधि में रुझान देख सकते हैं
  • अनियमित व्यवहार की पहचान कर सकते हैं
  • नेटवर्क की स्वास्थ्य रिपोर्ट तैयार कर सकते हैं

थ्रेड-सेफ डेटा एक्सेस

def scan_network(self, mode="regular"):
    # ...
    with self.lock:
        old_status = self.known_devices.get(ip, {}).get("status", "अज्ञात")
    # ...
    with self.lock:
        self.known_devices[ip] = dev_info
    # ...

एकाधिक थ्रेड्स से डेटा एक्सेस को नियंत्रित करने के लिए, लॉक जोड़े गए हैं। यह डेटा अखंडता सुनिश्चित करता है और रेस कंडीशन से बचाता है।

CSV डेटा उपयोग के व्यावहारिक उदाहरण

CSV फ़ाइलों में संग्रहीत डेटा का विभिन्न तरीकों से उपयोग किया जा सकता है:

1. दीर्घकालिक नेटवर्क सांख्यिकी

import pandas as pd

# घटना लॉग विश्लेषण
events_df = pd.read_csv('event_log.csv')

# महीने के अनुसार स्थिति परिवर्तन की संख्या
events_df['timestamp'] = pd.to_datetime(events_df['timestamp'])
events_df['month'] = events_df['timestamp'].dt.month
monthly_status_changes = events_df.groupby(['month', 'ip']).size().reset_index(name='changes')

2. नेटवर्क अस्थिरता की पहचान

# अस्थिर डिवाइस (जो बार-बार ऑनलाइन/ऑफलाइन होते हैं)
unstable_devices = events_df.groupby('ip').size().reset_index(name='status_changes')
problematic = unstable_devices[unstable_devices['status_changes'] > 10]  # दिन में 10 से अधिक परिवर्तन

3. नेटवर्क उपयोग पैटर्न

# स्नैपशॉट से समय के अनुसार नेटवर्क उपयोग पैटर्न
snapshots_df = pd.read_csv('snapshot_log.csv')
snapshots_df['timestamp'] = pd.to_datetime(snapshots_df['timestamp'])
snapshots_df['hour'] = snapshots_df['timestamp'].dt.hour

# घंटे के अनुसार औसत ऑनलाइन डिवाइस
hourly_pattern = snapshots_df.groupby('hour')['total_online'].mean()

नेटवर्क मॉनिटरिंग टूल: कॉन्फिगरेशन और अनुप्रयोग

अब तक हमने Python और Excel, और Streamlit का उपयोग करके नेटवर्क मॉनिटरिंग टूल के निर्माण और निष्पादन के बारे में देखा है। अब हम वास्तविक उपयोग विधि, कॉन्फिगरेशन के अनुकूलन और अनुप्रयोग के उदाहरणों पर चर्चा करेंगे।

सेटिंग्स को सीधे बदलना

संलग्न स्क्रिप्ट में, सेटिंग्स सीधे कोड में लिखी गई हैं। उदाहरण के लिए, ImprovedNetworkMonitor क्लास के init मेथड में, निम्नलिखित डिफॉल्ट सेटिंग्स परिभाषित की गई हैं:

def __init__(self):
    self.config = load_config()
    self.excel_file = self.config["excel_file"]
    self.refresh_interval = self.config["refresh_interval"]
    self.full_scan_interval = self.config["full_scan_interval"]
    self.dhcp_range_start = self.config["dhcp_range_start"]
    self.dhcp_range_end = self.config["dhcp_range_end"]
    self.priority_ips = set(self.config["priority_ips"])
    self.check_shared_folders = self.config["check_shared_folders"]

इन सेटिंग्स को बदलने के लिए, आप load_config फ़ंक्शन में डिफॉल्ट मान को सीधे संपादित कर सकते हैं:

def load_config():
    """
    कॉन्फिगरेशन लोड करता है। त्रुटि होने पर डिफॉल्ट मान का उपयोग करता है।
    """
    config = {
        "excel_file": "improved_lan_monitor.xlsx",    # यहां बदलें
        "refresh_interval": 30,                       # यहां बदलें (सेकंड में)
        "full_scan_interval": 600,                    # यहां बदलें (सेकंड में)
        "dhcp_range_start": 100,                      # यहां बदलें
        "dhcp_range_end": 200,                        # यहां बदलें
        "priority_ips": [],                           # यहां बदलें (उदाहरण: ["192.168.1.1", "192.168.1.5"])
        "check_shared_folders": True                  # यहां बदलें (True/False)
    }
    # ...बाकी कोड समान

कॉन्फिगरेशन फाइल के माध्यम से सेटिंग्स का प्रबंधन

अधिक उन्नत सेटअप के लिए, आप एक अलग कॉन्फिगरेशन फाइल बना सकते हैं जिसे उपयोगकर्ता आसानी से संपादित कर सकते हैं:

{
  "excel_file": "network_monitor.xlsx",
  "refresh_interval": 60,
  "full_scan_interval": 1800,
  "dhcp_range_start": 50,
  "dhcp_range_end": 150,
  "priority_ips": ["192.168.1.1", "192.168.1.100"],
  "check_shared_folders": false
}

इस फाइल को config.json के रूप में सहेजें और स्क्रिप्ट इसे स्वचालित रूप से लोड करेगी।

व्यावहारिक उपयोग विधि

1. मॉनिटरिंग आवृत्ति का संतुलन

मॉनिटरिंग आवृत्ति को समायोजित करके, नेटवर्क लोड और रीयल-टाइम अपडेट के बीच संतुलन बनाया जा सकता है:

नेटवर्क प्रकारअनुशंसित refresh_intervalअनुशंसित full_scan_interval
छोटा होम नेटवर्क60 सेकंड (1 मिनट)3600 सेकंड (1 घंटा)
मध्यम आकार का कार्यालय30 सेकंड900 सेकंड (15 मिनट)
बड़ा कॉर्पोरेट नेटवर्क120 सेकंड (2 मिनट)3600 सेकंड (1 घंटा)
संवेदनशील सुरक्षा नेटवर्क10 सेकंड300 सेकंड (5 मिनट)

बड़े नेटवर्क पर, स्कैन आवृत्ति को कम करना चाहिए ताकि नेटवर्क ट्रैफिक और सिस्टम लोड को कम किया जा सके।

2. मॉनिटरिंग लक्ष्य का अनुकूलन

DHCP रेंज और प्राथमिकता वाले IP को उचित रूप से सेट करके, प्रभावी मॉनिटरिंग संभव है:

"dhcp_range_start": 50,
"dhcp_range_end": 150,
"priority_ips": ["192.168.1.1", "192.168.1.10", "192.168.1.20"],

यहां, राउटर (192.168.1.1) और अन्य महत्वपूर्ण सर्वर या डिवाइस (192.168.1.10, 192.168.1.20) को प्राथमिकता दी गई है।

3. स्वचालित स्टार्टअप कॉन्फिगरेशन

Windows स्टार्टअप फोल्डर में रजिस्टर करने के लिए बैच फाइल (start_monitor.bat):

@echo off
cd C:\lan
call venv\Scripts\activate
start pythonw realtime_lan_monitor.py --run
timeout /t 5
start pythonw -m streamlit run app.py

इस फाइल को स्टार्टअप फोल्डर (Win+R दबाकर shell:startup टाइप करें) में रखें और यह Windows स्टार्टअप पर स्वचालित रूप से चलेगी।

उन्नत अनुकूलन: नेटवर्क सेगमेंटेशन

बड़े नेटवर्क के लिए, आप एकाधिक सब-नेटवर्क को अलग-अलग मॉनिटर कर सकते हैं:

NETWORKS = [
    {"name": "मुख्य कार्यालय", "range": "192.168.1.0/24", "priority": ["192.168.1.1", "192.168.1.10"]},
    {"name": "विकास टीम", "range": "192.168.2.0/24", "priority": ["192.168.2.1", "192.168.2.5"]},
    {"name": "वित्त विभाग", "range": "192.168.3.0/24", "priority": ["192.168.3.1"]}
]

इस प्रकार के कॉन्फिगरेशन से बड़े संगठनों में विभिन्न विभागों या स्थानों के नेटवर्क की निगरानी करना आसान हो जाता है।

अक्सर पूछे जाने वाले प्रश्न और समाधान

प्रश्न: मॉनिटरिंग धीमी है या प्रतिक्रिया नहीं देती

उत्तर: निम्नलिखित जांचें:

  • max_workers का मान समायोजित करें (थ्रेड्स की संख्या बढ़ाएं)
  • ping के टाइमआउट मान को कम करें
  • सुनिश्चित करें कि सबनेट मास्क सही तरीके से प्राप्त हो रहा है

प्रश्न: कुछ डिवाइस पता नहीं लगाए जाते

उत्तर: संभावित कारण:

  • डिवाइस ping प्रतिक्रिया नहीं देने के लिए कॉन्फिगर है
  • फायरवॉल ICMP को ब्लॉक कर रहा है
  • डिवाइस स्लीप मोड में है

समाधान:

  • मैन्युअल रूप से प्राथमिकता IP सूची में जोड़ें
  • साझा फोल्डर जांच को बंद करके देखें

प्रश्न: बहुत सारी त्रुटि लॉग दिखती हैं

उत्तर: लॉग स्तर समायोजित करें:

logging.basicConfig(
    filename='lan_monitor.log',
    level=logging.WARNING,  # INFO → WARNING में बदलें
    format='%(asctime)s [%(levelname)s] %(message)s',
    encoding='utf-8'
)

अनुप्रयोग के उन्नत विचार

इस टूल के आधार पर, विभिन्न प्रकार के विस्तार संभव हैं:

मॉनिटरिंग परिणामों की सूचना

def send_notification(device):
    # स्लैक या ईमेल के माध्यम से सूचित करने की प्रक्रिया
    if device["status"] == "ऑफलाइन" and device["device_type"] == "सर्वर":
        send_alert_email(
            subject=f"सर्वर डाउन अलर्ट: {device['ip']}",
            body=f"सर्वर {device['hostname']} ({device['ip']}) {device['last_seen']} के बाद से ऑफलाइन है।"
        )

लंबी अवधि के आंकड़ों का संग्रह

def save_statistics(devices):
    # डेटाबेस में रिकॉर्ड करें
    conn = sqlite3.connect('network_stats.db')
    cursor = conn.cursor()
    for device in devices:
        if device["status"] == "ऑनलाइन":
            cursor.execute(
                "INSERT INTO device_history (ip, hostname, timestamp, response_time) VALUES (?, ?, ?, ?)",
                (device["ip"], device["hostname"], datetime.now(), device["response_time_ms"])
            )
    conn.commit()
    conn.close()

सुरक्षा निगरानी का सुदृढ़ीकरण

def detect_suspicious_devices(devices):
    # ज्ञात डिवाइसों की सूची से तुलना करें
    known_devices = load_known_devices_list()
    unknown_devices = []
    
    for device in devices:
        if device["status"] == "ऑनलाइन" and device["ip"] not in known_devices:
            unknown_devices.append(device)
            logging.warning(f"अज्ञात डिवाइस पाया गया: {device['ip']} ({device['hostname']})")
    
    # अज्ञात डिवाइस मिलने पर अलर्ट
    if unknown_devices:
        send_security_alert(unknown_devices)

इंटरनेट कनेक्शन की निगरानी

def check_internet_connection():
    # बाहरी सर्वर के साथ कनेक्शन टेस्ट करें
    external_hosts = ["8.8.8.8", "1.1.1.1", "google.com"]
    
    for host in external_hosts:
        try:
            result = subprocess.run(["ping", "-c", "1", host], 
                                  stdout=subprocess.PIPE, 
                                  stderr=subprocess.PIPE,
                                  timeout=2)
            if result.returncode == 0:
                return True
        except:
            continue
    
    # सभी होस्ट फेल होने पर
    logging.error("इंटरनेट कनेक्शन डाउन है!")
    send_notification("इंटरनेट कनेक्शन निगरानी", "नेटवर्क का इंटरनेट कनेक्शन वर्तमान में अनुपलब्ध है।")
    return False

व्यापारिक मूल्य: नेटवर्क मॉनिटरिंग से दैनिक लाभ

इस टूल का उपयोग करके, IT प्रशासक निम्नलिखित लाभ प्राप्त कर सकते हैं:

  1. प्रोएक्टिव समस्या निवारण: नेटवर्क समस्याओं के प्रभाव से पहले उनका पता लगाएं
  2. नेटवर्क सुरक्षा में सुधार: अनधिकृत डिवाइसों की पहचान करें
  3. बेहतर संसाधन योजना: डिवाइस उपयोग पैटर्न का विश्लेषण करें
  4. डाउनटाइम कम करें: त्वरित पहचान और प्रतिक्रिया से व्यावसायिक व्यवधान कम करें

इन सभी अनुप्रयोगों के लिए CSV संस्करण के डेटा लॉगिंग फंक्शन विशेष रूप से उपयोगी हैं, क्योंकि वे विस्तृत विश्लेषण और रिपोर्टिंग का समर्थन करते हैं।

विकसित नेटवर्क मॉनिटरिंग टूल: CSV संस्करण का विस्तृत विवरण

पिछले भागों में हमने Excel आधारित नेटवर्क मॉनिटरिंग टूल और उसके Streamlit ब्राउज़र इंटरफेस के बारे में चर्चा की। अब हम अधिक हल्के और विस्तार योग्य CSV संस्करण के स्क्रिप्ट का गहराई से अध्ययन करेंगे। यह संस्करण Excel के स्थान पर CSV फ़ाइलों का उपयोग करता है, जिससे अधिक कुशल लॉग रिकॉर्डिंग और स्थिति प्रबंधन संभव हो जाता है।

CSV संस्करण के पीछे का दर्शन

Excel एक शक्तिशाली टूल है, लेकिन मॉनिटरिंग जैसे ऑटोमेशन कार्यों के लिए इसकी जटिलता कभी-कभी नुकसानदेह हो सकती है। CSV संस्करण निम्न सिद्धांतों पर आधारित है:

  1. सादगी: सरल, पाठ-आधारित प्रारूप जो किसी भी उपकरण पर आसानी से पढ़ा और संशोधित किया जा सकता है
  2. दक्षता: कम संसाधन उपयोग के साथ तेज़ प्रोसेसिंग
  3. मापनीयता: बड़ी मात्रा में डेटा रिकॉर्ड करने की क्षमता
  4. अनुकूलनीयता: विभिन्न प्लेटफॉर्म और प्रोग्रामिंग भाषाओं के साथ एकीकरण की सुविधा

💡 डेवलपर टिप: जब आप किसी ऑटोमेशन टूल का डिज़ाइन कर रहे हों, तो हमेशा डेटा स्टोरेज के सबसे सरल रूप के साथ शुरू करें जो आपकी आवश्यकताओं को पूरा कर सके। जटिलता केवल वहीं जोड़ें जहां यह अनिवार्य हो।

कार्यान्वयन विशेषताएं

घटना और स्नैपशॉट लॉगिंग का द्वैध दृष्टिकोण

CSV संस्करण की एक विशिष्ट विशेषता यह है कि यह दो अलग-अलग प्रकार के लॉग बनाए रखता है:

लॉग प्रकारफ़ाइलप्रयोजनरिकॉर्डिंग आवृत्ति
घटना लॉगevent_log.csvडिवाइस की स्थिति में परिवर्तन (ऑनलाइन ↔ ऑफलाइन)केवल परिवर्तन होने पर
स्नैपशॉट लॉगsnapshot_log.csvसंपूर्ण नेटवर्क की नियमित स्नैपशॉटनियमित अंतराल पर (डिफॉल्ट: 10 मिनट)

यह विभाजन दो महत्वपूर्ण लाभ प्रदान करता है:

  1. डेटा संग्रह दक्षता: परिवर्तन-आधारित लॉगिंग फ़ाइल आकार को कम रखती है
  2. विश्लेषण लचीलापन: समय के साथ प्रवृत्तियों को देखने के लिए स्नैपशॉट, जबकि घटनाएं समस्या निवारण के लिए विस्तृत जानकारी प्रदान करती हैं

दिनांकित फ़ाइल रोटेशन

लंबी अवधि के लिए चलने पर, लॉग फ़ाइलें बहुत बड़ी हो सकती हैं। इस समस्या से निपटने के लिए कोड में एक स्मार्ट फ़ाइल रोटेशन प्रणाली जोड़ी गई है:

def rotate_log_files():
    """पुरानी लॉग फ़ाइलों को आर्काइव करता है"""
    today = datetime.now().strftime("%Y-%m-%d")
    
    for log_file in [CONFIG["EVENT_LOG_FILE"], CONFIG["SNAPSHOT_LOG_FILE"]]:
        if os.path.exists(log_file) and os.path.getsize(log_file) > 1024 * 1024:  # 1MB से बड़ी
            archive_name = f"{os.path.splitext(log_file)[0]}_{today}.csv"
            try:
                shutil.copy(log_file, archive_name)
                # फ़ाइल को खाली करें पर हेडर रखें
                with open(log_file, 'r', encoding=CONFIG["CSV_ENCODING"]) as src:
                    header = src.readline()
                with open(log_file, 'w', encoding=CONFIG["CSV_ENCODING"]) as dest:
                    dest.write(header)
                logging.info(f"लॉग फ़ाइल रोटेट की गई: {archive_name}")
            except Exception as e:
                logging.error(f"फ़ाइल रोटेशन त्रुटि: {e}")

यह फ़ंक्शन दैनिक रूप से या फ़ाइल आकार निश्चित सीमा से अधिक होने पर चल सकता है, जिससे प्रदर्शन बेहतर रहता है और हिस्टोरिकल डेटा भी सुरक्षित रहता है।

डेटा विज़ुअलाइज़ेशन और रिपोर्टिंग

CSV फ़ाइलों का एक बड़ा लाभ यह है कि वे लगभग सभी डेटा विश्लेषण और विज़ुअलाइज़ेशन टूल के साथ संगत हैं। निम्नलिखित कोड CSV डेटा के आधार पर एक संपूर्ण नेटवर्क स्वास्थ्य डैशबोर्ड बनाता है:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta

def generate_network_health_report(output_file="network_report.html"):
    """संपूर्ण नेटवर्क स्वास्थ्य रिपोर्ट उत्पन्न करता है"""
    
    # डेटा लोड करें
    events_df = pd.read_csv(CONFIG["EVENT_LOG_FILE"])
    snapshots_df = pd.read_csv(CONFIG["SNAPSHOT_LOG_FILE"])
    
    # तिथि स्तंभों को सही प्रारूप में परिवर्तित करें
    events_df['timestamp'] = pd.to_datetime(events_df['timestamp'])
    snapshots_df['timestamp'] = pd.to_datetime(snapshots_df['timestamp'])
    
    # आज की तारीख़ प्राप्त करें और कल के लिए फ़िल्टर बनाएँ
    today = datetime.now().date()
    yesterday = today - timedelta(days=1)
    today_filter = events_df['timestamp'].dt.date == today
    yesterday_filter = events_df['timestamp'].dt.date == yesterday
    
    # आधारभूत स्थिरता मेट्रिक्स गणना
    total_devices = len(events_df['ip'].unique())
    stability_score = calculate_network_stability(events_df)
    
    # रिपोर्ट जेनरेट करें
    with open(output_file, 'w') as f:
        f.write("<html><head><title>नेटवर्क स्वास्थ्य रिपोर्ट</title></head><body>")
        f.write(f"<h1>नेटवर्क स्वास्थ्य रिपोर्ट - {today}</h1>")
        
        # सारांश अनुभाग
        f.write("<h2>सारांश</h2>")
        f.write(f"<p>कुल ट्रैक किए गए डिवाइस: {total_devices}</p>")
        f.write(f"<p>नेटवर्क स्थिरता स्कोर: {stability_score:.2f}%</p>")
        
        # ... अधिक रिपोर्ट विवरण ...
        
        f.write("</body></html>")
    
    # विज़ुअलाइज़ेशन भी उत्पन्न करें
    generate_visualizations(events_df, snapshots_df)
    
    return output_file

प्रदर्शन अनुकूलन तकनीकें

CSV संस्करण में कई प्रदर्शन अनुकूलन हैं जो इसे Excel वर्जन से तेज़ और अधिक कुशल बनाते हैं:

1. आलसी लोडिंग (Lazy Loading)

def get_hostname(ip_address, force_lookup=False):
    """IP पते से होस्टनेम प्राप्त करता है, कैशिंग के साथ"""
    if not force_lookup and ip_address in self.hostname_cache:
        return self.hostname_cache[ip_address]
        
    try:
        socket.setdefaulttimeout(1)
        hostname = socket.getfqdn(ip_address)
        if hostname == ip_address:
            hostname = "अज्ञात"
        self.hostname_cache[ip_address] = hostname
        return hostname
    except:
        return "अज्ञात"

होस्टनेम लुकअप जैसे धीमे ऑपरेशन केवल तभी किए जाते हैं जब आवश्यक हो, और परिणाम कैश किए जाते हैं।

2. बैचिंग और पूलिंग

CSV में आउटपुट लिखते समय, ऑपरेशन को बैच में किया जाता है जिससे डिस्क I/O की संख्या कम होती है:

def batch_append_events(events, batch_size=50):
    """कई घटनाओं को एक ही बार में अपेंड करें"""
    if not events:
        return
        
    try:
        file_exists = os.path.exists(CONFIG["EVENT_LOG_FILE"])
        with open(CONFIG["EVENT_LOG_FILE"], "a", newline="", encoding=CONFIG["CSV_ENCODING"]) as f:
            writer = csv.writer(f)
            
            if not file_exists:
                writer.writerow(["timestamp", "ip", "old_status", "new_status", "response_time_ms", "shared"])
                
            # सभी घटनाओं को एक साथ लिखें
            writer.writerows(events)
    except Exception as e:
        logging.error(f"बैच इवेंट अपेंड त्रुटि: {e}")

3. अनुकूलित स्कैन आवृत्ति

def adaptive_scan_scheduling(self):
    """नेटवर्क की स्थिति के आधार पर स्कैन आवृत्ति को अनुकूलित करता है"""
    
    # ऑनलाइन डिवाइसों की संख्या और उपयोग पैटर्न के आधार पर आवृत्ति निर्धारित करें
    online_percentage = len(self.active_ips) / max(len(self.known_devices), 1) * 100
    
    if online_percentage < 20:  # अधिकांश डिवाइस ऑफलाइन हैं
        return max(self.refresh_interval / 2, 15)  # अधिक बार जांचें, लेकिन कम से कम 15 सेकंड
    elif online_percentage > 90:  # अधिकांश डिवाइस ऑनलाइन हैं
        return min(self.refresh_interval * 1.5, 60)  # कम बार जांचें, अधिकतम 60 सेकंड
    else:
        return self.refresh_interval  # सामान्य आवृत्ति का उपयोग करें

डेटा विश्लेषण के लिए अतिरिक्त उपकरण

CSV फ़ाइलें कई तरीके से विश्लेषण की जा सकती हैं। यहां एक उपयोगी स्क्रिप्ट दी गई है जो नेटवर्क उपलब्धता और प्रदर्शन रिपोर्ट उत्पन्न करती है:

def generate_availability_report(days=7):
    """अंतिम N दिनों के लिए डिवाइस उपलब्धता रिपोर्ट उत्पन्न करता है"""
    # इवेंट लॉग से डेटा लोड करें
    events_df = pd.read_csv(CONFIG["EVENT_LOG_FILE"])
    events_df['timestamp'] = pd.to_datetime(events_df['timestamp'])
    
    # समय सीमा निर्धारित करें
    end_date = datetime.now()
    start_date = end_date - timedelta(days=days)
    mask = (events_df['timestamp'] >= start_date) & (events_df['timestamp'] <= end_date)
    recent_events = events_df.loc[mask]
    
    # प्रत्येक डिवाइस के लिए अपटाइम कैलकुलेट करें
    device_stats = {}
    
    for ip in recent_events['ip'].unique():
        device_events = recent_events[recent_events['ip'] == ip].sort_values('timestamp')
        
        # समय अवधि की गणना करें
        uptime_minutes = 0
        last_online_time = None
        
        for _, row in device_events.iterrows():
            if row['new_status'] == 'ऑनलाइन':
                last_online_time = row['timestamp']
            elif row['new_status'] == 'ऑफलाइन' and last_online_time is not None:
                uptime_minutes += (row['timestamp'] - last_online_time).total_seconds() / 60
                last_online_time = None
                
        # अभी भी ऑनलाइन डिवाइसों के लिए अंतिम पॉइंट जोड़ें
        if last_online_time is not None:
            uptime_minutes += (end_date - last_online_time).total_seconds() / 60
            
        # कुल अवधि की गणना करें
        total_minutes = (end_date - start_date).total_seconds() / 60
        uptime_percentage = min(uptime_minutes / total_minutes * 100, 100) if total_minutes > 0 else 0
        
        # प्रतिक्रिया समय का औसत
        avg_response = device_events[device_events['response_time_ms'].notna()]['response_time_ms'].mean()
        
        device_stats[ip] = {
            'उपलब्धता_प्रतिशत': round(uptime_percentage, 2),
            'औसत_प्रतिक्रिया_ms': round(avg_response, 2) if not pd.isna(avg_response) else None,
            'स्थिति_परिवर्तन': len(device_events)
        }
    
    # डेटाफ्रेम में परिवर्तित करें और वापस करें
    result_df = pd.DataFrame.from_dict(device_stats, orient='index')
    result_df.index.name = 'ip'
    result_df.reset_index(inplace=True)
    
    return result_df

सुरक्षा लॉगिंग और अलर्ट

CSV संस्करण में संदिग्ध गतिविधियों को ट्रैक करने के लिए अतिरिक्त सुरक्षा विशेषताएं भी शामिल हैं:

def log_security_event(event_type, details, severity="मध्यम"):
    """सुरक्षा संबंधित घटनाओं को लॉग करता है"""
    now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    security_log_file = "security_events.csv"
    file_exists = os.path.exists(security_log_file)
    
    try:
        with open(security_log_file, "a", newline="", encoding=CONFIG["CSV_ENCODING"]) as f:
            writer = csv.writer(f)
            if not file_exists:
                writer.writerow(["timestamp", "event_type", "severity", "details"])
            writer.writerow([now_str, event_type, severity, details])
            
        # गंभीर घटनाओं के लिए तुरंत अलर्ट भेजें
        if severity == "उच्च":
            send_security_alert(event_type, details)
    except Exception as e:
        logging.error(f"सुरक्षा घटना लॉगिंग त्रुटि: {e}")

निष्कर्ष: CSV बनाम Excel – क्या सही है?

अंत में, हम दोनों दृष्टिकोणों का संक्षिप्त तुलनात्मक विश्लेषण करेंगे:

विशेषताExcel संस्करणCSV संस्करणकिसके लिए बेहतरविज़ुअल अपीलउच्च (रंग-कोडित सेल, फॉर्मेटिंग)निम्न (प्लेन टेक्स्ट)Excel: जब तत्काल विज़ुअल फीडबैक महत्वपूर्ण होस्केलेबिलिटीसीमितउच्चCSV: बड़े नेटवर्क या लंबी अवधि की निगरानी के लिएप्रदर्शनमध्यमउच्चCSV: संसाधन-प्रतिबंधित प्रणालियों के लिएऐतिहासिक विश्लेषणमध्यमउत्कृष्टCSV: जब डेटा विश्लेषण प्राथमिकता हैउपयोगकर्ता अनुभवसहजतकनीकीExcel: गैर-तकनीकी उपयोगकर्ताओं के लिए

प्रत्येक दृष्टिकोण के अपने फायदे हैं, और सही विकल्प आपकी विशिष्ट आवश्यकताओं पर निर्भर करता है। सौभाग्य से, इस प्रोजेक्ट का CSV संस्करण इस तरह से डिज़ाइन किया गया है कि यह वैकल्पिक रूप से अभी भी Excel फ़ाइल उत्पन्न कर सकता है, जिससे आप दोनों दुनिया का सर्वश्रेष्ठ प्राप्त कर सकते हैं।

आगे के विकास पथ

इस प्रोजेक्ट के लिए भविष्य के विकास में शामिल हो सकते हैं:

  1. ग्राफिकल डैशबोर्ड इंटीग्रेशन: Grafana या Power BI जैसे टूल के साथ एकीकरण
  2. एपीआई लेयर: रिमोट एक्सेस के लिए REST API
  3. मशीन लर्निंग अनुप्रयोग: असामान्य नेटवर्क व्यवहार का पता लगाने के लिए
  4. क्लाउड इंटीग्रेशन: लॉग और अलर्ट के लिए AWS या Azure सेवाओं के साथ एकीकरण

अंतिम विचार के रूप में, यह ध्यान देना महत्वपूर्ण है कि टूल के CSV संस्करण में अधिक जटिल विश्लेषण और मापनीयता की क्षमता है, जबकि Excel संस्करण तत्काल दृश्य प्रतिक्रिया प्रदान करता है। आपकी विशिष्ट परिस्थिति के आधार पर, आप दोनों दृष्टिकोणों को पूरक के रूप में उपयोग कर सकते हैं या अपनी प्राथमिकताओं के अनुरूप एक को चुन सकते हैं।

If you like this article, please
Follow !

आइये इस पोस्ट को साझा करें!
विषयसूची