blob: e9e4751d5e44e9b4dd3e22f29f12ed9c312ab27b [file] [log] [blame]
lmr5d73e2f2009-10-09 20:46:36 +00001#!/usr/bin/python
2"""
3Simple script to setup unattended installs on KVM guests.
4"""
5# -*- coding: utf-8 -*-
Eric Li6f27d4f2010-09-29 10:55:17 -07006import os, sys, shutil, tempfile, re, ConfigParser, glob, inspect
lmr5d73e2f2009-10-09 20:46:36 +00007import common
8
9
Eric Li6f27d4f2010-09-29 10:55:17 -070010SCRIPT_DIR = os.path.dirname(sys.modules[__name__].__file__)
11KVM_TEST_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, ".."))
12
13
lmr5d73e2f2009-10-09 20:46:36 +000014class SetupError(Exception):
15 """
16 Simple wrapper for the builtin Exception class.
17 """
18 pass
19
20
Eric Li6f27d4f2010-09-29 10:55:17 -070021def find_command(cmd):
22 """
23 Searches for a command on common paths, error if it can't find it.
24
25 @param cmd: Command to be found.
26 """
27 for dir in ["/usr/local/sbin", "/usr/local/bin",
28 "/usr/sbin", "/usr/bin", "/sbin", "/bin"]:
29 file = os.path.join(dir, cmd)
30 if os.path.exists(file):
31 return file
32 raise ValueError('Missing command: %s' % cmd)
33
34
35def run(cmd, info=None):
36 """
37 Run a command and throw an exception if it fails.
38 Optionally, you can provide additional contextual info.
39
40 @param cmd: Command string.
41 @param reason: Optional string that explains the context of the failure.
42
43 @raise: SetupError if command fails.
44 """
45 print "Running '%s'" % cmd
46 cmd_name = cmd.split(' ')[0]
47 find_command(cmd_name)
48 if os.system(cmd):
49 e_msg = 'Command failed: %s' % cmd
50 if info is not None:
51 e_msg += '. %s' % info
52 raise SetupError(e_msg)
53
54
55def cleanup(dir):
56 """
57 If dir is a mountpoint, do what is possible to unmount it. Afterwards,
58 try to remove it.
59
60 @param dir: Directory to be cleaned up.
61 """
62 print "Cleaning up directory %s" % dir
63 if os.path.ismount(dir):
64 os.system('fuser -k %s' % dir)
65 run('umount %s' % dir, info='Could not unmount %s' % dir)
66 if os.path.isdir(dir):
67 shutil.rmtree(dir)
68
69
70def clean_old_image(image):
71 """
72 Clean a leftover image file from previous processes. If it contains a
73 mounted file system, do the proper cleanup procedures.
74
75 @param image: Path to image to be cleaned up.
76 """
77 if os.path.exists(image):
78 mtab = open('/etc/mtab', 'r')
79 mtab_contents = mtab.read()
80 mtab.close()
81 if image in mtab_contents:
82 os.system('fuser -k %s' % image)
83 os.system('umount %s' % image)
84 os.remove(image)
85
86
87class Disk(object):
88 """
89 Abstract class for Disk objects, with the common methods implemented.
90 """
91 def __init__(self):
92 self.path = None
93
94
95 def setup_answer_file(self, filename, contents):
96 answer_file = open(os.path.join(self.mount, filename), 'w')
97 answer_file.write(contents)
98 answer_file.close()
99
100
101 def copy_to(self, src):
102 dst = os.path.join(self.mount, os.path.basename(src))
103 if os.path.isdir(src):
104 shutil.copytree(src, dst)
105 elif os.path.isfile(src):
106 shutil.copyfile(src, dst)
107
108
109 def close(self):
110 os.chmod(self.path, 0755)
111 cleanup(self.mount)
112 print "Disk %s successfuly set" % self.path
113
114
115class FloppyDisk(Disk):
116 """
117 Represents a 1.44 MB floppy disk. We can copy files to it, and setup it in
118 convenient ways.
119 """
120 def __init__(self, path):
121 print "Creating floppy unattended image %s" % path
122 try:
123 qemu_img_binary = os.environ['KVM_TEST_qemu_img_binary']
124 except KeyError:
125 qemu_img_binary = os.path.join(KVM_TEST_DIR, qemu_img_binary)
126 if not os.path.exists(qemu_img_binary):
127 raise SetupError('The qemu-img binary that is supposed to be used '
128 '(%s) does not exist. Please verify your '
129 'configuration' % qemu_img_binary)
130
131 self.mount = tempfile.mkdtemp(prefix='floppy_', dir='/tmp')
132 self.virtio_mount = None
133 self.path = path
134 clean_old_image(path)
135 if not os.path.isdir(os.path.dirname(path)):
136 os.makedirs(os.path.dirname(path))
137
138 try:
139 c_cmd = '%s create -f raw %s 1440k' % (qemu_img_binary, path)
140 run(c_cmd, info='Could not create floppy image')
141 f_cmd = 'mkfs.msdos -s 1 %s' % path
142 run(f_cmd, info='Error formatting floppy image')
143 m_cmd = 'mount -o loop,rw %s %s' % (path, self.mount)
144 run(m_cmd, info='Could not mount floppy image')
145 except:
146 cleanup(self.mount)
147
148
149 def _copy_virtio_drivers(self, virtio_floppy):
150 """
151 Copy the virtio drivers on the virtio floppy to the install floppy.
152
153 1) Mount the floppy containing the viostor drivers
154 2) Copy its contents to the root of the install floppy
155 """
156 virtio_mount = tempfile.mkdtemp(prefix='virtio_floppy_', dir='/tmp')
157
158 pwd = os.getcwd()
159 try:
160 m_cmd = 'mount -o loop %s %s' % (virtio_floppy, virtio_mount)
161 run(m_cmd, info='Could not mount virtio floppy driver')
162 os.chdir(virtio_mount)
163 path_list = glob.glob('*')
164 for path in path_list:
165 self.copy_to(path)
166 finally:
167 os.chdir(pwd)
168 cleanup(virtio_mount)
169
170
171 def setup_virtio_win2003(self, virtio_floppy, virtio_oemsetup_id):
172 """
173 Setup the install floppy with the virtio storage drivers, win2003 style.
174
175 Win2003 and WinXP depend on the file txtsetup.oem file to install
176 the virtio drivers from the floppy, which is a .ini file.
177 Process:
178
179 1) Copy the virtio drivers on the virtio floppy to the install floppy
180 2) Parse the ini file with config parser
181 3) Modify the identifier of the default session that is going to be
182 executed on the config parser object
183 4) Re-write the config file to the disk
184 """
185 self._copy_virtio_drivers(virtio_floppy)
186 txtsetup_oem = os.path.join(self.mount, 'txtsetup.oem')
187 if not os.path.isfile(txtsetup_oem):
188 raise SetupError('File txtsetup.oem not found on the install '
189 'floppy. Please verify if your floppy virtio '
190 'driver image has this file')
191 parser = ConfigParser.ConfigParser()
192 parser.read(txtsetup_oem)
193 if not parser.has_section('Defaults'):
194 raise SetupError('File txtsetup.oem does not have the session '
195 '"Defaults". Please check txtsetup.oem')
196 default_driver = parser.get('Defaults', 'SCSI')
197 if default_driver != virtio_oemsetup_id:
198 parser.set('Defaults', 'SCSI', virtio_oemsetup_id)
199 fp = open(txtsetup_oem, 'w')
200 parser.write(fp)
201 fp.close()
202
203
204 def setup_virtio_win2008(self, virtio_floppy):
205 """
206 Setup the install floppy with the virtio storage drivers, win2008 style.
207
208 Win2008, Vista and 7 require people to point out the path to the drivers
209 on the unattended file, so we just need to copy the drivers to the
210 driver floppy disk.
211 Process:
212
213 1) Copy the virtio drivers on the virtio floppy to the install floppy
214 """
215 self._copy_virtio_drivers(virtio_floppy)
216
217
218class CdromDisk(Disk):
219 """
220 Represents a CDROM disk that we can master according to our needs.
221 """
222 def __init__(self, path):
223 print "Creating ISO unattended image %s" % path
224 self.mount = tempfile.mkdtemp(prefix='cdrom_unattended_', dir='/tmp')
225 self.path = path
226 clean_old_image(path)
227 if not os.path.isdir(os.path.dirname(path)):
228 os.makedirs(os.path.dirname(path))
229
230
231 def close(self):
232 g_cmd = ('mkisofs -o %s -max-iso9660-filenames '
233 '-relaxed-filenames -D --input-charset iso8859-1 '
234 '%s' % (self.path, self.mount))
235 run(g_cmd, info='Could not generate iso with answer file')
236
237 os.chmod(self.path, 0755)
238 cleanup(self.mount)
239 print "Disk %s successfuly set" % self.path
240
241
lmr5d73e2f2009-10-09 20:46:36 +0000242class UnattendedInstall(object):
243 """
244 Creates a floppy disk image that will contain a config file for unattended
Eric Li7edb3042011-01-06 17:57:17 -0800245 OS install. The parameters to the script are retrieved from environment
246 variables.
lmr5d73e2f2009-10-09 20:46:36 +0000247 """
248 def __init__(self):
249 """
250 Gets params from environment variables and sets class attributes.
251 """
Eric Li6f27d4f2010-09-29 10:55:17 -0700252 images_dir = os.path.join(KVM_TEST_DIR, 'images')
253 self.deps_dir = os.path.join(KVM_TEST_DIR, 'deps')
254 self.unattended_dir = os.path.join(KVM_TEST_DIR, 'unattended')
lmr5d73e2f2009-10-09 20:46:36 +0000255
Eric Li6f27d4f2010-09-29 10:55:17 -0700256 attributes = ['kernel_args', 'finish_program', 'cdrom_cd1',
257 'unattended_file', 'medium', 'url', 'kernel', 'initrd',
Eric Li7edb3042011-01-06 17:57:17 -0800258 'nfs_server', 'nfs_dir', 'install_virtio', 'floppy',
259 'cdrom_unattended', 'boot_path', 'extra_params']
260
Eric Li6f27d4f2010-09-29 10:55:17 -0700261 for a in attributes:
262 self._setattr(a)
lmr5d73e2f2009-10-09 20:46:36 +0000263
Eric Li6f27d4f2010-09-29 10:55:17 -0700264 if self.install_virtio == 'yes':
265 v_attributes = ['virtio_floppy', 'virtio_storage_path',
266 'virtio_network_path', 'virtio_oemsetup_id',
267 'virtio_network_installer']
268 for va in v_attributes:
269 self._setattr(va)
lmr5d73e2f2009-10-09 20:46:36 +0000270
Eric Lie0493a42010-11-15 13:05:43 -0800271 if self.cdrom_cd1:
272 self.cdrom_cd1 = os.path.join(KVM_TEST_DIR, self.cdrom_cd1)
Eric Li6f27d4f2010-09-29 10:55:17 -0700273 self.cdrom_cd1_mount = tempfile.mkdtemp(prefix='cdrom_cd1_', dir='/tmp')
274 if self.medium == 'nfs':
275 self.nfs_mount = tempfile.mkdtemp(prefix='nfs_', dir='/tmp')
lmr5d73e2f2009-10-09 20:46:36 +0000276
Eric Lie0493a42010-11-15 13:05:43 -0800277 if self.floppy:
278 self.floppy = os.path.join(KVM_TEST_DIR, self.floppy)
279 if not os.path.isdir(os.path.dirname(self.floppy)):
280 os.makedirs(os.path.dirname(self.floppy))
Eric Li6f27d4f2010-09-29 10:55:17 -0700281
Eric Li7edb3042011-01-06 17:57:17 -0800282 self.image_path = os.path.dirname(self.kernel)
lmree1e40f2010-06-10 15:32:27 +0000283
lmr5d73e2f2009-10-09 20:46:36 +0000284
Eric Li6f27d4f2010-09-29 10:55:17 -0700285 def _setattr(self, key):
lmr5d73e2f2009-10-09 20:46:36 +0000286 """
Eric Li6f27d4f2010-09-29 10:55:17 -0700287 Populate class attributes with contents of environment variables.
288
289 Example: KVM_TEST_medium will populate self.medium.
290
291 @param key: Name of the class attribute we desire to have.
lmr5d73e2f2009-10-09 20:46:36 +0000292 """
Eric Li6f27d4f2010-09-29 10:55:17 -0700293 env_name = 'KVM_TEST_%s' % key
294 value = os.environ.get(env_name, '')
295 setattr(self, key, value)
lmr5d73e2f2009-10-09 20:46:36 +0000296
lmr5d73e2f2009-10-09 20:46:36 +0000297
Eric Li6f27d4f2010-09-29 10:55:17 -0700298 def render_answer_file(self):
299 # Replace KVM_TEST_CDKEY (in the unattended file) with the cdkey
300 # provided for this test and replace the KVM_TEST_MEDIUM with
301 # the tree url or nfs address provided for this test.
302 unattended_contents = open(self.unattended_file).read()
303 dummy_cdkey_re = r'\bKVM_TEST_CDKEY\b'
304 real_cdkey = os.environ.get('KVM_TEST_cdkey')
305 if re.search(dummy_cdkey_re, unattended_contents):
306 if real_cdkey:
307 unattended_contents = re.sub(dummy_cdkey_re, real_cdkey,
308 unattended_contents)
Eric Li25fc6d12010-09-28 17:22:51 -0700309 else:
Eric Li6f27d4f2010-09-29 10:55:17 -0700310 print ("WARNING: 'cdkey' required but not specified for "
311 "this unattended installation")
Eric Li25fc6d12010-09-28 17:22:51 -0700312
Eric Li6f27d4f2010-09-29 10:55:17 -0700313 dummy_medium_re = r'\bKVM_TEST_MEDIUM\b'
314 if self.medium == "cdrom":
315 content = "cdrom"
316 elif self.medium == "url":
317 content = "url --url %s" % self.url
318 elif self.medium == "nfs":
319 content = "nfs --server=%s --dir=%s" % (self.nfs_server,
320 self.nfs_dir)
321 else:
322 raise SetupError("Unexpected installation medium %s" % self.url)
Eric Li25fc6d12010-09-28 17:22:51 -0700323
Eric Li6f27d4f2010-09-29 10:55:17 -0700324 unattended_contents = re.sub(dummy_medium_re, content,
325 unattended_contents)
Benson Leung517d95a2010-09-28 18:00:17 -0700326
Eric Li6f27d4f2010-09-29 10:55:17 -0700327 def replace_virtio_key(contents, dummy_re, env):
328 """
329 Replace a virtio dummy string with contents.
Benson Leung517d95a2010-09-28 18:00:17 -0700330
Eric Li6f27d4f2010-09-29 10:55:17 -0700331 If install_virtio is not set, replace it with a dummy string.
Benson Leung517d95a2010-09-28 18:00:17 -0700332
Eric Li6f27d4f2010-09-29 10:55:17 -0700333 @param contents: Contents of the unattended file
334 @param dummy_re: Regular expression used to search on the.
335 unattended file contents.
336 @param env: Name of the environment variable.
337 """
338 dummy_path = "C:"
339 driver = os.environ.get(env, '')
Benson Leung517d95a2010-09-28 18:00:17 -0700340
Eric Li6f27d4f2010-09-29 10:55:17 -0700341 if re.search(dummy_re, contents):
342 if self.install_virtio == "yes":
343 if driver.endswith("msi"):
344 driver = 'msiexec /passive /package ' + driver
345 else:
346 try:
347 # Let's escape windows style paths properly
348 drive, path = driver.split(":")
349 driver = drive + ":" + re.escape(path)
350 except:
351 pass
352 contents = re.sub(dummy_re, driver, contents)
353 else:
354 contents = re.sub(dummy_re, dummy_path, contents)
355 return contents
356
357 vdict = {r'\bKVM_TEST_STORAGE_DRIVER_PATH\b':
358 'KVM_TEST_virtio_storage_path',
359 r'\bKVM_TEST_NETWORK_DRIVER_PATH\b':
360 'KVM_TEST_virtio_network_path',
361 r'\bKVM_TEST_VIRTIO_NETWORK_INSTALLER\b':
362 'KVM_TEST_virtio_network_installer_path'}
363
364 for vkey in vdict:
365 unattended_contents = replace_virtio_key(unattended_contents,
366 vkey, vdict[vkey])
367
368 print "Unattended install contents:"
369 print unattended_contents
370 return unattended_contents
371
372
373 def setup_boot_disk(self):
374 answer_contents = self.render_answer_file()
375
376 if self.unattended_file.endswith('.sif'):
377 dest_fname = 'winnt.sif'
378 setup_file = 'winnt.bat'
379 boot_disk = FloppyDisk(self.floppy)
380 boot_disk.setup_answer_file(dest_fname, answer_contents)
381 setup_file_path = os.path.join(self.unattended_dir, setup_file)
382 boot_disk.copy_to(setup_file_path)
383 if self.install_virtio == "yes":
384 boot_disk.setup_virtio_win2003(self.virtio_floppy,
385 self.virtio_oemsetup_id)
386 boot_disk.copy_to(self.finish_program)
387
388 elif self.unattended_file.endswith('.ks'):
389 # Red Hat kickstart install
390 dest_fname = 'ks.cfg'
391 if self.cdrom_unattended:
392 boot_disk = CdromDisk(self.cdrom_unattended)
393 elif self.floppy:
394 boot_disk = FloppyDisk(self.floppy)
395 else:
396 raise SetupError("Neither cdrom_unattended nor floppy set "
397 "on the config file, please verify")
398 boot_disk.setup_answer_file(dest_fname, answer_contents)
399
400 elif self.unattended_file.endswith('.xml'):
Eric Li7edb3042011-01-06 17:57:17 -0800401 if "autoyast" in self.extra_params:
Eric Li6f27d4f2010-09-29 10:55:17 -0700402 # SUSE autoyast install
403 dest_fname = "autoinst.xml"
404 if self.cdrom_unattended:
405 boot_disk = CdromDisk(self.cdrom_unattended)
406 elif self.floppy:
407 boot_disk = FloppyDisk(self.floppy)
408 else:
409 raise SetupError("Neither cdrom_unattended nor floppy set "
410 "on the config file, please verify")
411 boot_disk.setup_answer_file(dest_fname, answer_contents)
412
413 else:
414 # Windows unattended install
415 dest_fname = "autounattend.xml"
416 boot_disk = FloppyDisk(self.floppy)
417 boot_disk.setup_answer_file(dest_fname, answer_contents)
418 if self.install_virtio == "yes":
419 boot_disk.setup_virtio_win2008(self.virtio_floppy)
420 boot_disk.copy_to(self.finish_program)
421
422 else:
423 raise SetupError('Unknown answer file %s' %
424 self.unattended_file)
425
426 boot_disk.close()
lmr5d73e2f2009-10-09 20:46:36 +0000427
428
Eric Li7edb3042011-01-06 17:57:17 -0800429 def setup_cdrom(self):
lmr5d73e2f2009-10-09 20:46:36 +0000430 """
Eric Li7edb3042011-01-06 17:57:17 -0800431 Mount cdrom and copy vmlinuz and initrd.img.
lmr5d73e2f2009-10-09 20:46:36 +0000432 """
Eric Li7edb3042011-01-06 17:57:17 -0800433 print "Copying vmlinuz and initrd.img from cdrom"
434 m_cmd = ('mount -t iso9660 -v -o loop,ro %s %s' %
435 (self.cdrom_cd1, self.cdrom_cd1_mount))
436 run(m_cmd, info='Could not mount CD image %s.' % self.cdrom_cd1)
lmr5d73e2f2009-10-09 20:46:36 +0000437
lmrb010c7e2010-02-24 11:54:30 +0000438 try:
Eric Li7edb3042011-01-06 17:57:17 -0800439 img_path_cmd = ("mkdir -p %s" % self.image_path)
440 run(img_path_cmd, info=("Could not create image path dir %s" %
441 self.image_path))
442 kernel_fetch_cmd = ("cp %s/%s/%s %s" %
443 (self.cdrom_cd1_mount, self.boot_path,
444 os.path.basename(self.kernel), self.kernel))
445 run(kernel_fetch_cmd, info=("Could not copy the vmlinuz from %s" %
446 self.cdrom_cd1_mount))
447 initrd_fetch_cmd = ("cp %s/%s/%s %s" %
448 (self.cdrom_cd1_mount, self.boot_path,
449 os.path.basename(self.initrd), self.initrd))
450 run(initrd_fetch_cmd, info=("Could not copy the initrd.img from "
451 "%s" % self.cdrom_cd1_mount))
lmrb010c7e2010-02-24 11:54:30 +0000452 finally:
Eric Li6f27d4f2010-09-29 10:55:17 -0700453 cleanup(self.cdrom_cd1_mount)
lmr5d73e2f2009-10-09 20:46:36 +0000454
lmrb010c7e2010-02-24 11:54:30 +0000455
lmree1e40f2010-06-10 15:32:27 +0000456 def setup_url(self):
457 """
Eric Li6f27d4f2010-09-29 10:55:17 -0700458 Download the vmlinuz and initrd.img from URL.
lmree1e40f2010-06-10 15:32:27 +0000459 """
Eric Li7edb3042011-01-06 17:57:17 -0800460 print "Downloading vmlinuz and initrd.img from URL"
lmree1e40f2010-06-10 15:32:27 +0000461 os.chdir(self.image_path)
462
Eric Li7edb3042011-01-06 17:57:17 -0800463 kernel_fetch_cmd = "wget -q %s/%s/%s" % (self.url, self.boot_path,
464 os.path.basename(self.kernel))
465 initrd_fetch_cmd = "wget -q %s/%s/%s" % (self.url, self.boot_path,
466 os.path.basename(self.initrd))
lmree1e40f2010-06-10 15:32:27 +0000467
468 if os.path.exists(self.kernel):
469 os.unlink(self.kernel)
470 if os.path.exists(self.initrd):
471 os.unlink(self.initrd)
472
Eric Li6f27d4f2010-09-29 10:55:17 -0700473 run(kernel_fetch_cmd, info="Could not fetch vmlinuz from %s" % self.url)
474 run(initrd_fetch_cmd, info=("Could not fetch initrd.img from %s" %
475 self.url))
lmree1e40f2010-06-10 15:32:27 +0000476
lmree1e40f2010-06-10 15:32:27 +0000477
478 def setup_nfs(self):
479 """
480 Copy the vmlinuz and initrd.img from nfs.
481 """
482 print "Copying the vmlinuz and initrd.img from nfs"
483
Eric Li6f27d4f2010-09-29 10:55:17 -0700484 m_cmd = ("mount %s:%s %s -o ro" %
485 (self.nfs_server, self.nfs_dir, self.nfs_mount))
486 run(m_cmd, info='Could not mount nfs server')
lmree1e40f2010-06-10 15:32:27 +0000487
488 try:
Eric Li7edb3042011-01-06 17:57:17 -0800489 kernel_fetch_cmd = ("cp %s/%s/%s %s" %
490 (self.nfs_mount, self.boot_path,
491 os.path.basename(self.kernel), self.image_path))
Eric Li6f27d4f2010-09-29 10:55:17 -0700492 run(kernel_fetch_cmd, info=("Could not copy the vmlinuz from %s" %
493 self.nfs_mount))
Eric Li7edb3042011-01-06 17:57:17 -0800494 initrd_fetch_cmd = ("cp %s/%s/%s %s" %
495 (self.nfs_mount, self.boot_path,
496 os.path.basename(self.initrd), self.image_path))
Eric Li6f27d4f2010-09-29 10:55:17 -0700497 run(initrd_fetch_cmd, info=("Could not copy the initrd.img from "
498 "%s" % self.nfs_mount))
lmree1e40f2010-06-10 15:32:27 +0000499 finally:
Eric Li6f27d4f2010-09-29 10:55:17 -0700500 cleanup(self.nfs_mount)
lmr5d73e2f2009-10-09 20:46:36 +0000501
502
503 def setup(self):
Eric Li6f27d4f2010-09-29 10:55:17 -0700504 """
505 Configure the environment for unattended install.
506
507 Uses an appropriate strategy according to each install model.
508 """
lmr5d73e2f2009-10-09 20:46:36 +0000509 print "Starting unattended install setup"
Eric Li6f27d4f2010-09-29 10:55:17 -0700510 print
lmr5d73e2f2009-10-09 20:46:36 +0000511
512 print "Variables set:"
Eric Li6f27d4f2010-09-29 10:55:17 -0700513 for member in inspect.getmembers(self):
514 name, value = member
515 attribute = getattr(self, name)
516 if not (name.startswith("__") or callable(attribute) or not value):
517 print " %s: %s" % (name, value)
518 print
lmr5d73e2f2009-10-09 20:46:36 +0000519
Eric Li6f27d4f2010-09-29 10:55:17 -0700520 if self.unattended_file and (self.floppy or self.cdrom_unattended):
521 self.setup_boot_disk()
lmree1e40f2010-06-10 15:32:27 +0000522 if self.medium == "cdrom":
Eric Li7edb3042011-01-06 17:57:17 -0800523 if self.kernel and self.initrd:
524 self.setup_cdrom()
lmree1e40f2010-06-10 15:32:27 +0000525 elif self.medium == "url":
526 self.setup_url()
527 elif self.medium == "nfs":
528 self.setup_nfs()
529 else:
530 raise SetupError("Unexpected installation method %s" %
Eric Li6f27d4f2010-09-29 10:55:17 -0700531 self.medium)
lmr5d73e2f2009-10-09 20:46:36 +0000532 print "Unattended install setup finished successfuly"
533
534
535if __name__ == "__main__":
536 os_install = UnattendedInstall()
537 os_install.setup()