# HG changeset patch # User Wolfgang Rosenauer # Date 1285596612 -7200 # Node ID c673c3eae93ce7f910a90ec8011f9af12d8e4d49 Add upload_buildsymbols.py script diff -r 000000000000 -r c673c3eae93c upload_buildsymbols.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upload_buildsymbols.py Mon Sep 27 16:10:12 2010 +0200 @@ -0,0 +1,144 @@ +#!/usr/bin/python + +import urllib2 +import sgmllib +import string +import pickle +import os + +class MyParser(sgmllib.SGMLParser): + "A simple parser class." + + def parse(self, s): + "Parse the given string 's'." + self.feed(s) + self.close() + + def __init__(self, verbose=0): + "Initialise an object, passing 'verbose' to the superclass." + sgmllib.SGMLParser.__init__(self, verbose) + self.packages = {} + + def start_a(self, attributes): + "Process a hyperlink and its 'attributes' and only add buildsymbols rpms to the list." + for name, value in attributes: + if name == "href": + fn = value.rsplit('.', 1) + if len(fn) > 1: + if fn[1] == "rpm": + if fn[0].find("buildsymbols") != -1: + tmpstr = fn[0].rsplit(".", 1)[0] + tmpstr = tmpstr.rsplit("-", 2) + name = tmpstr[0].rsplit("-", 1)[0] + version = tmpstr[1] + "-" + tmpstr[2] + self.packages[name] = version + + def get_buildsymbols(self): + "Return the list of packages." + return self.packages + + +def submit_package(baseuri, filename): + uri = baseuri + filename + + # download + print "fetching " + uri + try: + f = urllib2.urlopen(uri) + lf = open(filename, "wb") + lf.write(f.read()) + lf.close() + except HTTPError, e: + print "HTTP Error:",e.code , uri + except URLError, e: + print "URL Error:",e.reason , uri + + # extract + command = "rpm2cpio " + filename + " | cpio -idm --quiet" + print "extracting symbols from package" + os.system(command) + # save filename we just extracted (assume there is only one file) + for root, dirs, files in os.walk("usr"): + for file in files: + zipfile = file + + # - upload to symbolstore + print "uploading " + zipfile + " to mozilla" + command = "scp ./usr/share/mozilla/" + zipfile + " " + SSHCONF + ":" + os.system(command) + + # - unzip data on symbolstore + print "unzipping " + zipfile + " on symbolstore" + command = "ssh mozsymbols 'cd symbols; unzip -o /home/wr/" + zipfile + "'" + os.system(command) + + # clean up working directory + command = "rm -rf usr *.rpm" + os.system(command) + + +def find_packages(repo, arch): + updates = [] + f = urllib2.urlopen(repo) + s = f.read() + + parser = MyParser() + parser.parse(s) + + datanew = parser.get_buildsymbols() + + fn = repo + ".pkl" + fn = fn.replace("/", "_") + + dataold = None + if os.path.isfile(fn): + datafile = open(fn, 'rb') + dataold = pickle.load(datafile) + datafile.close() + + for k, v in datanew.iteritems(): + if dataold is not None: + if dataold[k] == v: + continue + + # different version, save in updates list + updates.append(k) + + # save new dataset for future use (only if anything changed at all) + if len(updates) > 0: + print "updating " + fn + datafile = open(fn, 'wb') + pickle.dump(datanew, datafile) + datafile.close() + else: + print "nothing to do for " + repo + + for package in updates: + baseuri = repo + "/" + filename = package + "-buildsymbols-" + datanew[package] + "." + arch + ".rpm" + submit_package(baseuri, filename) + + +# MAIN + +baseurl = "http://download.opensuse.org/" +archs = [ "i586", "x86_64"] +repos = [ "distribution/11.3/repo/oss/suse/", "update/11.3/rpm/" ] +bsrepos = [ "repositories/mozilla/", "repositories/mozilla:/beta/" ] +bsdists = [ "openSUSE_11.3", "openSUSE_11.2", "openSUSE_11.1" ] +SSHCONF = "mozsymbols" + +# product repos +for repo in repos: + for arch in archs: + uri = baseurl + repo + arch + find_packages(uri, arch) + +# OBS repos +for repo in bsrepos: + for dist in bsdists: + for arch in archs: + uri = baseurl + repo + dist + "/" + arch + find_packages(uri, arch) + +