1#!/bin/sh 2# 3# netconf 0.1 - Configure network 4# 5# Changes: 6# 7 8# Get system config 9. /etc/rc.conf 10 11LOCALRC=/usr/etc/rc.local 12INETCONF=/etc/inet.conf 13RCNET=/etc/rc.net 14HOSTS=/etc/hosts 15HOSTNAME=/etc/hostname.file 16USRKBFILE=/.usrkb 17LSPCI=/tmp/lspci.$$ 18DEVICES=/tmp/devices.$$ 19 20step1="" 21step2="" 22step3="" 23v=1 # verbosity 24manual_opts=0 25prefix="" 26cd="no" # running from cd? 27 28eth="" 29driver="" 30driverargs="" 31 32config="" 33manual="" 34dhcp="no" 35 36hostname="" 37hostname_prev="" 38ip="" 39ip_prev="" 40netmask="" 41netmask_prev="" 42gateway="" 43dns1="" 44dns2="" 45 46# Provide some sane defaults 47hostname_default=`uname -n` 48test -z "$hostname_default" && hostname_default="Minix" 49ip_default="10.0.0.1" 50netmask_default="255.255.255.0" 51gateway_default="" 52 53usage() 54{ 55 cat >&2 <<'EOF' 56Usage: 57 58 netconf [-q] [-p <prefix>] [-e <num>] [-a] 59 netconf [-H <name> -i <ip> -n <mask> -g <gw> -d <prim dns> [-s <sec dns>]] 60 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 74 75 By default netconf starts in Interactive mode. By providing parameters on the 76 command line, some questions can be omitted. 77EOF 78 exit 1 79} 80 81card() 82{ 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=" " 98 fi 99 printf "%2d. %s %s\n" "$card_number" "$card_mark" "$card_name" 100} 101 102first_pcicard=5 103 104cards() 105{ 106 # Run lspci once to a temp file for use in 'card' function 107 lspci >$LSPCI 2>/dev/null || true 108 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 121 122 card $first_after_pci "Different Ethernet card (no networking)" 123 124 # Remove temporary lspci output 125 rm -f $LSPCI 126} 127 128warn() 129{ 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" 131} 132 133config_pci_cards() { 134 rm -f $DEVICES 135 136 n=0 137 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' 143 fi 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 156 157 first_after_pci=`expr $first_pcicard + $n` 158 159 rm -f $DEVICES 160} 161 162do_step1() 163{ 164 eth_default=0 165 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 "" 172 173 while [ "$step1" != ok ]; do 174 echo -n "Ethernet card? [$eth_default] "; read eth 175 test -z $eth && eth=$eth_default 176 177 drv_params $eth 178 test -n "$driver" && step1="ok" 179 done 180} 181 182drv_params() 183{ 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 190 fi 191 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." 198 ;; 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." 204 ;; 205 4) driver=lan8710a; ;; 206 $first_after_pci) driver="psip0"; ;; 207 *) warn "choose a number" 208 esac 209} 210 211do_step2() 212{ 213 echo "" 214 echo "Configure network using DHCP or manually?" 215 echo "" 216 echo "1. Automatically using DHCP" 217 echo "2. Manually" 218 echo "" 219 220 while [ "$step2" != ok ] 221 do 222 echo -n "Configure method? [1] "; read config 223 test -z $config && config=1 224 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 231 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 238 fi 239 echo -n "Hostname [$hostname_prev]: " 240 read hostname 241 if [ ! -z $hostname ]; then 242 hostname_prev=$hostname 243 else 244 hostname=$hostname_prev 245 fi 246 247 # IP address 248 if [ -z $ip_prev ]; then 249 ip_prev=$ip_default 250 fi 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 257 fi 258 259 # Netmask 260 if [ -z $netmask_prev ]; then 261 netmask_prev=$netmask_default 262 fi 263 echo -n "Netmask [$netmask_prev]: " 264 read netmask 265 if [ ! -z $netmask ]; then 266 netmask_prev=$netmask 267 else 268 netmask=$netmask_prev 269 fi 270 271 # Gateway (no gateway is fine for local networking) 272 echo -n "Gateway: " 273 read gateway 274 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 281 282 echo -n "Secondary DNS Server [$dns2_prev]: " 283 read dns2 284 if [ ! -z $dns2 ]; then 285 dns2_prev=$dns2 286 fi 287 else 288 # If no primary DNS, then also no secondary DNS 289 dns2="" 290 fi 291 fi 292} 293 294# Find pci cards we know about 295config_pci_cards 296 297# Parse options 298while 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 304 ;; 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 316 ;; 317 \?) echo "Unknown option -$OPTARG"; usage ;; 318 :) echo "Missing required argument for -$OPTARG"; usage ;; 319 *) usage ;; 320 esac 321done 322 323# Verify parameter count 324if [ "$dhcp" != "yes" ] ; then 325 if [ $manual_opts -gt 0 ] ; then 326 test $manual_opts -eq 4 -a -n "$dns1" || usage 327 manual="do" 328 fi 329fi 330 331if [ -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 340 fi 341fi 342 343if [ `whoami` != root ] ; then 344 test "$v" = 1 && echo "Please run netconf as root." 345 exit 1 346fi 347 348# Are we running from CD? 349if [ -f "$USRKBFILE" ] ; then 350 cd="yes" # We are running from CD 351fi 352 353# Do we know what ethernet card to use? 354test -z "$ethernet" && do_step1 355 356# If no parameters are supplied and we're not using DHCP, query for settings 357test $manual_opts -eq 0 -a "$dhcp" = "no" && do_step2 358 359# Store settings. 360# Do not make backups if we're running from CD 361test "$cd" != "yes" && test -f $INETCONF && mv $INETCONF "$INETCONF~" && 362 test "$v" = 1 && echo "Backed up $INETCONF to $INETCONF~" 363test "$cd" != "yes" && test -f $LOCALRC && mv $LOCALRC "$LOCALRC~" && 364 test "$v" = 1 && echo "Backed up $LOCALRC to $LOCALRC~" 365 366if [ "$driver" = "psip0" ]; then 367 echo "psip0 { default; } ;" > $INETCONF 368else 369 echo "eth0 $driver 0 { default; } ;" > $INETCONF 370fi 371echo "$driverargs" > $LOCALRC 372 373if [ -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~" 380 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 390else 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 396fi 397 398test "$cd" != "yes" && test "$v" = 1 && echo " 399You might have to reboot for the changes to take effect." 400 401exit 0 402