tools/llvm: Do not build with symbols
[minix3.git] / minix / commands / netconf / netconf.sh
blobc9f75ad9f8653f916bc7340a939808bf76b707d2
1 #!/bin/sh
3 # netconf 0.1 - Configure network
5 # Changes:
6 #
8 # Get system config
9 . /etc/rc.conf
11 LOCALRC=/usr/etc/rc.local
12 INETCONF=/etc/inet.conf
13 RCNET=/etc/rc.net
14 HOSTS=/etc/hosts
15 HOSTNAME=/etc/hostname.file
16 USRKBFILE=/.usrkb
17 LSPCI=/tmp/lspci.$$
18 DEVICES=/tmp/devices.$$
20 step1=""
21 step2=""
22 step3=""
23 v=1 # verbosity
24 manual_opts=0
25 prefix=""
26 cd="no" # running from cd?
28 eth=""
29 driver=""
30 driverargs=""
32 config=""
33 manual=""
34 dhcp="no"
36 hostname=""
37 hostname_prev=""
38 ip=""
39 ip_prev=""
40 netmask=""
41 netmask_prev=""
42 gateway=""
43 dns1=""
44 dns2=""
46 # Provide some sane defaults
47 hostname_default=`uname -n`
48 test -z "$hostname_default" && hostname_default="Minix"
49 ip_default="10.0.0.1"
50 netmask_default="255.255.255.0"
51 gateway_default=""
53 usage()
55 cat >&2 <<'EOF'
56 Usage:
58 netconf [-q] [-p <prefix>] [-e <num>] [-a]
59 netconf [-H <name> -i <ip> -n <mask> -g <gw> -d <prim dns> [-s <sec dns>]]
61 flags:
62 -q Limit generated output
63 -p Path prefix for configuration files (e.g., during install -p mnt is used as files are mounted on /mnt).
64 -e Ethernet card
65 -a Use DHCP (-H, -i, -n, -g, -d, and -s flags are discarded)
66 -H Hostname
67 -i IP address
68 -n Netmask
69 -g Default gateway
70 -d Primary DNS
71 -s Secondary DNS
72 -h Shows this help file
73 -c Shows a list of ethernet cards supported
75 By default netconf starts in Interactive mode. By providing parameters on the
76 command line, some questions can be omitted.
77 EOF
78 exit 1
81 card()
83 card_number=$1
84 card_name=$2
85 card_avail=0
86 shift 2
87 while [ $# -gt 0 ]
88 do
89 cat $LSPCI | grep > /dev/null "^$1" && card_avail=1
90 shift
91 done
92 if [ $card_avail -gt 0 ]
93 then
94 card_mark="*"
95 eth_default=$card_number
96 else
97 card_mark=" "
99 printf "%2d. %s %s\n" "$card_number" "$card_mark" "$card_name"
102 first_pcicard=5
104 cards()
106 # Run lspci once to a temp file for use in 'card' function
107 lspci >$LSPCI 2>/dev/null || true
109 card 0 "No Ethernet card (no networking)"
110 card 1 "3Com 501 or 3Com 509 based card"
111 card 2 "Realtek 8029 based card (also emulated by Qemu)" "10EC:8029"
112 card 3 "NE2000, 3com 503 or WD based card (also emulated by Bochs)"
113 card 4 "lan8710a (on BeagleBone, BeagleBone Black)"
114 n=$first_pcicard
115 for pcicard in $pci_list
116 do var=\$pci_descr$pcicard; descr="`eval echo $var`"
117 var=\$pci_pcilist$pcicard; pcilist="`eval echo $var`"
118 card $n "$descr" $pcilist
119 n="`expr $n + 1`"
120 done
122 card $first_after_pci "Different Ethernet card (no networking)"
124 # Remove temporary lspci output
125 rm -f $LSPCI
128 warn()
130 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"
133 config_pci_cards() {
134 rm -f $DEVICES
138 # Collect configs from network devices
139 for dir in $SYSTEM_CONF_DIRS
140 do for f in $dir/$SYSTEM_CONF_SUBDIR/*
141 do if [ -f $f ]
142 then printconfig $f | grep 'type net.*pci device'
144 done
145 done >$DEVICES
146 while read devline
147 do pcilist="`echo $devline | sed 's/.*pci device //' | sed 's/,.*//'`"
148 descr="`echo $devline | sed 's/.*,descr //' | sed 's/,.*//'`"
149 label="`echo $devline | sed 's/.*service //' | sed 's/,.*//'`"
150 pci_list="$pci_list $n"
151 eval "pci_pcilist$n=\"$pcilist\""
152 eval "pci_descr$n=\"$descr\""
153 eval "pci_label$n=\"$label\""
154 n="`expr $n + 1`"
155 done <$DEVICES
157 first_after_pci=`expr $first_pcicard + $n`
159 rm -f $DEVICES
162 do_step1()
164 eth_default=0
166 # Ask user about networking
167 echo "MINIX 3 currently supports the following Ethernet cards. PCI cards detected"
168 echo "by MINIX are marked with *. Please choose: "
169 echo ""
170 cards
171 echo ""
173 while [ "$step1" != ok ]; do
174 echo -n "Ethernet card? [$eth_default] "; read eth
175 test -z $eth && eth=$eth_default
177 drv_params $eth
178 test -n "$driver" && step1="ok"
179 done
182 drv_params()
184 # If this is a known pci device, we only have to set
185 # the driver.
186 if [ $1 -ge $first_pcicard -a $1 -lt $first_after_pci ]
187 then pcicard="`expr $1 - $first_pcicard`"
188 var=\$pci_label$pcicard; driver="`eval echo $var`"
189 return
192 # Other possibilities.
193 case "$1" in
194 0) driver=psip0; ;;
195 1) driver=dpeth; driverargs="#dpeth_arg='DPETH0=port:irq:memory'";
196 test "$v" = 1 && echo ""
197 test "$v" = 1 && echo "Note: After installing, edit $LOCALRC to the right configuration."
199 2) driver=dp8390; driverargs="dp8390_arg='DPETH0=pci'"; ;;
200 3) driver=dp8390; driverargs="dp8390_arg='DPETH0=240:9'";
201 test "$v" = 1 && echo ""
202 test "$v" = 1 && echo "Note: After installing, edit $LOCALRC to the right configuration."
203 test "$v" = 1 && echo " chose option 4, the defaults for emulation by Bochs have been set."
205 4) driver=lan8710a; ;;
206 $first_after_pci) driver="psip0"; ;;
207 *) warn "choose a number"
208 esac
211 do_step2()
213 echo ""
214 echo "Configure network using DHCP or manually?"
215 echo ""
216 echo "1. Automatically using DHCP"
217 echo "2. Manually"
218 echo ""
220 while [ "$step2" != ok ]
222 echo -n "Configure method? [1] "; read config
223 test -z $config && config=1
225 case "$config" in
226 1) step2="ok"; dhcp="yes" ; ;;
227 2) step2="ok"; manual="do"; ;;
228 *) warn "choose a number"
229 esac
230 done
232 # Use manual parameters?
233 if [ -n "$manual" ]; then
234 # Query user for settings
235 # Hostname
236 if [ -z $hostname_prev ]; then
237 hostname_prev=$hostname_default
239 echo -n "Hostname [$hostname_prev]: "
240 read hostname
241 if [ ! -z $hostname ]; then
242 hostname_prev=$hostname
243 else
244 hostname=$hostname_prev
247 # IP address
248 if [ -z $ip_prev ]; then
249 ip_prev=$ip_default
251 echo -n "IP address [$ip_prev]: "
252 read ip
253 if [ ! -z $ip ]; then
254 ip_prev=$ip
255 else
256 ip=$ip_prev
259 # Netmask
260 if [ -z $netmask_prev ]; then
261 netmask_prev=$netmask_default
263 echo -n "Netmask [$netmask_prev]: "
264 read netmask
265 if [ ! -z $netmask ]; then
266 netmask_prev=$netmask
267 else
268 netmask=$netmask_prev
271 # Gateway (no gateway is fine for local networking)
272 echo -n "Gateway: "
273 read gateway
275 # DNS Servers
276 echo -n "Primary DNS Server [$dns1_prev]: "
277 read dns1
278 test -z "$dns1" && test -n "$dns1_prev" && dns1=$dns1_prev
279 if [ ! -z "$dns1" ]; then
280 dns1_prev=$dns1
282 echo -n "Secondary DNS Server [$dns2_prev]: "
283 read dns2
284 if [ ! -z $dns2 ]; then
285 dns2_prev=$dns2
287 else
288 # If no primary DNS, then also no secondary DNS
289 dns2=""
294 # Find pci cards we know about
295 config_pci_cards
297 # Parse options
298 while getopts ":qe:p:aH:i:n:g:d:s:hc" arg; do
299 case "$arg" in
300 q) v=0; ;;
301 e) ethernet=$OPTARG;
302 test "$ethernet" -ge 0 -a "$ethernet" -le 7 2>/dev/null || usage
303 drv_params $ethernet
305 p) prefix=$OPTARG; ;;
306 a) dhcp="yes"; ;;
307 H) hostname=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
308 i) ip=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
309 n) netmask=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
310 g) gateway=$OPTARG; manual_opts=`expr $manual_opts '+' 1`;;
311 d) dns1=$OPTARG; ;;
312 s) dns2=$OPTARG; ;;
313 h) usage ;;
314 c) echo -e "The following cards are supported by Minix:\n";
315 cards; exit 0
317 \?) echo "Unknown option -$OPTARG"; usage ;;
318 :) echo "Missing required argument for -$OPTARG"; usage ;;
319 *) usage ;;
320 esac
321 done
323 # Verify parameter count
324 if [ "$dhcp" != "yes" ] ; then
325 if [ $manual_opts -gt 0 ] ; then
326 test $manual_opts -eq 4 -a -n "$dns1" || usage
327 manual="do"
331 if [ -n "$prefix" ] ; then
332 LOCALRC=$prefix$LOCALRC
333 INETCONF=$prefix$INETCONF
334 RCNET=$prefix$RCNET
335 HOSTS=$prefix$HOSTS
336 HOSTNAME=$prefix$HOSTNAME
337 if [ ! -f $INETCONF ]; then
338 echo -e "It seems the supplied prefix (\`$prefix') is invalid."
339 exit 1
343 if [ `whoami` != root ] ; then
344 test "$v" = 1 && echo "Please run netconf as root."
345 exit 1
348 # Are we running from CD?
349 if [ -f "$USRKBFILE" ] ; then
350 cd="yes" # We are running from CD
353 # Do we know what ethernet card to use?
354 test -z "$ethernet" && do_step1
356 # If no parameters are supplied and we're not using DHCP, query for settings
357 test $manual_opts -eq 0 -a "$dhcp" = "no" && do_step2
359 # Store settings.
360 # Do not make backups if we're running from CD
361 test "$cd" != "yes" && test -f $INETCONF && mv $INETCONF "$INETCONF~" &&
362 test "$v" = 1 && echo "Backed up $INETCONF to $INETCONF~"
363 test "$cd" != "yes" && test -f $LOCALRC && mv $LOCALRC "$LOCALRC~" &&
364 test "$v" = 1 && echo "Backed up $LOCALRC to $LOCALRC~"
366 if [ "$driver" = "psip0" ]; then
367 echo "psip0 { default; } ;" > $INETCONF
368 else
369 echo "eth0 $driver 0 { default; } ;" > $INETCONF
371 echo "$driverargs" > $LOCALRC
373 if [ -n "$manual" ]
374 then
375 # Backup config file if it exists and we're not running from CD
376 test "$cd" != "yes" && test -f $RCNET && mv $RCNET "$RCNET~" &&
377 test "$v" = 1 && echo "Backed up $RCNET to $RCNET~"
378 test "$cd" != "yes" && test -f $HOSTS && mv $HOSTS "$HOSTS~" &&
379 test "$v" = 1 && echo "Backed up $HOSTS to $HOSTS~"
381 # Store manual config
382 echo "ifconfig -I /dev/ip0 -n $netmask -h $ip" > $RCNET
383 test ! -z $gateway && echo "add_route -g $gateway" >> $RCNET
384 echo "daemonize nonamed -L" >> $RCNET
385 test ! -z $dns1 && echo -e "$ip\t%nameserver\t#$hostname" > $HOSTS
386 test ! -z $dns1 && echo -e "$dns1\t%nameserver\t#DNS 1" >> $HOSTS
387 test ! -z $dns2 && echo -e "$dns2\t%nameserver\t#DNS 2" >> $HOSTS
388 echo -e "\n$ip\t$hostname" >> $HOSTS
389 echo $hostname > $HOSTNAME
390 else
391 test "$cd" != "yes" && test -f "$RCNET" && mv "$RCNET" "$RCNET~" &&
392 test "$v" = 1 && echo "Moved $RCNET to $RCNET~ to use default settings"
393 test "$cd" != "yes" && test -f $HOSTS && mv $HOSTS "$HOSTS~" &&
394 test "$v" = 1 && echo "Backed up $HOSTS to $HOSTS~"
395 test -f "$HOSTS~" && grep -v "%nameserver" "$HOSTS~" > $HOSTS
398 test "$cd" != "yes" && test "$v" = 1 && echo "
399 You might have to reboot for the changes to take effect."
401 exit 0