home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / pcnetconfig < prev    next >
Text File  |  1999-10-19  |  8KB  |  304 lines

  1. #!/bin/sh
  2. #
  3. # Interactively configure the PCMCIA network cards for Debian
  4. #
  5. # Brian Mays <brian@debian.org>
  6.  
  7. umask 022
  8.  
  9. readyesno()
  10. {
  11.     eval default=\$$1
  12.     while :
  13.     do 
  14.         echo -n "$2 [$default] "
  15.         read response
  16.     case $response in
  17.     [Yy]*)    eval "$1"'="y"'; return 0 ;;
  18.     [Nn]*)    eval "$1"'="n"'; return 1 ;;
  19.         "")    test "$default" = y && return 0 || return 1 ;;
  20.         esac
  21.     done
  22. }
  23.  
  24. readstuff()
  25. {
  26.     eval default=\$$1
  27.     echo "$2"
  28.     echo -n "("
  29.     test "$default" && echo -n "the default is '$default'; "
  30.     echo "type 'none' to leave blank)"
  31.     read response
  32.     case "`echo $response | tr A-Z a-z`" in
  33.     none)    eval "$1"="" ;;
  34.     "")        ;;
  35.     *)        eval "$1"="$response" ;;
  36.     esac
  37. }
  38.  
  39. if [ "root" != "`whoami`" ]
  40. then 
  41.    echo "Sorry, only root can run this script.  Exiting."
  42.    exit 1
  43. fi
  44.  
  45. # Default values
  46. BOOTP="n"
  47. DHCP="n"
  48. DHCLIENT="n"
  49. IPADDR=""
  50. NETMASK="255.255.255.0"
  51. NETWORK="1.2.0.0"
  52. BROADCAST="1.2.255.255"
  53. GATEWAY="1.2.0.1"
  54. DOMAIN=""
  55. SEARCH=""
  56. DNS_1=""
  57. DNS_2=""
  58. DNS_3=""
  59. MOUNTS=""
  60. IPX_FRAME=""
  61. IPX_NETNUM=""
  62.  
  63. cat <<END
  64. This program will create a basic /etc/pcmcia/network.opts file, the
  65. pcmcia-cs package's network adapter configuration file, based on choices
  66. that you make.
  67.  
  68. A sample network.opts file is supplied in pcmcia-cs; you can edit this
  69. file to match your local network setup.  Refer to the PCMCIA-HOWTO
  70. (usually in /usr/doc/HOWTO/PCMCIA-HOWTO.gz) for a detailed description
  71. of this file's contents.
  72.  
  73. Before continuing with this program, ensure that you know your host's
  74. network configuration.
  75.  
  76. END
  77.  
  78. cont="y"
  79. readyesno cont "Do you want to continue?" || exit 0
  80.  
  81. echo
  82. echo "Choose a method for obtaining the host's IP address and routing"
  83. echo "information"
  84. while :
  85. do 
  86.     echo
  87.     echo "1) Use the BOOTP protocol"
  88.     echo "2) Use the dhcpcd program"
  89.     echo "3) Use the dhclient program"
  90.     echo "4) Use netenv (from the netenv package)"
  91.     echo "5) Specify the IP address now (default)"
  92.     read response
  93.     case $response in
  94.     1)    ipmethod=bootp; break ;;
  95.     2)    ipmethod=dhcpc; break ;;
  96.     3)    ipmethod=dhclient; break ;;
  97.     4)    ipmethod=netenv; break ;;
  98.     5|"")
  99.     ipmethod=ipaddr; break ;;
  100.     esac
  101.     echo "Invalid response"
  102. done
  103.  
  104. case "$ipmethod" in
  105. netenv) ;;
  106. bootp)
  107.     BOOTP="y" ;;
  108. dhcpc)
  109.     DHCP="y" ;;
  110. dhclient)
  111.     DHCLIENT="y" ;;
  112. ipaddr)
  113.     while :
  114.     do
  115.     readstuff IPADDR "Enter the IP address for this interface:"
  116.     if [ ! "$IPADDR" -o `expr "$IPADDR" : \
  117.         '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'` \
  118.         -ne 0 ]; then break; fi
  119.     echo "Invalid IP address"
  120.     done
  121.     if [ "$IPADDR" ]
  122.     then
  123.     IP1=`expr "$IPADDR" : \
  124.         '\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'`
  125.     IP2=`expr "$IPADDR" : \
  126.         '[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*'`
  127.     IP3=`expr "$IPADDR" : \
  128.         '[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*'`
  129.     IP4=`expr "$IPADDR" : \
  130.         '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\)'`
  131.     if [ "$IP1" -lt 128 ]
  132.     then
  133. #    Network class A
  134.         NETMASK="255.0.0.0"
  135.     elif [ "$IP1" -lt 192 ]
  136.     then
  137. #    Network class B
  138.         NETMASK="255.255.0.0"
  139.     elif [ "$IP1" -lt 224 ]
  140.     then
  141. #    Network class C
  142.         NETMASK="255.255.255.0"
  143.     else
  144. #    Multicast
  145.         NETMASK="240.0.0.0"
  146.     fi
  147.     fi
  148.     readstuff NETMASK "Enter the netmask:"
  149.     NMIP2=`expr "$IPADDR" : \
  150.     '[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*'`
  151.     NMIP3=`expr "$IPADDR" : \
  152.     '[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*'`
  153.     NMIP4=`expr "$IPADDR" : \
  154.     '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\)'`
  155.     if [ "$NMIP2" -eq 0 ]
  156.     then
  157.     NETWORK="$IP1.0.0.0"
  158.     BROADCAST="$IP1.255.255.255"
  159.     GATEWAY="$IP1.0.0.1"
  160.     elif [ "$NMIP3" -eq 0 ]
  161.     then
  162.     NETWORK="$IP1.$IP2.0.0"
  163.     BROADCAST="$IP1.$IP2.255.255"
  164.     GATEWAY="$IP1.$IP2.0.1"
  165.     else
  166.     NETWORK="$IP1.$IP2.$IP3.0"
  167.     BROADCAST="$IP1.$IP2.$IP3.255"
  168.     GATEWAY="$IP1.$IP2.$IP3.1"
  169.     fi
  170.     cat <<END
  171.  
  172. Note: the "network address" here is NOT the same as the IP address.
  173. See the Networking HOWTO.  In short, the network address is the IP
  174. address masked by the netmask.
  175.  
  176. END
  177.     readstuff NETWORK "Enter the network address:"
  178.     readstuff BROADCAST "Enter the broadcast address:"
  179.     readstuff GATEWAY "Enter the gateway address:"
  180.     readstuff DOMAIN "Enter the local domain name:"
  181.     cat <<END
  182.  
  183. You may now specify up to three host names or IP addresses for
  184. nameservers for this interface, to be added to /etc/resolv.conf.  The
  185. nameservers defined here complement the nameservers already defined in
  186. /etc/resolv.conf.
  187.  
  188. END
  189.     readstuff DNS_1 "The 1st nameserver:"
  190.     test "$DNS_1" &&
  191.     readstuff DNS_2 "The 2nd nameserver:"
  192.     test "$DNS_1" -a "$DNS_2" &&
  193.     readstuff DNS_3 "The 3rd nameserver:"
  194.     cat <<END
  195. To automatically mount and unmount NFS filesystems, first add all these
  196. filesystems to /etc/fstab, but include noauto in the mount options.
  197.  
  198. WARNING:  It is especially important to use either cardctl or cardinfo
  199. to shut down a network card when NFS mounts are configured this way.
  200. It is not possible to cleanly unmount NFS filesystems if a network card
  201. is simply ejected without warning.
  202.  
  203. END
  204.     readstuff MOUNTS \
  205.         "Enter a list of NFS mount points to be mounted for this interface:"
  206.     echo
  207.     echo "The next two parameters are for IPX networks.  They are passed to"
  208.     echo "the ipx_interface command."
  209.     echo 
  210.     readstuff IPX_FRAME \
  211.         "Enter the frame type (i.e., 802.2):"
  212.     readstuff IPX_NETNUM \
  213.     "Enter the IPX network number:"
  214.     ;;
  215. esac
  216. cat <<END
  217.  
  218. In addition to the usual network configuration parameters, the
  219. network.opts script can specify extra actions to be taken after
  220. an interface is configured, or before an interface is shut down.
  221. If network.opts defines a shell function called start_fn, it will be
  222. invoked by the network script after the interface is configured, and the
  223. interface name will be passed to the function as its first (and only)
  224. argument.  Similarly, if it is defined, stop_fn will be invoked before
  225. shutting down an interface.  Refer to the PCMCIA-HOWTO for more details.
  226.  
  227. This program will now write the network.opts file.  Please take care
  228. not to overwrite a previously configured version of this file.
  229.  
  230. END
  231.  
  232. cont="y"
  233. readyesno cont "Do you want to write /etc/pcmcia/network.opts?" || exit 0
  234.  
  235. cat > /etc/pcmcia/network.opts <<EOF
  236. # Network adapter configuration
  237. #
  238. # ** This file was automatically generated by the pcnetconfig script **
  239. #
  240. # The address format is "scheme,socket,instance,hwaddr".
  241. #
  242. # Note: the "network address" here is NOT the same as the IP address.
  243. # See the Networking HOWTO.  In short, the network address is the IP
  244. # address masked by the netmask.
  245. #
  246. case "\$ADDRESS" in
  247. *,*,*,*)
  248.     # Transceiver selection, for some cards -- see 'man ifport'
  249.     IF_PORT=""
  250.     # Use BOOTP? [y/n]
  251.     BOOTP="$BOOTP"
  252.     # Use DHCP? [y/n]
  253.     DHCP="$DHCP"
  254.     # Use DHCLIENT? [y/n]
  255.     DHCLIENT="$DHCLIENT"
  256.     # Host's IP address, netmask, network address, broadcast address
  257.     IPADDR="$IPADDR"
  258.     NETMASK="$NETMASK"
  259.     NETWORK="$NETWORK"
  260.     BROADCAST="$BROADCAST"
  261.     # Gateway address for static routing
  262.     GATEWAY="$GATEWAY"
  263.     # Things to add to /etc/resolv.conf for this interface
  264.     DOMAIN="$DOMAIN"
  265.     SEARCH="$SEARCH"
  266.     # The nameserver IP addresses specified here complement the
  267.     # nameservers already defined in /etc/resolv.conf.  These nameservers
  268.     # will be added to /etc/resolv.conf automatically when the PCMCIA
  269.     # network connection is established and removed from this file when
  270.     # the connection is broken.
  271.     DNS_1="$DNS_1"
  272.     DNS_2="$DNS_2"
  273.     DNS_3="$DNS_3"
  274.     # NFS mounts, should be listed in /etc/fstab
  275.     MOUNTS="$MOUNTS"
  276.     # For IPX interfaces, the frame type and network number
  277.     IPX_FRAME="$IPX_FRAME"
  278.     IPX_NETNUM="$IPX_NETNUM"
  279.     # Use ipmasq? [y/n]  (found in the Debian ipmasq package)
  280.     IPMASQ="n"
  281.     # Extra stuff to do after setting up the interface
  282.     start_fn () { return; }
  283.     # Extra stuff to do before shutting down the interface
  284.     stop_fn () { return; }
  285.     ;;
  286. esac
  287. EOF
  288.  
  289. if [ "$ipmethod" = netenv ]
  290. then
  291.     cat >> /etc/pcmcia/network.opts <<EOF
  292.  
  293. # For those, who want to use the netenv-Package, the file containing
  294. # the network-setup has to be sourced.  This is not a problem if there
  295. # is no such file.
  296. # Note: in older versions of the netenv package, this file used to be
  297. # located in /tmp.  This was a security risk, however, that has been
  298. # fixed in more recent versions.
  299. if [ -r /etc/netenv/netenv ]; then . /etc/netenv/netenv; fi
  300. EOF
  301. fi
  302.  
  303. exit 0
  304.