Ping monitor - monitor ip in the background?

Andrey Balaguta andrey.balaguta at gmail.com
Sun Nov 2 08:54:09 CET 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