#!/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))