X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Fsteps%2FUpdateNodeConfiguration.py;h=3008341c9a6edddbcf421900ecd93c460195b73e;hb=5596c3347951b1da8136989073334b8df05b4d87;hp=2c8ea1b30ec73f0733fe597a5799563c6cebf543;hpb=aeecdf5a1be4c56b19e1ee8a902305742f4fd697;p=bootmanager.git diff --git a/source/steps/UpdateNodeConfiguration.py b/source/steps/UpdateNodeConfiguration.py index 2c8ea1b..3008341 100644 --- a/source/steps/UpdateNodeConfiguration.py +++ b/source/steps/UpdateNodeConfiguration.py @@ -1,11 +1,23 @@ +#!/usr/bin/python +# +# Copyright (c) 2003 Intel Corporation +# All rights reserved. +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. + + import os -import InstallWriteConfig -import InstallBuildVServer from Exceptions import * import utils +# if this file is present in the vservers /etc directory, +# the resolv.conf and hosts files will automatically be updated +# by the bootmanager +UPDATE_FILE_FLAG= "AUTO_UPDATE_NET_FILES" + def Run( vars, log ): """ @@ -22,7 +34,7 @@ def Run( vars, log ): SYSIMG_PATH the path where the system image will be mounted (always starts with TEMP_PATH) ROOT_MOUNTED the node root file system is mounted - NETWORK_SETTINGS A dictionary of the values from the network + INTERFACE_SETTINGS A dictionary of the values from the network configuration file """ @@ -30,9 +42,9 @@ def Run( vars, log ): # make sure we have the variables we need try: - NETWORK_SETTINGS= vars["NETWORK_SETTINGS"] - if NETWORK_SETTINGS == "": - raise ValueError, "NETWORK_SETTINGS" + INTERFACE_SETTINGS= vars["INTERFACE_SETTINGS"] + if INTERFACE_SETTINGS == "": + raise ValueError, "INTERFACE_SETTINGS" SYSIMG_PATH= vars["SYSIMG_PATH"] if SYSIMG_PATH == "": @@ -48,30 +60,25 @@ def Run( vars, log ): raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var try: - ip= NETWORK_SETTINGS['ip'] - method= NETWORK_SETTINGS['method'] - hostname= NETWORK_SETTINGS['hostname'] - domainname= NETWORK_SETTINGS['domainname'] + ip= INTERFACE_SETTINGS['ip'] + method= INTERFACE_SETTINGS['method'] + hostname= INTERFACE_SETTINGS['hostname'] + domainname= INTERFACE_SETTINGS['domainname'] except KeyError, var: raise BootManagerException, \ - "Missing network value %s in var NETWORK_SETTINGS\n" % var + "Missing network value %s in var INTERFACE_SETTINGS\n" % var if not ROOT_MOUNTED: raise BootManagerException, "Root isn't mounted on SYSIMG_PATH\n" - - log.write( "Updating node network configuration\n" ) - InstallWriteConfig.write_network_configuration( vars, log ) - - log.write( "Updating vserver's /etc/hosts and /etc/resolv.conf files\n" ) # create a list of the full directory paths of all the vserver images that # need to be updated. update_path_list= [] - for base_dir in ('/vservers','/vservers/.vcache'): + for base_dir in ('/vservers','/vservers/.vref','/vservers/.vcache'): try: full_dir_path= "%s/%s" % (SYSIMG_PATH,base_dir) slices= os.listdir( full_dir_path ) @@ -99,6 +106,110 @@ def Run( vars, log ): # now, update /etc/hosts and /etc/resolv.conf in each dir if # the update flag is there for base_dir in update_path_list: - InstallBuildVServer.update_vserver_network_files(base_dir,vars,log) + update_vserver_network_files(base_dir,vars,log) return + + + +def update_vserver_network_files( vserver_dir, vars, log ): + """ + Update the /etc/resolv.conf and /etc/hosts files in the specified + vserver directory. If the files do not exist, write them out. If they + do exist, rewrite them with new values if the file UPDATE_FILE_FLAG + exists it /etc. if this is called with the vserver-reference directory, + always update the network config files and create the UPDATE_FILE_FLAG. + + This is currently called when setting up the initial vserver reference, + and later when nodes boot to update existing vserver images. + + Expect the following variables from the store: + SYSIMG_PATH the path where the system image will be mounted + (always starts with TEMP_PATH) + INTERFACE_SETTINGS A dictionary of the values from the network + configuration file + """ + + try: + SYSIMG_PATH= vars["SYSIMG_PATH"] + if SYSIMG_PATH == "": + raise ValueError, "SYSIMG_PATH" + + INTERFACE_SETTINGS= vars["INTERFACE_SETTINGS"] + if INTERFACE_SETTINGS == "": + raise ValueError, "INTERFACE_SETTINGS" + + except KeyError, var: + raise BootManagerException, "Missing variable in vars: %s\n" % var + except ValueError, var: + raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var + + try: + ip= INTERFACE_SETTINGS['ip'] + method= INTERFACE_SETTINGS['method'] + hostname= INTERFACE_SETTINGS['hostname'] + domainname= INTERFACE_SETTINGS['domainname'] + except KeyError, var: + raise BootManagerException, \ + "Missing network value %s in var INTERFACE_SETTINGS\n" % var + + try: + os.listdir(vserver_dir) + except OSError: + log.write( "Directory %s does not exist to write network conf in.\n" % + vserver_dir ) + return + + file_path= "%s/etc/%s" % (vserver_dir,UPDATE_FILE_FLAG) + update_files= 0 + if os.access(file_path,os.F_OK): + update_files= 1 + + + # Thierry - 2012/03 - I'm renaming vserver-reference into sliceimage + # however I can't quite grasp the reason for this test below, very likely + # compatibility with very old node images or something + if '/.vref/' in vserver_dir or \ + '/.vcache/' in vserver_dir or \ + '/vserver-reference' in vserver_dir: + log.write( "Forcing update on vserver reference directory:\n%s\n" % + vserver_dir ) + utils.sysexec_noerr( "echo '%s' > %s/etc/%s" % + (UPDATE_FILE_FLAG,vserver_dir,UPDATE_FILE_FLAG), + log ) + update_files= 1 + + + if update_files: + log.write( "Updating network files in %s.\n" % vserver_dir ) + try: + # NOTE: this works around a recurring problem on public pl, + # suspected to be due to mismatch between 2.6.12 bootcd and + # 2.6.22/f8 root environment. files randomly show up with the + # immutible attribute set. this clears it before trying to write + # the files below. + utils.sysexec( "chattr -i %s/etc/hosts" % vserver_dir , log ) + utils.sysexec( "chattr -i %s/etc/resolv.conf" % vserver_dir , log ) + except: + pass + + + file_path= "%s/etc/hosts" % vserver_dir + hosts_file= file(file_path, "w" ) + hosts_file.write( "127.0.0.1 localhost\n" ) + if method == "static": + hosts_file.write( "%s %s.%s\n" % (ip, hostname, domainname) ) + hosts_file.close() + hosts_file= None + + file_path= "%s/etc/resolv.conf" % vserver_dir + if method == "dhcp": + # copy the resolv.conf from the boot cd env. + utils.sysexec( "cp /etc/resolv.conf %s/etc" % vserver_dir, log ) + else: + # copy the generated resolv.conf from the system image, since + # we generated it via static settings + utils.sysexec( "cp %s/etc/resolv.conf %s/etc" % \ + (SYSIMG_PATH,vserver_dir), log ) + + return