#!/usr/bin/env python import sys import imp import urllib import os import popen2 def abort(s): sys.stderr.write("%s\n" % s) sys.exit(1) def usage(): abort("Usage: %s configFile" % sys.argv[0]) def importModule(name): try: return sys.modules[name] except KeyError: pass try: fp,pathname,description=imp.find_module(name) except: raise "Cannot find module '%s'" % name try: return imp.load_module(name, fp, pathname, description) except: if fp: fp.close() raise "Cannot load module '%s'" % name else: fp.close() def urlFile(url): for c in "/:": url=url.replace(c,"_") return url def pipeNoInput(cmd,get_stdout=1,get_stderr=1): (stdout,stdin,stderr)=popen2.popen3(cmd) stdin.close() if get_stdout: out=stdout.read() else: out=None stdout.close() if get_stderr: err=stderr.read() else: err=None stderr.close() return (out,err) def makeDiff(old,new): files=[] s=(old,new) names=("old","new") for i in range(2): fileName=names[i] file=open(fileName,"w") file.write(s[i]) file.close() command="diff -s -B %s %s" % names (out,err)=pipeNoInput(command,get_stderr=0) if out.find("Files %s and %s are identical" % names)==-1: return out else: return None def mail(fromAddress,toAddress,subject,body): messagebody="To: %s\nReply-To: %s\nFrom: %s\nSubject:%s\n%s\n" % (toAddress,toAddress,fromAddress,subject,body) f=os.popen("/usr/sbin/sendmail -F%s %s" % (fromAddress,toAddress),"w") f.write(messagebody) f.close() def checkUrl(url): sys.stdout.write("Checking url %s ... " % url) f=urllib.urlopen(url) new=f.read() f.close() file="%s/%s" % (cacheDir,urlFile(url)) try: fold=open(file) old=fold.read() fold.close() except: old=None if old==None: sys.stdout.write("first check\n") else: diff=makeDiff(old,new) if diff: sys.stdout.write("differs\n") mail(fromAddress,toAddress,"Webtrack change: %s" % url,diff) else: sys.stdout.write("unchanged\n") return fold=open(file,"w") fold.write(new) fold.close() try: configFile=sys.argv[1] except: usage() if "/" in configFile: path="/".join(configFile.split("/")[:-1]) sys.path.append(path) configFile=configFile.split("/")[-1] config=importModule(configFile) fromAddress=config.fromAddress toAddress=config.toAddress cacheDir=config.cacheDir tmpDir=config.tmpDir os.chdir(tmpDir) try: urls=config.urls except: abort("Missing directive 'urls' in the configuration file") for url in urls: checkUrl(url)