#!/bin/sh

############################################################################
#	Syntax check
############################################################################
#
# This checks IP address syntax.
# usage: syntax_check ADDRESS #-OF-EXPECTED-SEGMENTS (up to 4)
# example: syntax_check 123.22.43.1 4
# returns: 0=found correct  1=too many fields  2=non numeric field found

syntax_check () {
    RET_CODE=0 
    SCRATCH=$1
    SCRATCH=`echo $SCRATCH | tr "." "/"`
    INDEX=$2
    while [ ! "$INDEX" = "0" ]; do
	# OK, so I'm a LISP-head :^)
	FIELD=`basename $SCRATCH`
	SCRATCH=`dirname $SCRATCH`
	if expr $FIELD + 1 1> /dev/null 2> /dev/null; then
	    GOOD=y
	else
	    RET_CODE=2	# non-numeric field
	fi
	INDEX=`expr $INDEX - 1`
    done
    if [ ! "$SCRATCH" = "." ]; then
	RET_CODE=1	# too many arguments
    fi
    if [ "$3" = "WARN" -a ! "$RET_CODE" = "0" ]; then

cat << EOF > /tmp/tmpmsg

Ϥ줿($1)ϡIPɥ쥹ǤϤޤ

ǴԤƤΤϡ192.168.1.1 Τ褦ˡ$2Ĥοͤɥå
ǷҤΤǤ⤦ϤľƤ
 
EOF

	dialog --title "ERROR" --msgbox "`cat /tmp/tmpmsg`" 10 70
	rm -r /tmp/tmpmsg
    else
	if [ "$3" = "ECHO" ]; then
	    echo $RET_CODE
	fi
    fi
    return $RET_CODE
}

############################################################################
#	Question and answer
############################################################################
#

first_dialog () {

cat << EOF > /tmp/tmpmsg

줫顢ƥΥͥåȥ˴ؤԤʤޤ

ͥåȥ(NIC)ΤʤޥǤ⡢ۥ̾ϤƤ
ɬפޤʤȵư䥢ץꥱμ¹Ի˰
ưʤʤ뤳Ȥޤ

ۥ̾ /etc/hosts/etc/HOSTNAME ˡͥåȥ
 /etc/network.conf/etc/network.fixed  /etc/network.modes
˹Ԥʤޤ٤Ԥʤʤɡɬפʾˤϡľ
ƥեƤޤ̵LANѤˤϡ
/etc/wireless.conf ꤹɬפ⤢ޤ

ʤnetconfig ޥɤ¹ԤСĤǤѹǤޤ
 
EOF

    dialog --title "ͥåȥ" --msgbox "`cat /tmp/tmpmsg`" 19 70
    rm -f /tmp/tmpmsg
}

############################################################################
#	Change permissions and exit
############################################################################
#

last_dialog () {

cat << EOF > /tmp/tmpmsg

ͥåȥν꤬λޤ

̤Υ(ڴѤ̾٥)䡢2ܰʹߤNICԤ
ϡ netconfig ޥɤ¹ԤƤ
 
EOF

    dialog --title "λ" --msgbox "`cat /tmp/tmpmsg`" 10 70
    rm -f /tmp/tmpmsg
}

############################################################################
#	OK
############################################################################
#

ok_dialog () {

cat << EOF > /tmp/tmpmsg

꤬λޤ

ͭNICˤĤƤܤϡǤȿǤƤޤ
 
EOF

    dialog --title "λ" --msgbox "`cat /tmp/tmpmsg`" 9 70
    rm -f /tmp/tmpmsg
}

############################################################################
#	Set hostname and domain
############################################################################
#

set_hostname () {

cat << EOF > /tmp/tmpmsg

ǽˤȤΥۥȤ̾ꤷƤǻꤹΤ
ۥ̾ǡɥᥤ̾ϴޤʤǤ

ۥ̾:
EOF

    HOSTNAME=""
    while [ "$HOSTNAME" = "" ]; do
	dialog --title "ۥ̾" --inputbox "`cat /tmp/tmpmsg`" 12 72 \
	    2> /tmp/SeThost
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/SeThost
	    exit
	fi
	HOSTNAME="`cat /tmp/SeThost`"
	rm -f /tmp/tmpmsg /tmp/SeThost
    done

cat << EOF > /tmp/tmpmsg

˥ɥᥤ̾Ԥʤޤǽ '.' ϤʤǤ
(㤨С.linet.gr.jp ǤϤʤ linet.gr.jp ȤƤ)

ꤷɥᥤ̾ϡۥ̾ղäȤȤˡƥͥ
ȥˤơ͡ॵФؤ䤤碌Ѥɥᥤ
̾ΥǥեͤȤѤޤ

DHCPʤɤѤ뤿˥ɥᥤ̾ޤäƤ餺äꤹ
ɬפʤϡñ [Enter] 򲡤Ƥ

$HOSTNAME Υɥᥤ̾:
EOF

    dialog --title "ɥᥤ̾" --inputbox "`cat /tmp/tmpmsg`" 19 72 \
	2> /tmp/SeTdom
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/SeTdom
	exit
    fi
    DOMAIN="`cat /tmp/SeTdom`"
    rm -f /tmp/tmpmsg /tmp/SeTdom
    if [ "$DOMAIN" = "" ]; then
	echo $HOSTNAME > etc/HOSTNAME
    else
	echo $HOSTNAME.$DOMAIN > etc/HOSTNAME
    fi
}

############################################################################
#	Use any interfaces?
############################################################################
#

select_loopback_only () {

cat << EOF > /tmp/tmpmsg

ͥåȥ(LAN)³ƻѤޤ?

Ѥϡθ³ԤʤޤʣNIC
ˤϡޤ1ܤNIC(eth0)ˤĤƹԤʤޤ

ޤ(ڴѤ̾٥)Ѥ뤳Ȥǡफ
椫Ѥ򤹤뤳ȤǤޤǤϤޤ
ǥեȤΥ(default)ˤĤƤԤʤޤ

륢åפΤߤǻѤˤ [No] Ǥ
 
EOF

    dialog --title "ͥåȥ³ޤ?" --yesno "`cat /tmp/tmpmsg`" \
	16 70
    if [ $? != 0 ]; then
	SKIP="y"
    fi
    rm -f /tmp/tmpmsg
}

############################################################################
#	tcpip installed?
############################################################################
#

check_tcpip () {
    if [ SKIP != "y" -a ! -r etc/rc.d/rc.inet1 ]; then

cat << EOF > /tmp/tmpmsg

TCP/IP ѥå󥹥ȡ뤵Ƥʤ褦ʤΤǡ
ǤΤϥۥ̾ɥᥤ̾Ǥξ硢ͥåȥ
ˤ³Ǥޤ󤬡ΥץץȤˤϻꤷۥ̾
ɽ褦ˤʤޤ
 
EOF

	dialog --title "λޤ" --msgbox "`cat /tmp/tmpmsg`" 10 70
	rm -f /tmp/tmpmsg
	SKIP=y
    fi
}

############################################################################
#	murasaki installed?
############################################################################
#

check_murasaki () {
    if [ ! -x etc/rc.d/rc.murasaki ]; then

cat << EOF > /tmp/tmpmsg

murasakiޤ󥹥ȡ뤵Ƥޤ󡣤ϡPCIǥХ
ưǧ䡢CardBusUSBʤɤΥǥХδɬפǤ

Plamo LinuxǤmurasakiΥѥå󶡤ƤޤΤǡθ塢

    # installpkg murasaki.tgz

Ȥơɬmurasaki򥤥󥹥ȡ뤷Ƥ
 
EOF

	dialog --title "WARNING" --msgbox "`cat /tmp/tmpmsg`" 14 70
	rm -f /tmp/tmpmsg
    fi
}

############################################################################
#	pcmcia-cs installed?
############################################################################
#

check_pcmcia () {
    if [ ! -x etc/rc.d/rc.pcmcia -a ! -x etc/rc.d/init.d/pcmcia ]; then

cat << EOF > /tmp/tmpmsg

pcmcia-csޤ󥹥ȡ뤵Ƥޤ󡣤ϡ16bit PCMCIA
ΥǥХδɬפǤ

Plamo LinuxǤpcmcia-csΥѥå󶡤ƤޤΤǡθ塢

    # installpkg pcmcia.tgz

Ȥơɬpcmcia-cs򥤥󥹥ȡ뤷Ƥ
 
EOF

	dialog --title "WARNING" --msgbox "`cat /tmp/tmpmsg`" 14 70
	rm -f /tmp/tmpmsg
    fi
}

############################################################################
#	dhclient installed?
############################################################################
#

check_dhclient () {
    if [ ! -x $DHCLIENT ]; then

cat << EOF > /tmp/tmpmsg

DHCP³ɬפdhclientޤ󥹥ȡ뤵Ƥޤ

Plamo LinuxǤdhclientΥѥå󶡤ƤޤΤǡθ塢

    # installpkg dhclient.tgz

Ȥơɬdhclient򥤥󥹥ȡ뤷Ƥ
 
EOF

	dialog --title "WARNING" --msgbox "`cat /tmp/tmpmsg`" 13 70
	rm -f /tmp/tmpmsg
    fi
}

############################################################################
#	Set interface config
############################################################################
#

set_interface () {
    FIXED=
    MODE=

    if [ "$SKIP" = "y" ]; then
	return
    fi

    # Fixed?

cat << EOF > /tmp/tmpmsg

$IFNAME($IFNUMܤNIC)ɤΤ褦³ƤΤ򡢰ʲ
Ǥ

褯狼ʤϡΤΤʤΤȤPCɤUSB
ɤΥࡼХ֥ʤΤʤΤǤ狼нʬǤ
 
EOF

    dialog --title "NIC³ˡ [$IFNAME]" --menu "`cat /tmp/tmpmsg`" \
	18 72 5 \
	"Fixed"     "ꡦܺ" \
	"Static"    "(PCI/ISA)ɥ饤ФϥͥȤ߹" \
	"PCI"       "(PCI)ɥ饤Фϥ⥸塼" \
	"ISA"       "(ISA)ɥ饤Фϥ⥸塼" \
	"Removable" "ࡼХ֥(CardBusPCMCIAUSBʤ)" 2> /tmp/reply
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/reply
	exit
    fi
    REPLY="`cat /tmp/reply`"
    rm -f /tmp/tmpmsg /tmp/reply
    case "$REPLY" in
    Fixed)
	FIXED="y"

cat << EOF > /tmp/tmpmsg

$IFNAME򡢸NICȤƵưͭˤʤ褦Ͽޤ

⤷NICPCI³ǡĥɥ饤Ф⥸塼Ǥä硢
NICϡmurasakiˤäƼưǧͭޤΤ
ᡢư$IFNAME˴ؤ륨顼å(Device already started)
ɽޤ³Ϥޤ󡣤ʤ/$NETFIX ե
뤫顢$IFNAMEιԤС顼åϽФʤʤޤ

⤷ưǧޤԤʤϡɬפʥɥ饤Х⥸塼
ɲäɬפޤ

NICISA³ǡĥɥ饤Ф⥸塼Ǥä硢
ɬפʥɥ饤Х⥸塼Ȥ߹褦 /etc/modules.conf ե
Խ뤫ɬפʥɥ饤ФȤ߹褦ˡͥƹ
ۤɬפޤ
 
EOF

	dialog --title "NOTICE" --msgbox "`cat /tmp/tmpmsg`" 21 70
	rm -f /tmp/tmpmsg
	check_murasaki
	;;
    Static)
	FIXED="y"

cat << EOF > /tmp/tmpmsg

$IFNAME򡢸NICȤƵưͭˤʤ褦Ͽޤ

ϡ/$NETFIX ե˹Ԥʤޤ
 
EOF

	dialog --title "NOTICE" --msgbox "`cat /tmp/tmpmsg`" 9 70
	rm -f /tmp/tmpmsg
	;;
    PCI)
	FIXED="n"

cat << EOF > /tmp/tmpmsg

$IFNAMEϡmurasakiˤäƼưǧͭޤΤᡢ
ưͭˤʤ褦ˤϿޤ

⤷ưǧޤԤʤϡɬפʥɥ饤Х⥸塼
ɲäɬפޤ

ʤͥκƹۤˤäơɥ饤Ф򥫡ͥȤ߹
ϡmurasakiˤ뼫ưǧƯޤΤǡ/$NETFIX
եˡ$IFNAMEιԤɲäɬפޤ
 
EOF

	dialog --title "NOTICE" --msgbox "`cat /tmp/tmpmsg`" 15 70
	rm -f /tmp/tmpmsg
	;;
    ISA)
	FIXED="y"

cat << EOF > /tmp/tmpmsg

$IFNAME򡢸NICȤƵưͭˤʤ褦Ͽޤ

ISA³NICϼưǧޤΤǡͥåȥͭˤ
ϡɬפʥɥ饤Х⥸塼Ȥ߹褦 /etc/modules.conf
եԽ뤫ɬפʥɥ饤ФȤ߹褦ˡͥ
ƹۤɬפޤ
 
EOF

	dialog --title "NOTICE" --msgbox "`cat /tmp/tmpmsg`" 12 70
	rm -f /tmp/tmpmsg
	;;
    *)	# Removable
	FIXED="n"
	MODE="default"

cat << EOF > /tmp/tmpmsg

$IFNAMEϡCardBus(32ӥå)USBʤɤǤmurasakiˡPCMCIA(16
ӥå)Ǥcardmgr˸ФơưŪͭˤʤޤ

줾졢ɬפʥѥå󥹥ȡ뤵Ƥʤưޤ
ΤǡǧԤʤޤ

ʤPCMCIACardBusNIC˴ؤƤ⡢/$NETCONF ե
˽Ѥ褦ˤʤäƤޤ
 
EOF

	dialog --title "NOTICE" --msgbox "`cat /tmp/tmpmsg`" 14 70
	rm -f /tmp/tmpmsg
	check_murasaki
	check_pcmcia
	;;
    esac

    # Mode

    if [ "$MODE" = "" ]; then

cat << EOF > /tmp/tmpmsg

$IFNAME($IFNUMܤNIC)ư⡼ɤ򡢰ʲǤ

ǥȥåPCǤ Static 򡢥ΡPC¢LANǤ Dynamic 
ޤΡPC¢̵LANǤ Manual ֤ΤŪǤ

Manual ϡifctl ޥɤѤơư̵ͭ
ڤ괹뤳ȤǤޤ
 
EOF

	dialog --title "NICư⡼ [$IFNAME]" --menu "`cat /tmp/tmpmsg`" \
	    18 72 3 \
	    "Static"  "ͭ" \
	    "Dynamic" "֥뤬ҤäƤ֤ͭ" \
	    "Manual"  "ưڤ괹" 2> /tmp/reply
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/reply /tmp/tmpmsg
	    exit
	fi
	REPLY="`cat /tmp/reply`"
	rm -f /tmp/reply /tmp/tmpmsg
	case "$REPLY" in
	Dynamic)
	    MODE="-d"
	    ;;
	Manual)
	    MODE="-m"
	    ;;
	*)	# Static
	    MODE="default"
	    ;;
	esac
    fi
}

############################################################################
#	Set network config
############################################################################
#

set_network () {
    USE=
    DHCP=
    IPADDR=
    MASKLEN=
    NETMASK=
    NETWORK=
    BROADCAST=
    SEARCH=
    GATEWAY=
    NAMESERVERS=
    NUM_NS=0

    if [ "$SKIP" = "y" ]; then
	return
    fi

cat << EOF > /tmp/tmpmsg

$IFNAME($IFNUMܤNIC)ԤʤޤѤ륹(ڴѤ
̾٥)ϡ$SCHEME Ǥ

ϡν֤ǹԤʤޤɬפʹܤϡ餫Ĵ٤ƥ
Ƥȡࡼ꤬Ԥʤޤ

1. ˡ (ꥢɥ쥹DHCP)
(ʲꥢɥ쥹λΤ)
2. IPɥ쥹ͥåȥޥ
3. ȥ
4. ɥᥤ̾
5. ͡ॵ
 
EOF

    dialog --title "ͥåȥ [$IFNAME($SCHEME)]" \
	--msgbox "`cat /tmp/tmpmsg`" 18 70
    rm -f /tmp/tmpmsg

    # DHCP?

cat << EOF > /tmp/tmpmsg

$IFNAME($SCHEME)IPɥ쥹ˡ򤷤Ƥ

ߤΥǡNICѤʤϡUnuse 򤷤Ƥ

 
EOF

    dialog --title "IPɥ쥹ˡ [$IFNAME($SCHEME)]" \
	--menu "`cat /tmp/tmpmsg`" 15 72 3 \
	"Fixed" "ꥢɥ쥹³" \
	"DHCP"  "DHCP³" \
	"Unuse" "NICѤʤ" 2> /tmp/reply
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/reply
	exit
    fi
    REPLY="`cat /tmp/reply`"
    rm -f /tmp/tmpmsg /tmp/reply
    case "$REPLY" in
    "Fixed")
	USE="y"
	DHCP="n"
	;;
    "DHCP")
	USE="y"
	DHCP="y"
	;;
    *)	# Unuse
	USE="n"
	;;
    esac
    if [ "$DHCP" = "y" ]; then
	check_dhclient
	return
    fi
    if [ "$USE" != "y" ]; then
	return
    fi

    # IP address / Netmask

    while [ 0 ]; do

cat << EOF > /tmp/tmpmsg

$IFNAMEIPɥ쥹ꤷƤIPɥ쥹ϡ4Ĥ10ͤ
ɥåȤǷҤǤ(: 192.168.1.1)

$HOSTNAME($IFNAME)IPɥ쥹 (aaa.bbb.ccc.ddd):
EOF

	dialog --title "IPɥ쥹 [$IFNAME($SCHEME)]" \
	    --inputbox "`cat /tmp/tmpmsg`" 12 72 2> /tmp/SeTlip
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/SeTlip
	    exit
	fi
	IPADDR="`cat /tmp/SeTlip`"
	rm -f /tmp/tmpmsg /tmp/SeTlip
	if [ "$IPADDR" = "" ]; then
	    continue
	fi
	syntax_check $IPADDR 4 WARN
	if [ $? != 0 ]; then
	    continue
	fi

	IPADDR_1="`expr $IPADDR : '\([0-9]*\)'`"
	if [ "$IPADDR_1" -lt 128 ]; then
	    # Class A
	    MASKLEN_DEF=8
	elif [ "$IPADDR_1" -lt 192 ]; then
	    # Class B
	    MASKLEN_DEF=16
	else
	    # Class C (perhaps)
	    MASKLEN_DEF=24
	fi

cat << EOF > /tmp/tmpmsg

³ΥͥåȥΥͥåȥޥĹ(ͥåȥΥӥåȿ)
ꤷƤ㤨Сͥåȥޥ 255.255.255.0 ξ
ͥåȥޥĹ24Ǥ

($IPADDR ФɸͥåȥޥĹ: $MASKLEN_DEF)

ɸŪʥͥåȥޥĹѤϡñ [Enter] 򲡤Ƥ


ͥåȥޥĹ (030):
EOF

	dialog --title "ͥåȥޥĹ [$IFNAME($SCHEME)]" \
	    --inputbox "`cat /tmp/tmpmsg`" 18 72 2> /tmp/SeTnmask
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/SeTnmask
	    exit
	fi
	MASKLEN="`cat /tmp/SeTnmask`"
	rm -f /tmp/tmpmsg /tmp/SeTnmask
	if [ "$MASKLEN" = "" ]; then
	    MASKLEN=$MASKLEN_DEF
	fi
	CONFS=`$GENMASK $IPADDR/$MASKLEN 2> /dev/null`
	if [ $? = 0 ]; then
	    eval $CONFS
	    break
	fi

cat << EOF > /tmp/tmpmsg

IPɥ쥹ȥͥåȥޥĹ($IPADDR/$MASKLEN)Ǥޤ

Ϥ줿ͤǤϡͥåȥԤʤޤ
ǧξ塢⤦ϤľƤ
 
EOF

	dialog --title "ERROR" --msgbox "`cat /tmp/tmpmsg`" 10 70
	rm -r /tmp/tmpmsg
    done

    # Gateway

    while [ 0 ]; do

cat << EOF > /tmp/tmpmsg

ȥIPɥ쥹ꤷƤ(: 192.168.1.254)
ȥ̵ϡ[Enter] 򲡤ơؿʤǤ

ȥIPɥ쥹 (aaa.bbb.ccc.ddd):
EOF

	dialog --title "ȥ [$IFNAME($SCHEME)]" \
	    --inputbox "`cat /tmp/tmpmsg`" 12 72 2> /tmp/SeTgate
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/SeTgate
	    exit
	fi
	GATEWAY="`cat /tmp/SeTgate`"
	rm -f /tmp/tmpmsg /tmp/SeTgate
	if [ "$GATEWAY" = "" ]; then
	    break
	fi
	syntax_check $GATEWAY 4 WARN
	if [ $? = 0 ]; then
	    break
	fi
    done

    # Search domain

cat << EOF > /tmp/tmpmsg

NIC³˻Ѥɥᥤ̾ꤷƤǻ
ꤷɥᥤ̾ϡ͡ॵФؤ䤤碌Ѥޤ

(ǥեȤΥɥᥤ̾: $DOMAIN)

ǥեȤΥɥᥤ̾򤽤ΤޤѤϡñ [Enter] 
Ƥ

ɥᥤ̾:
EOF

    dialog --title "ɥᥤ̾ [$IFNAME($SCHEME)]" \
	--inputbox "`cat /tmp/tmpmsg`" 17 72 2> /tmp/SeTdom
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/SeTdom
	exit
    fi
    SEARCH="`cat /tmp/SeTdom`"
    rm -f /tmp/tmpmsg /tmp/SeTdom
    if [ "$SEARCH" = "" ]; then
	SEARCH="$DOMAIN"
    fi

    # Nameserver

    while [ 0 ]; do
	NEXT_NUM=`expr $NUM_NS + 1`
	if [ $NUM_NS = "0" ]; then

cat << EOF > /tmp/tmpmsg

1ܤΥ͡ॵФIPɥ쥹ꤷƤ

͡ॵФ̵ϡ[Enter] 򲡤ơؿʤǤ
ξ硢̾Ԥʤˤϡ/$HOSTS եԽɬ
פޤ

͡ॵ(1)IPɥ쥹 (aaa.bbb.ccc.ddd): 
EOF

	    dialog --title "͡ॵ(1) [$IFNAME($SCHEME)]" \
		--inputbox "`cat /tmp/tmpmsg`" 15 72 2> /tmp/SeTns
	else

cat << EOF > /tmp/tmpmsg

$NEXT_NUMܤΥ͡ॵФIPɥ쥹ꤷƤ

(ޤǤꤷ͡ॵ: $NAMESERVERS)

ʾ͡ॵФ̵ϡ[Enter] 򲡤Ƥ

͡ॵ($NEXT_NUM)IPɥ쥹 (aaa.bbb.ccc.ddd): 
EOF

	    dialog --title "͡ॵ($NEXT_NUM) [$IFNAME($SCHEME)]" \
		--inputbox "`cat /tmp/tmpmsg`" 15 72 2> /tmp/SeTns
	fi

	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/SeTns
	    exit
	fi
	NAMESERVER="`cat /tmp/SeTns`"
	rm -f /tmp/tmpmsg /tmp/SeTns
	if [ "$NAMESERVER" = "" ]; then
	    break
	fi
	syntax_check $NAMESERVER 4 WARN
	if [ $? != 0 ]; then
	    continue
	fi
	NAMESERVERS="$NAMESERVERS${NAMESERVERS:+ }$NAMESERVER"
	NUM_NS=$NEXT_NUM
	if [ "$NUM_NS" = "3" ]; then
	    break
	fi
    done
}

############################################################################
#	Initialize config files
############################################################################
#

initialize_config_file () {
    # /etc/hosts
    if [ -f $HOSTS ]; then
	cp $HOSTS tmp/`basename $HOSTS`.OLD
    fi

    if [ "$IPADDR" = "" ]; then
	IPADDR="127.0.0.1"
    fi
    if [ "$DOMAIN" = "" ]; then
	FULLDOMAIN=""
    else
	FULLDOMAIN="$HOSTNAME.$DOMAIN "
    fi

cat << EOF > $HOSTS
#
# hosts		This file describes a number of hostname-to-address
#		mappings for the TCP/IP subsystem.  It is mostly
#		used at boot time, when no name servers are running.
#		On small systems, this file can be used instead of a
#		"named" name server.  Just add the names, addresses
#		and any aliases to this file...
#
# By the way, Arnt Gulbrandsen <agulbra@nvg.unit.no> says that 127.0.0.1
# should NEVER be named with the name of the machine.  It causes problems
# for some (stupid) programs, irc and reputedly talk. :^)
#

# For loopbacking.
127.0.0.1	localhost
$IPADDR	$FULLDOMAIN$HOSTNAME

# End of hosts.
EOF

    chmod 644 $HOSTS

    # /etc/networks
    if [ -f $NETWORKS ]; then
	cp $NETWORKS tmp/`basename $NETWORKS`.OLD
    fi

cat << EOF > $NETWORKS
#
# networks	This file describes a number of netname-to-address
#		mappings for the TCP/IP subsystem.  It is mostly
#		used at boot time, when no name servers are running.
#

loopback	127.0.0.0
localnet	$NETWORK

# End of networks.
EOF

    # /etc/network.conf
    if [ -f $NETCONF ]; then
	cp $NETCONF tmp/`basename $NETCONF`.OLD
    fi

cat << EOF > $NETCONF
# Network adapter configuration
# *** SEE ALSO /etc/network.fixed and /etc/network.mode ***
#
# The address format is "DEVICE,SCHEME,HWADDR".
#
# Note:
#   List devices to be set up at boot time into /etc/network.fixed
#   (DEVICES in "_boot" is obsoluted and now void). And the modes of
#   interfaces are described in /etc/network.mode.
#
#   IPADDR with its mask 0 indicates to set the P2P routing to the gateway,
#   instead of that to the local network.
#
# *: Required.
# +: Not required when DHCP is set.
# x: Required when NTDOMAIN=auth.
# -: Exclusive.
#
# - TXTYPE      : PCMCIA transceiver type    [txtype (see below)]
# - MII_AUTO    : Valid MII medium type list [medium (see below)...]
# - MII_FIX     : Fix MII medium type        [medium (see below)]
#   MTU         : Override MTU of interface  [bytes]
# * DHCP        : Use DHCP                   [y|n]
# *+IPADDR      : IP address/Netmask length  [IPaddr/int]
#   GATEWAY     : Gateway address            [+ (from DHCP)|IPaddr]
#   DOMAIN      : DNS search domain list     [+ (from DHCP)|domain domain...]
#   DNS         : DNS nameserver list        [+ (from DHCP)|IPaddr IPaddr...]
#   WORKGROUP   : NETBIOS workgroup/domain
#   NTDOMAIN    : Join NETBIOS domain        [y|auth|n]
# x PDC         : NETBIOS PDC                [NBname]
#   WINS        : NETBIOS nameserver         [+ (from DHCP)|IPaddr]
#   init_fn()   : To do before setting up the interface
#   start_fn()  : To do after setting up the interface
#   stop_fn()   : To do before shutting down the interface
#   finish_fn() : To do after shutting down the interface
#
# <txtype> := auto|10baseT|10base2|aui|100baseT
# <medium> := 10baseT-HD|10baseT-FD|100baseTx-HD|100baseTx-FD|100baseT4

case "\$ADDRESS" in
lo,*,*)
    INFO="Local loopback"
    TXTYPE=
    MII_AUTO=
    MII_FIX=
    MTU=
    DHCP=n
    IPADDR=127.0.0.1/8
    GATEWAY=
    DOMAIN=
    DNS=
    WORKGROUP=
    NTDOMAIN=
    PDC=
    WINS=
    init_fn() { return; }
    start_fn() { return; }
    stop_fn() { return; }
    finish_fn() { return; }
    ;;
esac
EOF

    chmod 644 $NETCONF

    # /etc/network.fixed
    if [ -f $NETFIX ]; then
	cp $NETFIX tmp/`basename $NETFIX`.OLD
    fi

cat << EOF > $NETFIX
# Network interfaces that is installed statically
#
# The interfaces to be probed and to be set up by murasaki, must not
# be listed here.

lo
EOF

    chmod 644 $NETFIX

    # /etc/network.mode
    if [ -f $NETMODE ]; then
	cp $NETMODE tmp/`basename $NETMODE`.OLD
    fi

cat << EOF > $NETMODE
# Network interfaces mode definitions
#
# Each line must be "interface {-s|-d|-m}".
#
# Interfaces with "-s" is made into static mode (always enabled), "-d"
# into dynamic mode (watch link status), and "-m" into manual mode
# (enabled only by hand). The default mode is "-s" (static mode).

EOF

    chmod 644 $NETMODE
}

############################################################################
#	Update interface config files
############################################################################
#

update_interface_config () {
    if [ "$SKIP" = "y" ]; then
	return
    fi

    # /etc/network.fixed
    grep -v $IFNAME $NETFIX > /tmp/`basename $NETFIX`.N
    if [ "$FIXED" = "y" ]; then
	echo "$IFNAME" >> /tmp/`basename $NETFIX`.N
    fi
    mv -f /tmp/`basename $NETFIX`.N $NETFIX
    chmod 644 $NETFIX

    # /etc/network.mode
    grep -v $IFNAME $NETMODE > /tmp/`basename $NETMODE`.N
    if [ "$MODE" != "default" ]; then
	echo "$IFNAME $MODE" >> /tmp/`basename $NETMODE`.N
    fi
    mv -f /tmp/`basename $NETMODE`.N $NETMODE
    chmod 644 $NETMODE
}

############################################################################
#	Update network config files
############################################################################
#

update_network_config () {
    if [ "$SKIP" = "y" ]; then
	return
    fi

    # /etc/network.conf
    if [ "$USE" = "y" ]; then
	if [ "$DHCP" = "y" ]; then

cat << EOF > /tmp/AdDnet
$IFNAME,$SCHEME,*)
    INFO="netconfig configured: DHCP"
    TXTYPE=
    MII_AUTO=
    MII_FIX=
    MTU=
    DHCP=y
    IPADDR=
    GATEWAY=+
    DOMAIN=+
    DNS=+
    WORKGROUP=
    NTDOMAIN=
    PDC=
    WINS=+
    init_fn() { return; }
    start_fn() { return; }
    stop_fn() { return; }
    finish_fn() { return; }
    ;;
EOF

	else
	    case "$SEARCH" in
	    *\ *)
		SEARCH=\"$SEARCH\"
		;;
	    esac
	    case "$NAMESERVERS" in
	    *\ *)
		NAMESERVERS=\"$NAMESERVERS\"
		;;
	    esac

cat << EOF > /tmp/AdDnet
$IFNAME,$SCHEME,*)
    INFO="netconfig configured: Fixed"
    TXTYPE=
    MII_AUTO=
    MII_FIX=
    MTU=
    DHCP=n
    IPADDR=$IPADDR/$MASKLEN
    GATEWAY=$GATEWAY
    DOMAIN=$SEARCH
    DNS=$NAMESERVERS
    WORKGROUP=
    NTDOMAIN=
    PDC=
    WINS=
    init_fn() { return; }
    start_fn() { return; }
    stop_fn() { return; }
    finish_fn() { return; }
    ;;
EOF

	fi
	sed -e "/^[ 	]*$IFNAME,$SCHEME,/,/^[ 	]*;;/d" \
	    -e "/^[ 	]*case \"\$ADDRESS\" in/r /tmp/AdDnet" < $NETCONF \
	    > /tmp/`basename $NETCONF`.N
	rm -f /tmp/AdDnet
    else
	sed -e "/^[ 	]*$IFNAME,$SCHEME,/,/^[ 	]*;;/d" < $NETCONF \
	    > /tmp/`basename $NETCONF`.N
    fi

    mv -f /tmp/`basename $NETCONF`.N $NETCONF
    chmod 644 $NETCONF
}

############################################################################
#	Select command
############################################################################
#

select_cmd () {

cat << EOF > /tmp/tmpmsg

ߤоݤϡ$IFNAME($IFNUMܤNIC)ǤTarget 򤹤ȡ
оݤNICѹǤޤ

$IFNAME³ˡ(꤫ࡼХ֥뤫)ư⡼(NICǥ
³򸡽Ф뤫ʤ)ѹˤϡInterface 
Ƥ

ͥåȥѹϡNetwork 򤷤Ƥ
ʣΥ(ڴѤ̾٥)ڤ괹ˤ⡢
Network 塢ɲäޤԤʤäƤ
 
EOF

    dialog --title "ͥåȥѹ [$IFNAME]" \
	--menu "`cat /tmp/tmpmsg`" 23 72 5 \
	"Target"    "оݤ$IFNAME ̤NICѹ" \
	"Interface" "$IFNAME ³ˡư⡼ɤѹ" \
	"Network"   "$IFNAME Υͥåȥɲáѹ" \
	"Cleanup"   "ߤ˴ᤫꤷľ" \
	"Exit"      "λ" 2> /tmp/reply
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/reply
	exit
    fi
    REPLY="`cat /tmp/reply`"
    rm -f /tmp/tmpmsg /tmp/reply
}

############################################################################
#	Select interface
############################################################################
#

select_target () {

cat << EOF > /tmp/tmpmsg

оݤΥͥåȥ(NIC)򤷤Ƥߤ
оݤϡ$IFNAME($IFNUMܤNIC)Ǥ

ѹʤϡUnchange 򤷤Ƥ
 
EOF

    dialog --title "NICѹ" --menu "`cat /tmp/tmpmsg`" 17 72 5 \
	"Unchange" "ѹʤ" \
	"eth0"     "1ܤNIC" \
	"eth1"     "2ܤNIC" \
	"eth2"     "3ܤNIC" \
	"eth3"     "4ܤNIC" 2> /tmp/reply
    if [ $? = 1 -o $? = 255 ]; then
	rm -f /tmp/tmpmsg /tmp/reply
	exit
    fi
    REPLY="`cat /tmp/reply`"
    rm -f /tmp/tmpmsg /tmp/reply
    if [ "$REPLY" != "Unchange" ]; then
	IFNAME="$REPLY"
	IFNUM="`expr $REPLY : 'eth\([0-9]*\)' + 1`"
    fi
}

############################################################################
#	Select scheme
############################################################################
#

select_scheme () {
    SCHEME=
    while [ "$SCHEME" = "" ]; do

cat << EOF > /tmp/tmpmsg

顢$IFNAME($IFNUMܤNIC)Ԥʤޤ

(ڴѤ̾٥)Ѥȡफ椫
Ѥ򤹤뤳ȤǤޤºݤ̤Υ
ڤ괹ϡnetscheme ޥɤ¹ԤƤ

ɤΥˤĤꤷޤ? ڤ괹ɬפʤ
ϡdefault 򤷤Ƥޤɲä
ˤϡAdd 򤷤Ƥ
 
EOF

	SCHEMES=
	NUM_ITEM="0"
	for d in `netscheme -ql`; do
	    if [ "$d" = "default" ]; then
		SCHEMES="$SCHEMES $d ǥեȤΥ"
	    else
		NUM_ITEM="`expr $NUM_ITEM + 1`"
		SCHEMES="$SCHEMES $d 桼ꥹ($NUM_ITEM)"
	    fi
	done
	if [ "$NUM_ITEM" -gt 4 ]; then
	    NUM_ITEM=4
	fi

	dialog --title " [$IFNAME]" --menu "`cat /tmp/tmpmsg`" \
	    "`expr $NUM_ITEM + 19`" 72 "`expr $NUM_ITEM + 2`" \
	    $SCHEMES \
	    "Add" "ɲ" 2> /tmp/reply
	if [ $? = 1 -o $? = 255 ]; then
	    rm -f /tmp/tmpmsg /tmp/reply
	    exit
	fi
	SCHEME="`cat /tmp/reply`"
	rm -f /tmp/tmpmsg /tmp/reply

	if [ "$SCHEME" = "Add" ]; then

cat << EOF > /tmp/tmpmsg

ɲä̾ΤꤷƤ

:
EOF

	    dialog --title "ɲ" --inputbox "`cat /tmp/tmpmsg`" \
		11 72 2> /tmp/AdDscm
	    if [ $? = 1 -o $? = 255 ]; then
		rm -f /tmp/tmpmsg /tmp/AdDscm
		exit
	    fi
	    SCHEME="`cat /tmp/AdDscm`"
	    rm -f /tmp/tmpmsg /tmp/AdDscm
	fi
    done
}

############################################################################
#	Warning for initialize configuration
############################################################################
#

warn_cleanup () {

cat << EOF > /tmp/tmpmsg

θλȡͥåȥ˴ؤե뤬ƽ
ޤeth0(1ܤNIC) default ʳ꤬
Ǥ⡢ƾõޤ

³ޤ?
 
EOF

    dialog --title "WARNING" --yesno "`cat /tmp/tmpmsg`" 11 72
    if [ $? != 0 ]; then
	return 1
    fi
}

############################################################################
#	Reset all configuration
############################################################################
#

cleanup_setting () {
    # ǽΥ
    first_dialog
    # ۥ̾
    set_hostname
    # eth0 ꤹ?
    select_loopback_only
    # /etc/rc.d/rc.inet1ĤʤϤޤ
    check_tcpip
    # eth0/defaultΤ߼ưǹԤʤ
    IFNAME="eth0"
    IFNUM="1"
    SCHEME="default"
    # NIC
    set_interface
    # ͥåȥ
    set_network
    # եؤν񤭽Ф
    echo "$SCHEME" > $SCMFILE
    RESET_LO=
    RESET_IF=
    if [ "$ALREADY" = "y" ]; then
	if [ -f $NETSTATE/lo.pid ]; then
	    RESET_LO="y"
	fi
	if [ -f $NETSTATE/$IFNAME.pid ]; then
	    RESET_IF="y"
	fi
	for f in $NETSTATE/*.pid; do
	    if [ -f "$f" ]; then
		$IFDOWN "`basename $f .pid`"
	    fi
	done
    fi
    initialize_config_file
    update_interface_config
    update_network_config
    if [ "$RESET_LO" = "y" ]; then
	$IFUP lo
    fi
    if [ "$RESET_IF" = "y" ]; then
	$IFUP $IFNAME
    fi
    # ǸΥ
    last_dialog
}

############################################################################
#				MAIN
############################################################################
#

if [ ! -d lost+found -a ! -d vmlinuz -a ! -d proc ]; then
    # cheap, but it works :^)
    cd /
fi

# IMPORTANT!!! NO LEADING '/' in the paths below, or this script will not
# function from the bootdisk.
HOSTS=etc/hosts
NETWORKS=etc/networks
NETFIX=etc/network.fixed
NETMODE=etc/network.mode
NETCONF=etc/network.conf
NETSTATE=var/lib/net
SCMFILE=${NETSTATE}/scheme
DHCLIENT=sbin/dhclient
GENMASK=etc/rc.d/genmask
IFUP=etc/murasaki/bin/ifup
IFDOWN=etc/murasaki/bin/ifup

SKIP=

if [ -r $SCMFILE ]; then
    ALREADY="y"
fi

if [ ! "$ALREADY" = "y" ]; then
    cleanup_setting
else
    HOSTNAME=$(hostname)
    DOMAIN=$(hostname -d)
    IFNAME="eth0"
    IFNUM="1"
    while [ 0 ]; do
	select_cmd
	case "$REPLY" in
	"Target")
	    select_target
	    ;;
	"Interface")
	    set_interface
	    if [ -f $NETSTATE/$IFNAME.pid ]; then
		$IFDOWN $IFNAME
		update_interface_config
		$IFUP $IFNAME
	    else
		update_interface_config
	    fi
	    ok_dialog
	    ;;
	"Network")
	    select_scheme
	    set_network
	    if [ -f $NETSTATE/$IFNAME.pid ]; then
		$IFDOWN $IFNAME
		update_network_config
		$IFUP $IFNAME
	    else
		update_network_config
	    fi
	    ok_dialog
	    ;;
	"Cleanup")
	    if warn_cleanup; then
		cleanup_setting
		exit
	    fi
	    ;;
	*)	# Exit
	    exit
	    ;;
	esac
    done
fi
