/[smeserver]/cdrom.image/sme8/updates/installclasses/smeinstallclass.py
ViewVC logotype

Contents of /cdrom.image/sme8/updates/installclasses/smeinstallclass.py

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


Revision 1.3 - (show annotations) (download) (as text)
Mon Jun 8 14:43:07 2009 UTC (15 years, 6 months ago) by slords
Branch: MAIN
Changes since 1.2: +2 -1 lines
Content type: text/x-python
Whitespace cleanup

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

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