/[smeserver]/cdrom.image/sme7/product/installclasses/smeinstallclass.py
ViewVC logotype

Contents of /cdrom.image/sme7/product/installclasses/smeinstallclass.py

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.6 - (show annotations) (download) (as text)
Thu Aug 26 22:09:11 2010 UTC (14 years, 3 months ago) by slords
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +29 -40 lines
Content type: text/x-python
Installer classes cleanup to fix dmraid crashes

1 from installclass import BaseInstallClass
2 from rhpl.translate import N_, _
3 from constants import *
4 import os
5 import iutil
6 from fsset import *
7
8 from autopart import getAutopartitionBoot, autoCreatePartitionRequests, autoCreateLVMPartitionRequests
9 from rhpl.log import log
10 import string
11 import partRequests
12 import partedUtils
13
14 class Script:
15 def __repr__(self):
16 str = ("(s: '%s' i: %s c: %d)") % \
17 (self.script, self.interp, self.inChroot)
18 return string.replace(str, "\n", "|")
19
20 def __init__(self, script, interp, inChroot, logfile = None):
21 self.script = script
22 self.interp = interp
23 self.inChroot = inChroot
24 self.logfile = logfile
25
26 def run(self, chroot, serial):
27 scriptRoot = "/"
28 if self.inChroot:
29 scriptRoot = chroot
30
31 path = scriptRoot + "/tmp/sme-script"
32
33 f = open(path, "w")
34 f.write(self.script)
35 f.close()
36 os.chmod(path, 0700)
37
38 if self.logfile is not None:
39 messages = self.logfile
40 elif serial:
41 messages = "/tmp/sme-script.log"
42 else:
43 messages = "/dev/tty3"
44
45 rc = iutil.execWithRedirect(self.interp,
46 [self.interp,"/tmp/sme-script"],
47 stdout = messages, stderr = messages,
48 root = scriptRoot)
49
50 if rc != 0:
51 log("WARNING - Error code %s encountered running a sme script", rc)
52
53 os.unlink(path)
54
55 class InstallClass(BaseInstallClass):
56 id = "smeserver"
57 name = N_("New _SME Server Install")
58 pixmap = "smeserver.png"
59 description = N_("This option performs a new install of "
60 "SME Server. All attached hard drives "
61 "will be repartitioned and formated.")
62
63 sortPriority = 1
64
65 parentClass = ( _("Install SME Server"), "smeserver.png" )
66
67 def requiredDisplayMode(self):
68 return 't'
69
70 def createCmdlineDict(self):
71 cmdlineDict = {}
72 cmdline = open("/proc/cmdline", "r").read().strip()
73
74 for i in cmdline.split():
75 try:
76 (key, val) = i.split("=", 1)
77 except:
78 key = i
79 val = True
80
81 cmdlineDict[key] = val
82
83 return cmdlineDict
84
85 def setSteps(self, dispatch):
86 self.anaconda = dispatch
87 self.cmdline = self.createCmdlineDict()
88
89 dispatch.setStepList(
90 "betanag",
91 "language",
92 "keyboard",
93 "findrootparts",
94 "installtype",
95 "partitionobjinit",
96 "autopartitionexecute",
97 "partitiondone",
98 "bootloadersetup",
99 "languagesupport",
100 "timezone",
101 "readcomps",
102 "selectlangpackages",
103 "checkdeps",
104 "dependencies",
105 "install",
106 "enablefilesystems",
107 "migratefilesystems",
108 "setuptime",
109 "preinstallconfig",
110 "installpackages",
111 "postinstallconfig",
112 "writeconfig",
113 "instbootloader",
114 "writeksconfig",
115 "setfilecon",
116 "copylogs",
117 "dopostaction",
118 "methodcomplete",
119 "complete"
120 )
121
122 # 'partition' can be used on the command line to force
123 # verification of partitions. useful in some cases...
124 dispatch.skipStep("partition", skip = (1,0)[self.cmdline.has_key("partition")])
125
126 def setDefaultPartitioning(self, partitions, clear = CLEARPART_TYPE_LINUX, doClear = 1):
127 diskset = self.anaconda.id.diskset
128
129 if self.cmdline.has_key("exclude"):
130 alldrives = filter(lambda x:not (partedUtils.hasProtectedPartitions(x, self.anaconda) or
131 x in self.cmdline["exclude"].split(",")), diskset.driveList())
132 else:
133 alldrives = filter(lambda x:not partedUtils.hasProtectedPartitions(x, self.anaconda), diskset.disks.keys())
134
135 if self.cmdline.has_key("drives"):
136 if self.cmdline["drives"] == "all":
137 drives = alldrives
138 else:
139 drives = filter(lambda x:x in self.cmdline["drives"].split(","), alldrives)
140 else:
141 drives = filter(lambda x:not isys.driveUsesModule(x, ["usb-storage", "ub", "sbp2"]), alldrives)
142
143 if self.cmdline.has_key("spares"):
144 if self.cmdline["spares"] == "none":
145 spares = 0
146 else:
147 try:
148 spares = max(0,min(int(self.cmdline["spares"]),len(drives)-2))
149 except:
150 spares = (len(drives)+4)/7
151 else:
152 spares = (len(drives)+4)/7
153
154 if self.cmdline.has_key("raid") and self.cmdline["raid"] in ["none","0","1","5","6"]:
155 if self.cmdline["raid"] == "none":
156 level = 0
157 else:
158 level = int(self.cmdline["raid"])
159 if level == 0:
160 del drives[1:]
161 spares = 0
162 if level == 6 and len(drives)-spares < 4:
163 level = 5
164 if level == 5 and len(drives)-spares < 3:
165 level = 1
166 if level == 1:
167 if spares > 1 and not self.cmdline.has_key("spares"):
168 spares = 1
169 del drives[2+spares:]
170 elif len(drives) > 1 and len(drives) == len(filter(lambda x:x.startswith('mapper/'), alldrives)):
171 level = -1
172 del drives[1:]
173 spares = 0
174 else:
175 if len(drives) - spares >= 6:
176 level = 6
177 elif len(drives) - spares >= 3:
178 level = 5
179 else:
180 level = 1
181
182 if len(drives) >= 1:
183 log("Using the following drives: %s" % drives)
184 excluded = filter(lambda x:x not in drives, diskset.disks.keys())
185 if excluded:
186 log("Excluding the following drives: %s" % excluded)
187 skipped = filter(lambda x:x not in diskset.disks.keys(), diskset.driveList())
188 if skipped:
189 log("Skipping the following drives: %s" % skipped)
190 if level >= 1:
191 log("Installing using RAID%s" % level)
192 log("Using %s spare drives" % spares)
193 elif level < 0:
194 log("Detected BIOS raid (skipping raid)")
195 else:
196 log("Installing without using RAID")
197
198 (swapMin, swapMax) = iutil.swapSuggestion()
199 if level >= 1:
200 raid1 = []
201 raid2 = []
202 raid3 = []
203 uniqueID = 100
204
205 for drive in drives:
206 request = partRequests.PartitionSpec(fileSystemTypeGet("software RAID"),
207 drive=[drive], size=100, primary=1, format=1)
208 request.uniqueID = uniqueID
209 raid1.append(uniqueID)
210 partitions.autoPartitionRequests.append(request)
211
212 if not self.cmdline.has_key("nolvm"):
213 if not self.cmdline.has_key("multipart"):
214 request = partRequests.PartitionSpec(fileSystemTypeGet("software RAID"),
215 size=(swapMin+1536)/(len(drives)-spares-max(0,level-4)),
216 drive=[drive], primary=1, grow=1, format=1)
217 else:
218 request = partRequests.PartitionSpec(fileSystemTypeGet("software RAID"),
219 size=(swapMin+5120)/(len(drives)-spares-max(0,level-4)),
220 drive=[drive], primary=1, grow=1, format=1)
221 request.uniqueID = uniqueID + 50
222 raid2.append(uniqueID + 50)
223 partitions.autoPartitionRequests.append(request)
224 else:
225 request = partRequests.PartitionSpec(fileSystemTypeGet("software RAID"),
226 drive=[drive], size=swapMin/(len(drives)-spares-max(0,level-4))+10, grow=1,
227 maxSizeMB=swapMax/(len(drives)-spares-max(0,level-4)), format=1, primary=1)
228 request.uniqueID = uniqueID + 30
229 raid2.append(uniqueID + 30)
230 partitions.autoPartitionRequests.append(request)
231
232 request = partRequests.PartitionSpec(fileSystemTypeGet("software RAID"),
233 size=1536/(len(drives)-spares-max(0,level-4)),
234 drive=[drive], grow=1, primary=1, format=1)
235 request.uniqueID = uniqueID + 60
236 raid3.append(uniqueID + 60)
237 partitions.autoPartitionRequests.append(request)
238
239 uniqueID = uniqueID + 1
240
241 partitions.autoPartitionRequests.append(partRequests.RaidRequestSpec(fileSystemTypeGet("ext3"),
242 mountpoint="/boot", raidmembers=raid1, raidlevel="RAID1", raidminor=1, format=1,
243 raidspares=0))
244
245 if not self.cmdline.has_key("nolvm"):
246 request = partRequests.RaidRequestSpec(fileSystemTypeGet("physical volume (LVM)"),
247 raidmembers=raid2, raidlevel="RAID"+str(level), raidminor=2, format=1,
248 raidspares=spares)
249 request.uniqueID = 200
250 partitions.autoPartitionRequests.append(request)
251 else:
252 partitions.autoPartitionRequests.append(partRequests.RaidRequestSpec(fileSystemTypeGet("swap"),
253 raidmembers=raid2, raidlevel="RAID"+str(level), raidminor=2, format=1, raidspares=spares))
254
255 partitions.autoPartitionRequests.append(partRequests.RaidRequestSpec(fileSystemTypeGet("ext3"),
256 mountpoint="/", raidmembers=raid3, raidlevel="RAID"+str(level), raidminor=3, format=1,
257 raidspares=spares))
258
259 else:
260 for drive in drives:
261 partitions.autoPartitionRequests.append(partRequests.PartitionSpec(fileSystemTypeGet("ext3"),
262 mountpoint="/boot", drive=[drive], size=100, primary=1, format=1))
263
264 if not self.cmdline.has_key("nolvm"):
265 if not self.cmdline.has_key("multipart"):
266 request = partRequests.PartitionSpec(fileSystemTypeGet("physical volume (LVM)"),
267 drive=[drive], size=swapMin+1536, grow=1, primary=1, format=1)
268 else:
269 request = partRequests.PartitionSpec(fileSystemTypeGet("physical volume (LVM)"),
270 drive=[drive], size=swapMin+5120, grow=1, primary=1, format=1)
271 request.uniqueID = 200
272 partitions.autoPartitionRequests.append(request)
273 else:
274 partitions.autoPartitionRequests.append(partRequests.PartitionSpec(fileSystemTypeGet("ext3"),
275 mountpoint="/", drive=[drive], size=1536, grow=1, primary=1, format=1))
276
277 partitions.autoPartitionRequests.append(partRequests.PartitionSpec(fileSystemTypeGet("swap"),
278 drive=[drive], size=swapMin, maxSizeMB=swapMax, grow=1, primary=1, format=1))
279
280 if not self.cmdline.has_key("nolvm"):
281 request = partRequests.VolumeGroupRequestSpec(vgname="main", physvols=[200], pesize=32768, format=1)
282 request.uniqueID = 201
283 partitions.autoPartitionRequests.append(request)
284
285 if not self.cmdline.has_key("multipart"):
286 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("ext3"),
287 mountpoint="/", size=1536, volgroup=201, lvname="root", grow=1, format=1))
288
289 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("swap"),
290 size=swapMin, maxSizeMB=swapMax, volgroup=201, lvname="swap", grow=1, format=1))
291 else:
292 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("ext3"),
293 mountpoint="/", size=2048, maxSizeMB=4096, volgroup=201, lvname="root", grow=1, format=1))
294
295 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("ext3"),
296 mountpoint="/var", size=1024, maxSizeMB=4096, volgroup=201, lvname="var", grow=1, format=1))
297
298 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("ext3"),
299 mountpoint="/home/e-smith/files", size=1024, maxSizeMB=8192, volgroup=201, lvname="files", grow=1, format=1))
300
301 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("ext3"),
302 mountpoint="/tmp", size=1024, maxSizeMB=4096, volgroup=201, lvname="tmp", grow=1, format=1))
303
304 partitions.autoPartitionRequests.append(partRequests.LogicalVolumeRequestSpec(fileSystemTypeGet("swap"),
305 size=swapMin, maxSizeMB=swapMax, volgroup=201, lvname="swap", grow=1, format=1))
306
307 partitions.autoClearPartType = CLEARPART_TYPE_ALL
308 partitions.autoClearPartDrives = drives
309 else:
310 log("Not useable drives found. Enabling manual partitioning.")
311 BaseInstallClass.setDefaultPartitioning(self, partitions, clear = CLEARPART_TYPE_ALL, doClear = True)
312 self.anaconda.skipStep("partition", skip = 0)
313
314 def setAsHeadless(self, dispatch, isHeadless = 0):
315 if isHeadless == 0:
316 pass
317 else:
318 dispatch.skipStep("handleX11pkgs", permanent = 1)
319 dispatch.skipStep("videocard", permanent = 1)
320 dispatch.skipStep("monitor", permanent = 1)
321 dispatch.skipStep("xcustom", permanent = 1)
322 dispatch.skipStep("writexconfig", permanent = 1)
323
324 def setGroupSelection(self, grpset, intf):
325 grpset.unselectAll()
326 grpset.selectGroup("Base")
327
328 def postAction(self, rootPath, serial, intf):
329 win = intf.waitWindow(_("Post Install Script"),
330 _("The post installation script is running..."))
331
332 script = ( "/sbin/syslogd &\n"
333 "sleep 2\n"
334 "/sbin/e-smith/signal-event post-install\n" )
335 s = Script(script, interp="/bin/sh", inChroot=1)
336 log("%s", s)
337 s.run(rootPath, serial)
338 win.pop()
339
340 def setInstallData(self, id, intf = None):
341 BaseInstallClass.setInstallData(self, id)
342 self.setAuthentication(id, useShadow=1, salt="md5")
343 self.setRootPassword(id, pw="ThisIsGoingToBeDisabledAnyway", isCrypted=0)
344 self.setZeroMbr(id, zeroMbr=1)
345 self.setClearParts(id, clear=CLEARPART_TYPE_ALL, initAll=1)
346 self.setBootloader(id, useLilo=0, location="mbr", linear=1)
347
348 def __init__(self, expert):
349 BaseInstallClass.__init__(self, expert)

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed