#!/bin/sh
# 
if [ "$1" = "prereqs" ]; then
  exit 0
fi

quiet=n



. /scripts/functions
. /conf/tcos.conf
. /conf/tcos-run-functions

# if break=sqmount STOP here
maybe_break network

# localhost
log_begin_msg "Bring up Local loopback device"
 ifconfig lo up
log_end_msg $?

touch /etc/resolv.conf

#if [ -d /var/lib/dhcp3 ]; then
#  # link to work with dhcp-client or dhcp3-client
#  ln -s /var/lib/dhcp3 /var/lib/dhcp

#  chown root:dhcp /lib/dhcp3-client 2>/dev/null
#  chown 775 /lib/dhcp3-client
#  chmod 4744 /lib/dhcp3-client/call-dhclient-script

#  chown root:dhcp /etc/resolv.conf 2>/dev/null
#  chmod 644 /etc/resolv.conf
#fi

# wireless TCOS minihowto
#
#  start thin client with something like this:
#
# boot: tcos wifi=1 essid="ESSID" server=xx.xx.xx.xx
# * server is tftpd and XMDCP host
# * ESSID is wireless network


if [ $(read_cmdline_var 'wifi' '0') = "1" ]; then
  # load kernel modules
  log_begin_msg "Loading wireless kernel modules"
    modprobe -q arc4
    modprobe -q ecb
    modprobe -q mac80211
    modprobe -q ieee80211_crypt
    modprobe -q ieee80211
    modprobe -q ieee80211softmac
    #modprobe -q rc80211_simple

    for kmod in $TCOS_WIRELESS_MODS; do
      if [ "$kmod" = "madwifi" ]; then
        #ath-pci ath-hal wlan_tkip wlan_scan_sta ath-hal
        modprobe -q ath-pci 2>/dev/null
        modprobe -q ath-hal 2>/dev/null
        modprobe -q wlan_tkip 2>/dev/null
        modprobe -q wlan_scan_sta 2>/dev/null
      elif [ "$kmod" = "zd1211" -o "$kmod" = "zd1211rw" ]; then
        modprobe -q zd1211rw 2>/dev/null
      elif [ "$kmod" = "rt2400" -o "$kmod" = "rt2400pci" ]; then
        modprobe -q rt2400pci 2>/dev/null
      elif [ "$kmod" = "rt2500" -o "$kmod" = "rt2500pci" ]; then
        modprobe -q rt2500pci 2>/dev/null
      elif [ "$kmod" = "rt61" -o "$kmod" = "rt2561" -o "$kmod" = "rt61pci" ]; then
        modprobe -q rt61pci 2>/dev/null
      elif [ "$kmod" = "rt73" -o "$kmod" = "rt73usb" ]; then
        modprobe -q rt73usb 2>/dev/null
      elif [ "$kmod" = "bcm43xx" -o "$kmod" = "broadcom" ]; then
        modprobe -q bcm43xx 2>/dev/null
      else
        modprobe -q $kmod 2>/dev/null
      fi
    done
  log_end_msg 0
fi

# get list of network interfaces
TCOS_NET_ACTIVE="eth0"
TCOS_NET_WIFI=0
TCOS_NET_WIFI_ESSID=""
TCOS_NET_WIFI_KEYMODE=""
TCOS_NET_DEVS=$(ls /sys/class/net/ |grep -v -e lo -e sit0 -e wmaster -e pan)
TCOS_NET_LINK=""
TCOS_NET_LINK_NUMBER=0


# search for network interfaces with link ok status
for dev in $TCOS_NET_DEVS; do
    # need to up iface
    ifconfig $dev up >> /tmp/initramfs.debug 2>&1
    # have link ???
    if [ -e /sys/class/net/$dev/carrier ]; then
       if [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" != "1" ]; then
           # some gigabit cards take some time to negotiate network link
           log_begin_msg "Waiting for netlink in $dev"
           sleep 10
           log_end_msg
       fi
       if [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = "1" ]; then
          _log "05NETWORK found carrier link in $dev iface"
          TCOS_NET_LINK="$TCOS_NET_LINK $dev"
          TCOS_NET_LINK_NUMBER=$(($TCOS_NET_LINK_NUMBER+1))
       fi
    fi
done

if [ $(read_cmdline_var 'wifi' '0') = "1" ]; then
  #force wireless, read some vars
  TCOS_NET_WIFI_ESSID=$(read_cmdline_var "essid" "")
  for dev in $TCOS_NET_DEVS; do
    # is wireless????
    if [ -e /sys/class/net/$dev/wireless ]; then
      TCOS_NET_WIFI=1
      TCOS_NET_LINK=$dev
      # stop searching
      break
    fi
  done
fi


if [ $TCOS_NET_WIFI = 1 ]; then
    # one iface wireless
    TCOS_NET_ACTIVE=$TCOS_NET_LINK

elif [ $TCOS_NET_LINK_NUMBER -gt 1 ]; then
    # we have some ifaces with link
    _log "05NETWORK various net ifaces have link"
    
elif [ $TCOS_NET_LINK_NUMBER = 1 ]; then
    # one iface
    TCOS_NET_ACTIVE=$TCOS_NET_LINK

else
    # not link !!!
    panic "ERROR: No link network detected, check cable."
fi

 # break for wireless
 maybe_break wireless

 if [ $TCOS_NET_WIFI = 1 ]; then

    #ifconfig $TCOS_NET_ACTIVE down
    #ifconfig $TCOS_NET_ACTIVE up
    
    [ -z $TCOS_NET_WIFI_KEYMODE ] && TCOS_NET_WIFI_KEYMODE="restricted"
    # scan wireless
    log_begin_msg "Scanning wireless networks"
      iwlist $TCOS_NET_ACTIVE scan | grep ESSID | awk -F ":" '{print $2}' | sed s/\"//g >> /tmp/initramfs.debug 2>&1
    log_end_msg $?

    log_begin_msg "Wireless associating with $TCOS_NET_WIFI_ESSID"
      iwconfig $TCOS_NET_ACTIVE essid "$TCOS_NET_WIFI_ESSID"
    log_end_msg $?

    # associate if ap cmdline var is set
    if [ "$TCOS_NET_WIFI_ESSID" != "" ]; then
       if [ "$TCOS_WIRELESS_ENC" = "WPA" ]; then
           modprobe -q michael_mic
           modprobe -q blkcipher
           modprobe -q aes
           modprobe -q ieee80211_crypt_tkip
           modprobe -q ieee80211_crypt_ccmp
           log_begin_msg "Wireless WPA mode"
             /sbin/start-wpa.sh "${TCOS_NET_ACTIVE}"
           log_end_msg $?
       fi
       
       if [ "$TCOS_WIRELESS_ENC" = "WEP" ]; then
           modprobe -q ieee80211_crypt_wep
           log_begin_msg "Wireless WEP mode setting key"
             if [ ! -z $TCOS_WIRELESS_KEY ];then
               iwconfig $TCOS_NET_ACTIVE key $TCOS_NET_WIFI_KEYMODE $TCOS_WIRELESS_KEY
             fi
           log_end_msg $?
       fi
    else
       log_begin_msg "Wireless associating with any"
         iwconfig $TCOS_NET_ACTIVE essid any
       log_end_msg $?
    fi
 #else
 #   # wired network
 #   ifconfig $TCOS_NET_ACTIVE down
 #   ifconfig $TCOS_NET_ACTIVE up
 fi
 
 
 log_begin_msg "Sending DHCP request on $TCOS_NET_LINK"
  _log "DHCLIENT $TCOS_NET_LINK"
  if [ -x /sbin/udhcpc ]; then
    /sbin/udhcpc -i $TCOS_NET_LINK -s /bin/udhcpc-script >> /tmp/initramfs.debug  2>&1
  else
    busybox udhcpc -i $TCOS_NET_LINK -s /bin/udhcpc-script -O swapsrv >> /tmp/initramfs.debug  2>&1
  fi
  myip=$(awk -F"=" '/^ip=/ {print $2}' /tmp/net.data)
  dhcpserver=$(awk -F"=" '/^serverid=/ {print $2}' /tmp/net.data)
  hostname=$(awk -F"=" '/^hostname=/ {print $2}' /tmp/net.data)
  netmask=$(awk -F"=" '/^netmask=/ {print $2}' /tmp/net.data)
  gateway=$(awk -F"=" '/^gateway=/ {print $2}' /tmp/net.data)
  TCOS_NET_ACTIVE=$(awk -F"=" '/^interface=/ {print $2}' /tmp/net.data)
  xserver=$(awk -F"=" '/^swapsrv=/ {print $2}' /tmp/net.data)
 log_end_msg 0


if [ -n ${TCOS_DEBUG} ]; then
  _log "NETWORK data: ip=${myip} server=${dhcpserver} hostname=${hostname}"
fi

# count number of ":" in hostname string
if [ $(echo $hostname | awk '{print split($1, A, ":")}') -gt 1 ]; then
  if [ -x /bin/hex2ascii ]; then
    # got an hexadecimal hostname
    hostname2=$(hex2ascii $hostname)
    _log "NETWORK HEX hostname \"$hostname\"=\"$hostname2\""
    hostname=$hostname2
  fi
fi

if [ -z $hostname ] || [ "x{$hostname}" = "x " ]; then
  panic "ERROR: DHCP server don't give me a hostname !!! Edit /etc/hosts in dhcp server"
fi

# search for other hosts
TCOS_TFTP_SERVER=$(read_cmdline_var 'tftpserver' "${dhcpserver}")

if [ "$xserver" != "" ]; then
  TCOS_SERVER=$(read_cmdline_var 'server' "${xserver}")
  TCOS_XDMCP_SERVER=$(read_cmdline_var 'xserver' "${xserver}")
  TCOS_FONT_SERVER=$(read_cmdline_var 'fontserver' "${xserver}")
  TCOS_RDESKTOP_SERVER=$(read_cmdline_var 'rdesktop' "${xserver}")
  TCOS_NFS_SERVER=$(read_cmdline_var 'nfsserver' "${xserver}")
else
  TCOS_SERVER=$(read_cmdline_var 'server' "${dhcpserver}")
  TCOS_XDMCP_SERVER=$(read_cmdline_var 'xserver' "${dhcpserver}")
  TCOS_FONT_SERVER=$(read_cmdline_var 'fontserver' "${dhcpserver}")
  TCOS_RDESKTOP_SERVER=$(read_cmdline_var 'rdesktop' "${dhcpserver}")
  TCOS_NFS_SERVER=$(read_cmdline_var 'nfsserver' "${dhcpserver}")
fi


# Setup the hostname
log_begin_msg "Setting hostname to ${hostname}"
  echo $hostname > /etc/hostname
  echo $hostname > /proc/sys/kernel/hostname
  cat <<EOF > /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 ${hostname}
${myip} ${hostname}
${TCOS_SERVER} tcos-server
${TCOS_TFTP_SERVER} tftp-server
${TCOS_XDMCP_SERVER} xdmcp-server
${TCOS_RDESKTOP_SERVER} rdesktop-server
${TCOS_NFS_SERVER} nfs-server
${TCOS_FONT_SERVER} font-server
EOF

hostname $hostname
export HOSTNAME=$hostname
log_end_msg

# start portmap || rcpbind (for NFS)
[ -x /sbin/portmap ] && /sbin/portmap >/tmp/portmap.log 2>&1 &
[ -x /sbin/rpcbind ] && /sbin/rpcbind >/tmp/rpcbind.log 2>&1 &


exit 0
