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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
import cloudinit.util as util
import subprocess
import os
def handle(name,cfg,cloud,log,args):
update = util.get_cfg_option_bool(cfg, 'apt_update', False)
upgrade = util.get_cfg_option_bool(cfg, 'apt_upgrade', False)
if not util.get_cfg_option_bool(cfg, \
'apt_preserve_sources_list', False):
if cfg.has_key("apt_mirror"):
mirror = cfg["apt_mirror"]
else:
mirror = cloud.get_mirror()
generate_sources_list(mirror)
old_mir = util.get_cfg_option_str(cfg,'apt_old_mirror', \
"archive.ubuntu.com/ubuntu")
rename_apt_lists(old_mir, mirror)
# process 'apt_sources'
if cfg.has_key('apt_sources'):
errors = add_sources(cfg['apt_sources'])
for e in errors:
log.warn("Source Error: %s\n" % ':'.join(e))
pkglist = []
if 'packages' in cfg:
if isinstance(cfg['packages'],list):
pkglist = cfg['packages']
else: pkglist.append(cfg['packages'])
if update or upgrade or pkglist:
#retcode = subprocess.call(list)
subprocess.Popen(['apt-get', 'update']).communicate()
e=os.environ.copy()
e['DEBIAN_FRONTEND']='noninteractive'
if upgrade:
subprocess.Popen(['apt-get', 'upgrade', '--assume-yes'], env=e).communicate()
if pkglist:
cmd=['apt-get', 'install', '--assume-yes']
cmd.extend(pkglist)
subprocess.Popen(cmd, env=e).communicate()
return(True)
def mirror2lists_fileprefix(mirror):
file=mirror
# take of http:// or ftp://
if file.endswith("/"): file=file[0:-1]
pos=file.find("://")
if pos >= 0:
file=file[pos+3:]
file=file.replace("/","_")
return file
def rename_apt_lists(omirror,new_mirror,lists_d="/var/lib/apt/lists"):
oprefix="%s/%s" % (lists_d,mirror2lists_fileprefix(omirror))
nprefix="%s/%s" % (lists_d,mirror2lists_fileprefix(new_mirror))
if(oprefix==nprefix): return
olen=len(oprefix)
for file in glob.glob("%s_*" % oprefix):
os.rename(file,"%s%s" % (nprefix, file[olen:]))
def generate_sources_list(mirror):
stdout, stderr = subprocess.Popen(['lsb_release', '-cs'], stdout=subprocess.PIPE).communicate()
codename = stdout.strip()
util.render_to_file('sources.list', '/etc/apt/sources.list', \
{ 'mirror' : mirror, 'codename' : codename })
# srclist is a list of dictionaries,
# each entry must have: 'source'
# may have: key, ( keyid and keyserver)
def add_sources(srclist):
elst = []
for ent in srclist:
if not ent.has_key('source'):
elst.append([ "", "missing source" ])
continue
source=ent['source']
if source.startswith("ppa:"):
try: util.subp(["add-apt-repository",source])
except:
elst.append([source, "add-apt-repository failed"])
continue
if not ent.has_key('filename'):
ent['filename']='cloud_config_sources.list'
if not ent['filename'].startswith("/"):
ent['filename'] = "%s/%s" % \
("/etc/apt/sources.list.d/", ent['filename'])
if ( ent.has_key('keyid') and not ent.has_key('key') ):
ks = "keyserver.ubuntu.com"
if ent.has_key('keyserver'): ks = ent['keyserver']
try:
ent['key'] = util.getkeybyid(ent['keyid'], ks)
except:
elst.append([source,"failed to get key from %s" % ks])
continue
if ent.has_key('key'):
try: util.subp(('apt-key', 'add', '-'), ent['key'])
except:
elst.append([source, "failed add key"])
try: util.write_file(ent['filename'], source + "\n")
except:
elst.append([source, "failed write to file %s" % ent['filename']])
return(elst)
|