summaryrefslogtreecommitdiffstats
path: root/abs/core/LinHES-config/mv_network.py
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/LinHES-config/mv_network.py')
-rwxr-xr-xabs/core/LinHES-config/mv_network.py507
1 files changed, 507 insertions, 0 deletions
diff --git a/abs/core/LinHES-config/mv_network.py b/abs/core/LinHES-config/mv_network.py
new file mode 100755
index 0000000..b80e4cc
--- /dev/null
+++ b/abs/core/LinHES-config/mv_network.py
@@ -0,0 +1,507 @@
+# -*- coding: utf-8 -*-
+import sys , os, commands , glob, time, re
+import logging
+import mv_common
+import socket, fcntl, struct, array
+import netifaces, iplib
+global etcnetdir
+etcnetdir = "/etc/net/ifaces"
+
+def setup_MYTH_DHCP(systemconfig):
+ default_interface = systemconfig["default_interface"]
+ try:
+ defaultdhcp = systemconfig["HostUSEDHCP"+default_interface]
+ except:
+ logging.critical(" *Error occured finding default dhcp")
+ defaultdhcp = "0"
+ logging.debug(" Using %s as dhcp value for %s", defaultdhcp, default_interface)
+ return defaultdhcp
+
+def all_interfaces():
+ max_possible = 128 # arbitrary. raise if needed.
+ bytes = max_possible * 32
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ names = array.array('B', '\0' * bytes)
+ outbytes = struct.unpack('iL', fcntl.ioctl(
+ s.fileno(),
+ 0x8912, # SIOCGIFCONF
+ struct.pack('iL', bytes, names.buffer_info()[0])
+ ))[0]
+ namestr = names.tostring()
+ return [namestr[i:i+32].split('\0', 1)[0] for i in range(0, outbytes, 32)]
+
+def get_ip(ifname):
+ logging.debug(" Finding ip address for %s", ifname)
+ all_if = all_interfaces()
+ logging.debug(" found interfaces:%s", all_if)
+ if ifname in all_if :
+ logging.debug(" Found %s in all_interfaces", ifname)
+ else:
+ logging.critical("* Couldn't find %s in list", ifname)
+ ifname = all_if[0]
+ logging.critical("* Using %s for interface name", ifname)
+
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ struct.pack('256s', ifname[:15])
+ )[20:24])
+
+def get_default_route(iface):
+ rcroute = "127.0.0.1"
+ f = open ('/proc/net/route', 'r')
+ for line in f:
+ words = string.split (line)
+ netiface = words[0]
+ route = words[2]
+ flags = words[3]
+ try:
+ if ( netiface == iface ) and ( flags == "0003") :
+ route = iplib.IPv4Address(route, notation="hex")
+ t = str(route.get_dot())
+ s = t.split(".")
+ rcroute = s[3] + "." + s[2] + "." + s[1] + "." + s[0]
+ break
+ except ValueError:
+ pass
+ return rcroute
+
+def setup_MYTH_IP(systemconfig):
+ default_interface = systemconfig["default_interface"]
+ #check for dhcp in use
+ if setup_MYTH_DHCP(systemconfig) == "0":
+ logging.debug(" dhcp is in use, finding dhcp ip")
+ defaultip = get_ip(default_interface)
+ else:
+ try:
+ defaultip = systemconfig["Hostip"+default_interface]
+ except:
+ logging.debug(" Error occured finding the defaultip")
+ defaultip = "127.0.0.1"
+ logging.debug(" Using %s as default ip", defaultip)
+ return defaultip
+
+
+def setup_MYTH_GW(systemconfig):
+ default_interface = systemconfig["default_interface"]
+ #check for dhcp in use
+ if setup_MYTH_DHCP(systemconfig) == "0":
+ logging.debug(" dhcp is in use, finding dhcp ip")
+ defaultgw = get_default_route(default_interface)
+ else:
+ try:
+ defaultgw = systemconfig["Hostgw"+default_interface]
+ except:
+ logging.debug(" Error occured finding the defaultgw")
+ defaultgw = "127.0.0.1"
+ logging.debug(" Using %s as default gw", defaultgw)
+ return defaultgw
+
+
+def setup_MTYH_DNS():
+ returndns = "127.0.0.1"
+ try:
+ f = open ('/etc/resolv.conf', 'r')
+ for line in f:
+ if line.startswith("nameserver"):
+ print line
+ returndns = line.split()[1]
+ break
+ except:
+ logging.debug(" Couldn't open /etc/resolv.conf for myth_dns")
+ logging.debug(" using %s for myth_dns", returndns)
+ return returndns
+
+
+
+
+
+def flush(netdev):
+ logging.debug(" Flushing %s",netdev)
+ cmd = '''ip address flush dev %s''' %netdev
+ mv_common.runcmd(cmd)
+
+def kill_dhcp(basedir):
+ logging.debug(" _Start of kill_dhcp")
+ logging.debug(" Killing off dhcpd")
+ stddir = os.getcwd()
+ piddir = ("%s/var/run/") %basedir
+ try:
+ os.chdir(piddir)
+ for FILE in glob.glob("dhcpcd-*.pid"):
+ f = open(FILE,'r')
+ pid = f.readline()
+ f.close
+ cmd = "kill -9 %s" %pid
+ mv_common.runcmd(cmd)
+ mv_common.remove_file(FILE)
+ os.chdir(stddir)
+ except:
+ pass
+
+def setup_nameserver(dns):
+ logging.info(" Adding %s for DNS", dns)
+ cmd = '''grep -q %s /etc/resolv.conf''' %dns
+ status = mv_common.runcmd(cmd)
+ if not status == 0 :
+ cmd = ''' echo "nameserver %s" >> /etc/resolv.conf ''' %dns
+ mv_common.runcmd(cmd)
+
+
+
+def setup_hostname(systemconfig):
+ logging.debug(" _Start of setup_hostname")
+ try:
+ hostname = systemconfig["hostname"]
+ except:
+ logging.critical(" *Hostname could not be set")
+ logging.info(" Using default value of me")
+ hostname = "me"
+ logging.info(" Setting the hostname to %s", hostname)
+ cmd = ''' echo %s > /etc/hostname ''' %hostname
+ mv_common.runcmd(cmd)
+ cmd = "cat /etc/hosts | grep -v 127.0.0.1 | grep -v %s > /tmp/hosts" %hostname
+ mv_common.runcmd(cmd)
+ if systemconfig["mythdhcp"] == "1" :
+ logging.debug(" not using dhcp")
+ cmd = ''' echo 127.0.0.1 localhost > /etc/hosts '''
+ mv_common.runcmd(cmd)
+ cmd = ''' echo %s %s > /etc/hosts ''' %(systemconfig["mythip"], systemconfig["hostname"])
+ mv_common.runcmd(cmd)
+ else:
+ cmd = ''' echo 127.0.0.1 %s localhost > /etc/hosts ''' %systemconfig["hostname"]
+ mv_common.runcmd(cmd)
+ cmd = '''cat /tmp/hosts >> /etc/hosts '''
+ mv_common.runcmd(cmd)
+
+
+def write_wpafile(line,netdev):
+ logging.debug(" writing out wpa_supplicant.conf file")
+ logging.debug(line)
+ wpafile = etcnetdir+"/"+netdev+"/wpa_supplicant.conf"
+ try:
+ f = open(wpafile,'w')
+ f.write(line)
+ f.close()
+ except:
+ logging.debug(" Couldn't write to %s",wpafile)
+
+def setup_wpa(netinfo,netdev):
+ logging.info(" %s will use wpa for encryption",netdev)
+ line = '''
+#This file was automaticly generated, any changes may be lost
+ctrl_interface=/var/run/wpa_supplicant
+network={
+ ssid="%s"
+ # Preshared key as an ASCII passphrase
+ psk="%s"
+ scan_ssid=1
+ key_mgmt=WPA-EAP WPA-PSK NONE
+ pairwise=CCMP TKIP
+ proto=WPA RSN
+}''' %(netinfo["ESSID"],netinfo["KEY"])
+ write_wpafile(line,netdev)
+
+def setup_wep(netinfo,netdev):
+ logging.info(" %s will use wep for encryption",netdev)
+ logging.debug(" When a packet comes along, you must wep it")
+ line='''
+#This file was automaticly generated, any changes may be lost
+ctrl_interface=/var/run/wpa_supplicant
+network={
+ ssid="%s"
+ key_mgmt=NONE
+ wep_key0=%s
+ wep_tx_keyidx=0
+ scan_ssid=1
+ auth_alg=SHARED
+}
+''' %(netinfo["ESSID"],netinfo["KEY"])
+ write_wpafile(line,netdev)
+
+
+def setup_none(netinfo,netdev):
+ logging.info(" %s will not use encryption",netdev)
+ line = '''
+#This file was automaticly generated, any changes may be lost
+ctrl_interface=/var/run/wpa_supplicant
+network={
+ ssid="%s"
+ key_mgmt=NONE
+}
+''' %netinfo["ESSID"]
+ write_wpafile(line,netdev)
+
+def setup_interface(netdev,systemconfig):
+ logging.debug(" _Start of setup_interface for %s",netdev)
+ nettrans = {'Hostip':'ip',
+ 'Hostnetmask':'netmask',
+ 'HostActive':'isactive',
+ 'HostDNS':'dns',
+ 'HostUSEDHCP':'UseDHCP',
+ 'HostGW':'GW',
+ 'HostMTU':'mtu',
+ 'HOST_iswireless':"wireless",
+ 'HostESSID':'ESSID',
+ 'HostKey':'KEY',
+ 'HostUseEncryption':'ENCRYPT'}
+ netinfo = {}
+ #populate the netinfo dict
+ for netitem in nettrans:
+ if systemconfig[netitem+netdev]:
+ netinfo[nettrans[netitem]] = systemconfig[netitem+netdev]
+ else:
+ netinfo[nettrans[netitem]] = False
+ logging.debug(" %s:%s",netitem,netinfo[nettrans[netitem]])
+ logging.info(" %s wireless: %s", netdev,netinfo["wireless"])
+ try:
+ os.makedirs(etcnetdir)
+ except:
+ logging.debug(" Could not create %s",etcnetdir)
+
+ optionfile=etcnetdir+"/"+netdev+"/options"
+ if not os.path.exists(optionfile):
+ try:
+ os.makedirs(etcnetdir+"/"+netdev)
+ except:
+ pass
+ mv_common.cp_and_log(systemconfig["TEMPLATES"]+"/etcnet/eth/options", optionfile)
+
+ if netinfo["isactive"] == "1" :
+ change_iface_state(netdev,"enabled")
+ else:
+ change_iface_state(netdev,"disabled")
+
+ if netinfo["wireless"] == "1" :
+
+ logging.info(" Enabling wireless extensions")
+ cmd = ''' sed -i -e 's/^CONFIG_WIRELESS=.*$/CONFIG_WIRLESS=yes/g' %s/%s/options''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ if netinfo["ENCRYPT"] == "WEP":
+ setup_wep(netinfo,netdev)
+ elif netinfo["ENCRYPT"] == "WPA":
+ setup_wpa(netinfo,netdev)
+ elif netinfo["ENCRYPT"] == "none":
+ setup_none(netinfo,netdev)
+
+ else:
+ logging.info(" Disabling wireless extensions")
+ cmd = '''sed -i -e 's/^CONFIG_WIRLESS=.*$/CONFIG_WIRLESS=no/g' %s/%s/options''' %(etcnetdir, netdev)
+ mv_common.runcmd(cmd)
+ #try:
+ wpafile=etcnetdir+"/"+netdev+"/wpa_supplicant.conf"
+ #os.remove(wpafile)
+ mv_common.remove_file(wpafile)
+ #except:
+ #logging.debug(" Couldn't remove %s",wpafile)
+
+ if netinfo["UseDHCP"] == "0" :
+ logging.info(" Enabling DHCP support")
+ cmd = ''' sed -i -e 's/^BOOTPROTO=.*$/BOOTPROTO=dhcp/g' %s/%s/options''' %(etcnetdir, netdev)
+ mv_common.runcmd(cmd)
+ else:
+ logging.info(" Using static ip address of %s",netinfo["ip"])
+ cmd = ''' sed -i -e 's/^BOOTPROTO=.*$/BOOTPROTO=static/g' %s/%s/options''' %(etcnetdir, netdev)
+ mv_common.runcmd(cmd)
+ cmd = '''echo "default via %s" > %s/%s/ipv4route''' %(netinfo["GW"], etcnetdir, netdev)
+ mv_common.runcmd(cmd)
+ cmd = '''echo "%s%s" > %s/%s/ipv4address ''' %(netinfo["ip"], netinfo["netmask"].split()[0], etcnetdir, netdev)
+ mv_common.runcmd(cmd)
+ setup_nameserver(netinfo["dns"])
+
+ if netinfo["mtu"] :
+ logging.info(" Setting mtu to %s", netinfo["mtu"])
+ cmd = '''sed -i '/^mtu.*$/d' %s/%s/iplink''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ cmd = ''' echo "mtu %s" >> %s/%s/iplink''' %(netinfo["mtu"], etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ else:
+ logging.info(" Using default mtu value")
+ cmd = '''sed -i '/^mtu.*$/d' %s/%s/iplink''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+
+
+def change_iface_state(netdev, state):
+ if state == "enabled":
+ logging.info(" Activating %s", netdev)
+ cmd = '''sed -i -e 's/^ONBOOT=.*$/ONBOOT=yes/g' %s/%s/options''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ cmd = '''sed -i -e 's/^DISABLED=.*$/DISABLED=no/g' %s/%s/options ''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ else:
+ logging.info(" Disabling %s", netdev)
+ cmd = '''sed -i -e 's/^ONBOOT=.*$/ONBOOT=no/g' %s/%s/options''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ cmd = '''sed -i -e 's/^DISABLED=.*$/DISABLED=yes/g' %s/%s/options ''' %(etcnetdir,netdev)
+ mv_common.runcmd(cmd)
+ cmd = "/sbin/ifconfig %s down" %netdev
+ mv_common.runcmd(cmd)
+ cmd = "ip address flush %s" %netdev
+ mv_common.runcmd(cmd)
+
+def devcheck(netdev):
+ cmd = ''' /sbin/ifconfig %s''' %netdev
+ rc = mv_common.runcmd(cmd)
+ if rc == 0 :
+ return True
+ else:
+ return False
+
+def udev_rules(netdev):
+ filename = "/etc/udev/rules.d/net.rules"
+ if devcheck(netdev):
+ logging.info(" Finding macaddress for %s",netdev)
+ try:
+ macaddress = netifaces.ifaddresses(netdev)[netifaces.AF_LINK][0]['addr']
+ logging.debug(" Macaddress: %s",macaddress)
+ except:
+ logging.debug(" Couldn't find mac address for %s",netdev)
+ return
+ try:
+ f = open(filename,'a')
+ except:
+ logging.debug(" Couldn't open %s for writing", filename)
+ return
+ if netdev.startswith('eth'):
+ line = '''KERNEL=="eth*", SYSFS{address}=="%s", NAME="%s"''' % ( macaddress , netdev)
+ elif netdev.startswith('wlan'):
+ line = '''KERNEL=="wlan*", SYSFS{address}=="%s", NAME="%s"'''% ( macaddress , netdev)
+ elif netdev.startswith('ath'):
+ line = '''KERNEL=="ath*", SYSFS{address}=="%s", NAME="%s"''' % ( macaddress , netdev)
+ logging.debug(" adding to net.rules ")
+ logging.debug(" %s",line)
+ f.write(line)
+ f.write("\n")
+ f.close()
+
+def find_active(systemconfig,this_is_install):
+ interfacelist=('eth0', 'eth1', 'wlan0', 'wlan1', 'ath0')
+ logging.debug(" _Start of find_active")
+
+ if systemconfig["mythdhcp"] == "1":
+ mv_common.remove_file("/etc/resolv.conf")
+ cmd = ''' echo search lan > /etc/resolv.conf '''
+ mv_common.runcmd(cmd)
+ cmd = ''' echo nameserver 127.0.0.1 >> /etc/resolv.conf '''
+ mv_common.runcmd(cmd)
+
+ for netdev in interfacelist:
+ if this_is_install:
+ udev_rules(netdev)
+ currentnet = "HostActive" + netdev
+ try:
+ systemconfig[currentnet]
+ except:
+ logging.debug(" %s is not defined",currentnet)
+ change_iface_state(netdev, "disabled")
+ continue
+ if systemconfig[currentnet] == "1" :
+ #check if device is present
+ if devcheck(netdev) :
+ setup_interface(netdev,systemconfig)
+ else:
+ logging.debug(" Interface %s not found in config", netdev)
+ #change_iface_state(netdev, "disabled")
+ else:
+ change_iface_state(netdev, "disabled")
+
+def vnc_netboot_check():
+ logging.debug(" Start of VNC/NETBOOT check")
+ vnc = False
+ netboot = False
+ try:
+ f = open('/proc/cmdline', 'r')
+ bootoptions = f.readlines()
+ f.close()
+ except:
+ logging.critical(" *Couldn't open /proc/cmdline")
+ logging.debug(" Assuming it's ok to fiddle with the network")
+ return True
+ bootoptions = bootoptions[0]
+ if re.match("vnc",bootoptions) != None :
+ logging.debug(" Found VNC option")
+ vnc = True
+ if re.match("nfsroot",bootoptions) != None :
+ logging.debug(" Found netboot option")
+ netboot = True
+
+ return (vnc or netboot)
+
+def start_network():
+ if not vnc_netboot_check():
+ logging.info(" Restarting network")
+ cmd ="/etc/net/scripts/network.init reload"
+ mv_common.runcmd(cmd)
+ cmd ="/etc/net/scripts/network.init restart"
+ mv_common.runcmd(cmd)
+ else:
+ logging.info(" Will not restart network due to netboot/vnc")
+
+
+def stop_network():
+ if not vnc_netboot_check():
+ logging.info(" Stopping network")
+ cmd ="/etc/net/scripts/network.init stop"
+ mv_common.runcmd(cmd)
+ kill_dhcp("")
+ interfacelist=('eth0', 'eth1', 'wlan0', 'wlan1', 'ath0')
+ for i in interfacelist:
+ flush(i)
+ else:
+ logging.info(" Will not stop network due to netboot/vnc")
+ pass
+
+def hostname_change_check(systemconfig):
+ restartfe = False
+ logging.debug(" _Start of hostname_change_check")
+ oldhostname = socket.gethostname()
+ #oldhostname = "crap"
+ newhostname = systemconfig["hostname"]
+ mv_root = systemconfig["MVROOT"]
+ logging.debug(" Old hostname: %s", oldhostname)
+ logging.debug(" New hostname: %s", newhostname)
+ if oldhostname != newhostname :
+ logging.info(" Changing hostname in database to match new hostname")
+ cmd ="%s/bin/restore_default_settings.sh -cuhostname -o -h%s" %(mv_root, oldhostname)
+ mv_common.runcmd(cmd)
+ logging.info(" Changing hostname to %s", newhostname)
+ cmd = "hostname %s" %newhostname
+ mv_common.runcmd(cmd)
+ if systemconfig["SystemType"] != "Frontend_only" :
+ logging.info(" Restarting backend")
+ mv_common.stop_service("mythbackend")
+ mv_common.start_service("mythbackend")
+ restartfe = True
+ else:
+ logging.debug(" old and new hostnames matched, leaving things along")
+ logging.debug(" __End of hostname_change_check")
+ return restartfe
+
+
+
+def setup_network (systemconfig,this_is_install):
+ logging.info("____Start of network____")
+ logging.info(" Setting up the network")
+ restartfe = hostname_change_check(systemconfig)
+ setup_hostname(systemconfig)
+ find_active(systemconfig,this_is_install)
+ start_network()
+ logging.info("__End of network\n")
+ return restartfe
+
+
+
+##this is used by the install process to start the network
+def install_network_setup(systemconfig):
+ logging.info("____Start of network_install____")
+ logging.info(" Setting up the network")
+ #setup_MYTH_vars
+ setup_hostname(systemconfig)
+ stop_network()
+ find_active(systemconfig)
+ start_network()
+ logging.info("__End of network install \n")
+
+