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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#!/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
import errno
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST:
pass
else: raise
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, repos):
new_repos = []
#print repos
#print meta
if meta.has_key("Architecture") and meta['Architecture']:
for repo in repos:
r = {}
r['Name'] = repo['Name']
r['Url'] = repo['Url'].replace("@ARCH@", meta['Architecture'])
new_repos.append(r)
else:
new_repos = repos
nameSpace = {'metadata': meta, 'repos': new_repos}
t = kickstart(searchList=[nameSpace])
a = str(t)
if meta.has_key('FileName') and meta['FileName']:
f = None
if meta.has_key("Baseline"):
mkdir_p(meta['Baseline'])
f = open("%s/%s/%s.ks" %( self.outdir, meta['Baseline'], meta['FileName'] ), 'w')
else:
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)
|