Στην καθημερινή λειτουργία ενός τμήματος IT, πολλά περιστατικά ξεκινούν από μια φαινομενικά απλή ερώτηση. Είναι πράγματι εκτός λειτουργίας η συσκευή που αναφέρθηκε ή το πρόβλημα οφείλεται σε μια προσωρινή απώλεια πακέτων, σε καθυστέρηση του δικτύου ή σε κάποια διαφορετική υπηρεσία της υποδομής;
Όταν πρέπει να ελεγχθεί μία μόνο συσκευή, η απάντηση μπορεί να δοθεί εύκολα με μια απλή εντολή ping. Όταν όμως το περιβάλλον περιλαμβάνει switches, access points, εκτυπωτές, servers, workstations και άλλες δικτυακές συσκευές, ο χειροκίνητος έλεγχος παύει να είναι αποτελεσματικός. Το άνοιγμα πολλών παραθύρων γραμμής εντολών μπορεί να προσφέρει μια στιγμιαία εικόνα, αλλά δεν δημιουργεί μια οργανωμένη διαδικασία monitoring. Δεν διατηρεί το ιστορικό του συμβάντος, δεν ξεχωρίζει την προσωρινή απώλεια από μια πραγματική διακοπή και δεν ενημερώνει αυτόματα την ομάδα όταν η κατάσταση αλλάζει.
Αυτό ήταν το πρακτικό πρόβλημα που με οδήγησε στη δημιουργία του PingOS, μιας ελαφριάς desktop εφαρμογής για Windows, αναπτυγμένης με Python και PyQt5. Ο στόχος μου δεν ήταν να δημιουργήσω έναν αντικαταστάτη μεγάλων enterprise πλατφορμών monitoring. Ήθελα να σχεδιάσω ένα άμεσο και λειτουργικό εργαλείο, το οποίο θα μπορούσε να προσφέρει καθαρή εικόνα για επιλεγμένες συσκευές, να περιορίσει τους επαναλαμβανόμενους χειροκίνητους ελέγχους και να επιταχύνει την πρώτη φάση της διερεύνησης ενός συμβάντος.
Η έκδοση PingOS 2.1.0 μπορεί να παρακολουθεί ταυτόχρονα πολλαπλές IPv4 διευθύνσεις, να καταγράφει χρόνους απόκρισης και απώλειες πακέτων, να αναγνωρίζει παρατεταμένες διακοπές μέσω ρυθμιζόμενων ορίων και να αποστέλλει ειδοποιήσεις μέσω Windows, email και Microsoft Teams.
Το πρόβλημα πίσω από την ιδέα
Η εντολή ping είναι ένα από τα πιο χρήσιμα εργαλεία στην τεχνική υποστήριξη. Παρ’ όλα αυτά, από μόνη της παραμένει ένα αντιδραστικό εργαλείο. Κάποιος πρέπει πρώτα να αντιληφθεί το πρόβλημα, να το αναφέρει και στη συνέχεια το IT να ξεκινήσει τον έλεγχο. Μέχρι εκείνη τη στιγμή, η συσκευή μπορεί να έχει επανέλθει ή το πρόβλημα να εμφανίζεται μόνο διακοπτόμενα, με αποτέλεσμα η αιτία να είναι δυσκολότερο να εντοπιστεί.
Υπάρχει επίσης το ζήτημα των λανθασμένων συμπερασμάτων. Ένα αποτυχημένο πακέτο δεν σημαίνει απαραίτητα ότι μια συσκευή βρίσκεται εκτός λειτουργίας. Μπορεί να έχει υπάρξει στιγμιαία συμφόρηση, προσωρινή καθυστέρηση ή περιορισμός στις ICMP απαντήσεις. Ένα πραγματικά χρήσιμο monitoring εργαλείο πρέπει να λαμβάνει υπόψη τη συνέχεια των αποτελεσμάτων και όχι να βασίζεται σε μία μόνο αποτυχία.
Για αυτόν τον λόγο, ήθελα το PingOS να κάνει κάτι περισσότερο από το να εμφανίζει αν μια συσκευή απάντησε. Έπρεπε να παρακολουθεί τη συμπεριφορά της στον χρόνο, να διαχωρίζει την απλή απώλεια πακέτων από μια επιβεβαιωμένη διακοπή και να ενημερώνει τον χρήστη μόνο όταν συνέβαινε μια ουσιαστική αλλαγή κατάστασης.
Από ένα απλό script σε ολοκληρωμένη εφαρμογή
Η αποστολή ενός ping με Python μπορεί να υλοποιηθεί με ελάχιστες γραμμές κώδικα. Η δημιουργία όμως μιας ολοκληρωμένης εφαρμογής απαιτεί πολύ περισσότερα. Χρειάζεται διαχείριση κατάστασης, ταυτόχρονη εκτέλεση εργασιών, αποθήκευση δεδομένων, ειδοποιήσεις, χειρισμό σφαλμάτων, ρυθμίσεις και ένα περιβάλλον χρήσης που να παραμένει λειτουργικό ακόμη και όταν εκτελούνται συνεχείς δικτυακοί έλεγχοι.
Για το γραφικό περιβάλλον επέλεξα το PyQt5. Η βιβλιοθήκη προσφέρει τα απαραίτητα εργαλεία για τη δημιουργία desktop εφαρμογών, όπως παράθυρα, μενού, dialogs, system tray notifications, signals και background threads. Σε αντίθεση με ένα command line εργαλείο, το PingOS μπορεί να παρουσιάσει πολλές συσκευές σε μία ενιαία οθόνη και να καταστήσει άμεσα ορατές τις σημαντικότερες αλλαγές.
Για την αποστολή των ICMP ελέγχων χρησιμοποιείται η βιβλιοθήκη ping3. Η τοπική αποθήκευση aliases πραγματοποιείται μέσω SQLite, ενώ οι ομάδες συσκευών και οι ρυθμίσεις της εφαρμογής αποθηκεύονται σε JSON. Οι ειδοποιήσεις email αποστέλλονται μέσω SMTP με κρυπτογράφηση STARTTLS και η επικοινωνία με το Microsoft Teams πραγματοποιείται μέσω Teams Workflows webhook και Adaptive Cards.
Η επιλογή αυτών των τεχνολογιών δεν έγινε μόνο για λόγους ευκολίας. Κάθε εργαλείο έχει συγκεκριμένο ρόλο μέσα στην εφαρμογή. Το PyQt5 διαχειρίζεται την παρουσίαση και την αλληλεπίδραση, το ping3 εκτελεί τους δικτυακούς ελέγχους, το SQLite αποθηκεύει τα στοιχεία των συσκευών, το JSON διατηρεί φορητές ρυθμίσεις και οι εξωτερικές υπηρεσίες αναλαμβάνουν την αποστολή ειδοποιήσεων.
Διατηρώντας το περιβάλλον χρήσης responsive
Μία από τις σημαντικότερες τεχνικές αποφάσεις ήταν ο διαχωρισμός των δικτυακών ελέγχων από το βασικό thread του γραφικού περιβάλλοντος.
Ένα ping δεν επιστρέφει πάντα άμεσα. Μπορεί να περιμένει μέχρι να λήξει το timeout, να επαναληφθεί πολλές φορές ή να αποτύχει λόγω κάποιου προσωρινού δικτυακού προβλήματος. Αν όλοι αυτοί οι έλεγχοι εκτελούνταν μέσα στο ίδιο thread που ενημερώνει το παράθυρο της εφαρμογής, το PingOS θα πάγωνε κάθε φορά που κάποια συσκευή καθυστερούσε να απαντήσει.
Για την αποφυγή αυτού του προβλήματος, κάθε host παρακολουθείται από το δικό του QThread worker. Ο worker εκτελεί τον κύκλο των ping, διατηρεί τους μετρητές των πακέτων και παρακολουθεί την κατάσταση της συγκεκριμένης συσκευής. Τα αποτελέσματα αποστέλλονται στο βασικό περιβάλλον μέσω PyQt signals, επιτρέποντας στο interface να ενημερώνεται με ασφάλεια χωρίς να διακόπτεται η λειτουργία του.
Η προσέγγιση αυτή είναι κατάλληλη για τον σκοπό και την κλίμακα της τρέχουσας εφαρμογής. Κάθε συσκευή διαθέτει ανεξάρτητη κατάσταση και οι καθυστερήσεις ενός host δεν επηρεάζουν την παρακολούθηση των υπολοίπων. Για πολύ μεγαλύτερες εγκαταστάσεις με εκατοντάδες ή χιλιάδες targets, μια μελλοντική έκδοση θα μπορούσε να χρησιμοποιεί ελεγχόμενο worker pool ή asynchronous αρχιτεκτονική.
Μείωση των λανθασμένων ειδοποιήσεων
Ένα από τα βασικά προβλήματα των απλών monitoring scripts είναι ότι συχνά αντιμετωπίζουν κάθε αποτυχημένη απάντηση ως διακοπή λειτουργίας. Αυτό μπορεί να οδηγήσει σε υπερβολικές ειδοποιήσεις και να μειώσει την εμπιστοσύνη των χρηστών στο εργαλείο.
Το PingOS χρησιμοποιεί ρυθμιζόμενο αριθμό προσπαθειών και όριο συνεχόμενων απωλειών. Πριν καταγραφεί ένας κύκλος ως αποτυχημένος, η εφαρμογή μπορεί να επαναλάβει τον έλεγχο πολλές φορές. Αν η συσκευή συνεχίσει να μην απαντά, αυξάνεται ο μετρητής των συνεχόμενων απωλειών. Η κατάσταση αλλάζει σε offline μόνο όταν ξεπεραστεί το όριο που έχει ορίσει ο χρήστης.
Η ίδια λογική εφαρμόζεται και κατά την αποκατάσταση. Μία μεμονωμένη επιτυχημένη απάντηση δεν αρκεί απαραίτητα για να θεωρηθεί ότι η συσκευή έχει επανέλθει σταθερά. Η εφαρμογή περιμένει διαδοχικές επιτυχημένες απαντήσεις πριν αλλάξει ξανά την κατάσταση σε online.
Με αυτόν τον τρόπο δημιουργείται ένα απλό αλλά αποτελεσματικό μοντέλο κατάστασης. Η συσκευή μπορεί να εμφανίζεται ως διαθέσιμη, να παρουσιάζει απώλεια πακέτων, να χαρακτηρίζεται offline μετά από επαναλαμβανόμενες αποτυχίες και στη συνέχεια να επιστρέφει σε online κατάσταση όταν επιβεβαιωθεί η αποκατάστασή της.
Μετατρέποντας τα δεδομένα σε χρήσιμη πληροφορία
Η συλλογή αποτελεσμάτων δεν αρκεί αν ο χρήστης δεν μπορεί να εντοπίσει γρήγορα τι χρειάζεται την προσοχή του. Για αυτόν τον λόγο, το PingOS χρησιμοποιεί διαφορετικά χρώματα για κάθε βασική κατάσταση.
Οι επιτυχημένες απαντήσεις εμφανίζονται με πράσινο χρώμα, η ανίχνευση απώλειας πακέτων με κίτρινο και μια επιβεβαιωμένη διακοπή με κόκκινο. Για κάθε συσκευή εμφανίζονται το alias, η IP διεύθυνση, ο χρόνος απόκρισης και οι συνολικοί αριθμοί πακέτων που στάλθηκαν, ελήφθησαν ή χάθηκαν.
Μία από τις πιο πρακτικές λειτουργίες είναι η αυτόματη μετακίνηση μιας offline συσκευής στην κορυφή της λίστας. Σε ένα περιβάλλον με πολλές καταχωρίσεις, ένα κρίσιμο αποτέλεσμα δεν πρέπει να παραμένει κρυμμένο ανάμεσα στις διαθέσιμες συσκευές. Η εφαρμογή δίνει προτεραιότητα στις εξαιρέσεις και βοηθά τον χρήστη να επικεντρωθεί αμέσως στο σημείο που απαιτεί διερεύνηση.
Το PingOS επιτρέπει επίσης την εκκίνηση και τη διακοπή όλων των ελέγχων, αλλά και τη διαχείριση κάθε συσκευής ξεχωριστά. Μέσα από το context menu ο χρήστης μπορεί να ξεκινήσει ή να σταματήσει ένα συγκεκριμένο monitor, να επεξεργαστεί το alias ή να αφαιρέσει τη συσκευή από τη λίστα.
Ειδοποιήσεις μόνο όταν υπάρχει πραγματική αλλαγή
Ένα monitoring εργαλείο μπορεί εύκολα να γίνει ενοχλητικό αν αποστέλλει συνεχώς το ίδιο μήνυμα. Αν μια συσκευή παραμείνει offline για δέκα λεπτά, δεν υπάρχει λόγος να δημιουργείται νέα ειδοποίηση σε κάθε αποτυχημένο ping.
Το PingOS παρακολουθεί τόσο την τρέχουσα όσο και την προηγούμενη κατάσταση κάθε host. Οι ειδοποιήσεις ενεργοποιούνται όταν εντοπιστεί πραγματική μετάβαση, όπως όταν μια συσκευή αλλάζει από online σε offline ή όταν επανέρχεται σε λειτουργία. Με αυτόν τον τρόπο μειώνεται ο περιττός θόρυβος και οι ειδοποιήσεις αποκτούν μεγαλύτερη αξία.
Η εφαρμογή υποστηρίζει τρία διαφορετικά κανάλια ειδοποιήσεων. Οι τοπικές Windows notifications εμφανίζονται μέσω του system tray και είναι χρήσιμες όταν η εφαρμογή εκτελείται στο workstation ενός διαχειριστή. Οι ειδοποιήσεις email αποστέλλονται μέσω παραμετροποιήσιμου SMTP server, ενώ οι ειδοποιήσεις Microsoft Teams χρησιμοποιούν ένα Workflows webhook.
Για το Teams δημιουργείται Adaptive Card που περιλαμβάνει τον τίτλο του συμβάντος, τη συσκευή, τη χρονική στιγμή και διαφορετική οπτική ένδειξη ανάλογα με το αν πρόκειται για διακοπή ή αποκατάσταση. Η εφαρμογή ελέγχει επίσης την απάντηση του webhook και καταγράφει αποτυχίες επικοινωνίας χωρίς να διακόπτει την κύρια λειτουργία του monitoring.
Αποθήκευση συσκευών και ρυθμίσεων
Οι IP διευθύνσεις δεν είναι πάντοτε εύκολο να αναγνωριστούν, ιδιαίτερα όταν ο χρήστης διαχειρίζεται πολλές διαφορετικές συσκευές. Για αυτόν τον λόγο, το PingOS επιτρέπει την αντιστοίχιση κάθε IP με ένα κατανοητό alias.
Τα aliases αποθηκεύονται σε τοπική βάση SQLite και χρησιμοποιούνται επίσης από το autocomplete της εφαρμογής. Καθώς ο χρήστης πληκτρολογεί, το PingOS αναζητά αντιστοιχίες τόσο στις IP διευθύνσεις όσο και στα αποθηκευμένα ονόματα.
Οι ομάδες συσκευών μπορούν να αποθηκευτούν σε αρχεία JSON και να φορτωθούν ξανά σε επόμενη συνεδρία. Με αυτόν τον τρόπο είναι δυνατό να δημιουργηθούν διαφορετικές συλλογές για κτίρια, τμήματα, γραφεία ή κατηγορίες εξοπλισμού.
Σε ξεχωριστό αρχείο JSON αποθηκεύονται οι βασικές ρυθμίσεις της εφαρμογής, όπως το διάστημα ανάμεσα στους ελέγχους, το timeout, το μέγεθος πακέτου, ο αριθμός προσπαθειών, το όριο συνεχόμενων απωλειών, τα ενεργά κανάλια ειδοποιήσεων, τα χρώματα και το μέγεθος της γραμματοσειράς.
Σχεδιάζοντας ένα εργαλείο και όχι απλώς ένα script
Κατά την ανάπτυξη του PingOS, προσπάθησα να αντιμετωπίσω το project ως ολοκληρωμένο προϊόν και όχι ως ένα προσωρινό script. Για αυτόν τον λόγο, η εφαρμογή διαθέτει ξεχωριστά dialogs για τις ρυθμίσεις του ping, την εμφάνιση και τις ειδοποιήσεις.
Ο χρήστης μπορεί να προσαρμόσει το interval, το timeout, το packet size, τις επαναλήψεις και το loss threshold χωρίς να χρειάζεται να τροποποιήσει τον κώδικα. Μπορεί επίσης να αλλάξει τα χρώματα κάθε κατάστασης, το μέγεθος των γραμμάτων και τις ρυθμίσεις των εξωτερικών ειδοποιήσεων.
Η εφαρμογή περιλαμβάνει ακόμη ενσωματωμένο user manual, About dialog, system tray icon και shortcuts για βασικές λειτουργίες. Αυτές οι λεπτομέρειες μπορεί να μη σχετίζονται άμεσα με τη δικτυακή λειτουργία, αλλά συμβάλλουν σημαντικά στη χρηστικότητα και στην αίσθηση ότι πρόκειται για ένα ολοκληρωμένο desktop εργαλείο.
Τι έμαθα από την ανάπτυξη του PingOS
Το PingOS ξεκίνησε από μια απλή λειτουργική ανάγκη, αλλά εξελίχθηκε σε μια άσκηση συνολικού σχεδιασμού λογισμικού. Το δυσκολότερο μέρος δεν ήταν η αποστολή του ICMP request. Ήταν ο συντονισμός όλων των υπόλοιπων στοιχείων γύρω από αυτό.
Χρειάστηκε να διαχειριστώ την ταυτόχρονη εκτέλεση εργασιών, τη μετάβαση μεταξύ διαφορετικών καταστάσεων, την επικοινωνία των threads με το interface, την αποθήκευση δεδομένων, τις εξωτερικές υπηρεσίες και την ασφαλή αντιμετώπιση σφαλμάτων.
Το project ενίσχυσε επίσης μια αρχή που θεωρώ σημαντική για κάθε μορφή IT automation. Η αυτοματοποίηση δεν έχει αξία μόνο επειδή μειώνει τον αριθμό των χειροκίνητων ενεργειών. Έχει πραγματική αξία όταν βελτιώνει την ορατότητα, περιορίζει την αβεβαιότητα, οργανώνει τη διαθέσιμη πληροφορία και βοηθά τους ανθρώπους να αντιδράσουν γρηγορότερα και με μεγαλύτερη σιγουριά.
Περιορισμοί και επόμενα βήματα
Η έκδοση 2.1.0 αποτελεί μια λειτουργική βάση, αλλά υπάρχουν αρκετοί τομείς που μπορούν να βελτιωθούν.
Η εφαρμογή επικεντρώνεται σήμερα σε IPv4 διευθύνσεις και ICMP monitoring. Μια μελλοντική έκδοση θα μπορούσε να υποστηρίζει hostnames, IPv6, TCP ports, HTTP endpoints, DNS checks και ελέγχους συγκεκριμένων υπηρεσιών.
Το ιστορικό των αποτελεσμάτων διατηρείται κατά τη διάρκεια της εκτέλεσης, αλλά δεν αποθηκεύεται ακόμη μόνιμα ούτε παρουσιάζεται μέσα από γραφήματα και αναφορές. Η αποθήκευση συμβάντων σε SQLite θα επέτρεπε τη δημιουργία outage timelines, latency charts και συγκριτικών reports.
Ένα ακόμη σημαντικό σημείο είναι η ασφαλής αποθήκευση credentials. Οι ρυθμίσεις SMTP αποθηκεύονται σήμερα τοπικά μαζί με τις υπόλοιπες επιλογές. Σε μια επόμενη έκδοση, τα ευαίσθητα στοιχεία θα πρέπει να μεταφερθούν στο credential manager του λειτουργικού συστήματος ή σε αντίστοιχη ασφαλή λύση.
Η αρχιτεκτονική με ένα thread ανά host λειτουργεί αποτελεσματικά στην κλίμακα για την οποία σχεδιάστηκε το PingOS. Για μεγαλύτερα περιβάλλοντα, θα εξέταζα τη χρήση ενός ελεγχόμενου worker pool ή asynchronous μηχανισμού. Στα επόμενα βήματα περιλαμβάνονται επίσης η προσθήκη unit tests, η βελτίωση του logging, η δημιουργία exports και η ανάπτυξη καλύτερου packaging και update mechanism.
Τελικές σκέψεις
Το PingOS δεν δημιουργήθηκε για να αντικαταστήσει πλατφόρμες όπως το Zabbix, το PRTG, το Nagios ή το Prometheus. Δημιουργήθηκε για να καλύψει μια πιο συγκεκριμένη ανάγκη. Να προσφέρει σε έναν διαχειριστή άμεση και καθαρή εικόνα για μια επιλεγμένη ομάδα δικτυακών συσκευών, χωρίς περίπλοκη εγκατάσταση και χωρίς να απαιτείται συνεχής χειροκίνητος έλεγχος.
Η ανάπτυξή του με βοήθησε να μετατρέψω ένα απλό διαγνωστικό σενάριο σε μια ολοκληρωμένη εφαρμογή με concurrency, state management, persistence, notifications, configuration και user interface.
Το project αντιπροσωπεύει επίσης τον τρόπο με τον οποίο προσεγγίζω γενικότερα τα προβλήματα του IT. Ξεκινώ κατανοώντας τη λειτουργική ανάγκη, εντοπίζω τα επαναλαμβανόμενα ή αναξιόπιστα σημεία της υπάρχουσας διαδικασίας και στη συνέχεια σχεδιάζω μια πρακτική λύση που μπορεί να χρησιμοποιηθεί, να αξιολογηθεί και να εξελιχθεί.
Το PingOS συνεχίζει να αναπτύσσεται, αλλά ο βασικός του στόχος παραμένει ξεκάθαρος. Να μετατρέψει τους αντιδραστικούς δικτυακούς ελέγχους σε προληπτική, οργανωμένη και αξιοποιήσιμη παρακολούθηση.
