81c9ab9ccbf4071c5654ae1f52c486056b59dd46
[platform/upstream/kickstarter.git] / kickstarter.py
1 #!/usr/bin/python
2 # Anas Nashif <anas.nashif@intel.com>
3 import yaml,  sys
4
5 import re, os
6 from kickstart import kickstart
7
8 import copy
9 import time
10 import optparse
11 from time import gmtime, strftime
12 import errno
13
14 def mkdir_p(path):
15     try:
16         os.makedirs(path)
17     except OSError as exc: # Python >2.5
18         if exc.errno == errno.EEXIST:
19             pass
20         else: raise
21
22
23 class KSWriter():
24     def __init__(self,  im, rep, out):
25         self.image_filename = im
26         self.repo_filename = rep
27         self.outdir = out
28         self.image_stream = file(self.image_filename, 'r')
29         self.repo_stream = file(self.repo_filename, 'r')
30         self.extra = {}
31         pass
32     def merge(*input):
33         return list(reduce(set.union, input, set()))
34         
35     def dump(self):
36         print yaml.dump(yaml.load(self.stream))
37         
38         
39     def parse(self, img):
40         print "Creating %s (%s.ks)" %(img['Name'], img['FileName'] )
41         conf = copy.copy(image_meta['Default'])
42         plat = copy.copy(image_meta[img['Platform']])
43         conf.update(plat)
44         conf.update(img)
45         lval = ['Repos', 'Groups', 'PostScripts', 'NoChrootScripts', 'RemovePackages', 'ExtraPackages']
46         lvald = {}
47         for l in lval:
48             full = []
49             if image_meta['Default'].has_key(l) and image_meta['Default'][l]:
50                 full = full + image_meta['Default'][l]                
51             if plat.has_key(l) and plat[l]:
52                 full = full + plat[l]
53             if img.has_key(l) and img[l]:
54                 full = full + img[l]                    
55             lvald[l] = set(full)
56             #print full
57         conf.update(lvald)
58         #print conf
59         postscript = ""  
60         for scr in conf['PostScripts']:
61             f = open('./custom/scripts/%s.post' %scr, 'r')
62             postscript += f.read()
63             postscript += "\n\n"
64             f.close()
65
66         nochrootscript = ""              
67         for scr in conf['NoChrootScripts']:
68             f = open('./custom/scripts/%s.nochroot' %scr, 'r')
69             nochrootscript += f.read()
70             nochrootscript += "\n\n"
71             f.close()
72
73         ptab = ""
74         if img.has_key("Part"):
75             f = open("./custom/part/%s" %img['Part'] )
76             ptab = f.read()
77             f.close()  
78             
79         conf['Part'] = ptab
80         conf['Post'] = postscript
81         conf['NoChroot'] = nochrootscript
82         return conf
83
84     def process_files(self,  meta,  repos):
85         new_repos = []
86         #print repos
87         #print meta
88         if meta.has_key("Architecture") and  meta['Architecture']:
89             for repo in repos:
90                 r = {}
91                 r['Name'] = repo['Name']
92                 r['Url'] = repo['Url'].replace("@ARCH@", meta['Architecture'])
93                 r['Url'] = repo['Url'].replace("@RELEASE@", meta['Baseline'])
94                 new_repos.append(r)
95         else:
96             new_repos = repos
97                 
98         nameSpace = {'metadata': meta,  'repos': new_repos}
99         t = kickstart(searchList=[nameSpace])
100         a = str(t)
101         if meta.has_key('FileName') and meta['FileName']:
102             f = None
103             if meta.has_key("Baseline"):
104                 mkdir_p(meta['Baseline'])
105                 f = open("%s/%s/%s.ks" %( self.outdir, meta['Baseline'],  meta['FileName'] ), 'w')
106             else:
107                 f = open("%s/%s.ks" %( self.outdir, meta['FileName'] ), 'w')
108             f.write(a)
109             f.close()
110
111 if __name__ == '__main__':
112     parser = optparse.OptionParser()
113
114     parser.add_option("-c", "--configs", type="string", dest="configsfile",
115                     help="configuration meta file")
116     parser.add_option("-o", "--outdir", type="string", dest="outdir",
117                     help="outdir")
118     parser.add_option("-r", "--repos", type="string", dest="repofile",
119                     help="repo meta file")
120
121     (options, args) = parser.parse_args()
122
123     if options.configsfile is None or options.repofile is None:
124         print "you need to provide meta files with --configs and --repos"
125         sys.exit(1)
126
127     outdir = ""
128     if options.outdir is None:
129         outdir = "."
130     else:
131         outdir = options.outdir
132
133     ks = KSWriter(options.configsfile, options.repofile, outdir)
134     repo_meta = yaml.load(ks.repo_stream)
135     image_meta = yaml.load(ks.image_stream)
136     r = repo_meta['Repositories']
137     for img in image_meta['Configurations']:
138         conf = ks.parse(img)
139         ks.process_files(conf, r)