Changeset 202
- Timestamp:
- 08/22/12 13:44:20 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/pxeconfig.py
r194 r202 35 35 36 36 The first five nodes of rack 16 37 37 - gb-r16n[1-5] 38 38 39 39 The first five nodes and node 12 and 18 of rack 16 to 20 … … 41 41 42 42 The first five nodes de in rack 16 with padding enabled 43 43 - gb-r[16]n[01-5] 44 44 45 45 Host with mac address 00:19:b9:de:21:47 and first five node of rack 15 46 47 46 - 00:19:b9:de:21:47 gb-r15n[1-5] 47 48 48 The ranges ([]) are not only limited to numbers, letters can also be used. 49 49 … … 77 77 78 78 def select_pxe_configfile(): 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 79 """ 80 Let user choose which pxeconfig file to use. 81 """ 82 83 os.chdir(PXE_CONF_DIR) 84 85 # Try to determine to which file the default symlink points, and 86 # if it exists, remove it from the list. 87 # 88 try: 89 default_file = os.readlink('default') 90 except OSError: 91 default_file = None 92 pass 93 94 files = glob.glob('default.*') 95 if not files: 96 error = 'There are no pxe config files starting with: default.' 97 raise PxeConfig, error 98 99 if default_file: 100 files.remove(default_file) 101 102 # sort the files 103 # 104 files.sort() 105 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 106 print 'Which pxe config file must we use: ?' 107 i = 1 108 for file in files: 109 print "%d : %s" %(i,file) 110 i = i + 1 111 112 while 1: 113 index = raw_input('Select a number: ') 114 try: 115 index = int(index) 116 except ValueError: 117 index = len(files) + 1 118 119 # Is the user smart enough to select 120 # the right value?? 121 # 122 if 0 < index <= len(files): 123 break 124 125 return files[index-1] 126 126 127 127 def manage_links(haddr, options): 128 129 130 128 """ 129 Create the links in the PXE_CONF_DIR, 130 list : A list containing: network hex address, pxe config file, 131 131 start number, end number 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 132 """ 133 if options.VERBOSE: 134 print 'manage_links(%s)' %(haddr) 135 136 os.chdir(PXE_CONF_DIR) 137 pxe_filename = options.filename 138 139 if options.REMOVE: 140 if options.DEBUG or options.DRY_RUN or options.VERBOSE: 141 print 'removing %s/%s' %(PXE_CONF_DIR, haddr) 142 143 if os.path.exists(haddr) and not options.DRY_RUN: 144 os.unlink(haddr) 145 146 else: 147 if options.DEBUG or options.DRY_RUN or options.VERBOSE: 148 print 'linking %s to %s' %(haddr, pxe_filename) 149 150 if not options.DRY_RUN: 151 if os.path.exists(haddr): 152 os.unlink(haddr) 153 os.symlink(pxe_filename, haddr) 154 154 155 155 def net_2_hex(net, options): 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 156 """ 157 This function checks if the give network is a Class C-network and will 158 convert the network address to a hex address if true. 159 """ 160 if options.DEBUG: 161 str = 'net_2_hex : %s' %(net) 162 print str 163 164 d = string.split(net, '.') 165 if len(d) != 3: 166 error = '%s is not a valid C-class network address' %(net) 167 raise PxeConfig, error 168 169 # Check if we have valid network values 170 r = '' 171 for i in d: 172 r = '%s%02X' %(r, int(i)) 173 174 if options.DEBUG: 175 print 'C-network converted to hex: ', r 176 177 return r 178 178 179 179 def host_2_hex(host, options): 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 180 """ 181 Convert hostname(s) to a net address that can be handled by manage_links function 182 """ 183 if options.DEBUG: 184 str = 'host_2_hex: %s' %hosts 185 print str 186 187 try: 188 addr = socket.gethostbyname(host) 189 except socket.error,detail: 190 error = '%s not an valid hostname: %s' %(host,detail) 191 raise PxeConfig, error 192 193 net = string.splitfields(addr, '.') 194 cnet = string.joinfields(net[0:3], '.') 195 196 if options.SCRIPT_HOOK: 197 if options.DEBUG or options.DRY_RUN or options.VERBOSE: 198 print 'Executing client script hook: %s with arg: %s' %(options.SCRIPT_HOOK, addr) 199 if not options.DRY_RUN: 200 cmd = '%s %s' %(options.SCRIPT_HOOK, addr) 201 os.system(cmd) 202 203 haddr = '%s%02X' %(net_2_hex(cnet, options), int(net[3])) 204 manage_links(haddr, options) 205 205 206 206 207 207 def mac_2_hex(mac_addr, options): 208 209 210 211 212 213 214 215 216 208 """ 209 Convert mac address to pxeconfig address 210 """ 211 if options.DEBUG: 212 str = 'mac_2_hex: %s' %mac_addr 213 print mac_addr 214 215 haddr = '01-%s' %(mac_addr.replace(':', '-').lower()) 216 manage_links(haddr, options) 217 217 218 218 def add_options(p): 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 219 """ 220 add the default options 221 """ 222 p.set_defaults( 223 DEBUG = False, 224 VERBOSE = False, 225 DRY_RUN = False, 226 REMOVE = False, 227 VERSION = False, 228 SCRIPT_HOOK = False, 229 ) 230 231 p.add_option('-d', '--debug', 232 action = 'store_true', 233 dest = 'DEBUG', 234 help = 'Toggle debug mode (default : False)' 235 ) 236 237 p.add_option('-f', '--filename', 238 action = 'store', 239 dest = 'filename', 240 help = 'Specifies which PXE filename must be use' 241 ) 242 243 p.add_option('-n', '--dry-run', 244 action = 'store_true', 245 dest = 'DRY_RUN', 246 help = 'Do not execute any command (default : False)' 247 ) 248 249 p.add_option('-r', '--remove', 250 action = 'store_true', 251 dest = 'REMOVE', 252 help = 'Removes the PXE filename for a host(s)' 253 ) 254 255 p.add_option('-v', '--verbose', 256 action = 'store_true', 257 dest = 'VERBOSE', 258 help = 'Make the program more verbose (default: False)' 259 ) 260 261 p.add_option('-V', '--version', 262 action = 'store_true', 263 dest = 'VERSION', 264 help = 'Print the program version number and exit' 265 ) 266 266 267 267 def parser(argv, config, defaults): 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 268 """ 269 Make use of sara advance parser module. It can handle regex in hostnames 270 """ 271 parser = AdvancedParser.AdvancedParser(usage=__doc__) 272 add_options(parser) 273 274 options, args = parser.parse_args() 275 276 if options.VERSION: 277 print VERSION 278 sys.exit(0) 279 280 if not args: 281 parser.print_help() 282 sys.exit(0) 283 284 # debug can be specified by the command line or options file 285 # 286 if not options.DEBUG: 287 try: 288 if defaults['debug']: 289 options.DEBUG = int(defaults['debug']) 290 except KeyError: 291 pass 292 293 # Only check if we have specified an pxeconfig file if we did not 294 # specify the REMOVE option 295 # 296 if not options.REMOVE: 297 if options.filename: 298 if not os.path.isfile(os.path.join(PXE_CONF_DIR, options.filename)): 299 error = '%s: Filename does not exists' %(options.filename) 300 raise PxeConfig, error 301 else: 302 options.filename = select_pxe_configfile() 303 304 # ... 305 try: 306 options.SCRIPT_HOOK = defaults['client_script_hook'] 307 except KeyError, detail: 308 pass 309 310 if options.DEBUG: 311 print args, options 312 313 ## 314 # Are the hosts wiht only mac addresses defined in the configuration file 315 # or specified on the command line 316 # 317 mac_addr_re = re.compile('([a-fA-F0-9]{2}[:|\-]?){6}') 318 319 for host in args: 320 if host in config.sections(): 321 mac_addr = config.get(host, 'mac_address') 322 mac_2_hex(mac_addr, options) 323 324 elif mac_addr_re.search(host): 325 mac_2_hex(host, options) 326 else: 327 host_2_hex(host, options) 328 328 329 329 def main(): 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 330 # A dictionary holding the boot info 331 # 332 global PXE_CONF_DIR 333 parser_config, default_settings = ReadConfig() 334 335 try: 336 PXE_CONF_DIR = default_settings['pxe_config_dir'] 337 338 except KeyError: 339 pass 340 341 PXE_CONF_DIR = os.path.realpath(PXE_CONF_DIR) 342 if not os.path.isdir(PXE_CONF_DIR): 343 error = 'pxeconfig directory: %s does not exists' %(PXE_CONF_DIR) 344 raise PxeConfig, error 345 346 parser(sys.argv, parser_config, default_settings) 347 348 349 349 if __name__ == '__main__': 350 351 352 353 354 350 try: 351 main() 352 except PxeConfig, detail: 353 print detail 354 sys.exit(1)
Note: See TracChangeset
for help on using the changeset viewer.