Ping monitor - monitor ip in the background?
Andrey Balaguta
andrey.balaguta at gmail.com
Sun Nov 2 02:54:09 EST 2008
Hi, ScottZ.
I I have to write such a thing, I'll wrap the whole thing into some
class, say Pinger. It will have "do" method, which will perform one
particular pinging action. It'll also have a start/stop mechanism,
which will start a thread to continuously pinging a host. To notify
environment (say, yours tray icon) about host state change (dead/
alive), it will have callback mechanism (register_callback/
unregister_callback). Here, I've written a simple implementation,
maybe this will be helpful.
====== pinger.py ================
import os
import threading
import subprocess
import re
import time
class Pinger:
def __init__(self, ip = None):
self.ip = None
self.running = False
self.callbacks = list()
self.setAddress(ip)
def setAddress(self, ip):
if self.ip != ip:
if self.running:
self.stop()
self.ip = ip
def do(self):
if os.name == "nt": # Windows
pcmd = "ping -n 1 -w 1000 "
else: # *nix
pcmd = "ping -c1 -W1 "
p = subprocess.Popen(pcmd + self.ip, shell=True,
stdout=subprocess.PIPE)
# give it time to respond
p.wait()
a = re.search('(.*)ms', p.stdout.read())
if a:
return True
else:
return False
def start(self):
def run():
result = False
while self.running:
next = self.do()
if next != result and self.running:
[ callback(next) for callback in self.callbacks ]
result = next
self.ping_thread = threading.Thread(target = run)
self.running = True
self.ping_thread.start()
def stop(self):
self.running = False
def register_callback(self, callback):
if callback not in self.callbacks:
self.callbacks.append(callback)
def unregister_callback(self, callback):
if callback in self.callbacks:
self.callbacks.remove(callback)
if __name__ == '__main__':
p = Pinger('192.168.1.1')
def printout(alive):
if alive:
print 'Host is alive.'
else:
print 'Host is dead.'
p.register_callback(printout)
p.start()
while True:
print "Ding..."
time.sleep(1)
================
Note that printout will be called ONLY if host state has changed, not
on EVERY ping.
--
Best Regards, Andrey Balaguta
More information about the Python-list
mailing list