diff options
author | Matt Wilson <msw@redhat.com> | 2001-06-20 04:39:53 +0000 |
---|---|---|
committer | Matt Wilson <msw@redhat.com> | 2001-06-20 04:39:53 +0000 |
commit | c4249bbe06e028e95f6514adb7f90ae11ab3b43b (patch) | |
tree | 408350beb14885893b86938d27a46688c4986003 /network.py | |
parent | 8a566ec58b79dc8c583a4610a27a5182b31bacb8 (diff) | |
download | anaconda-c4249bbe06e028e95f6514adb7f90ae11ab3b43b.tar.gz anaconda-c4249bbe06e028e95f6514adb7f90ae11ab3b43b.tar.xz anaconda-c4249bbe06e028e95f6514adb7f90ae11ab3b43b.zip |
merge dispatch to HEAD
Diffstat (limited to 'network.py')
-rw-r--r-- | network.py | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/network.py b/network.py new file mode 100644 index 000000000..93caa608b --- /dev/null +++ b/network.py @@ -0,0 +1,256 @@ +from simpleconfig import SimpleConfigFile +import string +import isys +import socket +import os +from log import log + +class NetworkDevice (SimpleConfigFile): + def __str__ (self): + s = "" + s = s + "DEVICE=" + self.info["DEVICE"] + "\n" + keys = self.info.keys () + keys.sort () + keys.remove ("DEVICE") + + # Don't let onboot be turned on unless we have config information + # to go along with it + if self.get('bootproto') != 'dhcp' and not self.get('ipaddr'): + forceOffOnBoot = 1 + else: + forceOffOnBoot = 0 + + onBootWritten = 0 + for key in keys: + if key == 'ONBOOT' and forceOffOnBoot: + s = s + key + "=" + 'no' + "\n" + else: + s = s + key + "=" + self.info[key] + "\n" + + if key == 'ONBOOT': + onBootWritten = 1 + + if not onBootWritten: + s = s + 'ONBOOT=no\n' + + return s + + def __init__ (self, dev): + self.info = { "DEVICE" : dev } + +class Network: + def __init__ (self): + self.netdevices = {} + self.gateway = "" + self.primaryNS = "" + self.secondaryNS = "" + self.ternaryNS = "" + self.domains = [] + self.readData = 0 + self.isConfigured = 0 + self.hostname = "localhost.localdomain" + + try: + f = open ("/tmp/netinfo", "r") + except: + pass + else: + lines = f.readlines () + f.close () + info = {} + self.isConfigured = 1 + for line in lines: + netinf = string.splitfields (line, '=') + info [netinf[0]] = string.strip (netinf[1]) + self.netdevices [info["DEVICE"]] = NetworkDevice (info["DEVICE"]) + if info.has_key ("IPADDR"): + self.netdevices [info["DEVICE"]].set (("IPADDR", info["IPADDR"])) + if info.has_key ("NETMASK"): + self.netdevices [info["DEVICE"]].set (("NETMASK", info["NETMASK"])) + if info.has_key ("BOOTPROTO"): + self.netdevices [info["DEVICE"]].set (("BOOTPROTO", info["BOOTPROTO"])) + if info.has_key ("ONBOOT"): + self.netdevices [info["DEVICE"]].set (("ONBOOT", info["ONBOOT"])) + if info.has_key ("GATEWAY"): + self.gateway = info["GATEWAY"] + if info.has_key ("DOMAIN"): + self.domains.append(info["DOMAIN"]) + if info.has_key ("HOSTNAME"): + self.hostname = info["HOSTNAME"] + + self.readData = 1 + try: + f = open ("/etc/resolv.conf", "r") + except: + pass + else: + lines = f.readlines () + f.close () + for line in lines: + resolv = string.split (line) + if resolv and resolv[0] == 'nameserver': + if self.primaryNS == "": + self.primaryNS = resolv[1] + elif self.secondaryNS == "": + self.secondaryNS = resolv[1] + elif self.ternaryNS == "": + self.ternaryNS = resolv[1] + + def getDevice(self, device): + return self.netdevices[device] + + def available (self): + f = open ("/proc/net/dev") + lines = f.readlines() + f.close () + # skip first two lines, they are header + lines = lines[2:] + for line in lines: + dev = string.strip (line[0:6]) + if dev != "lo" and not self.netdevices.has_key (dev): + self.netdevices[dev] = NetworkDevice (dev) + return self.netdevices + + def setHostname(self, hn): + self.hostname = hn + + def lookupHostname (self): + # can't look things up if they don't exist! + if not self.hostname or self.hostname == "localhost.localdomain": return None + if not self.primaryNS: return + if not self.isConfigured: + for dev in self.netdevices.values(): + if dev.get('bootproto') == "dhcp": + self.primaryNS = isys.pumpNetDevice(dev.get('device')) + self.isConfigured = 1 + break + elif dev.get('ipaddr') and dev.get('netmask'): + try: + isys.configNetDevice(dev.get('device'), + dev.get('ipaddr'), + dev.get('netmask'), + self.gateway) + self.isConfigured = 1 + break + except SystemError: + log ("failed to configure network device %s when " + "looking up host name", dev.get('device')) + + if not self.isConfigured: + log ("no network devices were availabe to look up host name") + return None + + f = open("/etc/resolv.conf", "w") + f.write("nameserver %s\n" % self.primaryNS) + f.close() + isys.resetResolv() + isys.setResolvRetry(2) + + try: + ip = socket.gethostbyname(self.hostname) + except: + return None + + return ip + + def nameservers (self): + return [ self.primaryNS, self.secondaryNS, self.ternaryNS ] + + def writeKS(self, f): + # XXX + # + # Hopefully the first one is the right one to use. We ought to support + # multiple "network" lines + # + # This doesn't write out nodns, ever. + # + devNames = self.netdevices.keys() + devNames.sort() + dev = self.netdevices[devNames[0]] + + if dev.get('bootproto') == 'dhcp' or dev.get('ipaddr'): + f.write("network --device %s" % dev.get('device')) + if dev.get('bootproto') == 'dhcp': + f.write(" --bootproto dhcp") + else: + f.write(" --ip %s --network %s --netmask %s" % + (dev.get('ipaddr'), dev.get('netmask'), dev.get('gateway'))) + + if dev.get('nameserver'): + f.write(" --nameserver %s" % dev.get('nameserver')) + + if self.hostname and self.hostname != "localhost.localdomain": + f.write(" --hostname %s" % dev.get('hostname')) + + f.write("\n"); + + def write (self, instPath): + # /etc/sysconfig/network-scripts/ifcfg-* + for dev in self.netdevices.values (): + device = dev.get ("device") + fn = instPath + "/etc/sysconfig/network-scripts/ifcfg-" + device + f = open (fn, "w") + os.chmod(fn, 0600) + f.write (str (dev)) + f.close () + + # /etc/sysconfig/network + + f = open (instPath + "/etc/sysconfig/network", "w") + f.write ("NETWORKING=yes\n" + "HOSTNAME=") + + + # use instclass hostname if set (kickstart) to override + if self.hostname: + f.write(self.hostname + "\n") + else: + f.write("localhost.localdomain" + "\n") + if self.gateway: + f.write("GATEWAY=" + self.gateway + "\n") + f.close () + + # /etc/hosts + f = open (instPath + "/etc/hosts", "w") + localline = "127.0.0.1\t\t" + + log ("self.hostname = %s", self.hostname) + + ip = self.lookupHostname() + + # If the hostname is not resolvable, tie it to 127.0.0.1 + if not ip and self.hostname != "localhost.localdomain": + localline = localline + self.hostname + " " + l = string.split(self.hostname, ".") + if len(l) > 1: + localline = localline + l[0] + " " + + localline = localline + "localhost.localdomain localhost\n" + f.write("# Do not remove the following line, or various programs\n") + f.write("# that require network functionality will fail.\n") + f.write (localline) + + if ip: + f.write ("%s\t\t%s\n" % (ip, self.hostname)) + + # If the hostname was not looked up, but typed in by the user, + # domain might not be computed, so do it now. + if self.domains == [ "localdomain" ] or not self.domains: + if '.' in self.hostname: + # chop off everything before the leading '.' + domain = self.hostname[(string.find(self.hostname, '.') + 1):] + self.domains = [ domain ] + + # /etc/resolv.conf + f = open (instPath + "/etc/resolv.conf", "w") + + if self.domains != [ 'localdomain' ] and self.domains: + f.write ("search " + string.joinfields (self.domains, ' ') + + "\n") + + for ns in self.nameservers (): + if ns: + f.write ("nameserver " + ns + "\n") + + f.close () + |