diff options
-rw-r--r-- | check.py | 44 | ||||
-rwxr-xr-x | gard-v2.py | 124 |
2 files changed, 57 insertions, 111 deletions
@@ -1,13 +1,26 @@ #!/usr/bin/python +import logging import urllib2 import time import rfc822 class GardCheck: # Base class which provides some helper functions - def __init__(self, url): + def __init__(self, url, log=True): self.url = url + if log: + self.logger = logging.getLogger('') + else: + self.logger = None + + def log_info(self, msg): + if self.logger is not None: + self.logger.info(msg) + + def log_error(self, msg): + if self.logger is not None: + self.logger.error(msg) def check_file_exists(self, url): ret = True @@ -40,7 +53,7 @@ class GardCheck: return ts - def get_lag(self, path, verbose=False): + def get_lag(self, path): ts = self._get_timestamp_from_url(self.url + path) now = time.mktime(time.gmtime()) if ts is None or now < ts: @@ -51,7 +64,7 @@ class GardCheck: mins, secs = divmod(secs, 60) hours, mins = divmod(mins, 60) days, hours = divmod(hours, 24) - return '%02d d %02dh %02d m %02d s' % (days, hours, mins, secs) + return '%02dd %02dh %02dm %02ds' % (days, hours, mins, secs) def timestamp_to_secs(self, ts): return rfc822.mktime_tz(rfc822.parsedate_tz(ts)) @@ -70,18 +83,15 @@ class DistfilesCheck(GardCheck): path = '/distfiles/timestamp.chk' return self.get_lag(path) - def check(self, maxlag, verbose=False): - # XXX: Replace 'verbose' with a logger object - + def check(self, maxlag): lag = self.lag() if lag is None: - print 'ERROR: Could not get distfiles timestamp for ' + self.url + self.log_error('Could not get distfiles timestamp for ' + self.url) ret = False elif lag > maxlag: - if verbose is True: - print 'ERROR: distfiles at %s is lagging\n\tdelta is %s' \ - % (self.url, self.humanize_time(lag)) + self.log_error('Distfiles at %s is lagging (delta is %s)' \ + % (self.url, self.humanize_time(lag))) ret = False else: ret = True @@ -94,18 +104,15 @@ class ReleasesCheck(GardCheck): path = '/releases/.test/timestamp.x' return self.get_lag(path) - def check(self, maxlag, verbose=False): - # Verify that releases aren't lagging - + def check(self, maxlag): lag = self.lag() if lag is None: - print 'ERROR: Could not get releases timestamp for ' + self.url + self.log_error('Could not get releases timestamp for ' + self.url) ret = False elif lag > maxlag: - if verbose is True: - print 'ERROR: releases at %s is lagging\n\tdelta is %s' \ - % (self.url, self.humanize_time(lag)) + self.log_error('Releases at %s is lagging (delta is %s)' \ + % (self.url, self.humanize_time(lag))) ret = False else: ret = True @@ -113,8 +120,7 @@ class ReleasesCheck(GardCheck): # Verify that releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt # is not world readable if self.check_file_exists(self.url+'releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt'): - if verbose is True: - print 'ERROR: THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt is visible on %s' % self.url + self.log_error('ERROR: releases permission check failed on %s' % self.url) ret = False return ret @@ -13,9 +13,11 @@ import datetime import subprocess import logging +import check + rmaxlag=45 -dmaxlag=5.5 -relmaxlag=2 +dmaxlag = 5.5 * 3600 +relmaxlag = 2 * 3600 HOME = os.getenv('HOME') reportpath = HOME + "/gentoo/mirrors/gard/reports" @@ -36,84 +38,6 @@ def add_handler(logfile): def remove_handler(handler): logging.getLogger('').removeHandler(handler) -def mirrorcheck(target): - retcode1=subprocess.call(['/usr/bin/wget','-q','-T 30',target]) - if retcode1 > 0: - logging.error("return value of wget during mirrorcheck was "+str(retcode1)) - return - else: - temp=open('timestamp.chk','r') - ots=temp.readline() - temp.close() - #Keep timestamp as Fri, 04 Jul 2008 20:45:01, remove the +0000 since there doesn't seem to be a %z in python - t1=time.mktime(time.strptime(ots.replace(" +0000",""), "%a, %d %b %Y %H:%M:%S ")) - lag=(time.mktime(time.gmtime())-t1)/(60*60) - gmt=time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()) - if lag > dmaxlag: - error1 = "distfiles is over 5.5 hours behind, lag is : "+str(round(lag,2))+" hours" - tstamp1 = "Timestamp on Mirror : "+str(ots).strip() - curtime1 = "Current time in UTC : "+str(time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())) - bugurl1 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate - logging.error(error1) - logging.info(tstamp1) - logging.info(curtime1) - logging.info(bugurl1) - else: - info1 = addy+" is in sync, current delta : "+str(round(lag,2))+" hours" - tstamp1 = "Timestamp on Mirror : "+str(ots) - curtime1 = "Current time in UTC : "+str(time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())) - bugurl1 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate - logging.info(info1) - logging.info(tstamp1) - logging.info(curtime1) - logging.info(bugurl1) - os.unlink('timestamp.chk') - return - -def relpermcheck(target): - retcode2=subprocess.call(['/usr/bin/wget','-q','-T 30',target]) - if retcode2 < 1: - logging.error("return value of wget for /releases file perm check was "+str(retcode2)+" which means the file is world accessible!") - os.unlink('THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt') - return - -def reltscheck(target): - retcode3=subprocess.call(['/usr/bin/wget','-q','-T 30',target]) - if retcode3 > 0: - logging.error("return value of wget for release timestamp check was "+str(retcode3)) - return - else: - temp=open('timestamp.x','r') - ots=temp.readline() - temp.close() - ts=ots.split(' ') - nots=ts[1]+" "+ts[2]+" "+ts[3]+" "+ts[4]+" "+ts[5]+" " - #Keep timestamp as Fri, 04 Jul 2008 20:45:01, remove the +0000 since there doesn't seem to be a %z in python - t1=time.mktime(time.strptime(nots, "%a, %d %b %Y %H:%M:%S ")) - lag=(time.mktime(time.gmtime())-t1)/(60*60*24) - gmt=time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()) - if lag > relmaxlag: - error3 = "releases is over 2 days behind, lag is : "+str(round(lag,2))+" days" - tstamp3 = "Timestamp on Mirror : "+nots - curtime3 = "Current time in UTC : "+str(time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())) - bugurl3 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate - logging.error(error3) - logging.info(tstamp3) - logging.info(curtime3) - logging.info(bugurl3) - else: - info3 = addy+"'s releases dir is in sync, current delta : "+str(round(lag,2))+" days" - tstamp3 = "Timestamp on Mirror : "+nots - curtime3 = "Current time in UTC : "+str(time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())) - bugurl3 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate - logging.info(info3) - logging.info(tstamp3) - logging.info(curtime3) - logging.info(bugurl3) - os.unlink('timestamp.x') - return - - retcode5=subprocess.call(['/usr/bin/wget','-q','-T 30', '-O', fname, bugurl]) file=open(fname,'r') logging.debug("Initializing G(entoo)A(utomated)R(sync)D(istfiles) checker script, version 2 (Katrina) - kicking mirror ass for Gentoo") @@ -203,12 +127,20 @@ for line in file: handler = add_handler(fname) info5 = addy+" wants to be distfiles mirror and is being checked as per Bug #"+bugnum+ " over http" logging.info(info5) - disttsdest=http+"/distfiles/timestamp.chk" - mirrorcheck(disttsdest) - reltsdest=http+"/releases/.test/timestamp.x" - reltscheck(reltsdest) - relpermdest=http+"/releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt" - relpermcheck(relpermdest) + + synced = True + if check.DistfilesCheck(http).check(dmaxlag) is not True: + synced = False + if check.ReleasesCheck(http).check(relmaxlag) is not True: + synced = False + if synced: + logging.info(addy + ' is in sync') + else: + logging.info(addy + ' is out of sync') + + bugurl1 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate + logging.info(bugurl1) + # New line for the prettiness logging.info('') remove_handler(handler) @@ -221,12 +153,20 @@ for line in file: add_handler(fname) info6 = addy+" wants to be an distfiles mirror and is being checked as per Bug #"+bugnum+ " over ftp" logging.info(info6) - ftpdest=ftp+"/distfiles/timestamp.chk" - mirrorcheck(ftpdest) - reltsdest=ftp+"/releases/.test/timestamp.x" - reltscheck(reltsdest) - relpermdest=ftp+"/releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt" - relpermcheck(relpermdest) + + synced = True + if check.DistfilesCheck(ftp).check(dmaxlag) is not True: + synced = False + if check.ReleasesCheck(ftp).check(relmaxlag) is not True: + synced = False + if synced: + logging.info(addy + ' is in sync') + else: + logging.info(addy + ' is out of sync') + + bugurl1 = "Bug URL : https://bugs.gentoo.org/"+bugnum+" , "+duedate + logging.info(bugurl1) + # New line for the prettiness logging.info('') remove_handler(handler) |