This commit was manufactured by cvs2svn to create tag
[opensuse:installation-images.git] / data / initrd / s390 / bin / netsetup
1 #!/bin/bash
2 # Copyright (c) 2000 SuSE GmbH Nuernberg, Germany.  All rights reserved.
3 #
4 # Authors: Joachim Schroeder <Joachim.Schroeder@suse.de>
5 #          Bernd Kaindl <Bernd.Kaindl@suse.de>
6 #
7 #       Save it for autoconfig
8 AUTO_PEER="$PEER"
9 # network setup script and linuxrc for s390-suse-linux
10 #
11 # Default environment variables:
12 #
13 # first, the network device parameters
14 : ${DEVNO:=auto} ${DEVNO2:=auto} ${DEVNO3:=auto} ${PORTNO:=0} ${PEER:=TCPIP}
15 : ${PORTNAME:=suselin7} ${PROTOCOL:=noproto}
16 #
17 #
18 # and export them:
19 export DEVNO DEVNO2 DEVNO3 PORTNAME PORTNO PEER LHOST UHOST LAPPL UAPPL DBG
20 #
21 # second, the network connection parameters
22 : ${IP_HOST:=linux.example.com}
23 : ${IP_ADDR:=192.168.0.1}
24 : ${IP_NETMASK:=255.255.255.0}
25 : ${IP_GATEWAY:=192.168.0.254}
26 : ${IP_PEER:=192.168.0.254}
27 : ${IP_DNS:=none}
28 # Take it from the domain of IP_HOST
29 #: ${IP_SEARCH:=example.com}
30 : ${IP_MTU:=default}
31 : ${SCH_ORDER:=DeviceAddr}
32 : ${DONTSHOW:=^....   ....  3390}
33 #
34 export IP_HOST
35 export IP_ADDR
36 export IP_NETMASK
37 export IP_GATEWAY
38 export IP_PEER
39 export IP_DNS
40 export IP_SEARCH
41 export IP_MTU
42 #
43 [ "$LINUXRC_RECORD" ] && LINUXRC_READ=""
44 #
45 # readln reads a line into $ANSW.
46 #
47 function readln () {
48   echo -n "$1"
49   if [ -z "$LINUXRC_RECORD" -a "$LINUXRC_READ" ]; then
50     set -- $LINUXRC_READ
51     echo "-> $1"
52     ANSW=$1
53     shift
54     LINUXRC_READ="$@"
55     [ "$ANSW" = /n -o "$ANSW" = /N ] && ANSW=""
56     sleep 1
57   else
58     IFS='@' read ANSW || exit 1
59     ANSW=`echo $ANSW | sed -e 's/^ *//'`
60     if [ "$LINUXRC_RECORD" ]; then
61       record_answ="$ANSW"
62       [ "$record_answ" ] || record_answ=/n
63       LINUXRC_READ="$LINUXRC_READ $record_answ"
64     fi
65     if [ "$ANSW" = "restart" -o "$ANS" = "RESTART" ]; then
66         echo;echo;echo "-- Restarting linuxrc --";echo;echo
67         if [ "$DEBUG" = "yes" ]; then
68             . ./linuxrc || exit 1
69         else
70             . /linuxrc || exit 1
71         fi
72         exit 0
73     fi
74   fi
75 }
76 #
77 #
78 # yes_no reads either a yes or a no into $ANSW
79 #
80 function yes_no () {
81   while :; do
82     readln "$1"
83     case "$ANSW" in
84       [yY] | [yY][eE][sS]) ANSW=yes
85                      break;;
86       [nN] | [nN][oO])  ANSW=no
87                      break;;
88     esac
89   done
90 }
91 #
92 #
93 # Check memory and issue a waring if we do not have a certain amount
94 #
95 function check_memory () {
96         MEM=`grep MemTotal /proc/meminfo|sed 's,[^0-9]*\([0-9]*\)[^0-9]*,\1,g'`
97         let MEM="($MEM >> 15) + 1 << 5" # round up to next 32M
98         if [ $MEM -lt 80 ]; then
99             echo "Warning: The kernel has only $MEM MB memory for applications"
100             echo "80 MB are recommended for installation thru FTP and updating."
101         fi
102 }
103 #
104 function ask_select_protocol() {
105     NO_ERROR=yes
106     while :; do
107       echo "Select protocol number for $NETTYPE:"
108       echo "0) Compatibility mode, also for non-Linux peers other"
109       echo "   than OS/390 and z/OS (this is the default mode)"
110       echo "1) Extended mode"
111       echo "3) Compatibility mode with OS/390 and z/OS"
112       if [ "$AUTOINSTALL" = "yes"  -a "$NO_ERROR" = "yes" ]
113       then
114                 echo "Enter your choice ($PROTOCOL): $PROTOCOL"
115                 ANSW=$PROTOCOL
116       else
117                 PROTOCOL=0
118                 readln "Enter your choice ($PROTOCOL): "
119       fi
120       [ "$ANSW" ] && PROTOCOL="$ANSW"
121       case "$PROTOCOL" in
122         0|1|3)
123            return ;;
124         *)
125            PROTOCOL=""
126            echo "This is not a valid menu option, redisplaying menu:";;
127       esac
128       NO_ERROR=no
129     done
130 }
131 #
132 function hwconfig_menu () {
133     while :; do
134       echo
135       echo "Check HW configuration/detection:"
136       echo "1) Show all detected subchannels"
137       echo "2) Show only subchannels that match a search expression"
138 #     echo "3) Change sort order of subchannel display: $SCH_ORDER"
139 #     echo "4) Change pattern of channels which are not shown: $DONTSHOW"
140 #     echo "5) Show the full output of /proc/chandev"
141 #     echo "6) Show detected devices of /proc/chandev"
142 #     echo "7) Show detected devices of /proc/chandev that match a search expression"
143 #     echo "8) Show devices enabled for detection in /proc/chandev"
144       echo "9) Return to main menu"
145       echo
146       readln "Enter your choice (1-9): "
147       case "$ANSW" in
148         1)
149           echo "Showing all detected subchannels(dasd channels not shown):"
150           show_subchannels | grep -v "$DONTSHOW"
151           press_return_to_continue
152           ;;
153         2)
154           readln "Enter search expression: "
155           echo "Showing subchannels that match $ANSW(dasd channels not shown):"
156           show_subchannels | grep -v "$DONTSHOW" | grep "$ANSW" >subchannels
157           if [ -s subchannels ]; then
158                 cat subchannels
159           else
160                 echo "No non-dasd subchannels matched $ANSW."
161           fi
162           press_return_to_continue
163           ;;
164 #       3)
165 #         echo "Select new sort order"
166 #         ;;
167 #       4)
168 #         echo "Change pattern of channels which are not shown:"
169 #         ;;
170         5)
171           echo "============================================================================="
172           echo "        Showing the contents of /proc/chandev(compressed output)"
173           echo "============================================================================="
174           sed -n 's/\(................................................................................\).*/\1/
175                         /^[=*]/d;
176                s/0x10  0x1731 0x01  0x1732 0x01/OSA Express Eth or Gigabit Eth/;
177                s/0x10  0x1731 0x05  0x1732 0x05/Hipersocket:(1731-05, 1732-05)/;
178                s/^0x//;s/^ //;s/0x/  /g;/./p' /proc/chandev
179                   press_return_to_continue
180           ;;
181         6)
182           echo "Showing the channels detected section of /proc/chandev:"
183           sed -n '1,/^channels detected/d;s/ *$//;/^[ =0]/p' /proc/chandev >channels
184           if [ -s channels ]; then
185           sed 's/0x10  0x1731 0x01  0x1732 0x01/OSA Express Eth or Gigabit Eth/;
186                s/0x10  0x1731 0x05  0x1732 0x05/Hipersocket:(1731-05, 1732-05)/;
187                s/^0x//;s/^ //;s/0x/  /g;' channels
188           else
189                 echo "/proc/chandev does not show detected devices."
190           fi
191           press_return_to_continue
192           ;;
193         7)
194           echo "Showing the channels detected section of /proc/chandev that match $ANSW:"
195           sed -n '1,/^channels detected/d;s/ *$//;/^[ =0]/p' /proc/chandev >channels
196           if [ -s channels ]; then
197                 readln "Enter search expression: "
198                 grep "$ANSW" channels
199           else
200                 echo "/proc/chandev does not show detected devices."
201           fi
202           press_return_to_continue
203           ;;
204         8)
205           echo "Showing the enabled channels of /proc/chandev, only the first 80 columns:"
206           echo "The output is clipped at column 80 to fit on 80 column terminals"
207           echo "Channels enabled for detection:"
208           sed '1,/^Channels enabled/d;/^$/,$d;s/\(................................................................................\).*/\1/' /proc/chandev
209           ;;
210         9)
211           break;;
212         *)
213           echo "This is not a valid menu option, redisplaying menu:";;
214       esac
215     done
216 }
217 #
218 #
219 # Show all detected subchannels (in subchannel order) with their device IDs:
220 #
221 function show_subchannels () {
222     echo -e "device\tonline\tcutype\tdevtype\tdetach_state"
223     for i in /sys/bus/ccw/devices/*
224     do
225         echo -e "`basename $i`\t`cat $i/online`\t`cat $i/cutype`\t`cat $i/devtype`\t`cat $i/detach_state`"
226     done
227 }
228 #
229 #
230 # Ask to press return to continue:
231 #
232 function press_return_to_continue () {
233         echo -n "Press ENTER to continue: "
234         read a
235 }
236 #
237 #
238 # Ask if the user want to see all detected subchannels:
239 #
240 function ask_show_subchannels () {
241         yes_no "Do you want to see all detected (non-DASD) subchannels? (yes/no) "
242         if [ "$ANSW" = "yes" ]; then
243                 show_subchannels | grep -v "3390/[0-9a-f][0-9a-f]"
244                 press_return_to_continue
245         fi
246 }
247 #
248 #
249 # execcmd executes a command or displays it in debug mode
250 #
251 function execcmd () {
252         CMD="$*"
253         if [ "$DEBUG" = "yes" ]; then
254                 echo "--> "$CMD
255         else
256                 eval $CMD
257         fi
258         EXIT_CODE=$?
259 }
260 #
261 #
262 # change_passwd asks for a new root password
263 #
264 function change_passwd() {
265   echo " "
266   echo "For security reasons you have to set an temporary installation"
267   echo "system password for the user \"root\"."
268   echo "You'll be asked for it only when you telnet into this installation"
269   echo "system to limit the access to it and it will be cleared as soon"
270   echo "as you shut down or reset the installation system"
271   NO_ERROR=yes
272   while :; do
273     echo " "
274     if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
275     then
276             echo "Please enter the temporary installation password: $INST_PASSWORD"
277             ANSW=$INST_PASSWORD
278     else
279             readln "Please enter the temporary installation password: "
280     fi
281     [ ${#ANSW} -ge 3 ] && break;
282     echo "Please enter at least 3 characters."
283     NO_ERROR=no
284   done
285   echo "root:$ANSW" | execcmd "/usr/sbin/chpasswd" &&
286     echo "Temporary installation password set."
287 }
288 #
289 #
290 function set_IP_DEV {
291   [ "$NETSELECT" = "tr" ]      && IP_DEV=tr0
292   [ "$NETSELECT" = "eth" ]     && IP_DEV=eth0
293   [ "$NETSELECT" = "qeth" ]    && IP_DEV=eth0
294   [ "$NETSELECT" = "hsi" ]     && IP_DEV=hsi0
295   [ "$NETSELECT" = "ctc" ]     && IP_DEV=ctc0
296   [ "$NETSELECT" = "escon" ]   && IP_DEV=escon0
297   [ "$NETSELECT" = "iucv" ]    && IP_DEV=iucv0
298   [ "$NETSELECT" = "qeth-tr" ] && IP_DEV=tr0
299 }
300 #
301 # select_network_device_type lets you choose the network connection
302 #
303 function select_network_device_type() {
304     if [ "$NETSELECT" -a "$NETSELECT" != none ]; then
305       echo "The selected network device type is $NETSELECT."
306       yes_no "Do you want to change it (Yes/No) ?"
307       [ "$ANSW" = no ] && return
308     fi
309     check_memory
310     NO_ERROR="yes"
311     while :; do
312       CHAN=""
313       echo
314       echo "Please select the type of your network device:"
315       echo " 0) no network"
316       echo " 1) OSA Token Ring (lcs)"
317       echo " 2) OSA Ethernet"
318       echo " 3) OSA-Gigabit Ethernet or OSA-Express Fast Ethernet"
319       echo " 4) Channel To Channel"
320       echo " 5) Escon"
321       echo " 6) IUCV"
322       echo " 8) Hipersockets"
323       echo " 9) OSA High speed Token Ring (qdio)"
324       echo "10) Show subchannels and detected devices"
325       if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
326       then
327                 case "$IP_INTERFACE" in
328                         tr) ANSW=1;;
329                         eth) ANSW=2;;
330                         qeth) ANSW=3;;
331                         ctc) ANSW=4;;
332                         escon) ANSW=5;;
333                         iucv) ANSW=6;;
334                         hsi) ANSW=8;;
335                         qeth-tr) ANSW=9;;
336                 esac
337       else
338                 readln "Enter your choice (0-10): "
339       fi
340       echo
341       case "$ANSW" in
342         0)
343 #         no network
344           NETSELECT="none"
345           EXIT_SCRIPT=1
346           no_network
347           break;;
348         1)
349           NETSELECT="tr"
350           set_IP_DEV
351           if load_LCS; then
352               break
353           fi;;
354         2)
355           NETSELECT="eth"
356           set_IP_DEV
357           if load_LCS; then
358               break
359           fi;;
360         3)
361           NETSELECT="qeth"
362           set_IP_DEV
363           if load_QETH; then
364               break
365           fi;;
366         4)
367           NETSELECT="ctc"
368           set_IP_DEV
369           if load_CTC; then
370             break
371           fi;;
372         5)
373           NETSELECT="escon"
374           set_IP_DEV
375           if load_CTC; then
376             break
377           fi;;
378         6)
379           NETSELECT="iucv"
380           set_IP_DEV
381           if load_IUCV; then
382             break
383           fi;;
384         8)
385           NETSELECT="hsi"
386           set_IP_DEV
387           if load_QETH; then
388             break
389           fi;;
390         9)
391           NETSELECT="qeth-tr"
392           set_IP_DEV
393           if load_QETH; then
394               break
395           fi;;
396         10)
397           hwconfig_menu
398           ;;
399         *)
400           echo "This is not a valid menu option, redisplaying menu:";;
401       esac
402       NO_ERROR=no
403     done
404 }
405
406 #
407 # asks user whether to ignore the previous error
408 #
409 function continue_anyway()
410 {
411         echo
412         echo 'Do you want to ignore this error and continue anyway? (Yes/No)'
413         yes_no
414         if test "$ANSW" = "yes"
415         then
416                 return 0
417         else
418                 return 1
419         fi
420 }
421
422 #
423 #
424 # activate_config establishes the network connection
425
426 function activate_config() {
427     export HOSTNAME=${IP_HOST%%.*}
428     execcmd "/bin/hostname $HOSTNAME"
429     dns_config
430     ANSW="y"
431     while [ "$ANSW" = "y" ] ; do
432         IFCONFIG="ifconfig $IP_DEV $IP_ADDR"
433         case "$NETSELECT" in
434             tr|eth|qeth|hsi|qeth-tr)
435                 IFCONFIG="$IFCONFIG netmask $IP_NETMASK broadcast $IP_BROADCAST" ;;
436             ctc|escon|iucv)
437                 IFCONFIG="$IFCONFIG pointopoint $IP_PEER" ;;
438         esac
439         if [ $IP_MTU != 0 ]; then
440             IFCONFIG="$IFCONFIG mtu $IP_MTU"
441         fi
442         echo "$IFCONFIG"
443         execcmd "/sbin/$IFCONFIG"
444         echo "/sbin/ifconfig $IP_DEV :"
445         execcmd "/sbin/ifconfig $IP_DEV"
446         sleep 1
447         echo "Trying to ping my IP address:"
448         execcmd "ping -w 10 -n -c 3 $IP_ADDR"
449         if [ $EXIT_CODE -gt 0 ]; then
450             echo "Warning: Could not ping my IP address!"
451         else
452             case "$NETSELECT" in
453                 tr|eth|qeth|hsi|qeth-tr)
454                     NTRY=3
455                     if [ "$IP_GATEWAY" ]; then
456                         echo "Trying to ping the IP address of the Gateway:"
457                         execcmd "ping -w 10 -n -c $NTRY $IP_GATEWAY" 
458                         if [ $EXIT_CODE -eq 0 ]; then
459                             echo "Gateway seems to respond to our pings, continuing."
460                             break
461                         else
462                             echo "Warning: The gateway address $IP_GATEWAY did not ping."
463                             continue_anyway && break
464                         fi
465                     fi
466                     ;;
467                 ctc|escon|iucv)
468                     if [ "$IP_PEER" ]; then
469                         if [ "$NETSELECT" != iucv ]; then
470                             for i in 6 3 4 5 4 4 3 2
471                             do
472                                 if dmesg | tail | grep -q "$IP_DEV: connected with remote side"; then
473                                         break
474                                 fi
475                                 echo "Waiting $i seconds for connection with remote side."
476                                 sleep $i
477                             done
478                         fi
479                         echo "Trying to ping the IP address of the peer:"
480                         execcmd "ping -w 10 -n -c 3 $IP_PEER"
481                         if [ $EXIT_CODE -eq 0 ]; then
482                             echo "Peer seems to respond to our pings, continuing."
483                             break
484                         else
485                             echo "Warning: The peer address $IP_PEER did not ping."
486                             case "$NETSELECT" in
487                                 ctc|escon)
488                                     echo "Statistics from $IP_DEV:"
489                                     STATS_DIR=/sys/class/net/$IP_DEV/statistics
490                                     for file in $STATS_DIR/*; do
491                                         if [ -r $file ]; then
492                                             read num < $file;
493                                             if [ $num -ne 0 ]; then
494                                                 echo $(basename $file): $num
495                                             fi
496                                         fi
497                                     done
498                                 ;;
499                             esac
500                             continue_anyway && break
501                         fi
502                     fi
503                     ;;
504                 *)
505                     echo "Something went wrong with $NETSELECT..."
506             esac
507         fi
508         readln "Do you want to retry the ifconfig (y/n)? "
509     done
510     if [ "$IP_GATEWAY" ] ; then
511       execcmd "route add default gw $IP_GATEWAY"
512     fi
513     if [ "$IP_DNS" ]; then
514         echo "Trying to ping the IP address of the DNS Server:"
515         execcmd "ping -w 10 -c 3 $IP_DNS"
516         if [ $EXIT_CODE -gt 0 ]; then
517             echo "Warning: The DNS address $IP_DNS did not ping."
518             echo "Diagnostics:"
519             echo "traceroute to the DNS IP with max ttl 10, waittime 1, one probe per hop:"
520             execcmd "traceroute -m 10 -n -w 1 -q 1 $IP_DNS"
521             echo "Flaky DNS will cause delays when logging in and during"
522             echo "Installation. To disable DNS enter: \"nodns\"."
523         fi
524     fi
525     generate_installinf >$INSTALLINF
526 }
527 #
528 #
529 #
530 generate_installinf () {
531 #
532 # the following lines are not needed in install.inf
533 #Display: Color
534 #Keytable: de-lat1-nd
535 #Bootmode: CD
536 #Cdrom: /dev/hda
537 #Server:  10.10.0.10
538 #Serverdir: /work/CDs/full-i386
539 #Language: english
540 #
541     echo "Bootmode: Net
542 Sourcemounted: 0
543 Netdevice: $IP_DEV
544 IP: $IP_ADDR
545 HostIP: $IP_ADDR
546 NetConfig: static"
547     [ "$IP_MTU" -ne 0 ] && echo "MTU: $IP_MTU"
548     case "$NETSELECT" in
549         tr|eth|qeth|hsi|qeth-tr)
550             echo "Netmask: $IP_NETMASK"
551             echo "Broadcast: $IP_BROADCAST"
552 #       for qeth and hsi
553             [ "$NETSELECT" = "qeth" -o "$NETSELECT" = "hsi" -o "$NETSELECT" = qeth-tr ] && echo "WAIT_FOR_INTERFACES: 15"
554             ;;
555         ctc|escon|iucv)
556 #
557 #       KRUECKE TODO
558 #       We need a networkmask to get linuxrc in batch-mode
559 #
560             echo "Netmask: $IP_NETMASK"
561             echo "Pointopoint: $IP_PEER"
562 #       Only for ctc and escon
563             [ ! "$NETSELECT" = "iucv" ] && echo "WAIT_FOR_INTERFACES: 40"
564             ;;
565         *)
566             echo "Something went wrong with $NETSELECT..." >&2
567     esac
568     [ "$IP_GATEWAY" ] && echo "Gateway: $IP_GATEWAY"
569     [ "$IP_SEARCH" ]  && echo "Domain: $IP_SEARCH"
570     [ "$CHAN" ]       && echo "Hardware: $CHAN"
571     if [ "$NETSELECT" = tr -o "$NETSELECT" = eth ]; then
572       echo "Alias: $IP_DEV lcs"
573 #      echo "Options: lcs $PARM"
574       echo "ConnectWait: 3"
575     fi
576     if [ "$NETSELECT" = "qeth" -o "$NETSELECT" = hsi -o "$NETSELECT" = qeth-tr ]; then
577       echo "Alias: $IP_DEV qeth"
578 #      echo "Options: qeth $PARM"
579       echo "ConnectWait: 15"
580     fi
581     if [ "$NETSELECT" = "ctc" -o "$NETSELECT" = "escon" ]; then
582 #      echo "Alias: $IP_DEV ctc"
583 #      echo "Options: ctc $PARM"
584       echo "ConnectWait: 30"
585     fi
586     if [ "$NETSELECT" = "iucv" ]; then
587 #      echo "Alias: $IP_DEV netiucv"
588       echo "$PARM" | sed "s/iucv=\(.*\)/Options: netiucv iucv=\1/g"
589     fi
590     [ "$IP_HOST" ]        && echo "Machinename: $IP_HOST"
591     [ "$IP_DNS" ]         && echo "Nameserver: $IP_DNS"
592     [ "$IP_MTU" -ne 0 ]   && echo "IP_MTU: $IP_MTU"
593 }
594 #
595 #
596 # at the end, run services
597 #
598 function run_services () {
599   echo "Network Setup finished, running inetd..."
600   echo pts/0 >> /etc/securetty
601   echo pts/1 >> /etc/securetty
602   echo pts/2 >> /etc/securetty
603   execcmd "/usr/sbin/inetd &"
604   execcmd "/sbin/portmap &"
605   echo
606   echo "You should be able to login via telnet now, for ssh wait a few seconds,"
607   echo "temporary host keys (only for installation) are being generated now:"
608   echo
609   execcmd "/etc/init.d/sshd start"
610   echo
611   echo "Generation of temporary installation host keys finished."
612   echo "After installation, new, different SSH keys will be generated."
613   echo
614 # /usr/sbin/rpc.mountd -d call &
615 # /usr/sbin/rpc.nfsd -d auth &
616 }
617 #
618 #
619 # configure name resolving
620 #
621 function dns_config () {
622   if [ "$DEBUG" = "yes" ]; then echo "-->(Installing /etc/resolv.conf)";return; fi
623   cat > /etc/resolv.conf <<EOF
624 #
625 # /etc/resolv.conf
626 #
627 # Automatically generated by SuSE S/390 linuxrc (network setup)
628 #
629 # PLEASE DO NOT EDIT THIS FILE!
630 #
631 search $IP_SEARCH
632 nameserver $IP_DNS
633 EOF
634 }
635 #
636 #
637 # on failure, quit with this message
638 #
639 function no_network () {
640   echo
641   echo "*** OK, NETWORK ACCESS WILL _NOT_ BE AVAILABLE. ***"
642   echo
643 }
644 function err () {
645         echo "$@" >&2
646 }
647
648 #
649 function check_qeth_channels () {
650     IFS="," read read write data rest
651     if [ "$read" = auto ]; then
652         echo auto
653         return 0
654     fi
655     if [ -z "$read" -o -z "$write" -o -z "$data" ]; then
656         err "qeth needs 3 four-digit hexadecimal numbers delimited by commas(,)."
657         echo "$DEVS"
658         return 1
659     fi
660     err=0
661     for channel in read write data
662     do
663         eval devno=\$${channel}
664         lcssid=${devno%.*}
665         devid=${devno#?.?.}
666         [ $channel != read ] && echo -n ,
667         if [ "$devid" != "${devid//[^0-9a-fA-F.]/}" ]; then
668            echo -n "[$devno]"
669            err "$channel channel address $devno contains non-hex characters, please check."
670            return 1
671         fi
672         devid=`printf %d 0x${devid}`
673         if [ ${devid} -lt 0 -o ${devid} -gt 65535 ]; then
674            printf '[0x%04x]' "$devid"
675            err "$channel channel address ${devid#0x} must be between 0 and 0xffff"
676            return 1
677         fi
678         devid=`printf %04x ${devid}`
679         CHPIDs=`sed -n "s/^${devid} \([0-9a-f]*\) */\1/p" chandet.qeth`
680         if [ -z "$CHPIDs" ]; then
681            err "$channel channel address ${devno} not found, please check."
682            return 1
683         fi
684         if [ "${last_CHIPDs}" -a "${CHPIDs}" != "${last_CHIPDs}" ]; then
685            err "$channel channel is CHPID ${CHPIDs//00/} while ${last_channel} channel is CHPID ${last_CHPIDs//00/}."
686            return 1
687         fi
688         eval ${channel}=${devid}
689         if [ "$NETSELECT" = qeth -o "$NETSELECT" = qeth-tr ]; then
690           if [ $channel = read ] && [ $((0x$read & 1)) -eq 1 ]; then
691                 err "read channel address is odd, must be even!(incremented)"
692                 read="$((0x$read + 1))"
693                 devid=`printf %04x ${read}`
694                 err=1
695           fi
696           if [ $channel = write ] && [ $((0x$read + 1)) -ne $((0x$write)) ]; then
697                 err "write channel address must be the read channel address plus 1(corrected)"
698                 write="$((0x$read + 1))"
699                 devid=`printf %04x ${write}`
700                 err=1
701           fi
702         fi
703         last_channel=${channel}
704         last_CHIPDs=${CHPIDs}
705         echo -n "${lcssid}.${devid}"
706     done
707     #echo -n "${read},${write},${data}"
708     [ "${rest}" ] && echo ",${rest}"
709     return $err
710 }
711 #
712 #
713 #
714 function print_qeth_ranges () {
715     IFS="," read read write data rest
716     if [ $(($read - 1)) -eq $(($data)) ]; then
717         echo "$data,$write"
718     elif [ $(($write + 1)) -eq $(($data)) ]; then
719         echo "$read,$data"
720     else
721         echo "$read,$write"
722         echo "$data"
723     fi
724 }
725 #
726 #
727 # ask for lcs parameters for OSA devices
728 #
729 function load_LCS () {
730   if ! grep -q cu3088 /proc/modules ; then
731     echo "Loading cu3088 module:"
732     execcmd "/sbin/modprobe cu3088"
733   fi
734   
735   ls /sys/bus/ccw/drivers/cu3088|while read device
736   do
737     echo "$device `cat /sys/bus/ccw/drivers/cu3088/$device/cutype`"
738   done >lcs_detected
739   #FIXME: filter out non-LCS devices
740   
741   if [ `grep '^0' lcs_detected | wc -l` -lt 2 ]; then
742         echo "Could not find two(read/write) LCS Channels."
743         ask_show_subchannels
744         return 1
745   fi
746   echo "First 16 possible OSA / OSA-2 channel devices detected:"
747   echo "chan_type is a bitfield of: CTC=1 ESCON=2 LCS=0x4"
748   sort -k 2 lcs_detected | head -n 18
749   echo 
750   echo "We recommend to only use LCS autoprobing if Linux can see only two channel"
751   echo "devices and you are sure that the relative adapter number 0 is not used"
752   echo "by an other LPAR or Virtual Machine. For manual config, you have to enter"
753   echo "the read channel device address (must be an even address). The write channel"
754   echo "device number will be one greater. For autoprobing enter \"auto\"."
755   AUTO_DEVNO="$DEVNO"
756   [ -z "$DEVNO" -o "$DEVNO" = auto ] &&
757         DEVNO=`sed -n 's/^\(0.0....[02468ace]\).*/\1/p' lcs_detected | head -n 1`
758   ANSW="yes"
759   NO_ERROR="yes"
760   while [ "$ANSW" = "yes" ]; do
761      while true; do
762         if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
763         then
764                 echo "Enter the read channel device number, e.g. '0.0.fc20' (${DEVNO}): $AUTO_DEVNO"
765                 ANSW="$AUTO_DEVNO"
766         else
767                 readln "Enter the read channel device number, e.g. '0.0.fc20' (${DEVNO}): "
768         fi
769         [ -z "$ANSW" ] && ANSW=$DEVNO
770         if [ "$ANSW" = "auto" -o "$ANSW" = "AUTO" -o "$ANSW" = 0 ]; then
771             DEVNO=auto
772             break
773         fi
774         ANSW="${ANSW}"
775         if [ "$ANSW" != "${ANSW//[^.0-9a-fA-F]/}" ]; then
776             echo "Invalid character detected, allowed hex numbers only consist of 0-9,a-f."
777             NO_ERROR=no
778             continue
779         fi
780         ANSWh=${ANSW/[0-9].[0-9]./0x}
781         if [ $(($ANSWh & 1)) -eq 1 ]; then
782             echo "Warning: You entered an odd read channel address, should be even!"
783             NO_ERROR=no
784             continue
785         fi
786         if [ $(( $ANSWh )) -ge 0 -a $(( $ANSWh )) -le 65534 ]; then
787             DEVNO="$ANSW"
788             DEVNOh="$ANSWh"
789             break
790         fi
791         echo
792         echo "The read channel device number should be a hex number in the range of 0-FFFE."
793         NO_ERROR=no
794      done
795      
796      #shutdown_reset_conf_chandev
797      if ! grep -q lcs /proc/modules; then
798         execcmd "/sbin/modprobe lcs"
799      fi
800      
801      if [ "$DEVNO" = "auto" -o "$DEVNO" = "AUTO" ]; then
802         #FIXME: how does autoprobe work with 2.6?
803         PARM=""
804         CHAN=""
805      else
806         WRITE_DEVNO=`printf "0.0.%04x\n" $(($DEVNOh + 1))`
807         echo
808         echo "Please enter the relative port number on device address ${DEVNO}"
809         if [ ! "$AUTOINSTALL" = "yes" -o "$NO_ERROR" = "no" ]
810         then
811                 readln "Relative port, e.g. '0' ($PORTNO): "
812                 [ "$ANSW" ] && export PORTNO=$ANSW
813         fi
814         PARM="noauto=1 devno_portno_pairs=$DEVNO,$PORTNO"
815         CHAN="lcs,$DEVNO,$WRITE_DEVNO,$PORTNO"
816         CCWGROUP_ID="$DEVNO"
817         CCW_CHAN_IDS="$DEVNO $WRITE_DEVNO"
818         echo "$DEVNO,$WRITE_DEVNO" >/sys/bus/ccwgroup/drivers/lcs/group
819      fi
820
821      # Wait for CCWGROUP event
822      for i in 2 1 2 3 4 5 6 7 8 9; do
823          sleep $i
824          if [ -s /hotplug.msg ]; then
825              if grep -q "ccwgroup" /hotplug.msg; then
826                  dp=`grep ^DEVPATH= /hotplug.msg|sed s,DEVPATH=,,`
827                  echo "Device $CCWGROUP_ID configured"
828                  break
829              fi
830          fi
831      done
832      rm -f /hotplug.msg
833      
834      if [ "$dp" ]; then
835          # By default portno=0; value of 1 (OSA2) or higher (MP3000) allowed
836          if [ -n "$PORTNO" -a "$PORTNO" -gt 0 ]; then
837              echo "$PORTNO" >/sys/$dp/portno
838          fi
839          # bring interface online
840          echo 1 > /sys/$dp/online
841      else
842          echo "Device $CCWGROUP_ID could not be configured"
843          NO_ERROR="no"
844          return 1
845      fi
846
847      # Write hwcfg file
848      hwcfg_file="/etc/sysconfig/hardware/hwcfg-lcs-bus-ccw-${DEVNO}"
849
850      cat > $hwcfg_file <<EOF
851 #!/bin/sh
852 #
853 # hwcfg-lcs-bus-ccw-${CCWGROUP_ID}
854 #
855 # Hardware configuration for a lcs device at ${CCWGROUP_ID}
856 # Automatically generated by netsetup
857 #
858
859 STARTMODE="auto"
860 MODULE="lcs"
861 MODULE_OPTIONS=""
862 MODULE_UNLOAD="yes"
863
864 # Scripts to be called for the various events.
865 SCRIPTUP="hwup-ccw"
866 SCRIPTUP_ccw="hwup-ccw"
867 SCRIPTUP_ccwgroup="hwup-lcs"
868 SCRIPTDOWN="hwdown-ccw"
869
870 # CCW_CHAN_IDS sets the channel IDs for this device
871 # The first ID will be used as the group ID
872 CCW_CHAN_IDS="${CCW_CHAN_IDS}"
873
874 # CCW_CHAN_NUM set the number of channels for this device
875 # Always 2 for a lcs device
876 CCW_CHAN_NUM=2
877
878 EOF
879
880      # Write the port number if set
881      if [ -n "$PORTNO" -a "$PORTNO" -gt 0 ]; then
882          cat >> $hwcfg_file <<EOF
883 # CCW_CHAN_MODE sets the port number for an lcs device
884 CCW_CHAN_MODE="$PORTNO"
885
886 EOF
887      else
888          cat >> $hwcfg_file <<EOF
889 # CCW_CHAN_MODE sets the port number for an lcs device
890 # CCW_CHAN_MODE=""
891
892 EOF
893      fi
894
895      for i in 2 1 2 3 4 5 6 7 8 9; do
896          sleep $i
897          if [ -s /hotplug.msg ]; then
898              if grep -q "^INTERFACE=$IP_DEV" /hotplug.msg; then
899                  echo "$IP_DEV detected!"
900                  break
901              elif grep -q '^INTERFACE=' /hotplug.msg; then
902                  dev=`grep ^INTERFACE= /hotplug.msg|sed s,INTERFACE=,,`
903                  echo "$dev detected, expected $IP_DEV, skipping."
904              fi
905          fi
906      done
907      execcmd "/sbin/ifconfig $IP_DEV"
908      if [ $EXIT_CODE -eq 0 ]; then
909          ANSW="yes"
910          break
911      else
912          echo -e "\n$IP_DEV not available, check device addresses/cards.\n"
913      fi
914      yes_no "Do you want to retry the lcs-setup (Yes/No) ? "
915      NO_ERROR=no
916   done
917   if [ "$ANSW" = "yes" -o "$ANSW" = "Yes" ]; then
918      echo "$IP_DEV is available, continuing with network setup."
919   else
920      return 1
921   fi
922 }
923 #
924 #
925 # load the qeth driver
926 #
927 function load_QETH () {
928   if [ ! -d /sys/bus/ccw/drivers/qeth ]; then
929     echo "Loading qeth..."
930     execcmd "/sbin/modprobe qeth_mod"
931   fi
932
933   if [ ! -d /sys/bus/ccw/drivers/qeth ]; then
934       echo -e "\nqeth module not loaded, module problem.\n"
935       yes_no "Do you want to retry the qeth-setup (Yes/No) ? "
936       NO_ERROR=no
937       return 1
938   fi
939
940   if [ "$NETSELECT" = hsi ]; then
941     CUTYPE=05
942     NETTYPE=Hipersocket
943   else
944     CUTYPE=01
945     NETTYPE='OSA Express, Gigabit Ethernet or High Speed Token Ring'
946   fi
947   
948   echo -n "Detecting available channels ... "
949   rm -f chandet.qeth
950   for i in /sys/bus/ccw/drivers/qeth/*
951   do
952     dn=`basename $i|sed "s,^[0-9].[0-9].,,"`
953     chp=`cat $i/../chpids|sed "s, ,,g"`
954     echo "$dn $chp" >>chandet.qeth
955   done
956   echo "done"
957
958   NUMCHANS=`wc -l <chandet.qeth`
959   echo $NUMCHANS "$NETTYPE Channels were detected."
960   if [ $NUMCHANS -lt 3 ]; then
961     echo "3 $NETTYPE Channels need to be detected to use $NETSELECT."
962     ask_show_subchannels
963     return 1
964   fi
965   if [ "$NETSELECT" = qeth -o "$NETSELECT" = qeth-tr ]; then
966     grep '^...[02468ace] ' chandet.qeth >qeth_read_chans
967     if [ ! -s qeth_read_chans ]; then
968       echo "One even device address for OSA/QDIO Read Channel needs to exist!"
969       ask_show_subchannels
970       return 1
971     fi
972   fi
973   if [ $NUMCHANS -gt 20 ]; then
974     echo "Summary of all $NETTYPE channels detected:"
975     echo "Device Addresses CHPID(s)"
976     sed 's/^\(...\)./            \1?/;s/0* *$//g' chandet.qeth | sort -u +1
977   fi
978   echo "First $NETTYPE Channels that were detected:"
979   echo "Device Addresses CHPID(s)"
980   sed 's/^\(....\)/            \1/;s/0* *$//g' chandet.qeth|head -n 20
981
982   if [ "$DEVNO" != auto -a "$DEVNO" != "${DEVNO//[^0-9a-fA-F]/}" ]; then
983     echo "Device address $DEVNO contains non-hexadecimal characters, ignoring it."
984     DEVNO=auto
985   fi
986   if [ "$DEVNO2" != auto -a "$DEVNO2" != "${DEVNO2//[^0-9a-fA-F]/}" ]; then
987     echo "Device address $DEVNO2 contains non-hexadecimal characters, ignoring it."
988     DEVNO2=auto
989   fi
990   if [ "$DEVNO3" != auto -a "$DEVNO3" != "${DEVNO3//[^0-9a-fA-F]/}" ]; then
991     echo "Device address $DEVNO3 contains non-hexadecimal characters, ignoring it."
992     DEVNO3=auto
993   fi
994   if [ "$DEVNO" != auto ]; then
995     [[ "$DEVNO" == 0x* ]] || DEVNO=0x$DEVNO
996     DEVNO=`printf %04x $DEVNO`
997     grep -q "^${DEVNO} " chandet.qeth || {
998       echo "Device address ${DEVNO#0x} not found, ignoring it."
999       DEVNO=auto
1000     }
1001   fi
1002   if [ "$DEVNO2" != auto ]; then
1003     [[ "$DEVNO2" == 0x* ]] || DEVNO2=0x$DEVNO2
1004     DEVNO2=`printf %04x $DEVNO2`
1005     grep -q "^${DEVNO2} " chandet.qeth || {
1006       echo "Device address ${DEVNO2#0x} not found, ignoring it."
1007       DEVNO2=auto
1008     }
1009   fi
1010   if [ "$DEVNO3" != auto ]; then
1011     [[ "$DEVNO3" == 0x* ]] || DEVNO3=0x$DEVNO3
1012     DEVNO3=`printf %04x $DEVNO3`
1013     grep -q "^${DEVNO3} " chandet.qeth || {
1014       echo "Device address ${DEVNO3#0x} not found, ignoring it."
1015       DEVNO3=auto
1016     }
1017   fi
1018   if [ "$NETSELECT" = qeth -o "$NETSELECT" = qeth-tr ]; then
1019     echo
1020     echo "Format for OSA Express configuration: Read Channel,Write Channel,Data Channel"
1021     echo "The Read Channel must be an even device address,"
1022     echo "The Write Channel must be the Read Channel address plus 1,"
1023     echo "The Data Channel must be the Read Channel address plus 2."
1024     echo
1025     if [ $DEVNO != auto ] && [[ $DEVNO != ???[02468ace] ]]; then
1026       echo "Device address ${DEVNO} is not even, ignoring it."
1027       DEVNO=auto
1028     fi
1029     if [ $DEVNO2 != auto -a $DEVNO = auto ] && [[ $DEVNO2 == ???[13579bdf] ]]; then
1030       DEVNO=`printf %04x $(( 0x$DEVNO2 - 1 ))`
1031     fi
1032     while [ -s qeth_read_chans ]; do
1033       if [ "$DEVNO" != auto ]; then
1034         DEVNO1=$DEVNO
1035         DEVNO=auto
1036       else
1037         DEVNO1=`sed -n 's/^\(....\) .*/\1/p' qeth_read_chans | head -n 1`
1038       fi
1039       DEVNO2=`printf %04x $(( 0x$DEVNO1 + 1 ))`
1040       if grep -q "^${DEVNO2} " chandet.qeth; then
1041         CHPIDlist=`sed -n "s/^${DEVNO2} \([0-9a-f]*\) */\1/p" chandet.qeth`
1042         grep "${CHPIDlist}" chandet.qeth |
1043                 grep -v -e "^${DEVNO1} " -e "^${DEVNO2} " > qeth_data_chans
1044         if [ "$DEVNO3" != auto ] && grep -q "^${DEVNO3} " qeth_data_chans; then
1045           DEVNO=$DEVNO1
1046           break
1047         fi
1048         DEVNO3=`sed -n 's/^\(....\) .*/\1/p' qeth_data_chans | head -n 1`
1049         if [ "$DEVNO3" ]; then
1050           DEVNO=$DEVNO1
1051           break
1052         else
1053           echo "No Data Channel address detected!"
1054           ask_show_subchannels
1055           return 1
1056         fi
1057       else
1058         mv qeth_read_chans qeth_read_chans.old
1059         grep -v "^$DEVNO1 " qeth_read_chans.old > qeth_read_chans
1060       fi
1061     done
1062     if [ "$DEVNO" = auto ]; then
1063       echo "No address for Read Channel with matching address for Write Channel detected!"
1064       ask_show_subchannels
1065       return 1
1066     fi
1067   else
1068     cp chandet.qeth chandet.hsi
1069     while [ -s chandet.hsi ]; do
1070       if [ "$DEVNO" != auto ]; then
1071         DEVNO1=$DEVNO
1072         DEVNO=auto
1073       else
1074         DEVNO1=`sed -n 's/^\(....\) .*/\1/p' chandet.hsi | head -n 1`
1075       fi
1076       CHPIDlist=`sed -n "s/^${DEVNO1} \([0-9a-f]*\) */\1/p" chandet.hsi`
1077       if [ "$DEVNO2" != auto ]; then
1078         grep -q -e "^${DEVNO2} ${CHPIDlist}" chandet.hsi || DEVNO2=auto
1079       fi
1080       if [ "$DEVNO2" = auto ]; then
1081         DEVNO2=`grep "${CHPIDlist}" chandet.hsi | grep -v "^${DEVNO1} "|head -n 1|sed -n 's/^\(....\) .*/\1/p'`
1082       fi
1083       if [ -z ${DEVNO2} ]; then
1084         mv chandet.hsi chandet.hsi.old
1085         grep -v "${CHPIDlist}" chandet.hsi.old > chandet.hsi
1086         continue
1087       fi
1088       if [ "$DEVNO3" != auto ]; then
1089         grep -q -e "^${DEVNO3} ${CHPIDlist}" chandet.hsi || DEVNO3=auto
1090       fi
1091       if [ "$DEVNO3" = auto ]; then
1092         DEVNO3=`grep "${CHPIDlist}" chandet.hsi |
1093                 grep -v -e "^${DEVNO1} " -e "^${DEVNO2} "|head -n 1 |sed -n 's/^\(....\) .*/\1/p'`
1094       fi
1095       if [ -z ${DEVNO3} ]; then
1096         mv chandet.hsi chandet.hsi.old
1097         grep -v "${CHPIDlist}" chandet.hsi.old > chandet.hsi
1098         continue
1099       fi
1100       DEVNO=${DEVNO1}
1101       break
1102     done
1103     if [ "$DEVNO" = auto ]; then
1104       echo "Could not find 3 channels from the same CHPID!"
1105       ask_show_subchannels
1106       return 1
1107     fi
1108   fi
1109   echo "Possible configuration: read: 0x$DEVNO, write: 0x$DEVNO2, data: 0x$DEVNO3"
1110   DEVNOS=0.0.${DEVNO/auto/f801},0.0.${DEVNO2/auto/f802},0.0.${DEVNO3/auto/f803}
1111   DEVNOs="$DEVNOS"
1112   ANSW="yes"
1113   NO_ERROR="yes"
1114   while [ "$ANSW" = "yes" ]; do
1115      while true; do
1116         echo "Enter the device addresses for the qeth module, e.g. '$DEVNOs'"
1117         if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
1118         then
1119                 WRITE_DEVNO=`printf %04x $(( 0x$READ_DEVNO + 1 ))`
1120                 ANSW="0.0.$READ_DEVNO,0.0.$WRITE_DEVNO,0.0.$DATA_DEVNO"
1121         else
1122                 if [ -n "$READ_DEVNO" -a -n "$DATA_DEVNO" ]
1123                 then
1124                         WRITE_DEVNO=`printf %04x $(( 0x$READ_DEVNO + 1 ))`
1125                         DEVNOS="0.0.$READ_DEVNO,0.0.$WRITE_DEVNO,0.0.$DATA_DEVNO"
1126                 fi
1127                 readln "($DEVNOS): "
1128                 ANSW="`echo "$ANSW"|sed "s, ,,g"`"
1129                 [ -z "$ANSW" ] && ANSW="$DEVNOS"
1130         fi
1131        DEVNOS=`echo "$ANSW"|check_qeth_channels` && break
1132        NO_ERROR=no
1133      done
1134
1135      CCW_CHAN_IDS=""
1136      [ "$DEVNOS" != auto ] && CCW_CHAN_IDS="`echo $DEVNOS | sed -e 's@,@ @g'`"
1137      [ "$CCW_CHAN_IDS" ] && CCWGROUP_ID=${DEVNOS%%,*}
1138      [ "$DEVNOS" != auto ] && CHAN="qeth,$DEVNOS"
1139      if [ "$NETSELECT" = qeth -o "$NETSELECT" = qeth-tr -a "${DEVNOS/*,portname:*/}" ]; then
1140         NO_ERROR="yes"
1141         while true; do
1142             if [ "$AUTOINSTALL" = "yes" ]
1143             then
1144                 ANSW="$PORTNAME"
1145             else
1146                 readln "Please enter the portname(case sensitive) to use($PORTNAME): "
1147             fi
1148             if [ ${#ANSW} -eq 0 -a ${#PORTNAME} -eq 0 ]; then
1149                 echo "Warning: Only old MCLs allow empty portnames. Because not"
1150                 echo "every operator may be aware of this config when updating"
1151                 echo "the MCL, you may loose network as soon as it's updated."
1152                 yes_no "Are you sure that you want to use an empty portname (Yes/No) ? "
1153                 [ "$ANSW" != "yes" ] && continue
1154                 ANSW=
1155             fi
1156             if [ ${#ANSW} -le 8 ]; then
1157                 [ ${ANSW} ] && PORTNAME="${ANSW}"
1158                 break
1159             fi
1160             echo "The portname may not consist of more than 8 characters."
1161             NO_ERROR=no
1162         done
1163      fi
1164      [ "$PORTNAME" ] && CHAN="$CHAN,$PORTNAME"
1165
1166      rm -f /hotplug.msg
1167      echo "$DEVNOS" > /sys/bus/ccwgroup/drivers/qeth/group
1168
1169      # Wait for CCWGROUP event
1170      for i in 2 1 2 3 4 5 6 7 8 9; do
1171          sleep $i
1172          if [ -s /hotplug.msg ]; then
1173              if grep -q "ccwgroup" /hotplug.msg; then
1174                  dp=`grep ^DEVPATH= /hotplug.msg|sed s,DEVPATH=,,`
1175                  echo "Device $CCWGROUP_ID configured"
1176                  break
1177              fi
1178          fi
1179      done
1180      rm -f /hotplug.msg
1181      
1182      if [ "$dp" ]; then
1183          if test "$PORTNAME"; then
1184              echo "$PORTNAME" >/sys/$dp/portname
1185          fi
1186          
1187          echo 1 >/sys/$dp/online
1188      else
1189          echo "Device $CCWGROUP_ID could not be configured"
1190          NO_ERROR="no"
1191          return 1
1192      fi
1193
1194      # Write hwcfg file
1195      hwcfg_file="/etc/sysconfig/hardware/hwcfg-qeth-bus-ccw-${CCWGROUP_ID}"
1196
1197      cat > $hwcfg_file <<EOF
1198 #!/bin/sh
1199 #
1200 # hwcfg-qeth-bus-ccw-${CCWGROUP_ID}
1201 #
1202 # Hardware configuration for a qeth device at ${CCWGROUP_ID}
1203 # Automatically generated by netsetup
1204 #
1205
1206 STARTMODE="auto"
1207 MODULE="qeth_mod"
1208 MODULE_OPTIONS=""
1209 MODULE_UNLOAD="yes"
1210
1211 # Scripts to be called for the various events.
1212 SCRIPTUP="hwup-ccw"
1213 SCRIPTUP_ccw="hwup-ccw"
1214 SCRIPTUP_ccwgroup="hwup-qeth"
1215 SCRIPTDOWN="hwdown-ccw"
1216
1217 # CCW_CHAN_IDS sets the channel IDs for this device
1218 # The first ID will be used as the group ID
1219 CCW_CHAN_IDS="${CCW_CHAN_IDS}"
1220
1221 # CCW_CHAN_NUM set the number of channels for this device
1222 # Always 3 for an qeth device
1223 CCW_CHAN_NUM=3
1224
1225 EOF
1226
1227      # Write the portname if set
1228      if [ "$PORTNAME" ]; then
1229          cat >> $hwcfg_file <<EOF
1230 # CCW_CHAN_MODE sets the port name for an OSA-Express device
1231 CCW_CHAN_MODE="$PORTNAME"
1232
1233 EOF
1234      else
1235          cat >> $hwcfg_file <<EOF
1236 # CCW_CHAN_MODE sets the port name for an OSA-Express device
1237 # CCW_CHAN_MODE=""
1238
1239 EOF
1240      fi
1241
1242      for i in 2 1 2 3 4 5 6 7 8 9; do
1243          sleep $i
1244          if [ -s /hotplug.msg ]; then
1245              if grep -q "^INTERFACE=$IP_DEV" /hotplug.msg; then
1246                  echo "$IP_DEV detected!"
1247                  break
1248              elif grep -q '^INTERFACE=' /hotplug.msg; then
1249                  dev=`grep ^INTERFACE= /hotplug.msg|sed s,INTERFACE=,,`
1250                  echo "$dev detected, expected $IP_DEV, aborting."
1251                  return 1
1252              fi
1253          fi
1254      done
1255      execcmd "/sbin/ifconfig $IP_DEV"
1256      if [ $EXIT_CODE -eq 0 ]; then
1257          ANSW="yes"
1258          break
1259      else
1260          echo -e "\n$IP_DEV not available, check device addresses/cards.\n"
1261      fi
1262      yes_no "Do you want to retry the qeth-setup (Yes/No) ? "
1263      NO_ERROR=no
1264   done
1265   if [ "$ANSW" = "yes" -o "$ANSW" = "Yes" ]; then
1266      echo "$IP_DEV is available, continuing with network setup."
1267   else
1268      return 1
1269   fi
1270 }
1271 #
1272 #
1273 # load the ctc driver
1274 #
1275 function load_CTC () {
1276   if [ ! -d /sys/bus/ccwgroup/drivers/ctc ] ; then
1277       echo "Loading CTC module:"
1278       execcmd "/sbin/modprobe ctc"
1279   fi
1280   
1281   if [ ! -d /sys/bus/ccwgroup/drivers/ctc ] ; then
1282       echo -e "ctc module not loaded, module problem.\n"
1283       NO_ERROR=no
1284       return 1
1285   fi
1286
1287   if [ "$NETSELECT" = escon ]; then
1288     NETTYPE=ESCON
1289     OTHERTYPE=CTC
1290   else
1291     NETTYPE=CTC
1292     OTHERTYPE=ESCON
1293   fi
1294   
1295   ls /sys/bus/ccw/drivers/cu3088|while read device
1296   do
1297     echo "$device `cat /sys/bus/ccw/drivers/cu3088/$device/cutype`"
1298   done >ctc_detected
1299   # FIXME: grep out OTHERTYPE
1300   if [ `cat ctc_detected | wc -l` -lt 2 ]; then
1301         echo "Couldn't find two $NETTYPE Channels (read and write)."
1302         ask_show_subchannels
1303         return 1
1304   fi
1305   echo "List of first 10 $NETTYPE Channels that were detected:"
1306   echo "Device   Channel type"
1307   head -n 10 ctc_detected
1308   ANSW="yes"
1309   NO_ERROR=yes
1310   while [ "$ANSW" = "yes" ]; do
1311         [ -z "$DEVNO" -o "$DEVNO" = auto ] &&
1312            DEVNO=`cut -d' ' -f 1 ctc_detected | head -n 1`
1313         LAST_DEVNO="$DEVNO"
1314         if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
1315         then
1316                 echo "Device address for read channel ($DEVNO): 0.0.$READ_DEVNO"
1317                 ANSW=0.0.$READ_DEVNO
1318         else
1319                 [ -n "$READ_DEVNO" ] && DEVNO=0.0.$READ_DEVNO
1320                 readln "Device address for read channel ($DEVNO): "
1321         fi
1322         [ "$ANSW" ] && export DEVNO=$ANSW
1323         grep "^$DEVNO " ctc_detected >ctc_DEVNO
1324         [ -s ctc_DEVNO ] || echo "Warning: $DEVNO is not a detected $NETTYPE channel"
1325         
1326         # Huh?
1327         #[ "$LAST_DEVNO" = "$DEVNO" ] || DEVNO2=`echo | sed -n "1,/$DEVNO /d;s/^\(....\).*/\1/p;q" - ctc_detected`
1328         
1329         [ -z "$DEVNO2" -o "$DEVNO2" = auto ] && DEVNO2=`cut -d' ' -f 1 ctc_detected | head -n 2|tail -n 1`
1330         if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
1331         then
1332                 echo "Device address for write channel ($DEVNO2): 0.0.$WRITE_DEVNO"
1333                 ANSW=0.0.$WRITE_DEVNO
1334         else
1335                 [ -n "$WRITE_EVNO" ] && DEVNO2=0.0.$WRITE_DEVNO
1336                 readln "Device address for write channel ($DEVNO2): "
1337         fi
1338         [ "$ANSW" ] && export DEVNO2=$ANSW
1339         grep "^$DEVNO2 " ctc_detected >ctc_DEVNO2
1340         [ -s ctc_DEVNO2 ] || echo "Warning: $DEVNO2 is not a detected $NETTYPE channel"
1341         ask_select_protocol
1342         
1343         echo "$DEVNO,$DEVNO2" >/sys/bus/ccwgroup/drivers/ctc/group
1344         echo "$PROTOCOL" >/sys/devices/cu3088/$DEVNO/protocol
1345
1346         # Write hwcfg file
1347
1348         rm -f /hotplug.msg
1349         echo 1 >/sys/devices/cu3088/$DEVNO/online
1350         
1351         for i in 1 2 3 4 5 6 7; do
1352             sleep $i
1353             if [ -s /hotplug.msg ]; then
1354                 if head -n 1 /hotplug.msg| grep -q '^net'; then
1355                     IP_DEV=`grep "^INTERFACE=" /hotplug.msg | sed "s,INTERFACE=,,"`
1356                     echo "$IP_DEV detected."
1357                     break
1358                 fi
1359             fi
1360         done
1361
1362         execcmd "/sbin/ifconfig $IP_DEV" >/dev/null
1363         if [ $EXIT_CODE -eq 0 ]; then
1364             ANSW="yes"
1365             CHAN="ctc,$DEVNO,$DEVNO2,$PROTOCOL"
1366             # Write hwcfg file
1367             hwcfg_file="/etc/sysconfig/hardware/hwcfg-ctc-bus-ccw-${DEVNO}"
1368             cat > $hwcfg_file <<EOF
1369 #!/bin/sh
1370 #
1371 # hwcfg-ctc
1372 #
1373 # Hardware configuration for a ctc device at $DEVNO
1374 # Automatically generated by $0
1375 #
1376
1377 STARTMODE="auto"
1378 MODULE="ctc"
1379 MODULE_OPTIONS=""
1380 MODULE_UNLOAD="yes"
1381
1382 # Scripts to be called for the various events.
1383 SCRIPTUP="hwup-ccw"
1384 SCRIPTUP_ccw="hwup-ccw"
1385 SCRIPTUP_ccwgroup="hwup-ctc"
1386 SCRIPTDOWN="hwdown-ccw"
1387
1388 # CCW_CHAN_IDS sets the channel IDs for this device
1389 # The first ID will be used as the group ID
1390 CCW_CHAN_IDS="$DEVNO $DEVNO2"
1391
1392 # CCW_CHAN_NUM set the number of channels for this device
1393 # Always 2 for a CTC device
1394 CCW_CHAN_NUM=2
1395
1396 EOF
1397             if [ "$PROTOCOL" -ne "0" ]; then
1398                 cat >> $hwcfg_file <<EOF
1399 # CCW_CHAN_MODE sets the protocol for CTC / ESCON
1400 # 0 for compability mode (default)
1401 # 1 for extended mode
1402 # 2 for CTC-based tty
1403 # 3 for compability mode with OS/390 and z/OS
1404 CCW_CHAN_MODE="$PROTOCOL"
1405
1406 EOF
1407             else
1408                 cat >> $hwcfg_file <<EOF
1409 # CCW_CHAN_MODE sets the protocol for CTC / ESCON
1410 # 0 for compability mode (default)
1411 # 1 for extended mode
1412 # 2 for CTC-based tty
1413 # 3 for compability mode with OS/390 and z/OS
1414 # CCW_CHAN_MODE="$PROTOCOL"
1415
1416 EOF
1417             fi
1418             break
1419         else
1420             echo -e "\n$IP_DEV not available, check device addresses.\n"
1421         fi
1422         yes_no "Do you want to retry to configure $IP_DEV (Yes/No) ? "
1423         NO_ERROR=no
1424   done
1425   if [ "$ANSW" = "yes" ]; then
1426      echo "$IP_DEV is available, continuing with network setup."
1427   else
1428      false
1429   fi
1430 }
1431 #
1432 #
1433 # load the iucv driver
1434 #
1435 function load_IUCV () {
1436   ANSW="yes"
1437   NO_ERROR="yes"
1438   while [ "$ANSW" = "yes" ]; do
1439     echo "Please enter the name(userid) of the target VM guest here."
1440     echo "In VIF this is normally \$TCPIP, in VM normally TCPIP."
1441     echo ""
1442     if [ "$AUTOINSTALL" = "yes" -a "$NO_ERROR" = "yes" ]
1443     then
1444         echo "The name of the peer guest, e.g. 'TCPIP' ($PEER): $AUTO_PEER"
1445         ANSW=$AUTO_PEER
1446     else
1447         [ -n "$AUTO_PEER" ] && PEER=$AUTO_PEER
1448         readln "The name of the peer guest, e.g. 'TCPIP' ($PEER): "
1449     fi
1450     [ "$ANSW" ] && export PEER=$ANSW
1451
1452     IUCVDIR="/sys/bus/iucv/drivers/netiucv"
1453     if [ -d "$IUCVDIR" ]; then
1454       echo "Unloading netiucv, iucv modules..."
1455       execcmd "/sbin/rmmod netiucv"
1456       execcmd "/sbin/rmmod iucv"
1457     fi
1458     echo "Trying to start the netiucv module now..."
1459     echo "modprobe netiucv:"
1460     execcmd "/sbin/modprobe netiucv"
1461     if [ -d "$IUCVDIR" ]; then
1462       echo "netiucv module is loaded, activating it."
1463       echo "$PEER" > $IUCVDIR/connection
1464       CHAN="iucv,$PEER"
1465       echo "checking interface $IP_DEV."
1466       execcmd "/sbin/ifconfig $IP_DEV"
1467       if [ $EXIT_CODE -eq 0 ]; then
1468         ANSW="yes"
1469         break
1470       else
1471         echo "Error: $IP_DEV is not available, likely a problem connecting to the target."
1472       fi
1473     else
1474       echo "Error: The netiucv module could NOT be loaded."
1475     fi
1476     yes_no "Do you want to retry the setup of IUCV (Yes/No) ? "
1477     NO_ERROR=no
1478   done
1479   if [ "$ANSW" = "yes" ]; then
1480      echo "$IP_DEV seems to exist, continuing with network setup."
1481      hwcfg_file="/etc/sysconfig/hardware/hwcfg-iucv-id-${PEER}"
1482      cat > $hwcfg_file <<EOF
1483 #!/bin/bash
1484 #
1485 # hwcfg-iucv
1486 #
1487 # Hardware configuration for an iucv device with link partner '$PEER'
1488 # Automatically generated by $0
1489 #
1490
1491 STARTMODE="auto"
1492 MODULE="netiucv"
1493 MODULE_OPTIONS=""
1494 MODULE_UNLOAD="yes"
1495
1496 # Scripts to be called for the various events.
1497 SCRIPTUP="hwup-iucv"
1498
1499 EOF
1500   else
1501      false
1502   fi
1503 }
1504 #
1505 #
1506 # checks an IP to have numbers only between 0 and 255:
1507 #
1508 # example:
1509 # if echo $IP_ADDR | check_ip; then ...
1510 #
1511 function check_ip()
1512 {
1513         IFS=". " read ip1 ip2 ip3 ip4 rest
1514         for i in ip1 ip2 ip3 ip4
1515         do
1516                 eval x=\$$i
1517                 if [ $x -lt 0 -o $x -gt 255 ]; then
1518                         echo "$x: Value must be between 0 and 255"
1519                         return 1
1520                 fi
1521         done
1522         return 0
1523 }
1524 #
1525 #
1526 # calculates the broadcast address; parameters are IP_ADDR and IP_NETMASK
1527 #
1528 function calc_broadcast_enh()
1529 #
1530 # STDIN: IP, NETMASK
1531 # STDOUT: BROADCAST
1532 {
1533         IFS=". " read ip1 ip2 ip3 ip4  nm1 nm2 nm3 nm4 rest
1534         echo $(( ($ip1 & $nm1 | ~$nm1) & 255)).$(( ($ip2 & $nm2 | ~$nm2) & 255)).$(( ($ip3 & $nm3 | ~$nm3) & 255)).$((($ip4 & $nm4 | ~$nm4) & 255))
1535 }
1536
1537 # suggest a gateway address
1538 function calc_gateway()
1539 {
1540         IFS=". " read ip1 ip2 ip3 ip4  nm1 nm2 nm3 nm4 rest
1541         echo $(($ip1 & $nm1)).$(($ip2 & $nm2)).$(($ip3 & $nm3)).$((($ip4 & $nm4) + 1))
1542 }
1543
1544 # Issue the welcome message with variable version string
1545 function welcome_msg() {
1546     local line msg off left right end ls le
1547
1548     line="                                                                  "
1549
1550     msg="Welcome to $1 for zSeries"
1551     off=$(expr ${#line} - ${#msg})
1552     left=$(($off >> 1))
1553     right=$(expr $left + ${#msg})
1554     end=$(expr ${#line} - 1)
1555     echo "= $line ="
1556     ls=`echo "$line" | cut -b 1-$left`
1557     le=`echo "$line" | cut -b $right-$end`
1558     echo "=-${ls}${msg}${le}-="
1559     echo "= $line ="
1560 }
1561
1562
1563 #
1564 #
1565 # MAIN
1566 #
1567 #
1568 #
1569 # If we are not started by init (we are linuxrc), we have to make sure
1570 # that we have an suitable PATH for us and the user:
1571 #
1572 PATH=/sbin:/bin:/usr/sbin:/usr/bin
1573 #
1574 #
1575 # Ensure that we have /proc, /sys mounted:
1576 #
1577 [ ! -f /proc/version ] && mount -n -t proc virtual-proc-filesystem /proc
1578 [ ! -d /sys/devices ] && mount -n -t sysfs none /sys
1579 [ ! -d /etc/sysconfig/hardware ] && mkdir /etc/sysconfig/hardware
1580 #
1581 #
1582 # We want to save the kernel message ring buffer to a file:
1583 #
1584 [ ! -e /boot.msg ] && dmesg > /boot.msg
1585 #
1586 # set debug to yes/no
1587 #set -vx
1588 : ${DEBUG:=no}
1589 #
1590 if [ "$DEBUG" = "no" ]
1591 then
1592         INSTALLINF="/etc/netsetup.inf"
1593 else
1594         INSTALLINF="./netsetup.inf"
1595 fi
1596 #
1597 if [ "$DEBUG" = "no" ]; then
1598         if [ -e /linuxrc.init ]; then
1599                 . /linuxrc.init
1600                 rm /linuxrc.init
1601 #
1602 #               We use the initenv from the kernel parmfile only in the first run
1603 #
1604                 for i in 1 2 3 4 5 6 7 8 9
1605                 do
1606                         eval LINUXRC_READLINE="\$LINUXRC_READ$i"
1607                         if [ "$LINUXRC_READLINE" ]; then
1608                                 LINUXRC_READ="$LINUXRC_READ $LINUXRC_READLINE"
1609                         fi
1610                 done
1611                 if [ "$LINUXRC_READ" ]; then
1612                         LINUXRC_READ="`echo $LINUXRC_READ|sed 's/\"//g'`"
1613                         echo "Found this input script for linuxrc: $LINUXRC_READ"
1614                 fi
1615         fi
1616 else
1617         if [ -e ./linuxrc.init.debug ]; then
1618                 . ./linuxrc.init.debug
1619                 rm ./linuxrc.init.debug
1620         fi
1621 #       export -p
1622 fi
1623 #
1624
1625 # Print out welcome message
1626 welcome_msg "`grep ^Product /linuxrc.config|tail -n 1|sed s,^Product:[[:space:]]*,,g`"
1627
1628 [ "$DEBUG" = "yes" ] && echo -e "\n- Running in DEBUG mode. -\n"
1629 EXIT_SCRIPT=0
1630 CONFIG_IS_OK=0
1631 while [ $CONFIG_IS_OK = 0 ]; do
1632   select_network_device_type
1633   [ $CONFIG_IS_OK = 1 -o $EXIT_SCRIPT = 1 ] && break
1634   echo
1635   if [ "$AUTOINSTALL" = "yes" ]
1636   then
1637           echo "Please enter your full host name, e.g. 'linux.example.com' ($IP_HOST): $IP_HOST"
1638           echo "Please enter your IP address, e.g. '192.168.0.1' ($IP_ADDR): $IP_ADDR"
1639           export IP_ADDR IP_HOST
1640   else
1641           readln "Please enter your full host name, e.g. 'linux.example.com' ($IP_HOST): "
1642           [ "$ANSW" ] && export IP_HOST=$ANSW
1643           readln "Please enter your IP address, e.g. '192.168.0.1' ($IP_ADDR): "
1644           [ "$ANSW" ] && export IP_ADDR=$ANSW
1645   fi
1646   case "$NETSELECT" in
1647     tr|eth|qeth|hsi|qeth-tr)
1648             if [ "$AUTOINSTALL" = "yes" ]
1649             then
1650                     echo "Please enter the net mask, e.g. '255.255.255.0' ($IP_NETMASK): $IP_NETMASK"
1651                     IP_BROADCAST=$(echo $IP_ADDR $IP_NETMASK | calc_broadcast_enh)
1652                     echo "Please enter the broadcast address if different from ($IP_BROADCAST): $IP_BROADCAST"
1653                     echo "Please enter the gateway's IP address, e.g. '192.168.0.254' ($IP_GATEWAY): $IP_GATEWAY"
1654                     export IP_NETMASK IP_BROADCAST IP_GATEWAY
1655             else
1656                     readln "Please enter the net mask, e.g. '255.255.255.0' ($IP_NETMASK): "
1657                     [ "$ANSW" ] && export IP_NETMASK=$ANSW
1658                     IP_BROADCAST=$(echo $IP_ADDR $IP_NETMASK | calc_broadcast_enh)
1659                     readln "Please enter the broadcast address if different from ($IP_BROADCAST): "
1660                     [ "$ANSW" ] && export IP_BROADCAST=$ANSW
1661                     IP_GATEWAY=$(echo $IP_ADDR $IP_NETMASK | calc_gateway)
1662                     readln "Please enter the gateway's IP address, e.g. '192.168.0.254' ($IP_GATEWAY): "
1663                     [ "$ANSW" ] && export IP_GATEWAY=$ANSW
1664             fi
1665             ;;
1666 #    peer-to-peer networks
1667     ctc|escon|iucv)
1668             if [ "$AUTOINSTALL" = "yes" ]
1669             then
1670                     echo "Please enter the IP address of your peer, e.g. '192.168.0.254' ($IP_PEER): $IP_PEER"
1671                     export IP_PEER
1672             else
1673                     readln "Please enter the IP address of your peer, e.g. '192.168.0.254' ($IP_PEER): "
1674                     [ "$ANSW" ] && export IP_PEER=$ANSW
1675             fi
1676             export IP_GATEWAY=$IP_PEER
1677             export IP_NETMASK=255.255.255.255
1678             ;;
1679     *)
1680             echo "Something went wrong with $NETSELECT..."
1681   esac
1682   if [ "$AUTOINSTALL" = "yes" ]
1683   then
1684           echo "Please enter the IP address of the DNS server or 'none' for no DNS ($IP_DNS): $IP_DNS"
1685           export IP_DNS
1686   else
1687           readln "Please enter the IP address of the DNS server or 'none' for no DNS ($IP_DNS): "
1688           [ "$ANSW" ] && export IP_DNS=$ANSW
1689   fi
1690   [ "$IP_DNS" = "none" -o "$IP_DNS" = "NONE" ] && export IP_DNS=""
1691   if [ "$IP_DNS" ]; then
1692     [ -z "$IP_SEARCH" ] && IP_SEARCH=${IP_HOST#*.}
1693     if [ "$AUTOINSTALL" = "yes" ]
1694     then
1695             echo "Please enter the DNS search domain, e.g. 'example.com' ($IP_SEARCH): $IP_SEARCH"
1696             export IP_SEARCH
1697     else
1698             readln "Please enter the DNS search domain, e.g. 'example.com' ($IP_SEARCH): "
1699             [ "$ANSW" ] && export IP_SEARCH=$ANSW
1700     fi
1701   else
1702     IP_SEARCH=none
1703   fi
1704   [ "$IP_SEARCH" = "none" -o "$IP_SEARCH" = "NONE" ] && export IP_SEARCH=""
1705   while true; do
1706     if [ "$IP_MTU" = "default" ]; then
1707       case "$NETSELECT" in
1708         tr|eth)
1709             export IP_MTU=1492
1710             ;;
1711         ctc|qeth|qeth-tr)
1712             export IP_MTU=1500
1713             ;;
1714         iucv)
1715             export IP_MTU=9216
1716             ;;
1717         escon)
1718             export IP_MTU=32760
1719             ;;
1720         hsi)
1721             # Do not set mtu, hipersocket should use IOCDS/Channel default
1722             export IP_MTU="max. Socket MTU"
1723             ;;
1724         *)
1725             echo "Something went wrong with $NETSELECT..."
1726       esac
1727     fi
1728     if [ "$AUTOINSTALL" = "yes" ]
1729     then
1730             echo "Please enter the MTU (Maximum Transfer Unit),"
1731             echo "leave blank for default: ($IP_MTU): $IP_MTU"
1732             ANSW=$IP_MTU
1733     else
1734             echo "Please enter the MTU (Maximum Transfer Unit),"
1735             readln "leave blank for default: ($IP_MTU): "
1736     fi
1737     echo
1738     [ "$ANSW" ] && export IP_MTU=$ANSW
1739     [ $(( ${IP_MTU//[A-z]*/} + 0 )) -eq 0 ] && IP_MTU=0
1740     case "$NETSELECT" in
1741       ctc|escon|iucv)
1742         [ $IP_MTU -ge 576 -a $IP_MTU -le 32768 -o $IP_MTU = 0 ] && break
1743         echo "For the CTC/IUCV driver, the MTU must be in the range 576-32768."
1744         ;;
1745       tr|eth)
1746         [ $IP_MTU -ge  68 -a $IP_MTU -le 1500 -o $IP_MTU = 0 ] && break
1747         echo "For the LCS driver, the MTU must be in the range 68-1500."
1748         ;;
1749       qeth|qeth-tr)
1750         [ $IP_MTU -ge 576 -a $IP_MTU -le 1500 -o $IP_MTU = 0 ] && break
1751         echo "The installation MTU range for qeth is 576-1500, set other values later."
1752         ;;
1753       hsi)
1754         break
1755         ;;
1756     esac
1757     IP_MTU=default
1758   done
1759   echo "Configuration for $IP_DEV will be:"
1760   [ $IP_HOST ] && echo "Full host name   : $IP_HOST"
1761   echo "IP address       : $IP_ADDR"
1762   case "$NETSELECT" in
1763     tr|eth|qeth|hsi|qeth-tr)
1764             echo "Net mask         : $IP_NETMASK"
1765             [ "$IP_BROADCAST" ] && echo "Broadcast address: $IP_BROADCAST"
1766             [ "$IP_GATEWAY" ] && echo "Gateway address  : $IP_GATEWAY"
1767             ;;
1768     ctc|escon|iucv)
1769             echo "Peer IP address  : $IP_PEER"
1770             ;;
1771     *)
1772             echo "Something went wrong with $NETSELECT..."
1773   esac
1774   [ "$IP_DNS" ] && echo "DNS IP address   : $IP_DNS"
1775   [ "$IP_SEARCH" ] && echo "DNS search domain: $IP_SEARCH"
1776   if test $IP_MTU ; then
1777     if [ $IP_MTU != 0 ]; then
1778       echo "MTU size         : $IP_MTU"
1779     else
1780       echo "MTU size         : default interface MTU"
1781     fi
1782   fi
1783   if [ "$AUTOINSTALL" = "yes" ]
1784   then
1785           echo "Is this correct (Yes/No) ? yes"
1786           ANSW="yes"
1787   else
1788           yes_no "Is this correct (Yes/No) ? "
1789   fi
1790   if [ "$ANSW" = "yes" ]; then
1791     change_passwd
1792     activate_config
1793     CONFIG_IS_OK=1
1794   fi
1795 done
1796 [ $EXIT_SCRIPT = 0 ] && run_services
1797 #
1798 [ "$LINUXRC_RECORD" ] && echo "LINUXRC_READ=\"$LINUXRC_READ\""
1799 check_memory
1800 check_memory >> /etc/motd
1801