minix/commands/scripts/netconf.sh

316 lines
8 KiB
Bash
Raw Normal View History

#!/bin/sh
#
# netconf 0.1 - Configure network
#
# Changes:
#
LOCALRC=/usr/etc/rc.local
INETCONF=/etc/inet.conf
RCNET=/etc/rc.net
HOSTS=/etc/hosts
HOSTNAME=/etc/hostname.file
USRKBFILE=/.usrkb
step1=""
step2=""
step3=""
v=1 # verbosity
manual_opts=0
prefix=""
cd="no" # running from cd?
eth=""
driver=""
driverargs=""
config=""
manual=""
dhcp="no"
hostname=""
hostname_prev=""
ip=""
ip_prev=""
netmask=""
netmask_prev=""
gateway=""
dns1=""
dns2=""
# Provide some sane defaults
hostname_default=`uname -n`
test -z "$hostname_default" && hostname_default="Minix"
ip_default="10.0.0.1"
netmask_default="255.255.255.0"
gateway_default=""
usage()
{
cat >&2 <<'EOF'
Usage:
netconf [-q] [-p <prefix>] [-e <num>] [-a]
netconf [-H <name> -i <ip> -n <mask> -g <gw> -d <prim dns> [-s <sec dns>]]
flags:
-q Limit generated output
-p Path prefix for configuration files (e.g., during install -p mnt is used as files are mounted on /mnt).
-e Ethernet card
-a Use DHCP (-H, -i, -n, -g, -d, and -s flags are discarded)
-H Hostname
-i IP address
-n Netmask
-g Default gateway
-d Primary DNS
-s Secondary DNS
-h Shows this help file
-c Shows a list of ethernet cards supported
By default netconf starts in Interactive mode. By providing parameters on the
command line, some questions can be omitted.
EOF
exit 1
}
cards()
{
echo "0. No Ethernet card (no networking)"
echo "1. Intel Pro/100"
echo "2. 3Com 501 or 3Com 509 based card"
echo "3. Realtek 8139 based card (also emulated by KVM)"
echo "4. Realtek 8029 based card (also emulated by Qemu)"
echo "5. NE2000, 3com 503 or WD based card (also emulated by Bochs)"
echo "6. AMD LANCE (also emulated by VMWare and VirtualBox)"
echo "7. Different Ethernet card (no networking)"
}
warn()
{
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b ! $1"
}
do_step1()
{
# Ask user about networking
echo "MINIX 3 currently supports the following Ethernet cards. Please choose: "
echo ""
cards
echo ""
while [ "$step1" != ok ]; do
echo -n "Ethernet card? [0] "; read eth
test -z $eth && eth=0
drv_params $eth
test -n "$driver" && step1="ok"
done
}
drv_params()
{
case "$1" in
0) driver=psip0; ;;
1) driver=fxp; ;;
2) driver=dpeth; driverargs="#dpeth_arg='DPETH0=port:irq:memory'";
test "$v" = 1 && echo ""
test "$v" = 1 && echo "Note: After installing, edit $LOCALRC to the right configuration."
;;
3) driver=rtl8139; ;;
4) driver=dp8390; driverargs="dp8390_arg='DPETH0=pci'"; ;;
5) driver=dp8390; driverargs="dp8390_arg='DPETH0=240:9'";
test "$v" = 1 && echo ""
test "$v" = 1 && echo "Note: After installing, edit $LOCALRC to the right configuration."
test "$v" = 1 && echo " chose option 4, the defaults for emulation by Bochs have been set."
;;
6) driver="lance"; ;;
7) driver="psip0"; ;;
*) warn "choose a number"
esac
}
do_step2()
{
echo ""
echo "Configure network using DHCP or manually?"
echo ""
echo "1. Automatically using DHCP"
echo "2. Manually"
echo ""
while [ "$step2" != ok ]
do
echo -n "Configure method? [1] "; read config
test -z $config && config=1
case "$config" in
1) step2="ok"; dhcp="yes" ; ;;
2) step2="ok"; manual="do"; ;;
*) warn "choose a number"
esac
done
# Use manual parameters?
if [ -n "$manual" ]; then
# Query user for settings
# Hostname
if [ -z $hostname_prev ]; then
hostname_prev=$hostname_default
fi
echo -n "Hostname [$hostname_prev]: "
read hostname
if [ ! -z $hostname ]; then
hostname_prev=$hostname
else
hostname=$hostname_prev
fi
# IP address
if [ -z $ip_prev ]; then
ip_prev=$ip_default
fi
echo -n "IP address [$ip_prev]: "
read ip
if [ ! -z $ip ]; then
ip_prev=$ip
else
ip=$ip_prev
fi
# Netmask
if [ -z $netmask_prev ]; then
netmask_prev=$netmask_default
fi
echo -n "Netmask [$netmask_prev]: "
read netmask
if [ ! -z $netmask ]; then
netmask_prev=$netmask
else
netmask=$netmask_prev
fi
# Gateway (no gateway is fine for local networking)
echo -n "Gateway: "
read gateway
# DNS Servers
echo -n "Primary DNS Server [$dns1_prev]: "
read dns1
test -z "$dns1" && test -n "$dns1_prev" && dns1=$dns1_prev
if [ ! -z "$dns1" ]; then
dns1_prev=$dns1
echo -n "Secondary DNS Server [$dns2_prev]: "
read dns2
if [ ! -z $dns2 ]; then
dns2_prev=$dns2
fi
else
# If no primary DNS, then also no secondary DNS
dns2=""
fi
fi
}
# Parse options
while getopts ":qe:p:aH:i:n:g:d:s:hc" arg; do
case "$arg" in
q) v=0; ;;
e) ethernet=$OPTARG;
test "$ethernet" -ge 0 -a "$ethernet" -le 7 2>/dev/null || usage
drv_params $ethernet
;;
p) prefix=$OPTARG; ;;
a) dhcp="yes"; ;;
H) hostname=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
i) ip=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
n) netmask=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
g) gateway=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
d) dns1=$OPTARG; ;;
s) dns2=$OPTARG; ;;
h) usage ;;
c) echo -e "The following cards are supported by Minix:\n";
cards; exit 0
;;
\?) echo "Unknown option -$OPTARG"; usage ;;
:) echo "Missing required argument for -$OPTARG"; usage ;;
*) usage ;;
esac
done
# Verify parameter count
if [ "$dhcp" != "yes" ] ; then
if [ $manual_opts -gt 0 ] ; then
test $manual_opts -eq 4 -a -n "$dns1" || usage
manual="do"
fi
fi
if [ -n "$prefix" ] ; then
LOCALRC=$prefix$LOCALRC
INETCONF=$prefix$INETCONF
RCNET=$prefix$RCNET
HOSTS=$prefix$HOSTS
HOSTNAME=$prefix$HOSTNAME
if [ ! -f $INETCONF ]; then
echo -e "It seems the supplied prefix (\`$prefix') is invalid."
exit 1
fi
fi
if [ "$USER" != root ] ; then
test "$v" = 1 && echo "Please run netconf as root."
exit 1
fi
# Are we running from CD?
if [ -f "$USRKBFILE" ] ; then
echo "Running from CD"
cd="yes" # We are running from CD
fi
# Do we know what ethernet card to use?
test -z "$ethernet" && do_step1
# If no parameters are supplied and we're not using DHCP, query for settings
test $manual_opts -eq 0 -a "$dhcp" = "no" && do_step2
# Store settings.
# Do not make backups if we're running from CD
test "$cd" != "yes" && test -f $INETCONF && mv $INETCONF "$INETCONF~" &&
test "$v" = 1 && echo "Backed up $INETCONF to $INETCONF~"
test "$cd" != "yes" && test -f $LOCALRC && mv $LOCALRC "$LOCALRC~" &&
test "$v" = 1 && echo "Backed up $LOCALRC to $LOCALRC~"
echo "eth0 $driver 0 { default; } ;" > $INETCONF
echo "$driverargs" > $LOCALRC
if [ -n "$manual" ]
then
# Backup config file if it exists and we're not running from CD
test "$cd" != "yes" && test -f $RCNET && mv $RCNET "$RCNET~" &&
test "$v" = 1 && echo "Backed up $RCNET to $RCNET~"
test "$cd" != "yes" && test -f $HOSTS && mv $HOSTS "$HOSTS~" &&
test "$v" = 1 && echo "Backed up $HOSTS to $HOSTS~"
# Store manual config
echo "ifconfig -I /dev/ip0 -n $netmask -h $ip" > $RCNET
test ! -z $gateway && echo "add_route -g $gateway" >> $RCNET
echo "daemonize nonamed -L" >> $RCNET
test ! -z $dns1 && echo -e "$ip\t%nameserver\t#$hostname" > $HOSTS
test ! -z $dns1 && echo -e "$dns1\t%nameserver\t#DNS 1" >> $HOSTS
test ! -z $dns2 && echo -e "$dns2\t%nameserver\t#DNS 2" >> $HOSTS
echo -e "\n$ip\t$hostname" >> $HOSTS
echo $hostname > $HOSTNAME
else
test "$cd" != "yes" && test -f "$RCNET" && mv "$RCNET" "$RCNET~" &&
test "$v" = 1 && echo "Moved $RCNET to $RCNET~ to use default settings"
test "$cd" != "yes" && test -f $HOSTS && mv $HOSTS "$HOSTS~" &&
test "$v" = 1 && echo "Backed up $HOSTS to $HOSTS~"
test -f "$HOSTS~" && grep -v "%nameserver" "$HOSTS~" > $HOSTS
fi
test "$cd" != "yes" && test "$v" = 1 && echo "
You might have to reboot for the changes to take effect."
exit 0