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 # In case we are booted with a kernel that does not have the
74 # device mapper code compiled into the kernel.
75 if not os.path.exists("/dev/mapper"):
76 log.write( "Loading support for LVM\n" )
77 utils.sysexec_noerr( "modprobe dm_mod", log )
79 # for anything that needs to know we are running under the boot cd and
81 os.environ['PL_BOOTCD']= "1"
87 def __check_boot_version( vars, log ):
89 identify which version of the boot os we are running on, and whether
90 or not we can run at all on the given version. later, this will be
91 used to identify extra packages to download to enable the boot manager
92 to run on any supported version.
94 2.x cds have the version file in /usr/bootme/ID, which looked like:
95 'PlanetLab BootCD v2.0.3'
97 3.x cds have the version file in /pl_version, which lookes like:
98 'PlanetLab BootCD 3.0-beta0.3'
100 All current known version strings that we support:
102 PlanetLab BootCD 3.0-beta0.1
103 PlanetLab BootCD 3.0-beta0.3
104 PlanetLab BootCD v2.0
105 PlanetLab BootCD v2.0.1
106 PlanetLab BootCD v2.0.2
107 PlanetLab BootCD v2.0.3
109 Returns 1 if the boot os version is identified and will work
110 to run the boot manager. Two class variables are set:
111 BOOT_OS_MAJOR_VERSION
112 BOOT_OS_MINOR_VERSION
113 version strings with three parts parts to the version ignore the
114 middle number (so 2.0.3 is major 2, minor 3)
116 Returns 0 if the boot os is insufficient to run the boot manager
120 # check for a 3.x version first
121 version_file= file(BOOT_VERSION_3X_FILE,'r')
122 full_version= string.strip(version_file.read())
125 version_parts= string.split(full_version)
126 version= version_parts[-1]
128 version_numbers= string.split(version,".")
129 if len(version_numbers) == 2:
130 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
131 BOOT_OS_MINOR_VERSION= int(version_numbers[1])
133 # for 3.x cds, if there are more than two parts
134 # separated by a ., its one of the beta cds.
135 # hardcode as a 3.0 cd
136 BOOT_OS_MAJOR_VERSION= 3
137 BOOT_OS_MINOR_VERSION= 0
139 vars['BOOT_CD_VERSION']= (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION)
141 if (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION) >= \
142 MINIMUM_BOOT_VERSION:
147 except IndexError, e:
154 # check for a 2.x version first
155 version_file= file(BOOT_VERSION_2X_FILE,'r')
156 full_version= string.strip(version_file.read())
159 version_parts= string.split(full_version)
160 version= version_parts[-1]
161 if version[0] == 'v':
164 version_numbers= string.split(version,".")
165 if len(version_numbers) == 2:
166 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
167 BOOT_OS_MINOR_VERSION= int(version_numbers[1])
169 BOOT_OS_MAJOR_VERSION= int(version_numbers[0])
170 BOOT_OS_MINOR_VERSION= int(version_numbers[2])
172 vars['BOOT_CD_VERSION']= (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION)
174 if (BOOT_OS_MAJOR_VERSION,BOOT_OS_MINOR_VERSION) >= \
175 MINIMUM_BOOT_VERSION:
180 except IndexError, e:
190 def _create_cciss_dev_entries():
191 def mkccissnod(dev,node):
192 dev = dev + " b 104 %d" % (node)
193 cmd = "mknod /dev/cciss/%s" %dev
194 utils.sysexec_noerr(cmd)
199 for i in range(0,16):
201 node = mkccissnod(dev,node)
202 for j in range(1,16):
203 subdev = dev + "p%d" % j
204 node = mkccissnod(subdev,node)