|
|
@ -11,10 +11,12 @@ import time |
|
|
|
import config |
|
|
|
from log import notice |
|
|
|
|
|
|
|
def getTime(date): |
|
|
|
|
|
|
|
def get_time(date): |
|
|
|
return time.mktime(time.strptime(date, "%a, %d %b %Y %H:%M:%S %Z")) |
|
|
|
|
|
|
|
def getDate(relfile): |
|
|
|
|
|
|
|
def get_date(relfile): |
|
|
|
match = re.search('Date: .+', relfile) |
|
|
|
if match: |
|
|
|
line = relfile[match.start():match.end()] |
|
|
@ -22,36 +24,36 @@ def getDate(relfile): |
|
|
|
return relfile |
|
|
|
|
|
|
|
|
|
|
|
def parseRel(reltext): |
|
|
|
def parse_release(reltext): |
|
|
|
hash = {} |
|
|
|
match = re.search('SHA256:+', reltext) |
|
|
|
if match: |
|
|
|
line = reltext[match.start():-1] |
|
|
|
for i in line.split('\n'): |
|
|
|
if i == 'SHA256:' or i == '\n': # XXX: hack |
|
|
|
if i == 'SHA256:' or i == '\n': # XXX: hack |
|
|
|
continue |
|
|
|
hash[(i.split()[2])] = i.split()[0] |
|
|
|
return hash |
|
|
|
|
|
|
|
|
|
|
|
def pkgParse(entry): |
|
|
|
def parse_package(entry): |
|
|
|
# for parsing a single package |
|
|
|
values = re.split('\\n[A-Z].+?:', entry)[0:] |
|
|
|
values[0] = values[0].split(':')[1] |
|
|
|
keys = re.findall('\\n[A-Z].+?:', '\n'+entry) |
|
|
|
keys = re.findall('\\n[A-Z].+?:', '\n' + entry) |
|
|
|
both = zip(keys, values) |
|
|
|
return {key.lstrip(): value for key, value in both} |
|
|
|
|
|
|
|
|
|
|
|
def parsePkgs(pkgtext): |
|
|
|
def parse_packages(pkgtext): |
|
|
|
# this parses our package file into a hashmap |
|
|
|
# key: package name, value: entire package paragraph as a hashmap |
|
|
|
map = {} |
|
|
|
|
|
|
|
# TODO: consider also this approach |
|
|
|
#def parsePkgs(pkgfilepath): |
|
|
|
#with gzip.open(pkgfilepath, "rb") as f: |
|
|
|
# pkgs = f.read().split("\n\n") |
|
|
|
# def parse_packages(pkgfilepath): |
|
|
|
# with gzip.open(pkgfilepath, "rb") as f: |
|
|
|
# pkgs = f.read().split("\n\n") |
|
|
|
|
|
|
|
pkgs = pkgtext.split("\n\n") |
|
|
|
for pkg in pkgs: |
|
|
@ -59,11 +61,11 @@ def parsePkgs(pkgtext): |
|
|
|
if m: |
|
|
|
line = pkg[m.start():m.end()] |
|
|
|
key = line.split(': ')[1] |
|
|
|
map[key] = pkgParse(pkg) |
|
|
|
map[key] = parse_package(pkg) |
|
|
|
return map |
|
|
|
|
|
|
|
|
|
|
|
def printPkg(map, pkgname): |
|
|
|
def print_package(map, pkgname): |
|
|
|
try: |
|
|
|
pkg = ast.literal_eval(map[pkgname]) |
|
|
|
sin = [] |
|
|
@ -75,32 +77,32 @@ def printPkg(map, pkgname): |
|
|
|
log.die("nonexistent package") |
|
|
|
|
|
|
|
|
|
|
|
def dictCompare(d1, d2): |
|
|
|
def compare_dict(d1, d2): |
|
|
|
d1_keys = set(d1.keys()) |
|
|
|
d2_keys = set(d2.keys()) |
|
|
|
intersect_keys = d1_keys.intersection(d2_keys) |
|
|
|
modified = {o : (d1[o], d2[o]) for o in intersect_keys if d1[o] != d2[o]} |
|
|
|
modified = {o: (d1[o], d2[o]) for o in intersect_keys if d1[o] != d2[o]} |
|
|
|
return modified |
|
|
|
|
|
|
|
|
|
|
|
def compareRel(oldrel, newrel): |
|
|
|
def compare_release(oldrel, newrel): |
|
|
|
r = requests.get(newrel) |
|
|
|
new = r.text |
|
|
|
with open(oldrel, "rb") as f: |
|
|
|
old = f.read() |
|
|
|
|
|
|
|
oldtime = getTime(getDate(old)) |
|
|
|
newtime = getTime(getDate(new)) |
|
|
|
oldtime = get_time(get_date(old)) |
|
|
|
newtime = get_time(get_date(new)) |
|
|
|
if newtime > oldtime: |
|
|
|
notice("Update available") |
|
|
|
newhashes = parseRel(new) |
|
|
|
oldhashes = parseRel(old) |
|
|
|
changes = dictCompare(newhashes, oldhashes) |
|
|
|
newhashes = parse_release(new) |
|
|
|
oldhashes = parse_release(old) |
|
|
|
changes = compare_dict(newhashes, oldhashes) |
|
|
|
# k = pkg name, v = sha256 |
|
|
|
return changes |
|
|
|
|
|
|
|
|
|
|
|
#relmap = compareRel("../spool/dists/jessie/updates/Release", "http://security.debian.org/dists/jessie/updates/Release") |
|
|
|
#print relmap |
|
|
|
#for k,v in relmap.iteritems(): |
|
|
|
# relmap = compare_release("../spool/dists/jessie/updates/Release", "http://security.debian.org/dists/jessie/updates/Release") |
|
|
|
# print relmap |
|
|
|
# for k,v in relmap.iteritems(): |
|
|
|
# print(k) |
|
|
|