-#!/usr/bin/python
+#!/usr/bin/env python
#
# Copyright (c) 2008,2009 Citrix Systems, Inc.
#
--pif A PIF reference within the session.
--pif-uuid The UUID of a PIF.
--force An interface name.
+ --root-prefix=DIR Use DIR as alternate root directory (for testing).
+ --no-syslog Write log messages to stderr instead of system log.
"""
# Notes:
import traceback
import re
import random
+import syslog
management_pif = None
pifrec = db().get_pif_record(pif)
try:
- f = open("/proc/ardence")
+ f = open(root_prefix() + "/proc/ardence")
macline = filter(lambda x: x.startswith("HWaddr:"), f.readlines())
f.close()
if len(macline) == 1:
def get_netdev_mac(device):
try:
- return read1("/sys/class/net/%s/address" % device)
+ return read1("%s/sys/class/net/%s/address" % (root_prefix(), device))
except:
# Probably no such device.
return None
def get_netdev_tx_queue_len(device):
try:
- return int(read1("/sys/class/net/%s/tx_queue_len" % device))
+ return int(read1("%s/sys/class/net/%s/tx_queue_len" % (root_prefix(), device)))
except:
# Probably no such device.
return None
def get_netdev_by_mac(mac):
- for device in os.listdir("/sys/class/net"):
+ for device in os.listdir(root_prefix() + "/sys/class/net"):
dev_mac = get_netdev_mac(device)
if (dev_mac and mac.lower() == dev_mac.lower() and
get_netdev_tx_queue_len(device)):
return None
def rename_netdev(old_name, new_name):
- log("Changing the name of %s to %s" % (old_name, new_name))
- run_command(['/sbin/ifconfig', old_name, 'down'])
- if not run_command(['/sbin/ip', 'link', 'set', old_name, 'name', new_name]):
- raise Error("Could not rename %s to %s" % (old_name, new_name))
+ raise Error("Trying to rename %s to %s - This functionality has been removed" % (old_name, new_name))
+ # log("Changing the name of %s to %s" % (old_name, new_name))
+ # run_command(['/sbin/ifconfig', old_name, 'down'])
+ # if not run_command(['/sbin/ip', 'link', 'set', old_name, 'name', new_name]):
+ # raise Error("Could not rename %s to %s" % (old_name, new_name))
pifrec = db().get_pif_record(pif)
device = pifrec['device']
if not netdev_exists(netdev):
log("ifdown: device %s does not exist, ignoring" % netdev)
return
- if not os.path.exists("/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
+ if not os.path.exists("%s/etc/sysconfig/network-scripts/ifcfg-%s" % (root_prefix(), netdev)):
log("ifdown: device %s exists but ifcfg-%s does not" % (netdev,netdev))
run_command(["/sbin/ifconfig", netdev, 'down'])
return
def ifup(netdev):
"""Bring up a network interface"""
- if not os.path.exists("/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
+ if not os.path.exists(root_prefix() + "/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
raise Error("ifup: device %s exists but ifcfg-%s does not" % (netdev,netdev))
+ d = os.getenv("DHCLIENTARGS","")
+ if os.path.exists("/etc/firstboot.d/data/firstboot_in_progress"):
+ os.putenv("DHCLIENTARGS", d + " -T 240 " )
run_command(["/sbin/ifup", netdev])
+ os.putenv("DHCLIENTARGS", d )
#
#
#
def pif_rename_physical_devices(pif):
+ if pif_is_tunnel(pif):
+ return
if pif_is_vlan(pif):
pif = pif_get_vlan_slave(pif)
# The key is not present, i.e. there are no static routes
lines = []
- child = ConfigurationFile("/etc/sysconfig/network-scripts/route-%s" % interface)
+ child = ConfigurationFile("%s/etc/sysconfig/network-scripts/route-%s" % (root_prefix(), interface))
child.write("# DO NOT EDIT: This file (%s) was autogenerated by %s\n" % \
(os.path.basename(child.path()), os.path.basename(sys.argv[0])))
log("Writing network configuration for %s" % ipdev)
- f = ConfigurationFile("/etc/sysconfig/network-scripts/ifcfg-%s" % ipdev)
+ f = ConfigurationFile("%s/etc/sysconfig/network-scripts/ifcfg-%s" % (root_prefix(), ipdev))
f.write("# DO NOT EDIT: This file (%s) was autogenerated by %s\n" % \
(os.path.basename(f.path()), os.path.basename(sys.argv[0])))
f.write("XEMANAGED=yes\n")
f.write("DEVICE=%s\n" % ipdev)
f.write("ONBOOT=no\n")
+ f.write("NOZEROCONF=yes\n")
return f
"""
pifrec = db().get_pif_record(pif)
- nwrec = db().get_network_record(pifrec['network'])
+ nw = pifrec['network']
+ nwrec = db().get_network_record(nw)
ipdev = pif_ipdev_name(pif)
if len(offload):
f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
- mtu = mtu_setting(nwrec['other_config'])
- if mtu:
- f.write("MTU=%s\n" % mtu)
-
ipdev_configure_static_routes(ipdev, nwrec['other_config'], f)
+ mtu = mtu_setting(nw, "Network", nwrec['other_config'])
+ if mtu:
+ f.write("MTU=%s\n" % mtu)
+
+
if pifrec.has_key('DNS') and pifrec['DNS'] != "":
ServerList = pifrec['DNS'].split(",")
for i in range(len(ServerList)): f.write("DNS%d=%s\n" % (i+1, ServerList[i]))
pifs_on_host = [p for p in db().get_all_pifs() if not p in pif_get_bond_masters(pif)]
+ # now prune out bond slaves as they are not connected to the IP
+ # stack and so cannot be used as gateway or DNS devices.
+ pifs_on_host = [ p for p in pifs_on_host if len(pif_get_bond_masters(p)) == 0]
+
# loop through all the pifs on this host looking for one with
# other-config:peerdns = true, and one with
# other-config:default-route=true
is_gatewaydev = defaultroute_pif == pif
if is_dnsdev or is_gatewaydev:
- fnetwork = ConfigurationFile("/etc/sysconfig/network")
+ fnetwork = ConfigurationFile(root_prefix() + "/etc/sysconfig/network")
for line in fnetwork.readlines():
if is_dnsdev and line.lstrip().startswith('DNSDEV='):
fnetwork.write('DNSDEV=%s\n' % ipdev)
pifrec = db().get_pif_record(pif)
ipdev = pif_ipdev_name(pif)
- dp = DatapathFactory(pif)
+ dp = DatapathFactory()(pif)
log("action_up: %s" % ipdev)
dp.post()
# Update /etc/issue (which contains the IP address of the management interface)
- os.system("/sbin/update-issue")
+ os.system(root_prefix() + "/sbin/update-issue")
f.commit()
except Error, e:
def action_down(pif):
ipdev = pif_ipdev_name(pif)
- dp = DatapathFactory(pif)
+ dp = DatapathFactory()(pif)
log("action_down: %s" % ipdev)
dp.bring_down()
+def action_rewrite():
+ DatapathFactory().rewrite()
+
# This is useful for reconfiguring the mgmt interface after having lost connectivity to the pool master
def action_force_rewrite(bridge, config):
def getUUID():
log("Configuring %s using %s configuration" % (bridge, mode))
- f = ConfigurationFile(dbcache_file)
+ f = ConfigurationFile(root_prefix() + dbcache_file)
pif_uuid = getUUID()
network_uuid = getUUID()
f.write('\t\t<VLAN_slave_of/>\n')
f.write('\t\t<VLAN_master_of>OpaqueRef:NULL</VLAN_master_of>\n')
f.write('\t\t<VLAN>-1</VLAN>\n')
+ f.write('\t\t<tunnel_access_PIF_of/>\n')
+ f.write('\t\t<tunnel_transport_PIF_of/>\n')
f.write('\t\t<device>%s</device>\n' % interface)
f.write('\t\t<MAC>%s</MAC>\n' % mac)
f.write('\t\t<other_config/>\n')
"force-interface=",
"management",
"mac=", "device=", "mode=", "ip=", "netmask=", "gateway=",
+ "root-prefix=",
+ "no-syslog",
"help" ]
arglist, args = getopt.gnu_getopt(argv[1:], shortops, longops)
except getopt.GetoptError, msg:
force_management = True
elif o in ["--mac", "--device", "--mode", "--ip", "--netmask", "--gateway"]:
force_rewrite_config[o[2:]] = a
+ elif o == "--root-prefix":
+ set_root_prefix(a)
+ elif o == "--no-syslog":
+ set_log_destination("stderr")
elif o == "-h" or o == "--help":
print __doc__ % {'command-name': os.path.basename(argv[0])}
return 0
- syslog.openlog(os.path.basename(argv[0]))
- log("Called as " + str.join(" ", argv))
+ if get_log_destination() == "syslog":
+ syslog.openlog(os.path.basename(argv[0]))
+ log("Called as " + str.join(" ", argv))
if len(args) < 1:
raise Usage("Required option <action> not present")
pif = db().get_pif_by_uuid(pif_uuid)
if action == "rewrite":
- pass
+ action_rewrite()
else:
if not pif:
raise Usage("No PIF given")