#! /bin/sh # #Big thanks to Morpheus for finally working out a particularly bad #problem (morpheus@hal9000.cc) . # # # ######## Store the options to supplied arguments # ACTION="$1" INTERFACE="$2" BASEINTERFACE="$2" if [ "$3" ] ; then BASEINTERFACE="$3" fi MAINPATH="/etc/dhcpxd" if [ "$4" ] ; then MAINPATH="$4" fi if ! [ "$INTERFACE" ] ; then echo "Syntax: ifcfg.def action interface [base_interface main_path]" exit 1 fi source "$MAINPATH/cfg.def" $* MASQINTERFACE="`echo -n "$INTERFACE" | sed -e "s,^masq.*,&," -e "t" -e "d"`" # ######## Load interface specific configuration file # run_cfg() { if [ -f "$MAINPATH/$INTERFACE.cfg" ] ; then source "$MAINPATH/$INTERFACE.cfg" $* fi } # ######## External script execution mechanisms # run_scripts() { # FLIST contains masks for execution scripts FLIST="$MAINPATH/$INTERFACE.ifcfg $MAINPATH/$INTERFACE.ifcfg.* $0.*" for FMASK in ${FLIST} ; do if [ -f "$FMASK" ] ; then source "$FMASK" $* fi done } # ######## Used to store settings that may be modified later # output_current() { cat > "$MAINPATH/$INTERFACE.current" << __ENDDOC__ CURRENTIP="$IP" CURRENTSERVER="$SERVER" CURRENTHOSTNAME="$HOSTNAME" CURRENTDOMAIN="$DOMAIN" CURRENTNETWORK="$NETWORK" CURRENTNETMASK="$NETMASK" CURRENTBROADCAST="$BROADCAST" CURRENTGATEWAY="$GATEWAY" CURRENTDNS="$DNS" __ENDDOC__ } get_current() { if [ -f "$MAINPATH/$INTERFACE.current" ] ; then source "$MAINPATH/$INTERFACE.current" $* fi } # ######## Initialization procedure # init_begin() { echo -n > "$MAINPATH/$INTERFACE.info" echo "Initialize interface $INTERFACE, $BASEINTERFACE" PROCLIST="init_interface" } init_interface() { if [ "$BASEINTERFACE" = "$INTERFACE" ] ; then /sbin/ifconfig "$BASEINTERFACE" up 0.0.0.0 else /sbin/ifconfig "$BASEINTERFACE" up fi } # ######## Open procedure # open_begin() { echo "Open interface $INTERFACE, $BASEINTERFACE" if ! [ "$MASQINTERFACE" ] ; then PROCLIST="open_interface CfgHost AddNetwork AddGateway AddDNS CfgHostname CfgDomain CfgSearch" fi } open_interface() { output_current $* /sbin/ifconfig "$INTERFACE" "$IP" netmask "$NETMASK" broadcast "$BROADCAST" } # ######## Update procedures # update_begin() { UPDATEDINTERFACE="NO" if ! [ "$MASQINTERFACE" ] ; then PROCLIST="update_interface UpdateHost UpdateNetwork UpdateGateway UpdateDNS UpdateHostname UpdateDomain UpdateSearch" fi } update_interface() { output_current $* [ "$CURRENTIP" = "$IP" ] && \ [ "$CURRENTNETMASK" = "$NETMASK" ] && \ [ "$CURRENTBROADCAST" = "$BROADCAST" ] && \ return UPDATEDINTERFACE="YES" echo "Update interface $INTERFACE, $BASEINTERFACE" /sbin/ifconfig "$INTERFACE" "$IP" netmask "$NETMASK" broadcast "$BROADCAST" } # ######## Close procedure # close_begin() { echo "Close interface $INTERFACE, $BASEINTERFACE" if ! [ "$MASQINTERFACE" ] ; then PROCLIST="close_interface RemoveDNS" fi } close_interface() { if [ "$INTERFACE" = "$BASEINTERFACE" ] ; then /sbin/ifconfig "$INTERFACE" down else /sbin/ifconfig "$INTERFACE" 0.0.0.0 fi } # ######## Misc setup mechanisms # CfgHost() { if [ "$HOSTNAME" ] && [ "$ADDHOST" ] ; then FLAG="0" for VAR in ${ADDHOST} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then "$MAINPATH/filter" "$IP" < /etc/hosts > /etc/hosts.temp mv -f /etc/hosts.temp /etc/hosts { if [ "$CFGDNSDOMAINNAME" = "$INTERFACE" ] ; then echo "$IP $HOSTNAME.$DOMAIN $HOSTNAME" "$MAINPATH/filter" "$HOSTNAME.$DOMAIN" else "$MAINPATH/filter" "$HOSTNAME.$DOMAIN" echo "$IP $HOSTNAME.$DOMAIN $HOSTNAME" fi } < /etc/hosts > /etc/hosts.temp mv -f /etc/hosts.temp /etc/hosts FLAG="1" fi fi done fi } UpdateHost() { [ "$CURRENTIP" = "$IP" ] && \ [ "$CURRENTHOSTNAME" = "$HOSTNAME" ] && \ [ "$CURRENTDOMAIN" = "$DOMAIN" ] && \ return echo "Update host $INTERFACE, $BASEINTERFACE" CfgHost $* } AddNetwork() { if [ "$ADDNETWORK" ] && [ "$NETMASK" != "255.255.255.255" ] ; then FLAG="0" for VAR in ${ADDNETWORK} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then /sbin/route add -net "$NETWORK" netmask "$NETMASK" "$INTERFACE" FLAG="1" fi fi done fi } UpdateNetwork() { [ "$UPDATEDINTERFACE" = "NO" ] && \ [ "$CURRENTNETWORK" = "$NETWORK" ] && \ [ "$CURRENTNETMASK" = "$NETMASK" ] && \ return echo "Update network $INTERFACE, $BASEINTERFACE" if [ "$ADDNETWORK" ] && [ "$NETMASK" != "255.255.255.255" ] ; then FLAG="0" for VAR in ${ADDNETWORK} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then /sbin/route del -net "$CURRENTNETWORK" netmask "$CURRENTNETMASK" "$INTERFACE" /sbin/route add -net "$NETWORK" netmask "$NETMASK" "$INTERFACE" FLAG="1" fi fi done fi } AddGateway() { if [ "$GATEWAY" ] && [ "$ADDGATEWAY" ] ; then FLAG="0" for VAR in ${ADDGATEWAY} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then for GW in ${GATEWAY} ; do /sbin/route add -host "$GW" "$INTERFACE" /sbin/route add default gw "$GW" netmask 0.0.0.0 "$INTERFACE" done FLAG="1" fi fi done fi } UpdateGateway() { [ "$UPDATEDINTERFACE" = "NO" ] && \ [ "$CURRENTGATEWAY" = "$GATEWAY" ] && \ return echo "Update gateway $INTERFACE, $BASEINTERFACE" if [ "$GATEWAY" ] && [ "$ADDGATEWAY" ] ; then FLAG="0" for VAR in ${ADDGATEWAY} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then for GW in ${CURRENTGATEWAY} ; do /sbin/route del default gw "$GW" netmask 0.0.0.0 "$INTERFACE" /sbin/route del -host "$GW" "$INTERFACE" done for GW in ${GATEWAY} ; do /sbin/route add -host "$GW" "$INTERFACE" /sbin/route add default gw "$GW" netmask 0.0.0.0 "$INTERFACE" done FLAG="1" fi fi done fi } AddDNS() { if [ "$DNS" ] && [ "$ADDNAMESERVER" ] ; then FLAG="0" for VAR in ${ADDNAMESERVER} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then for NS in ${DNS} ; do { cat /etc/resolv.conf echo "nameserver $NS" } > /etc/resolv.temp mv -f /etc/resolv.temp /etc/resolv.conf done FLAG="1" fi fi done fi } RemoveDNS() { if [ "$DNS" ] && [ "$ADDNAMESERVER" ] ; then FLAG="0" for VAR in ${ADDNAMESERVER} ; do if [ "$VAR" = "$INTERFACE" ] || [ "$VAR" = "all" ] ; then if [ "$FLAG" = "0" ] ; then for NS in ${CURRENTDNS} ; do { "$MAINPATH/filter" "nameserver $NS" } < /etc/resolv.conf > /etc/resolv.temp mv -f /etc/resolv.temp /etc/resolv.conf done FLAG="1" fi fi done fi } UpdateDNS() { [ "$CURRENTDNS" = "$DNS" ] && return echo "Update DNS $INTERFACE, $BASEINTERFACE" RemoveDNS $* AddDNS $* } CfgHostname() { if [ "$HOSTNAME" ] ; then if [ "$CFGHOSTNAME" = "$INTERFACE" ] ; then /bin/hostname "$HOSTNAME" fi fi } UpdateHostname() { [ "$CURRENTHOSTNAME" = "$HOSTNAME" ] && return echo "Update hostname $INTERFACE, $BASEINTERFACE" CfgHostname $* } CfgDomain() { if [ "$DOMAIN" ] ; then if [ "$CFGDOMAINNAME" = "$INTERFACE" ] ; then /bin/domainname "$DOMAIN" fi fi } UpdateDomain() { [ "$CURRENTDOMAIN" = "$DOMAIN" ] && return echo "Update domain $INTERFACE, $BASEINTERFACE" CfgDomain $* } CfgSearch() { if [ "$DOMAIN" ] ; then if [ "$CFGSEARCH" = "$INTERFACE" ] ; then { echo "search $DOMAIN" "$MAINPATH/filter" "search " } < /etc/resolv.conf > /etc/resolv.temp mv -f /etc/resolv.temp /etc/resolv.conf fi fi } UpdateSearch() { [ "$CURRENTDOMAIN" = "$DOMAIN" ] && return echo "Update search $INTERFACE, $BASEINTERFACE" CfgSearch $* } # ######## For the most part, processing begins HERE. # PROCLIST="" "$ACTION"_begin $* source "$MAINPATH/$INTERFACE.info" $* source "$MAINPATH/$INTERFACE.pars" $* run_cfg $* run_scripts pre $* get_current $* if [ "$PROCLIST" ] ; then for VAR in ${PROCLIST} ; do "$VAR" $* done fi run_scripts post $*