1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#!/usr/bin/python
import os, sys
from optparse import OptionParser
import urllib
from subprocess import call, Popen, STDOUT, PIPE
import apt_pkg # apt-get install python-apt
import packages
versions_cfg = 'http://ftp.schooltool.org/schooltool/trunk/versions.cfg'
def silent_check_call(*args, **kw):
assert 'stdout' not in kw
assert 'stderr' not in kw
kw['stdout'] = PIPE
kw['stderr'] = STDOUT
p = Popen(*args, **kw)
stdout = p.communicate()[0]
if p.returncode != 0:
print stdout
raise Exception("Call Failed %s" % args[0])
def check_call(*args, **kw):
assert 0 == call(*args, **kw)
def cmp_version(v1, v2):
v1 = v1.split('-')[0]
v2 = v2.split('-')[0]
packages.require_apt()
return apt_pkg.VersionCompare(v1, v2)
def get_versions(pkg, apt_conf):
versions = []
for line in Popen(["apt-cache", "-c", apt_conf, 'show', pkg], stdout=PIPE, stderr=PIPE).communicate()[0].splitlines():
if line.startswith('Version: '):
versions.append(line[9:])
return versions
def get_max_version(pkg, apt_conf):
versions = get_versions(pkg, apt_conf)
if not versions:
return None
versions.sort(cmp=cmp_version)
versions.reverse()
return versions[0]
def get_apt_conf(distro):
return os.path.join(distro, 'etc/apt/apt.conf')
def apt_get_update(distro):
apt_conf = get_apt_conf(distro)
if not os.path.isfile(apt_conf):
sys.exit('File %s does not exist' % apt_conf)
def mkdir_p(dirname):
d = os.path.join(distro, dirname)
if not os.path.isdir(d):
os.makedirs(d)
def touch(filename):
dirname = os.path.dirname(filename)
mkdir_p(dirname)
f = open(os.path.join(distro, filename), 'w')
f.close()
mkdir_p('etc/apt/preferences.d')
mkdir_p('var/cache/apt/archives/partial')
touch('var/lib/apt/lists/lock')
mkdir_p('var/lib/apt/lists/partial')
touch('var/lib/dpkg/lock')
touch('var/lib/dpkg/status')
check_call(['apt-get', '-c', apt_conf, 'update'])
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-k", "--kgs",
help="update schooltool.kgs.cfg instead",
action="store_true", dest="update_kgs")
(options, args) = parser.parse_args()
if options.update_kgs:
print 'Downloading ' + versions_cfg + ' -> schooltool.kgs.cfg'
kgs = urllib.urlopen(versions_cfg)
open('schooltool.kgs.cfg', 'w').write(kgs.read())
else:
apt_get_update('lucid')
apt_get_update('maverick')
apt_get_update('unstable')
|