#!/usr/bin/env python # vi: ft=python expandtab sts=4 sw=4 import os import re import subprocess import sys import urlparse import curl def get_release(): proc = subprocess.Popen(['lsb_release', '-c'], stdout=subprocess.PIPE) out, _ = proc.communicate() release = out.split()[1] return release def get_deb_line(client, url): content = client.get(url) # print content # look for "deb http://ppa.launchpad.net/bzr/ppa/ubuntu jaunty main" deb_regex = 'deb <[^>]*>([^<]*) [^<]* (.*)\n' match = re.search(deb_regex, content) repo, component = match.groups() release = get_release() name = repo if name.startswith('http://ppa.launchpad.net/'): name = name.replace('http://ppa.launchpad.net/', '') name = name.replace('/ppa/', '/') name = name.replace('/', '-') archive_dep_regex = 'archive-dependencies(.*)archive-dependencies' content = content.replace('\n', ' ') match = re.search(archive_dep_regex, content) deps = [] if match is not None: dep_content = match.groups()[0] # "" dep_regex = '' for match in re.finditer(dep_regex, dep_content): depurl = urlparse.urljoin(url, match.groups()[0]) deps.append(depurl) key_area_regex = 'signing-key(.*)signing-key' match = re.search(key_area_regex, content) key = None if match: key_regex = 'search=0x(.*)&' key = re.search(key_regex, match.groups()[0]).groups()[0] return "deb %s %s %s" % (repo, release, component), name , key, deps def main(argv): """Enable a ppa.""" if len(argv) != 2: sys.stderr.write("Usage: ppa-enable ppa-url\n") return 2 print "Activating", argv[1] client = curl.Curl() needed = set() done = set([argv[1]]) lines = set() keys = set() debline, name, key, deps = get_deb_line(client, argv[1]) lines.add(debline) needed.update(deps) if key: keys.add(key) ppa_filename = "/etc/apt/sources.list.d/%s.list" % name while needed: url = needed.pop() if url in done: continue done.add(url) debline, _, key, deps = get_deb_line(client, url) lines.add(debline) needed.update(deps) if key: keys.add(key) # install keys print "Adding GPG keys for PPA" subprocess.call( ["sudo", "apt-key", "adv", "--recv-keys", "--keyserver", "keyserver.ubuntu.com"] + list(keys)) print print "Adding deb lines for PPA to", ppa_filename proc = subprocess.Popen(["sudo", "tee", ppa_filename], stdin=subprocess.PIPE) proc.communicate(input='\n'.join(lines)) print if 0 != os.WEXITSTATUS(proc.returncode): print "Failed to write PPA list file." return 2 print "PPA Activated. Now update in synaptic." return 0 if __name__ == "__main__": sys.exit(main(sys.argv))