#!/bin/sh
#
#ident  @(#)ipxconfig   1.1,REV=2     96/05/31 SMI
#
#Copyright (c) 1995,1996 by Sun Microsystems, Inc. All rights reserved.
#
#Configuration utility to configure IPX network number

TPUT=/usr/bin/tput
AWK=/bin/awk
ETHER_TYPE="ethernet_type"
TR_TYPE="token-ring_type"
INT_MTU=2000
export AWK
export TPUT

Main_Menu()
{
COLS=`$TPUT cols`
ROWS=`$TPUT lines`
CCOL=`expr $COLS / 2`
CROW=`expr $ROWS / 2`

MAIN=true
while [ $MAIN = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 24
echo "IPX/SPX Configuration Main Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"
OPT1="1. Edit interface configuration"
OPT2="2. Delete interface configuration"
OPT3="3. View current configuration"
CCOL=34
CCOL=`expr \( $COLS - $CCOL \) / 2`
$TPUT cup 7 $CCOL
echo $OPT1
$TPUT cup 8 $CCOL
echo $OPT2
$TPUT cup 9 $CCOL
echo $OPT3
$TPUT cup 20 0
echo "<Q> quit"
echo "Please enter option number: \c"
read option
echo
if [ "$option" = q ] || [ "$option" = Q ]
then
  MAIN=false
else
  case "$option" in
    1)
      Edit_Menu
      ;;
    2)
      Delete_Menu
      ;;
    3)
      View_Config
      ;;
    *)
      echo "The value entered is not valid, please try again."
      read dummy
      ;;
  esac 
fi
done
}

Edit_Menu()
{
EDIT=true
while [ $EDIT = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 24
echo "IPX/SPX Configuration Edit Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"
if [ -f "/tmp/edit.$$" ]; then
  cat /tmp/edit.$$
else
   echo "                         1. Internal_network" | tee -a /tmp/edit.$$
   /usr/sbin/ifconfig -a | grep flags | sed -e '/lo0/d' | $AWK 'BEGIN {num=1} \
   {num++; print "                         " num ". /dev/" substr($1,1,length($1)-2) ":" \
   substr($1,length($1)-1,1);} END{}' | tee -a /tmp/edit.$$
fi

$TPUT cup 20 0
echo "<P> Previous"
echo "Please enter option number: \c"
read option
echo
if [ "$option" = p ] || [ "$option" = P ]
then
  EDIT=false
else
  SELECT=`awk ' 
  { list[NR] = $2 ; }
  END{
  if ( listnum <= NR ) 
  { 
    if ( listnum == 1)
    {
      print list[listnum]":" ;
    }
    else
    {
      print substr(list[listnum],6,length(list[listnum])-5) ; 
    }   
  } 
  else 
  { 
    print "The option is not valid. Please press enter and try again." ; 
  } 
  }' listnum=$option /tmp/edit.$$`
  INTERFACE=`echo "$SELECT" | awk -F: '{print $1}'`
  if [ "${INTERFACE}" != "Internal_network" ]; then
    INT_NUM=`echo ${SELECT} | $AWK -F: '{print $2}'`
    INT_DEV=`echo "$INTERFACE$INT_NUM"`
    INT_MTU=`/usr/sbin/ifconfig $INT_DEV | grep mtu | $AWK '{print $4;}'`
  fi
  if [ "$INTERFACE" = "tr" ]; then
       INT_TYPE="$TR_TYPE"
  elif [ $INT_MTU -lt 2000 ]; then
       INT_TYPE="$ETHER_TYPE"
  else
       INT_TYPE="$UNKNOWN_INT_TYPE"
  fi
 
  if [ "$INTERFACE" = "tr" ]; then
    TR_Config "$SELECT"
  elif [ "${INTERFACE}" = "Internal_network" ]; then
    IN_Config "internal"
  elif [ "${INT_TYPE}" = "${ETHER_TYPE}" ]; then
    Ether_Config "$SELECT"
  else
    echo "$SELECT"    
    read dummy
  fi
fi
done
rm -f /tmp/edit.$$ > /dev/null 2> /dev/null
}

Ether_Config()
{
ETHER=true
while [ $ETHER = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 24
echo "IPX/SPX Configuration Interface Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"

Create_Internal_Format /tmp/ipxtabint.$$

$TPUT cup 7 31
ET1="1. ethernet_ii"
echo $ET1 | tee -a /tmp/ether.$$
$TPUT cup 8 31
ET2="2. ethernet_802.2"
echo $ET2 | tee -a /tmp/ether.$$
$TPUT cup 9 31
ET3="3. ethernet_802.3"
echo $ET3 | tee -a /tmp/ether.$$
$TPUT cup 10 31
ET4="4. ethernet_snap"
echo $ET4 | tee -a /tmp/ether.$$
$TPUT cup 20 0
if [ -f /tmp/ethmod.$$ ]
then
  echo "<P> Previous	<S> Save"
else
  echo "<P> Previous"
fi
echo "Please enter option number: \c"
read option
echo
if [ "$option" = p ] || [ "$option" = P ]
then
  ETHER=false
  if [ -f /tmp/ethmod.$$ ]
  then
    echo "Do you want to save the changes? [y,n]\c"
    read saveornot
    if [ "$saveornot" = y -o "$saveornot" = Y ]
    then
      Save_Config /tmp/ethmod.$$ /tmp/ipxtabint.$$
    fi
    rm -f /tmp/ethmod.$$ > /dev/null 2> /dev/null
  fi
elif [ "$option" = s ] || [ "$option" = S ]
then
  Save_Config /tmp/ethmod.$$ /tmp/ipxtabint.$$
  rm -f /tmp/ethmod.$$  > /dev/null 2> /dev/null
else
  if [ "$option" -gt 0 ] && [ "$option" -lt 5 ]
  then
    $TPUT cup 22 0
    echo "Please enter a network number: \c"
    read  netnum
    netnum="0x"$netnum
# Sanity check on netnum
    if [ $netnum -gt FFFFFFFF -o $netnum -lt 0 ]
    then
      echo "The entered value is not valid. Please press Enter and try again."
      read dummy
    else
      case "$option" in
      1)
        FRAMETYPE="ethernet_ii"
        ;;
      2)
        FRAMETYPE="ethernet_802.2"
        ;;
      3)
        FRAMETYPE="ethernet_802.3"
        ;;
      4)
        FRAMETYPE="ethernet_snap"
        ;;
      esac
      cat >> /tmp/ethmod.$$ << --!
sed -e '/$1%$FRAMETYPE%/d' /tmp/ipxtabint.$$ > /tmp/ipxtabint.$$.tmp
mv /tmp/ipxtabint.$$.tmp /tmp/ipxtabint.$$
echo "$netnum%$1%$FRAMETYPE%" >> /tmp/ipxtabint.$$

--!
    fi
  else
    echo "The entered option is not valid. Please press Enter and try again."
    read dummy
  fi
fi
done
rm -f /tmp/ether.$$ /tmp/ethmod.$$ /tmp/ipxtabint.$$ > /dev/null 2> /dev/null
}


Create_Internal_Format()
{
IPXTAB="/etc/opt/SUNWipx/ipxtab"
rm /tmp/cattmp /tmp/intrep 2> /dev/null > /dev/null
cat $IPXTAB | sed -n -e "/^[Ss]ap[Aa]dvertise/p" >> /tmp/ipxtab.misc.$$
cat $IPXTAB | sed -n -e "/^spxmaxpacket/p" >> /tmp/ipxtab.misc.$$
cat $IPXTAB | sed -n -e "/^frametype/p" | awk '{val[NR] = $2 ; type[NR] = $3 ;}\
END{ for (i=1; i <= NR; i++) {print val[i] "%" type[i] ;}}' >> /tmp/cattmp
cat $IPXTAB | sed -n -e "/^interface/p" | awk '{val[NR] = $3 ; intf[NR] = $2 ;}\
END{ for (i=1; i <= NR; i++) {print val[i] "%" intf[i] ;}}' >> /tmp/cattmp
sort /tmp/cattmp > /tmp/cattmp2
mv /tmp/cattmp2 /tmp/cattmp
awk '
{ mylist[NR] = $1 ; }
END {
  i = 1
  while ( i <= NR )
  {
    varterm = mylist[i]
    split(varterm,arrterm1,"%")
    varterm1 = arrterm1[1]
    varterm2 = arrterm1[2]
    if ( varterm2 != "internal" && i < NR )
    {
      i++
      varterm = mylist[i]
      split(varterm,arrterm2,"%")
      varterm3 = arrterm2[1]
      varterm4 = arrterm2[2]
      if ( varterm1 == varterm3 )
      {  
        split(varterm2,devterm,"/")
        print varterm1"%"devterm[3]"%"varterm4"%"
      }  
      else
      {   
        if ( varterm2 == "internal" )
        {
          print varterm1"%"varterm2"%"varterm2"%"
        }
      }  
    }
    else
    {
      if ( varterm2 == "internal" )
      {  
        print varterm1"%"varterm2"%"varterm2"%"
      }  
    }
    i++
  }
}' /tmp/cattmp > /tmp/intrep
 
mv /tmp/intrep $1
rm -f /tmp/cattmp 2>/dev/null >/dev/null
}



Save_Config()
{
IPXTAB="/etc/opt/SUNWipx/ipxtab"
chmod a+x $1
/bin/sh $1
awk -F% '\
{ if ( $2 == "internal")
  {
    print "interface internal",$1
  }
  else
  { print "interface /dev/"$2,$1 
    print "frametype",$1,$3
  } }' $2 > /tmp/ipxtab.$$
mv /tmp/ipxtab.$$ $IPXTAB
if [ -f /tmp/ipxtab.misc.$$ ]
then
  cat /tmp/ipxtab.misc.$$ >> $IPXTAB
  rm -f /tmp/ipxtab.misc.$$ > /dev/null 2>&1
fi
}



TR_Config()
{
TOKEN=true
while [ $TOKEN = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 24
echo "IPX/SPX Configuration Interface Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"

Create_Internal_Format /tmp/ipxtabint.$$
 
$TPUT cup 7 31
TR1="1. token-ring"
echo $TR1 | tee -a /tmp/token.$$
$TPUT cup 8 31
TR2="2. token-ring_snap"
echo $TR2 | tee -a /tmp/token.$$
$TPUT cup 9 31
$TPUT cup 20 0
if [ -f /tmp/trmod.$$ ]
then
  echo "<P> Previous    <S> Save"
else
  echo "<P> Previous"
fi
echo "Please enter option number: \c"
read option
echo
if [ "$option" = p ] || [ "$option" = P ]
then
  TOKEN=false
  if [ -f /tmp/trmod.$$ ]
  then
    echo "Do you want to save the changes? [y,n]\c"
    read saveornot
    if [ "$saveornot" = y -o "$saveornot" = Y ]
    then
      Save_Config /tmp/trmod.$$ /tmp/ipxtabint.$$
    fi
    rm -f /tmp/trmod.$$ > /dev/null 2> /dev/null
  fi
elif [ "$option" = s ] || [ "$option" = S ]
then
  Save_Config /tmp/trmod.$$ /tmp/ipxtabint.$$
  rm -f /tmp/trmod.$$  > /dev/null 2> /dev/null
else
  if [ "$option" -gt 0 ] && [ "$option" -lt 3 ]
  then
    $TPUT cup 22 0
    echo "Please enter a network number: \c"
    read netnum
    netnum="0x"$netnum
# Sanity check on netnum
    if [ $netnum -gt FFFFFFFF -o $netnum -lt 0 ]
    then
      echo "The entered value is not valid. Please press Enter and try again."
      read dummy
    else
      case "$option" in
      1)
        FRAMETYPE="token-ring"
        ;;
      2)  
        FRAMETYPE="token-ring_snap"
        ;;
      esac
      cat >> /tmp/trmod.$$ << --!
sed -e '/$1%$FRAMETYPE%/d' /tmp/ipxtabint.$$ > /tmp/ipxtabint.$$.tmp
mv /tmp/ipxtabint.$$.tmp /tmp/ipxtabint.$$
echo "$netnum%$1%$FRAMETYPE%" >> /tmp/ipxtabint.$$

--!
    fi
  else
    echo "The entered option is not valid. Please press Enter and try again."
    read dummy
  fi
fi
done
rm -f /tmp/token.$$ /tmp/trmod.$$ /tmp/ipxtabint.$$ > /dev/null 2> /dev/null
}




IN_Config()
{
INTERNAL=true
while [ $INTERNAL = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 24
echo "IPX/SPX Configuration Interface Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"
 
Create_Internal_Format /tmp/ipxtabint.$$
 
$TPUT cup 8 31
IN1="1. Modify "
echo $IN1 | tee -a /tmp/int.$$
$TPUT cup 9 31
IN2="2. Default"
echo $IN2 | tee -a /tmp/int.$$
$TPUT cup 20 0
if [ -f /tmp/inmod.$$ ]
then
  echo "<P> Previous    <S> Save"
else
  echo "<P> Previous"
fi
echo "Please enter option number: \c"
read option
echo
if [ "$option" = p ] || [ "$option" = P ]
then
  INTERNAL=false
  if [ -f /tmp/inmod.$$ ]
  then
    echo "Do you want to save the changes? [y,n]\c"
    read saveornot
    if [ "$saveornot" = y -o "$saveornot" = Y ]
    then
      Save_Config /tmp/inmod.$$ /tmp/ipxtabint.$$
    fi
    rm -f /tmp/inmod.$$ > /dev/null 2> /dev/null
  fi
elif [ "$option" = s ] || [ "$option" = S ]
then
  Save_Config /tmp/inmod.$$ /tmp/ipxtabint.$$
  rm -f /tmp/inmod.$$  > /dev/null 2> /dev/null
else
  case "$option" in
  1)
    $TPUT cup 22 0
    echo "Please enter a network number: \c"
    read netnum
    netnum="0x"$netnum
# Sanity check on netnum
    if [ $netnum -gt FFFFFFFF -o $netnum -lt 0 ]
    then
      echo "The entered value is not valid. Please press Enter and try again."
      read dummy
    else
      FRAMETYPE="internal"
      cat >> /tmp/inmod.$$ << --!
sed -e '/$1%$FRAMETYPE%/d' /tmp/ipxtabint.$$ > /tmp/ipxtabint.$$.tmp
mv /tmp/ipxtabint.$$.tmp /tmp/ipxtabint.$$
echo "$netnum%$1%$FRAMETYPE%" >> /tmp/ipxtabint.$$
--!
    fi
    ;;
  2)
    netnum=`/usr/ucb/hostid`
    FRAMETYPE="internal" 
      cat >> /tmp/inmod.$$ << --%
sed -e '/$1%$FRAMETYPE%/d' /tmp/ipxtabint.$$ > /tmp/ipxtabint.$$.tmp
mv /tmp/ipxtabint.$$.tmp /tmp/ipxtabint.$$
echo "$netnum%$1%$FRAMETYPE%" >> /tmp/ipxtabint.$$
--%
    ;;
  *)
    echo "The entered option is not valid. Please press Enter and try again."
    read dummy
    ;;
  esac
fi
done
rm -f /tmp/int.$$ /tmp/inmod.$$ /tmp/ipxtabint.$$ > /dev/null 2> /dev/null
}



Delete_Menu()
{
DELMENU=true

Create_Internal_Format /tmp/ipxtabint.$$
sed -e '/internal/d' /tmp/ipxtabint.$$ > /tmp/ipxtabdel.$$ 2> /dev/null

while [ $DELMENU = true ]
do
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 22
echo "IPX/SPX Configuration Delete Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"

NUMRECORD=`awk -F% 'END{print NR}' /tmp/ipxtabdel.$$`
if [ $NUMRECORD = 0 ]
then
  $TPUT cup 7 22
  echo "No configured external interfaces"
else
  rm -f /tmp/delmenu.$$ 2> /dev/null > /dev/null
  awk -F% 'BEGIN{num=0}{num++; print "                    "num") "$2,$3,$1}' \
  /tmp/ipxtabdel.$$ | tee -a /tmp/delmenu.$$
fi
$TPUT cup 20 0
if [ -f /tmp/delmod.$$ ]
then
  echo "<P> Previous    <S> Save"
else
  echo "<P> Previous"
fi
echo "Please enter option number: \c"
read option
echo
if [ "$option" = p ] || [ "$option" = P ]
then
  DELMENU=false
  if [ -f /tmp/delmod.$$ ]
  then
    echo "Do you want to save the changes? [y,n]\c"
    read saveornot
    if [ "$saveornot" = y -o "$saveornot" = Y ]
    then
      Save_Config /tmp/delmod.$$ /tmp/ipxtabint.$$
    fi
  fi
elif [ "$option" = s ] || [ "$option" = S ]
then
  Save_Config /tmp/delmod.$$ /tmp/ipxtabint.$$
  rm -f /tmp/delmod.$$ > /dev/null 2> /dev/null
elif [ $option -gt $NUMRECORD -o $option -lt 1 ]
then
  echo "The option is not valid. Please press enter and try again."
  read dummy
else
  INTRF=`sed -n -e "/$option)/p" /tmp/delmenu.$$ | awk '{print $2}'`
  FRAME=`sed -n -e "/$option)/p" /tmp/delmenu.$$ | awk '{print $3}'`
  NETNUM=`sed -n -e "/$option)/p" /tmp/delmenu.$$ | awk '{print $4}'`
  sed -e "/$NETNUM%$INTRF%$FRAME%/d" /tmp/ipxtabdel.$$ > \
  /tmp/ipxtabdel.$$.tmp
  mv /tmp/ipxtabdel.$$.tmp /tmp/ipxtabdel.$$ 2> /dev/null > /dev/null
  cat >> /tmp/delmod.$$ << --!
sed -e "/$NETNUM%$INTRF%$FRAME%/d" /tmp/ipxtabint.$$ >/tmp/ipxtabint.$$.tmp
mv /tmp/ipxtabint.$$.tmp /tmp/ipxtabint.$$
--!
fi
done
rm -f /tmp/delmenu.$$ /tmp/delmod.$$ /tmp/ipxtabdel.$$ /tmp/ipxtabint.$$ > \
/dev/null 2> /dev/null
}



View_Config()
{

Create_Internal_Format /tmp/ipxtabint.$$
 
$TPUT clear
$TPUT cup 0 0
echo "PC Protocol Services 1.1"
$TPUT cup 1 0
echo "with IPX/SPX for Solaris (R) Operating Environment"
$TPUT cup 2 0
echo "Copyright 1995, 1996 Sun Microsystems, Inc. All Rights Reserved."
$TPUT cup 3 0
echo "-------------------------------------------------------------------------------"
$TPUT cup 4 22
echo "IPX/SPX Configuration View Menu"
$TPUT cup 5 0
echo "-------------------------------------------------------------------------------"

NUMRECORD=`awk -F% 'END{print NR}' /tmp/ipxtabint.$$`
if [ $NUMRECORD = 0 ]
then
  $TPUT cup 7 24
  echo "No configured interfaces"
else
  awk -F% '{print "                    > "$2,$3,$1}' /tmp/ipxtabint.$$
fi
$TPUT cup 20 0
echo "<P> Previous"
echo "Please enter option P to return to main menu: \c"
read option
echo
}



# Main 
Main_Menu
$TPUT cup $ROWS 0

exit 0
