Initial import
authorAnas Nashif <anas.nashif@intel.com>
Fri, 7 May 2010 03:56:28 +0000 (23:56 -0400)
committerAnas Nashif <anas.nashif@intel.com>
Fri, 7 May 2010 03:56:28 +0000 (23:56 -0400)
16 files changed:
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
configurations.yaml [new file with mode: 0644]
custom/part/custom [new file with mode: 0644]
custom/scripts/buildname.nochroot [new file with mode: 0644]
custom/scripts/cleanup.post [new file with mode: 0644]
custom/scripts/flash.post [new file with mode: 0644]
custom/scripts/prelink.post [new file with mode: 0644]
custom/scripts/rpm.post [new file with mode: 0644]
custom/scripts/serial.post [new file with mode: 0644]
kickstart.py [new file with mode: 0644]
kickstart.pyc [new file with mode: 0644]
kickstart.tmpl [new file with mode: 0644]
kickstarter.py [new file with mode: 0644]
repos.yaml [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
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 (file)
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 <images.yaml> -r <repos.yaml>
+
+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 (file)
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 (file)
index 0000000..cd94271
--- /dev/null
@@ -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 (file)
index 0000000..d6c8b6b
--- /dev/null
@@ -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 (file)
index 0000000..edd20a7
--- /dev/null
@@ -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 (file)
index 0000000..c36c2e4
--- /dev/null
@@ -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 (file)
index 0000000..fe062d3
--- /dev/null
@@ -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 (file)
index 0000000..527548c
--- /dev/null
@@ -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 (file)
index 0000000..1e4049e
--- /dev/null
@@ -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 (file)
index 0000000..5961379
--- /dev/null
@@ -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 (file)
index 0000000..a9af541
--- /dev/null
@@ -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 (file)
index 0000000..1d36785
Binary files /dev/null and b/kickstart.pyc differ
diff --git a/kickstart.tmpl b/kickstart.tmpl
new file mode 100644 (file)
index 0000000..8a6fed3
--- /dev/null
@@ -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 (file)
index 0000000..b1cad01
--- /dev/null
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+# Anas Nashif <anas.nashif@intel.com>
+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 (file)
index 0000000..4627c50
--- /dev/null
@@ -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/