# Start post_install_network_config generated code
#if $getVar("system_name","") != ""
    ## this is being provisioned by system records, not profile records
    ## so we can do the more complex stuff
    ## get the list of interface names
    #set ikeys = $interfaces.keys()
    #set osversion = $getVar("os_version","")
    #import re
    #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+")
    ## Determine if we should use the MAC address to configure the interfaces first
    ## Only physical interfaces are required to have a MAC address
    ## Also determine the number of bonding devices we have, so we can set the
    ## max-bonds option in modprobe.conf accordingly. -- jcapel
    #set $configbymac = True
    #set $numbondingdevs = 0
    #set $enableipv6 = False
    ## =============================================================================
    #for $iname in $ikeys
        ## look at the interface hash data for the specific interface
        #set $idata = $interfaces[$iname]
        ## do not configure by mac address if we don't have one AND it's not for bonding/vlans
        ## as opposed to a "real" physical interface
        #if $idata.get("mac_address", "") == "" and not $vlanpattern.match($iname) and not $idata.get("interface_type", "").lower() in ("master","bond","bridge"):
                ## we have to globally turn off the config by mac feature as we can't
                ## use it now
                #set $configbymac = False
        #end if
        ## count the number of bonding devices we have.
        #if $idata.get("interface_type", "").lower() in ("master","bond","bonded_bridge_slave")
            #set $numbondingdevs += 1
        #end if
        ## enable IPv6 networking if we set an ipv6 address or turn on autoconfiguration
        #if $idata.get("ipv6_address", "") != "" or $ipv6_autoconfiguration == True
            #set $enableipv6 = True
        #end if
    #end for
    ## end looping through the interfaces to see which ones we need to configure.
    ## =============================================================================
    #set $i = 0
    ## setup bonding if we have to
    #if $numbondingdevs > 0

# we have bonded interfaces, so set max_bonds
if [ -f "/etc/modprobe.conf" ]; then
    echo "options bonding max_bonds=$numbondingdevs" >> /etc/modprobe.conf
fi
    #end if
    ## =============================================================================
    ## create a staging directory to build out our network scripts into
    ## make sure we preserve the loopback device

# create a working directory for interface scripts
mkdir /etc/sysconfig/network-scripts/cobbler
cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/cobbler/
    ## =============================================================================
    ## configure the gateway if set up (this is global, not a per-interface setting)
    #if $gateway != ""

# set the gateway in the network configuration file
grep -v GATEWAY /etc/sysconfig/network > /etc/sysconfig/network.cobbler
echo "GATEWAY=$gateway" >> /etc/sysconfig/network.cobbler
rm -f /etc/sysconfig/network
mv /etc/sysconfig/network.cobbler /etc/sysconfig/network
    #end if
    ## =============================================================================
    ## Configure the system's primary hostname. This is also passed to anaconda, but
    ## anaconda doesn't seem to honour it in DHCP-setups.
    #if $hostname != ""

# set the hostname in the network configuration file
grep -v HOSTNAME /etc/sysconfig/network > /etc/sysconfig/network.cobbler
echo "HOSTNAME=$hostname" >> /etc/sysconfig/network.cobbler
rm -f /etc/sysconfig/network
mv /etc/sysconfig/network.cobbler /etc/sysconfig/network

# Also set the hostname now, some applications require it
# (e.g.: if we're connecting to Puppet before a reboot).
/bin/hostname $hostname
    #end if
    #if $enableipv6 == True
grep -v NETWORKING_IPV6 /etc/sysconfig/network > /etc/sysconfig/network.cobbler
echo "NETWORKING_IPV6=yes" >> /etc/sysconfig/network.cobbler
rm -f /etc/sysconfig/network
mv /etc/sysconfig/network.cobbler /etc/sysconfig/network
        #if $ipv6_autoconfiguration != ""
grep -v IPV6_AUTOCONF /etc/sysconfig/network > /etc/sysconfig/network.cobbler
            #if $ipv6_autoconfiguration == True
echo "IPV6_AUTOCONF=yes" >> /etc/sysconfig/network.cobbler
            #else
echo "IPV6_AUTOCONF=no" >> /etc/sysconfig/network.cobbler
            #end if
rm -f /etc/sysconfig/network
mv /etc/sysconfig/network.cobbler /etc/sysconfig/network
        #end if
        #if $ipv6_default_device != ""
grep -v IPV6_DEFAULTDEV /etc/sysconfig/network > /etc/sysconfig/network.cobbler
echo "IPV6_DEFAULTDEV=$ipv6_default_device" >> /etc/sysconfig/network.cobbler
rm -f /etc/sysconfig/network
mv /etc/sysconfig/network.cobbler /etc/sysconfig/network
        #end if
    #end if
    ## =============================================================================
    ## now create the config file for each interface
    #for $iname in $ikeys

# Start configuration for $iname
        ## create lots of variables to use later
        #set $idata                = $interfaces[$iname]
        #set $mac                  = $idata.get("mac_address", "").upper()
        #set $mtu                  = $idata.get("mtu", "")
        #set $static               = $idata.get("static", "")
        #set $ip                   = $idata.get("ip_address", "")
        #set $netmask              = $idata.get("netmask", "")
        #set $if_gateway           = $idata.get("if_gateway", "")
        #set $static_routes        = $idata.get("static_routes", "")
        #set $iface_type           = $idata.get("interface_type", "").lower()
        #set $iface_master         = $idata.get("interface_master", "")
        #set $bonding_opts         = $idata.get("bonding_opts", "")
        #set $bridge_opts          = $idata.get("bridge_opts", "").split(" ")
        #set $ipv6_address         = $idata.get("ipv6_address", "")
        #set $ipv6_secondaries     = $idata.get("ipv6_secondaries", "")
        #set $ipv6_mtu             = $idata.get("ipv6_mtu", "")
        #set $ipv6_default_gateway = $idata.get("ipv6_default_gateway", "")
        #set $ipv6_static_routes   = $idata.get("ipv6_static_routes", "")
        #set $devfile              = "/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname
        #set $routesfile           = "/etc/sysconfig/network-scripts/cobbler/route-" + $iname
        #set $ipv6_routesfile      = "/etc/sysconfig/network-scripts/cobbler/route6-" + $iname
        ## determine if this interface is for a VLAN
        #if $vlanpattern.match($iname)
            #set $is_vlan = "true"
        #else
            #set $is_vlan = "false"
        #end if
        ## slave interfaces are assumed to be static
        #if $iface_type in ("slave","bond_slave","bridge_slave","bonded_bridge_slave")
            #set $static = 1
        #end if 
        ## ===================================================================
        ## Things every interface get, no matter what
        ## ===================================================================
echo "DEVICE=$iname" > $devfile
echo "ONBOOT=yes" >> $devfile
            #if $mac != "" and $iface_type not in ("master","bond","bridge","bonded_bridge_slave")
            ## virtual interfaces don't get MACs
echo "HWADDR=$mac" >> $devfile
IFNAME=\$(ip -o link | grep -i '$mac' | sed -e 's/^[0-9]*: //' -e 's/:.*//')
            ## Rename this interface in modprobe.conf
            ## FIXME: if both interfaces startwith eth this is wrong
if [ -f "/etc/modprobe.conf" ] && [ \$IFNAME ]; then
    grep \$IFNAME /etc/modprobe.conf | sed "s/\$IFNAME/$iname/" >> /etc/modprobe.conf.cobbler
    grep -v \$IFNAME /etc/modprobe.conf >> /etc/modprobe.conf.new
    rm -f /etc/modprobe.conf
    mv /etc/modprobe.conf.new /etc/modprobe.conf
fi
            #end if
        ## ===================================================================
        ## Actions based on interface_type
        ## ===================================================================
        #if $iface_type in ("master","bond","bonded_bridge_slave")
            ## if this is a bonded interface, configure it in modprobe.conf
            #if $osversion == "rhel4"
if [ -f "/etc/modprobe.conf" ]; then
    echo "install $iname /sbin/modprobe bonding -o $iname $bonding_opts" >> /etc/modprobe.conf.cobbler
fi
            #else
            ## Add required entry to modprobe.conf
if [ -f "/etc/modprobe.conf" ]; then
    echo "alias $iname bonding" >> /etc/modprobe.conf.cobbler
fi
            #end if
            #if $bonding_opts != ""
cat >> $devfile << EOF
BONDING_OPTS="$bonding_opts"
EOF
            #end if
        #elif $iface_type in ("slave","bond_slave") and $iface_master != ""
echo "SLAVE=yes" >> $devfile
echo "MASTER=$iface_master" >> $devfile
echo "HOTPLUG=no" >> $devfile
        #end if
        #if $iface_type == "bridge"
echo "TYPE=Bridge" >> $devfile
        #for $bridge_opt in $bridge_opts
            #if $bridge_opt.strip() != ""
echo "$bridge_opt" >> $devfile
            #end if
        #end for
        #elif ($iface_type == "bridge_slave" or $iface_type == "bonded_bridge_slave") and $iface_master != ""
echo "BRIDGE=$iface_master" >> $devfile
echo "HOTPLUG=no" >> $devfile
        #end if
        #if $iface_type != "bridge"
echo "TYPE=Ethernet" >> $devfile
        #end if
        ## ===================================================================
        ## Actions based on static/dynamic configuration
        ## ===================================================================
        #if $static
            #if $mac == "" and $iface_type == ""
# WARNING! Configuring interfaces by their names only
#          is error-prone, and can cause issues if and when
#          the kernel gives an interface a different name
#          following a reboot/hardware changes.
            #end if
echo "BOOTPROTO=none" >> $devfile
            #if $ip != "" and $iface_type not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave")
                ## Only configure static networking if an IP-address is configured
                ## and if the interface isn't slaved to another interface (bridging or bonding)
echo "IPADDR=$ip" >> $devfile
                #if $if_gateway != ""
echo "GATEWAY=$if_gateway" >> $devfile
                #end if
                #if $netmask == ""
                    ## Default to 255.255.255.0?
                    #set $netmask = "255.255.255.0"
                #end if
echo "NETMASK=$netmask" >> $devfile
            #end if
            #if $enableipv6 == True and $ipv6_autoconfiguration == False
                #if $ipv6_address != ""
echo "IPV6INIT=yes" >> $devfile
echo "IPV6ADDR=$ipv6_address" >> $devfile
                #end if
                #if $ipv6_secondaries != ""
                    #set ipv6_secondaries = ' '.join(ipv6_secondaries)
                    ## The quotes around the ipv6 ip's need to be here
echo "IPV6ADDR_SECONDARIES=\"$ipv6_secondaries\"" >> $devfile
                #end if
                #if $ipv6_mtu != ""
echo "IPV6MTU=$ipv6_mtu" >> $devfile
                #end if
                #if $ipv6_default_gateway != ""
echo "IPV6_DEFAULTGW=$ipv6_default_gateway" >> $devfile
                #end if
            #end if
        #else
            ## this is a DHCP interface, much less work to do
echo "BOOTPROTO=dhcp" >> $devfile
            #if $len($name_servers) > 0
echo "PEERDNS=no" >> $devfile
            #end if
        #end if
        ## ===================================================================
        ## VLAN configuration
        ## ===================================================================
        #if $is_vlan == "true"
echo "VLAN=yes" >> $devfile
echo "ONPARENT=yes" >> $devfile
        #end if
        ## ===================================================================
        ## Optional configuration stuff
        ## ===================================================================
        #if $mtu != ""
echo "MTU=$mtu" >> $devfile
        #end if
        ## ===================================================================
        ## Non-slave DNS configuration, when applicable
        ## ===================================================================
        ## If the interface is anything but a slave then add DNSn entry
        #if $iface_type.lower() not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave")
            #set $nct = 0
            #for $nameserver in $name_servers
                #set $nct = $nct + 1
echo "DNS$nct=$nameserver" >> $devfile
            #end for
        #end if
        ## ===================================================================
        ## Interface route configuration
        ## ===================================================================
        #for $route in $static_routes
            #set routepattern = $re.compile("[0-9/.]+:[0-9.]+")
            #if $routepattern.match($route)
                #set $routebits = $route.split(":")
                #set [$network, $router] = $route.split(":")
echo "$network via $router" >> $routesfile
            #else
# Warning: invalid route "$route"
            #end if
        #end for
        #if $enableipv6 == True
            #for $route in $ipv6_static_routes
                #set routepattern = $re.compile("[0-9a-fA-F:/]+,[0-9a-fA-F:]+")
                #if $routepattern.match($route)
                    #set $routebits = $route.split(",")
                    #set [$network, $router] = $route.split(",")
echo "$network via $router dev $iname" >> $ipv6_routesfile
                #else
# Warning: invalid ipv6 route "$route"
                #end if
            #end for
        #end if
        ## ===================================================================
        ## Done with this interface
        ## ===================================================================
        #set $i = $i + 1
# End configuration for $iname
    #end for
    ## =============================================================================
    ## Configure name server search path in /etc/resolv.conf
    #set $num_ns = $len($name_servers)
    #set $num_ns_search = $len($name_servers_search)
    #if $num_ns_search > 0

sed -i -e "/^search /d" /etc/resolv.conf
echo -n "search " >>/etc/resolv.conf
        #for $nameserversearch in $name_servers_search
echo -n "$nameserversearch " >>/etc/resolv.conf
        #end for
echo "" >>/etc/resolv.conf
    #end if
    ## =============================================================================
    ## Configure name servers in /etc/resolv.conf
    #if $num_ns > 0

sed -i -e "/^nameserver /d" /etc/resolv.conf
        #for $nameserver in $name_servers
echo "nameserver $nameserver" >>/etc/resolv.conf
        #end for
    #end if

## Disable all eth interfaces by default before overwriting
## the old files with the new ones in the working directory
## This stops unneccesary (and time consuming) DHCP queries
## during the network initialization
sed -i 's/ONBOOT=yes/ONBOOT=no/g' /etc/sysconfig/network-scripts/ifcfg-eth*

## Move all staged files to their final location
    #for $iname in $ikeys
rm -f /etc/sysconfig/network-scripts/ifcfg-$iname
    #end for
mv /etc/sysconfig/network-scripts/cobbler/* /etc/sysconfig/network-scripts/
rm -r /etc/sysconfig/network-scripts/cobbler
if [ -f "/etc/modprobe.conf" ]; then
cat /etc/modprobe.conf.cobbler >> /etc/modprobe.conf
rm -f /etc/modprobe.conf.cobbler
fi
#end if
# End post_install_network_config generated code
