Sophie

Sophie

distrib > Mageia > 7 > i586 > by-pkgid > bfb1f3780007b1f6c636a14c149f3765 > files > 5

dhcpxd-1.0.3-33.mga7.i586.rpm

#! /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 $*