move writing sources.list to CloudConfig. add 'apt_preserve_sources_list'

Move the writing of sources.list to CloudConfig.  This way we have
access to the cloud-config user data.  Then, allow the user
to specify the archive mirror using 'apt_mirror' key. 

Now, if specified in cloud-config, that is used, otherwise, we 
get one from the DataSource.

One other change here is adding 'apt_preserve_sources_list'.  If set to
true, then overwriting of the sources.list with the selected mirror
will not be done.
This commit is contained in:
Scott Moser 2010-01-26 16:40:10 -05:00
parent 03461eb912
commit f79903db21
4 changed files with 35 additions and 15 deletions

View File

@ -1,10 +1,10 @@
#!/usr/bin/python #!/usr/bin/python
import subprocess import subprocess
from Cheetah.Template import Template
import sys import sys
import ec2init import ec2init
import ec2init.util as util
def warn(str): def warn(str):
sys.stderr.write(str) sys.stderr.write(str)
@ -56,27 +56,15 @@ def main():
sys.exit(0) sys.exit(0)
def render_to_file(template, outfile, searchList):
t = Template(file='/etc/ec2-init/templates/%s.tmpl' % template, searchList=[searchList])
f = open(outfile, 'w')
f.write(t.respond())
f.close()
def set_defaults(cloud): def set_defaults(cloud):
generate_sources_list(cloud.get_mirror())
apply_locale(cloud.get_locale()) apply_locale(cloud.get_locale())
def apply_locale(locale): def apply_locale(locale):
subprocess.Popen(['locale-gen', locale]).communicate() subprocess.Popen(['locale-gen', locale]).communicate()
subprocess.Popen(['update-locale', locale]).communicate() subprocess.Popen(['update-locale', locale]).communicate()
render_to_file('default-locale', '/etc/default/locale', { 'locale' : locale }) util.render_to_file('default-locale', '/etc/default/locale', \
{ 'locale' : locale })
def generate_sources_list(mirror):
stdout, stderr = subprocess.Popen(['lsb_release', '-cs'], stdout=subprocess.PIPE).communicate()
codename = stdout.strip()
render_to_file('sources.list', '/etc/apt/sources.list', { 'mirror' : mirror, 'codename' : codename })
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -99,6 +99,13 @@ class CloudConfig():
update = util.get_cfg_option_bool(self.cfg, 'apt_update', False) update = util.get_cfg_option_bool(self.cfg, 'apt_update', False)
upgrade = util.get_cfg_option_bool(self.cfg, 'apt_upgrade', False) upgrade = util.get_cfg_option_bool(self.cfg, 'apt_upgrade', False)
if not util.get_cfg_option_bool(self.cfg, \
'apt_preserve_sources_list', False):
if self.cfg.has_key("apt_mirror"):
mirror = self.cfg["apt_mirror"]
else:
mirror = self.cloud.get_mirror()
generate_sources_list(mirror)
# process 'apt_sources' # process 'apt_sources'
if self.cfg.has_key('apt_sources'): if self.cfg.has_key('apt_sources'):
@ -277,3 +284,11 @@ def add_sources(srclist):
elst.append([source, "failed write to file %s" % ent['filename']]) elst.append([source, "failed write to file %s" % ent['filename']])
return(elst) return(elst)
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 })

View File

@ -260,6 +260,15 @@ class EC2Init:
f=open(cloud_config, "wb") f=open(cloud_config, "wb")
f.write(self.cloud_config_str) f.write(self.cloud_config_str)
f.close() f.close()
## this could merge the cloud config with the system config
## for now, not doing this as it seems somewhat circular
## as CloudConfig does that also, merging it with this cfg
##
# ccfg = yaml.load(self.cloud_config_str)
# if ccfg is None: ccfg = { }
# self.cfg = util.mergedict(ccfg, self.cfg)
return return
self.cloud_config_str+="\n#%s\n%s" % (filename,payload) self.cloud_config_str+="\n#%s\n%s" % (filename,payload)

View File

@ -2,6 +2,7 @@ import yaml
import os import os
import errno import errno
import subprocess import subprocess
from Cheetah.Template import Template
def read_conf(fname): def read_conf(fname):
stream = file(fname) stream = file(fname)
@ -69,3 +70,10 @@ def subp(args, input=None):
if sp.returncode is not 0: if sp.returncode is not 0:
raise subprocess.CalledProcessError(sp.returncode,args) raise subprocess.CalledProcessError(sp.returncode,args)
return(out,err) return(out,err)
def render_to_file(template, outfile, searchList):
t = Template(file='/etc/ec2-init/templates/%s.tmpl' % template, searchList=[searchList])
f = open(outfile, 'w')
f.write(t.respond())
f.close()