1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#!/usr/bin/python
import os
import urllib2
import time
import rfc822
class GardCheck:
# Base class which provides some helper functions
def __init__(self, url):
self.url = url
# Overridde in child classes
def check(self):
return True
def humanize_time(self, secs):
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)
def timestamp_to_secs(self, ts):
return rfc822.mktime_tz(rfc822.parsedate_tz(ts))
class DistCheck(GardCheck):
# can only be used from Python 2.6 onwards
HTTP_TIMEOUT = 30
# Takes the URL to a timestamp.{chk|x} file and returns the
# corresponding time stamp in seconds
def _get_timestamp_from_url(self, url):
try:
f = urllib2.urlopen(url)
date = f.read()
f.close()
if date is None or len(date) == 0:
raise ValueError
try:
# timestamp.chk format
ts = self.timestamp_to_secs(date)
except:
# timestamp.x format?
ts = float(date.split(' ')[0])
except:
print 'ERROR: Could not get timestamp from ' + url
return None
return ts
def _check_file_exists(self, url):
ret = True
try:
f = urllib2.urlopen(url)
if len(f.read()) == 0:
raise IOError
except:
ret = False
return ret
def check(self, maxdlag, maxrlag, verbose=False):
# XXX: Replace 'verbose' with a logger object
ret = True
# Verify that distfiles aren't lagging
now = time.mktime(time.gmtime())
ts = self._get_timestamp_from_url(self.url+'/distfiles/timestamp.chk')
if ts is not None and ((now - ts) > maxdlag or (now - ts) < 0):
if verbose is True:
print 'ERROR: distfiles at %s is lagging by %s' \
% (self.url, self.humanize_time(now - ts))
ret = False
# Verify that releases aren't lagging
ts = self._get_timestamp_from_url(self.url+'/releases/.test/timestamp.x')
if ts is not None and ((now - ts) > maxrlag or (now - ts) < 0):
if verbose is True:
print 'ERROR: releases at %s is lagging by %s seconds' \
% (self.url, self.humanize_time(now - ts))
ret = False
# 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 to the outside world'
ret = False
return ret
|