5 # Copyright (c) 2003 Intel Corporation
8 # Copyright (c) 2004-2006 The Trustees of Princeton University
16 from Exceptions import *
20 # locations of boot os version files
21 BOOT_VERSION_2X_FILE='/usr/bootme/ID'
22 BOOT_VERSION_3X_FILE='/pl_version'
24 # minimium version of the boot os we need to run, as a (major,minor) tuple
25 MINIMUM_BOOT_VERSION= (3,0)
27 # minimum version of python required to run the boot manager
28 MINIMUM_PYTHON_VERSION= (2,2,0)
33 Setup the boot manager so it can run, do any extra necessary
34 hardware setup (to fix old cd problems)
36 Sets the following variables:
37 PARTITIONS A dictionary of generic partition types and their
39 BOOT_CD_VERSION A two number tuple of the boot cd version
42 log.write( "\n\nStep: Initializing the BootManager.\n" )
44 # define the basic partition paths
46 PARTITIONS["root"]= "/dev/planetlab/root"
47 PARTITIONS["swap"]= "/dev/planetlab/swap"
48 PARTITIONS["vservers"]= "/dev/planetlab/vservers"
49 # Linux 2.6 mounts LVM with device mapper
50 PARTITIONS["mapper-root"]= "/dev/mapper/planetlab-root"
51 PARTITIONS["mapper-swap"]= "/dev/mapper/planetlab-swap"
52 PARTITIONS["mapper-vservers"]= "/dev/mapper/planetlab-vservers"
53 vars["PARTITIONS"]= PARTITIONS
55 log.write( "Opening connection to API server\n" )
57 api_inst= xmlrpclib.Server( vars['BOOT_API_SERVER'], verbose=0 )
59 raise BootManagerException, \
60 "configuration file does not specify API server URL"
62 vars['API_SERVER_INST']= api_inst
64 if not __check_boot_version( vars, log ):
65 raise BootManagerException, \
66 "Boot CD version insufficient to run the Boot Manager"
68 log.write( "Running on boot cd version: %s\n" %
69 str(vars['BOOT_CD_VERSION']) )
71 BOOT_CD_VERSION= vars['BOOT_CD_VERSION']
73 # old cds need extra modules loaded for compaq smart array
74 if BOOT_CD_VERSION[0] == 2:
76 has_smartarray= utils.sysexec_noerr(
77 'lspci | egrep "0e11:b178|0e11:4070|0e11:4080|0e11:4082|0e11:4083"')
80 log.write( "Loading support for Compaq smart array\n" )
81 utils.sysexec_noerr( "modprobe cciss", log )
82 _create_cciss_dev_entries()
85 has_fusion= utils.sysexec_noerr('lspci | egrep "1000:0030"')
88 log.write( "Loading support for Fusion MPT SCSI controllers\n" )
89 utils.sysexec_noerr( "modprobe mptscsih", log )
91 # out of the way for rc26
92 # log.write( "Loading support for LVM\n" )
93 # utils.sysexec_noerr( "modprobe dm_mod", log )
94 # for anything that needs to know we are running under the boot cd and
96 os.environ['PL_BOOTCD']= "1"
102 def __check_boot_version( vars, log ):
104 identify which version of the boot os we are running on, and whether
105 or not we can run at all on the given version. later, this will be
106 used to identify extra packages to download to enable the boot manager
107 to run on any supported version.
109 2.x cds have the version file in /usr/bootme/ID, which looked like:
110 'PlanetLab BootCD v2.0.3'
112 3.x cds have the version file in /pl_version, which lookes like:
113 'PlanetLab BootCD 3.0-beta0.3'
115 All current known version strings that we support:
117 PlanetLab BootCD 3.0-beta0.1
118 PlanetLab BootCD 3.0-beta0.3
119 PlanetLab BootCD v2.0
120 PlanetLab BootCD v2.0.1
121 PlanetLab BootCD v2.0.2
122 PlanetLab BootCD v2.0.3
124 Returns 1 if the boot os version is identified and will work
125 to run the boot manager. Two class variables are set:
126 BOOT_OS_MAJOR_VERSION
127 BOOT_OS_MINOR_VERSION
128 version strings with three parts parts to the version ignore the
129 middle number (so 2.0.3 is major 2, minor 3)
131 Returns 0 if the boot os is insufficient to run the boot manager
135 # check for a 3.x version first
136 version_file= file(BOOT_VERSION_3X_FILE,'r')
137 full_version= string.strip(version_file.read())
140 version_parts= string.split(full_version)
141 version= version_parts[-1]
143 version_numbers= string.split(version,".")
144 if len(version_numbers) == 2:
145 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
146 BOOT_OS_MINOR_VERSION= int(version_numbers[1])
148 # for 3.x cds, if there are more than two parts
149 # separated by a ., its one of the beta cds.
150 # hardcode as a 3.0 cd
151 BOOT_OS_MAJOR_VERSION= 3
152 BOOT_OS_MINOR_VERSION= 0
154 vars['BOOT_CD_VERSION']= (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION)
156 if (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION) >= \
157 MINIMUM_BOOT_VERSION:
162 except IndexError, e:
169 # check for a 2.x version first
170 version_file= file(BOOT_VERSION_2X_FILE,'r')
171 full_version= string.strip(version_file.read())
174 version_parts= string.split(full_version)
175 version= version_parts[-1]
176 if version[0] == 'v':
179 version_numbers= string.split(version,".")
180 if len(version_numbers) == 2:
181 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
182 BOOT_OS_MINOR_VERSION= int(version_numbers[1])
184 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
185 BOOT_OS_MINOR_VERSION= int(version_numbers[2])
187 vars['BOOT_CD_VERSION']= (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION)
189 if (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION) >= \
190 MINIMUM_BOOT_VERSION:
195 except IndexError, e:
205 def _create_cciss_dev_entries():
206 def mkccissnod(dev,node):
207 dev = dev + " b 104 %d" % (node)
208 cmd = "mknod /dev/cciss/%s" %dev
209 utils.sysexec_noerr(cmd)
214 for i in range(0,16):
216 node = mkccissnod(dev,node)
217 for j in range(1,16):
218 subdev = dev + "p%d" % j
219 node = mkccissnod(subdev,node)