From: Planet-Lab Support Date: Thu, 10 Aug 2006 19:05:21 +0000 (+0000) Subject: This commit was manufactured by cvs2svn to create branch X-Git-Tag: myplc-0_4-rc3~4 X-Git-Url: http://git.onelab.eu/?p=bootmanager.git;a=commitdiff_plain;h=efc8738d21493f59ec8772df5dcf23f8232b3806 This commit was manufactured by cvs2svn to create branch 'myplc-0_4-branch'. --- diff --git a/source/COPYRIGHT b/source/COPYRIGHT new file mode 100644 index 0000000..6bf1167 --- /dev/null +++ b/source/COPYRIGHT @@ -0,0 +1,55 @@ +The BootManager source code was initially developed by Intel +Corporation and subsequently rewritten by Princeton University. The +copyright for the BootManager source code is as follows: + +Copyright (c) 2003 Intel Corporation +All rights reserved. + +Copyright (c) 2004-2006 The Trustees of Princeton University +All rights reserved. + +The License from both Intel and Princeton for this software is +follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PRINCETON +UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Intel Corporation places the following export restrictions on the +software: + +EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF +YOUR JURISDICTION. It is licensee's responsibility to comply with any +export regulations applicable in licensee's jurisdiction. Under +CURRENT (May 2000) U.S. export regulations this software is eligible +for export from the U.S. and can be downloaded by or otherwise +exported or reexported worldwide EXCEPT to U.S. embargoed destinations +which include Cuba, Iraq, Libya, North Korea, Iran, Syria, Sudan, +Afghanistan and any other country to which the U.S. has embargoed +goods and services. + diff --git a/source/steps/WriteModprobeConfig.py b/source/steps/WriteModprobeConfig.py new file mode 100644 index 0000000..a50fcc4 --- /dev/null +++ b/source/steps/WriteModprobeConfig.py @@ -0,0 +1,100 @@ +#!/usr/bin/python2 -u + +# Copyright (c) 2003 Intel Corporation +# All rights reserved. +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. + +import os, string + +from Exceptions import * +import utils +import systeminfo +import BootAPI +import ModelOptions + +def Run( vars, log, filename = "/etc/modprobe.conf"): + """ + write out the system file /etc/modprobe.conf with the current + set of modules. + + returns a tuple of the number of network driver lines and storage + driver lines written as (networkcount,storagecount) + """ + + # write out the modprobe.conf file for the system. make sure + # the order of the ethernet devices are listed in the same order + # as the boot cd loaded the modules. this is found in /tmp/loadedmodules + # ultimately, the order will only match the boot cd order if + # the kernel modules have the same name - which should be true for the later + # version boot cds because they use the same kernel version. + # older boot cds use a 2.4.19 kernel, and its possible some of the network + # module names have changed, in which case the system might not boot + # if the network modules are activated in a different order that the + # boot cd. + + # make sure we have this class loaded + + try: + SYSIMG_PATH= vars["SYSIMG_PATH"] + if SYSIMG_PATH == "": + raise ValueError, "SYSIMG_PATH" + + 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 + + sysmods= systeminfo.get_system_modules(vars, log) + if sysmods is None: + raise BootManagerException, "Unable to get list of system modules." + + eth_count= 0 + scsi_count= 0 + + modulesconf_file= file("%s/%s" % (SYSIMG_PATH,filename), "w" ) + + for type in sysmods: + if type == systeminfo.MODULE_CLASS_SCSI: + for a_mod in sysmods[type]: + if scsi_count == 0: + modulesconf_file.write( "alias scsi_hostadapter %s\n" % + a_mod ) + else: + modulesconf_file.write( "alias scsi_hostadapter%d %s\n" % + (scsi_count,a_mod) ) + scsi_count= scsi_count + 1 + + elif type == systeminfo.MODULE_CLASS_NETWORK: + for a_mod in sysmods[type]: + modulesconf_file.write( "alias eth%d %s\n" % + (eth_count,a_mod) ) + eth_count= eth_count + 1 + + modulesconf_file.close() + modulesconf_file= None + + # dump the modprobe.conf file to the log (not to screen) + log.write( "Contents of new modprobe.conf file:\n" ) + modulesconf_file= file("%s/%s" % (SYSIMG_PATH,filename), "r" ) + contents= modulesconf_file.read() + log.write( contents + "\n" ) + modulesconf_file.close() + modulesconf_file= None + log.write( "End contents of new modprobe.conf file.\n" ) + + # before we do the real kexec, check to see if we had any + # network drivers written to modprobe.conf. if not, return -1, + # which will cause this node to be switched to a debug state. + if eth_count == 0: + log.write( "\nIt appears we don't have any network drivers. Aborting.\n" ) + + vars['BOOT_STATE']= 'dbg' + vars['STATE_CHANGE_NOTIFY']= 1 + vars['STATE_CHANGE_NOTIFY_MESSAGE']= \ + notify_messages.MSG_NO_DETECTED_NETWORK + raise BootManagerException, \ + notify_messages.MSG_NO_DETECTED_NETWORK + + diff --git a/source/steps/WriteNetworkConfig.py b/source/steps/WriteNetworkConfig.py new file mode 100644 index 0000000..2e6867d --- /dev/null +++ b/source/steps/WriteNetworkConfig.py @@ -0,0 +1,141 @@ +#!/usr/bin/python2 + +# Copyright (c) 2003 Intel Corporation +# All rights reserved. +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. +# expected /proc/partitions format + +import os, string + +from Exceptions import * +import utils +import BootAPI +import ModelOptions + +def Run( vars, log ): + """ + Write out the network configuration for this machine: + /etc/hosts + /etc/sysconfig/network-scripts/ifcfg-eth0 + /etc/resolv.conf (if applicable) + /etc/sysconfig/network + + It is assumed the caller mounted the root partition and the vserver partition + starting on SYSIMG_PATH - it is not checked here. + + The values to be used for the network settings are to be set in vars + in the variable 'NETWORK_SETTINGS', which is a dictionary + with keys: + + Key Used by this function + ----------------------------------------------- + node_id + node_key + method x + ip x + mac x (optional) + gateway x + network x + broadcast x + netmask x + dns1 x + dns2 x (optional) + hostname x + domainname x + + Expect the following variables from the store: + SYSIMG_PATH the path where the system image will be mounted + (always starts with TEMP_PATH) + NETWORK_SETTINGS A dictionary of the values from the network + configuration file + Sets the following variables: + None + """ + + log.write( "\n\nStep: Install: Writing Network Configuration files.\n" ) + + try: + SYSIMG_PATH= vars["SYSIMG_PATH"] + if SYSIMG_PATH == "": + raise ValueError, "SYSIMG_PATH" + + 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: + network_settings= vars['NETWORK_SETTINGS'] + except KeyError, e: + raise BootManagerException, "No network settings found in vars." + + try: + hostname= network_settings['hostname'] + domainname= network_settings['domainname'] + method= network_settings['method'] + ip= network_settings['ip'] + gateway= network_settings['gateway'] + network= network_settings['network'] + netmask= network_settings['netmask'] + dns1= network_settings['dns1'] + mac= network_settings['mac'] + except KeyError, e: + raise BootManagerException, "Missing value %s in network settings." % str(e) + + try: + dns2= '' + dns2= network_settings['dns2'] + except KeyError, e: + pass + + + log.write( "Writing /etc/hosts\n" ) + hosts_file= file("%s/etc/hosts" % SYSIMG_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 + + + log.write( "Writing /etc/sysconfig/network-scripts/ifcfg-eth0\n" ) + eth0_file= file("%s/etc/sysconfig/network-scripts/ifcfg-eth0" % + SYSIMG_PATH, "w" ) + eth0_file.write( "DEVICE=eth0\n" ) + if method == "static": + eth0_file.write( "BOOTPROTO=static\n" ) + eth0_file.write( "IPADDR=%s\n" % ip ) + eth0_file.write( "NETMASK=%s\n" % netmask ) + eth0_file.write( "GATEWAY=%s\n" % gateway ) + else: + eth0_file.write( "BOOTPROTO=dhcp\n" ) + eth0_file.write( "DHCP_HOSTNAME=%s\n" % hostname ) + if mac != "": + eth0_file.write( "HWADDR=%s\n" % mac ) + eth0_file.write( "ONBOOT=yes\n" ) + eth0_file.write( "USERCTL=no\n" ) + eth0_file.close() + eth0_file= None + + if method == "static": + log.write( "Writing /etc/resolv.conf\n" ) + resolv_file= file("%s/etc/resolv.conf" % SYSIMG_PATH, "w" ) + if dns1 != "": + resolv_file.write( "nameserver %s\n" % dns1 ) + if dns2 != "": + resolv_file.write( "nameserver %s\n" % dns2 ) + resolv_file.write( "search %s\n" % domainname ) + resolv_file.close() + resolv_file= None + + log.write( "Writing /etc/sysconfig/network\n" ) + network_file= file("%s/etc/sysconfig/network" % SYSIMG_PATH, "w" ) + network_file.write( "NETWORKING=yes\n" ) + network_file.write( "HOSTNAME=%s.%s\n" % (hostname, domainname) ) + if method == "static": + network_file.write( "GATEWAY=%s\n" % gateway ) + network_file.close() + network_file= None