From b3f23061abe8b08e51522ec8e2b5cad0b8571f02 Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Thu, 6 May 2010 23:56:28 -0400 Subject: [PATCH] Initial import --- Makefile | 21 ++++ README | 16 +++ TODO | 6 + configurations.yaml | 68 ++++++++++ custom/part/custom | 2 + custom/scripts/buildname.nochroot | 3 + custom/scripts/cleanup.post | 6 + custom/scripts/flash.post | 5 + custom/scripts/prelink.post | 4 + custom/scripts/rpm.post | 9 ++ custom/scripts/serial.post | 2 + kickstart.py | 255 ++++++++++++++++++++++++++++++++++++++ kickstart.pyc | Bin 0 -> 8105 bytes kickstart.tmpl | 61 +++++++++ kickstarter.py | 111 +++++++++++++++++ repos.yaml | 7 ++ 16 files changed, 576 insertions(+) create mode 100644 Makefile create mode 100644 README create mode 100644 TODO create mode 100644 configurations.yaml create mode 100644 custom/part/custom create mode 100644 custom/scripts/buildname.nochroot create mode 100644 custom/scripts/cleanup.post create mode 100644 custom/scripts/flash.post create mode 100644 custom/scripts/prelink.post create mode 100644 custom/scripts/rpm.post create mode 100644 custom/scripts/serial.post create mode 100644 kickstart.py create mode 100644 kickstart.pyc create mode 100644 kickstart.tmpl create mode 100644 kickstarter.py create mode 100644 repos.yaml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..404738b --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +# ex: set tabstop=4 noexpandtab: +PYTHON=python +CHEETAH=cheetah +TEMPLATES=$(wildcard *.tmpl) +TEMPLATE_MODS=$(patsubst %.tmpl,%.py,$(TEMPLATES)) +.SECONDARY: $(TEMPLATE_MODS) +KS=$(wildcard *.ks) + +all: $(TEMPLATE_MODS) + +%.py: %.tmpl + $(CHEETAH) compile --settings='useStackFrames=False' $< + + +ks: $(TEMPLATES) ../images.yaml + python kickstarter.py -m ../images.yaml + +clean: + rm -f $(TEMPLATE_MODS) + rm -f $(addsuffix .bak,$(TEMPLATE_MODS)) + rm -f *.pyc *.pyo diff --git a/README b/README new file mode 100644 index 0000000..10ebc2b --- /dev/null +++ b/README @@ -0,0 +1,16 @@ +Install cheetah (http://www.cheetahtemplate.org/) templating system, PyYAML. + +run make +then run: +python kickstarter.py -c -r + +Example: + python kickstarter.py --configs configurations.yaml --repos repos.yaml + +Repo file: +This file contains a list of repositories to be used in the kickstart files + +Configurations file: +This file has the definition of configurations. The Configurations inherit +from platforms first then from the DEFAULT section. The image configurations +override the all other settings (in DEFAULT and platform sections). diff --git a/TODO b/TODO new file mode 100644 index 0000000..031d3ee --- /dev/null +++ b/TODO @@ -0,0 +1,6 @@ + +List of things to do: + + - Add support for build IDs + - Multi arch repos + - .. diff --git a/configurations.yaml b/configurations.yaml new file mode 100644 index 0000000..cd94271 --- /dev/null +++ b/configurations.yaml @@ -0,0 +1,68 @@ +Default: + Active: True + Language: en_US.UTF-8 + Keyboard: us + PackageArgs: + SaveRepos: False + Timezone: America/New_York + RootPass: meego + DefaultUser: meego + DefaultUserPass: meego + PartSize: 1900 + PostScripts: + - rpm + Groups: + - MeeGo Core + - X Window System + +CORE: + PartSize: 1000 + BootloaderAppend: "quiet" + BootloaderTimeout: 0 + PostScripts: + - cleanup + Repos: + - meego-core-1.0 + Kernel: kernel-netbook + +NETBOOK: + PartSize: 1900 + BootloaderAppend: "quiet" + BootloaderTimeout: 0 + PostScripts: + - cleanup + - flash + Groups: + - X for Netbooks + - Virtual Machine Support + - Printing + - Games + Kernel: kernel-netbook + Repos: + - adobe + - meego-core-1.0 + - meego-netbook-1.0 + PostScripts: + - prelink + ExtraPackages: + - gdb + - flash-plugin + - adobe-release +Configurations: + - Name: MeeGo Core 1.0 + Active: True + Baseline: 1.0 + Platform: CORE + FileName: core + Desktop: + - Name: MeeGo Netbook/Nettop 1.0 + Active: True + Baseline: 1.0 + Platform: NETBOOK + Desktop: meego + FileName: netbook + Groups: + - MeeGo Netbook Desktop + Repos: + - meego-core-1.0 + - meego-netbook-1.0 diff --git a/custom/part/custom b/custom/part/custom new file mode 100644 index 0000000..d6c8b6b --- /dev/null +++ b/custom/part/custom @@ -0,0 +1,2 @@ +part / --size 1300 --ondisk sda --grow --maxsize=1450 --fstype=ext3 +#part /home --size 1000 --grow --maxsize=1450 --ondisk sdb --fstype=ext3 diff --git a/custom/scripts/buildname.nochroot b/custom/scripts/buildname.nochroot new file mode 100644 index 0000000..edd20a7 --- /dev/null +++ b/custom/scripts/buildname.nochroot @@ -0,0 +1,3 @@ +if [ -n "$IMG_NAME" ]; then + echo "BUILD: $IMG_NAME" >> $INSTALL_ROOT/etc/meego-release +fi diff --git a/custom/scripts/cleanup.post b/custom/scripts/cleanup.post new file mode 100644 index 0000000..c36c2e4 --- /dev/null +++ b/custom/scripts/cleanup.post @@ -0,0 +1,6 @@ + +# save a little bit of space at least... +rm -f /boot/initrd* + +# make sure there aren't core files lying around +rm -f /core* diff --git a/custom/scripts/flash.post b/custom/scripts/flash.post new file mode 100644 index 0000000..fe062d3 --- /dev/null +++ b/custom/scripts/flash.post @@ -0,0 +1,5 @@ +# verify link of flash plugin +if [ -f /usr/lib/flash-plugin/setup ]; then + sh /usr/lib/flash-plugin/setup install + rm -f /root/oldflashplugins.tar.gz +fi diff --git a/custom/scripts/prelink.post b/custom/scripts/prelink.post new file mode 100644 index 0000000..527548c --- /dev/null +++ b/custom/scripts/prelink.post @@ -0,0 +1,4 @@ +# Prelink can reduce boot time +if [ -x /usr/sbin/prelink ]; then + /usr/sbin/prelink -aRqm +fi diff --git a/custom/scripts/rpm.post b/custom/scripts/rpm.post new file mode 100644 index 0000000..1e4049e --- /dev/null +++ b/custom/scripts/rpm.post @@ -0,0 +1,9 @@ +# work around for poor key import UI in PackageKit +rm -f /var/lib/rpm/__db* +rpm --rebuilddb +if [ -f /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux ]; then + rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux +fi +if [ -f /etc/pki/rpm-gpg/RPM-GPG-KEY-meego ]; then + rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-meego +fi diff --git a/custom/scripts/serial.post b/custom/scripts/serial.post new file mode 100644 index 0000000..5961379 --- /dev/null +++ b/custom/scripts/serial.post @@ -0,0 +1,2 @@ +# open serial line console for embedded system +echo "s0:235:respawn:/sbin/agetty -L 115200 ttyS0 vt100" >> /etc/inittab diff --git a/kickstart.py b/kickstart.py new file mode 100644 index 0000000..a9af541 --- /dev/null +++ b/kickstart.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python + + + + +################################################## +## DEPENDENCIES +import sys +import os +import os.path +import __builtin__ +from os.path import getmtime, exists +import time +import types +from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion +from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple +from Cheetah.Template import Template +from Cheetah.DummyTransaction import * +from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList +from Cheetah.CacheRegion import CacheRegion +import Cheetah.Filters as Filters +import Cheetah.ErrorCatchers as ErrorCatchers + +################################################## +## MODULE CONSTANTS +VFFSL=valueFromFrameOrSearchList +VFSL=valueFromSearchList +VFN=valueForName +currentTime=time.time +__CHEETAH_version__ = '2.2.2' +__CHEETAH_versionTuple__ = (2, 2, 2, 'final', 0) +__CHEETAH_genTime__ = 1273202421.2641661 +__CHEETAH_genTimestamp__ = 'Thu May 6 23:20:21 2010' +__CHEETAH_src__ = 'kickstart.tmpl' +__CHEETAH_srcLastModified__ = 'Thu May 6 22:51:32 2010' +__CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine' + +if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: + raise AssertionError( + 'This template was compiled with Cheetah version' + ' %s. Templates compiled before version %s must be recompiled.'%( + __CHEETAH_version__, RequiredCheetahVersion)) + +################################################## +## CLASSES + +class kickstart(Template): + + ################################################## + ## CHEETAH GENERATED METHODS + + + def __init__(self, *args, **KWs): + + super(kickstart, self).__init__(*args, **KWs) + if not self._CHEETAH__instanceInitialized: + cheetahKWArgs = {} + allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split() + for k,v in KWs.items(): + if k in allowedKWs: cheetahKWArgs[k] = v + self._initCheetahInstance(**cheetahKWArgs) + + + def respond(self, trans=None): + + + + ## CHEETAH: main method generated for this template + if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)): + trans = self.transaction # is None unless self.awake() was called + if not trans: + trans = DummyTransaction() + _dummyTrans = True + else: _dummyTrans = False + write = trans.response().write + SL = self._CHEETAH__searchList + _filter = self._CHEETAH__currentFilter + + ######################################## + ## START - generated method body + + write(u'''# +# Do not Edit! Generated by: +# kickstarter.py +# + +lang ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Language",True) # u'${metadata.Language}' on line 6, col 6 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Language}')) # from line 6, col 6. + write(u''' +keyboard ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Keyboard",True) # u'${metadata.Keyboard}' on line 7, col 10 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Keyboard}')) # from line 7, col 10. + write(u''' +timezone --utc ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Timezone",True) # u'${metadata.Timezone}' on line 8, col 16 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Timezone}')) # from line 8, col 16. + write(u''' +auth --useshadow --enablemd5 +''') + if VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Part",True) == "": # generated from line 10, col 1 + write(u'''part / --size ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.PartSize",True) # u'${metadata.PartSize}' on line 11, col 15 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.PartSize}')) # from line 11, col 15. + write(u''' --ondisk sda --fstype=ext3 +''') + else: # generated from line 12, col 1 + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Part",True) # u'${metadata.Part}' on line 13, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Part}')) # from line 13, col 1. + write(u''' +''') + write(u'''rootpw ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.RootPass",True) # u'${metadata.RootPass}' on line 15, col 8 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.RootPass}')) # from line 15, col 8. + write(u''' +xconfig --startxonboot +bootloader --timeout=''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.BootloaderTimeout",True) # u'${metadata.BootloaderTimeout}' on line 17, col 22 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.BootloaderTimeout}')) # from line 17, col 22. + write(u''' --append="''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.BootloaderAppend",True) # u'${metadata.BootloaderAppend}' on line 17, col 62 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.BootloaderAppend}')) # from line 17, col 62. + write(u'''" +desktop --autologinuser=''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.DefaultUser",True) # u'${metadata.DefaultUser}' on line 18, col 25 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.DefaultUser}')) # from line 18, col 25. + write(u''' --defaultdesktop=''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Desktop",True) # u'${metadata.Desktop}' on line 18, col 67 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Desktop}')) # from line 18, col 67. + write(u''' +user --name ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.DefaultUser",True) # u'${metadata.DefaultUser}' on line 19, col 13 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.DefaultUser}')) # from line 19, col 13. + write(u''' --groups audio,video --password ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.DefaultUserPass",True) # u'${metadata.DefaultUserPass}' on line 19, col 70 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.DefaultUserPass}')) # from line 19, col 70. + write(u''' + +''') + save = "" + if VFSL([locals()]+SL+[globals(), __builtin__],"metadata.SaveRepos",True): # generated from line 22, col 1 + save = "--save" + for r in VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Repos",True): # generated from line 25, col 1 + for rr in VFSL([locals()]+SL+[globals(), __builtin__],"repos",True): # generated from line 26, col 1 + if VFSL([locals()]+SL+[globals(), __builtin__],"rr.Name",True) == VFSL([locals()]+SL+[globals(), __builtin__],"r",True): # generated from line 27, col 1 + write(u'''repo --name=''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"r",True) # u'${r}' on line 28, col 15 + if _v is not None: write(_filter(_v, rawExpr=u'${r}')) # from line 28, col 15. + write(u''' --baseurl=''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"rr.Url",True) # u'${rr.Url}' on line 28, col 30 + if _v is not None: write(_filter(_v, rawExpr=u'${rr.Url}')) # from line 28, col 30. + write(u''' ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"save",True) # u'${save}' on line 28, col 40 + if _v is not None: write(_filter(_v, rawExpr=u'${save}')) # from line 28, col 40. + write(u''' +''') + write(u''' + +''') + if VFSL([locals()]+SL+[globals(), __builtin__],"metadata.PackageArgs",True) != "": # generated from line 34, col 1 + write(u'''%packages ''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.PackageArgs",True) # u'${metadata.PackageArgs}' on line 35, col 11 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.PackageArgs}')) # from line 35, col 11. + write(u''' +''') + else: # generated from line 36, col 1 + write(u'''%packages +''') + write(u''' +''') + for g in VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Groups",True): # generated from line 40, col 1 + write(u'''@''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"g",True) # u'${g}' on line 41, col 2 + if _v is not None: write(_filter(_v, rawExpr=u'${g}')) # from line 41, col 2. + write(u''' +''') + write(u''' + +''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Kernel",True) # u'$metadata.Kernel' on line 45, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'$metadata.Kernel')) # from line 45, col 1. + write(u''' + +''') + for e in VFSL([locals()]+SL+[globals(), __builtin__],"metadata.ExtraPackages",True): # generated from line 47, col 1 + _v = VFSL([locals()]+SL+[globals(), __builtin__],"e",True) # u'${e}' on line 48, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'${e}')) # from line 48, col 1. + write(u''' +''') + for e in VFSL([locals()]+SL+[globals(), __builtin__],"metadata.RemovePackages",True): # generated from line 50, col 1 + write(u'''-''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"e",True) # u'${e}' on line 51, col 2 + if _v is not None: write(_filter(_v, rawExpr=u'${e}')) # from line 51, col 2. + write(u''' +''') + write(u'''%end + +%post +''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.Post",True) # u'${metadata.Post}' on line 56, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.Post}')) # from line 56, col 1. + write(u''' +%end + +%post --nochroot +''') + _v = VFSL([locals()]+SL+[globals(), __builtin__],"metadata.NoChroot",True) # u'${metadata.NoChroot}' on line 60, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'${metadata.NoChroot}')) # from line 60, col 1. + write(u''' +%end +''') + + ######################################## + ## END - generated method body + + return _dummyTrans and trans.response().getvalue() or "" + + ################################################## + ## CHEETAH GENERATED ATTRIBUTES + + + _CHEETAH__instanceInitialized = False + + _CHEETAH_version = __CHEETAH_version__ + + _CHEETAH_versionTuple = __CHEETAH_versionTuple__ + + _CHEETAH_genTime = __CHEETAH_genTime__ + + _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__ + + _CHEETAH_src = __CHEETAH_src__ + + _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__ + + _mainCheetahMethod_for_kickstart= 'respond' + +## END CLASS DEFINITION + +if not hasattr(kickstart, '_initCheetahAttributes'): + templateAPIClass = getattr(kickstart, '_CHEETAH_templateClass', Template) + templateAPIClass._addCheetahPlumbingCodeToClass(kickstart) + + +# CHEETAH was developed by Tavis Rudd and Mike Orr +# with code, advice and input from many other volunteers. +# For more information visit http://www.CheetahTemplate.org/ + +################################################## +## if run from command line: +if __name__ == '__main__': + from Cheetah.TemplateCmdLineIface import CmdLineIface + CmdLineIface(templateObj=kickstart()).run() + + diff --git a/kickstart.pyc b/kickstart.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d36785bfbb97cc8f3476f436afdb4fa6727b834 GIT binary patch literal 8105 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 literal 0 HcmV?d00001 diff --git a/kickstart.tmpl b/kickstart.tmpl new file mode 100644 index 0000000..8a6fed3 --- /dev/null +++ b/kickstart.tmpl @@ -0,0 +1,61 @@ +# ############################################## +# Do not Edit! Generated by: +# kickstarter.py +# ############################################### + +lang ${metadata.Language} +keyboard ${metadata.Keyboard} +timezone --utc ${metadata.Timezone} +auth --useshadow --enablemd5 +#if $metadata.Part == "" +part / --size ${metadata.PartSize} --ondisk sda --fstype=ext3 +#else +${metadata.Part} +#end if +rootpw ${metadata.RootPass} +xconfig --startxonboot +bootloader --timeout=${metadata.BootloaderTimeout} --append="${metadata.BootloaderAppend}" +desktop --autologinuser=${metadata.DefaultUser} --defaultdesktop=${metadata.Desktop} +user --name ${metadata.DefaultUser} --groups audio,video --password ${metadata.DefaultUserPass} + +#set $save = "" +#if $metadata.SaveRepos +#set $save = "--save" +#end if +#for $r in $metadata.Repos +#for $rr in $repos +#if $rr.Name == $r +repo --name=${r} --baseurl=${rr.Url} ${save} +#end if +#end for +#end for + + +#if $metadata.PackageArgs != "" +%packages ${metadata.PackageArgs} +#else +%packages +#end if + +#for $g in $metadata.Groups +@${g} +#end for + + +$metadata.Kernel + +#for $e in $metadata.ExtraPackages +${e} +#end for +#for $e in $metadata.RemovePackages +-${e} +#end for +%end + +%post +${metadata.Post} +%end + +%post --nochroot +${metadata.NoChroot} +%end diff --git a/kickstarter.py b/kickstarter.py new file mode 100644 index 0000000..b1cad01 --- /dev/null +++ b/kickstarter.py @@ -0,0 +1,111 @@ +#!/usr/bin/python +# Anas Nashif +import yaml, sys + +import re, os +from kickstart import kickstart + +import copy +import time +import optparse +from time import gmtime, strftime + +class KSWriter(): + def __init__(self, im, rep, out): + self.image_filename = im + self.repo_filename = rep + self.outdir = out + self.image_stream = file(self.image_filename, 'r') + self.repo_stream = file(self.repo_filename, 'r') + self.extra = {} + pass + def merge(*input): + return list(reduce(set.union, input, set())) + + def dump(self): + print yaml.dump(yaml.load(self.stream)) + + + def parse(self, img): + print "Creating %s (%s.ks)" %(img['Name'], img['FileName'] ) + conf = copy.copy(image_meta['Default']) + plat = copy.copy(image_meta[img['Platform']]) + conf.update(plat) + conf.update(img) + lval = ['Repos', 'Groups', 'PostScripts', 'NoChrootScripts', 'RemovePackages', 'ExtraPackages'] + lvald = {} + for l in lval: + full = [] + if image_meta['Default'].has_key(l) and image_meta['Default'][l]: + full = full + image_meta['Default'][l] + if plat.has_key(l) and plat[l]: + full = full + plat[l] + if img.has_key(l) and img[l]: + full = full + img[l] + lvald[l] = set(full) + #print full + conf.update(lvald) + #print conf + postscript = "" + for scr in conf['PostScripts']: + f = open('./custom/scripts/%s.post' %scr, 'r') + postscript += f.read() + postscript += "\n\n" + f.close() + + nochrootscript = "" + for scr in conf['NoChrootScripts']: + f = open('./custom/scripts/%s.nochroot' %scr, 'r') + nochrootscript += f.read() + nochrootscript += "\n\n" + f.close() + + ptab = "" + if img.has_key("Part"): + f = open("./custom/part/%s" %img['Part'] ) + ptab = f.read() + f.close() + + conf['Part'] = ptab + conf['Post'] = postscript + conf['NoChroot'] = nochrootscript + return conf + + def process_files(self, meta, r): + nameSpace = {'metadata': meta, 'repos': r} + t = kickstart(searchList=[nameSpace]) + a = str(t) + if meta.has_key('FileName') and meta['FileName']: + f = open("%s/%s.ks" %( self.outdir, meta['FileName'] ), 'w') + f.write(a) + f.close() + +if __name__ == '__main__': + parser = optparse.OptionParser() + + parser.add_option("-c", "--configs", type="string", dest="configsfile", + help="configuration meta file") + parser.add_option("-o", "--outdir", type="string", dest="outdir", + help="outdir") + parser.add_option("-r", "--repos", type="string", dest="repofile", + help="repo meta file") + + (options, args) = parser.parse_args() + + if options.configsfile is None or options.repofile is None: + print "you need to provide meta files with --configs and --repos" + sys.exit(1) + + outdir = "" + if options.outdir is None: + outdir = "." + else: + outdir = options.outdir + + ks = KSWriter(options.configsfile, options.repofile, outdir) + repo_meta = yaml.load(ks.repo_stream) + image_meta = yaml.load(ks.image_stream) + r = repo_meta['Repositories'] + for img in image_meta['Configurations']: + conf = ks.parse(img) + ks.process_files(conf, r) diff --git a/repos.yaml b/repos.yaml new file mode 100644 index 0000000..4627c50 --- /dev/null +++ b/repos.yaml @@ -0,0 +1,7 @@ +Repositories: + - Name: meego-core-1.0 + Url: http://repo.meego.com/MeeGo/release/1.0/core/repo/ia32/os/ + - Name: meego-netbook-1.0 + Url: http://repo.meego.com + - Name: adobe + Url: http://linuxdownload.adobe.com/linux/i386/ -- 2.7.4