--- /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)
+
+