#!/bin/bash

# Check for --help
PREFIX=$1;
if test x$PREFIX = "x--help"; then
  cat <<EOF
Loughborough University Wireless Network Settings Installer
-----------------------------------------------------------

Usage:

  As root type,

    $0 <prefix>

e.g. To use /usr/local/lboro-wireless as an install base type:

    $0 /usr/local/lboro-wireless

If a prefix is not supplied then / is used as a default.

See README for more details.
EOF
  exit;
fi

if test x$PREFIX = "x"; then
  PREFIX=/usr/local;
elif test x$PREFIX = "x."; then
    PREFIX=`pwd`;
fi

# Must be root
if test ! x`whoami` = "xroot"; then
  echo You must run this script as root
  echo Exiting...
  exit 1
fi

# Get some locations...
loc_sup_exe=`which wpa_supplicant 2> /dev/null`
if test x$loc_sup_exe = "x"; then
  echo wpa_supplicant binary not found.
  read -p "Please enter the location of the binary: " loc_sup_exe_user
  if ! test -x $loc_sup_exe_user; then
    echo Sorry, $loc_sup_exe_user does not appear to be executable
    echo Check the location of the wpa_supplicant binary and try again
    echo Exiting...
    exit 1
  else
    echo $loc_sup_exe_user looks OK
    loc_sup_exe="$loc_sup_exe_user"
  fi
fi

loc_cli_exe=`which wpa_cli 2> /dev/null`
if test x$loc_cli_exe = "x"; then
  echo wpa_cli binary not found.
  read -p "Please enter the location of the binary: " loc_cli_exe_user
  if ! test -x $loc_cli_exe_user; then
    echo Sorry, $loc_cli_exe_user does not appear to be executable
    echo Check the location of the wpa_cli binary and try again
    echo Exiting...
    exit 1
  else 
    echo $loc_cli_exe_user looks OK
    loc_cli_exe="$loc_cli_exe_user"
  fi
fi

loc_dhclient_exe=`which dhclient 2> /dev/null`
if test x$loc_dhclient_exe = "x"; then
  echo dhclient binary not found.
  read -p "Please enter the location of the binary: " loc_dhclient_exe_user
  if ! test -x $loc_dhclient_exe_user; then
    echo Sorry, $loc_dhclient_exe_user does not appear to be executable
    echo Check the location of the dhclient binary and try again
    echo Exiting...
    exit 1
  else
    echo $loc_dhclient_exe_user looks OK
    loc_dhclient_exe="$loc_dhclient_exe_user"
  fi
fi

# Get some details from the user
# Wireless interface name
echo
read -p "Please enter your wireless network interface name (e.g. eth1): " wireless_int_name
if test x$wireless_int_name = "x"; then
  echo Interface name missing
  echo Exiting...
  exit 1
fi
echo

# Wireless driver for wpa_supplicant
echo "Please enter the name of the driver you use with wpa_supplicant"
echo "If you are unsure please read the wpa_supplicant documentation"
read -p "(e.g. wext): " wpa_supplicant_driver
if test x$wireless_int_name = "x"; then
  echo wpa_supplicant driver name missing
  echo Exiting...
  exit 1
fi
echo

echo "Prefix for installation: $PREFIX";
echo "WPA Supplicant path    : $loc_sup_exe";
echo "WPA CLI path           : $loc_cli_exe";
echo "dhclient path          : $loc_dhclient_exe";
echo "Wireless interface     : $wireless_int_name";
echo "WPA Supplicant driver  : $wpa_supplicant_driver";
echo
read -p "Are these details correct? (Y/N): " input_line
if (test x$input_line = "xY") || (test x$input_line = "xy"); then
  echo "Continuing...";
  echo;
else
  echo "Exiting...";
  exit 1;
fi

if test x$PREFIX = "x/"; then
    PREFIX=;
fi

mkdir -p $PREFIX/etc/wpa_supplicant/lboro/
mkdir -p $PREFIX/sbin/

# cp lboro-ca.crt $PREFIX/etc/wpa_supplicant/lboro/
cat > $PREFIX/etc/wpa_supplicant/lboro/lboro-ca.crt <<EOFCert
-----BEGIN CERTIFICATE-----
MIIDOzCCAqQCAQAwDQYJKoZIhvcNAQEEBQAwgeUxCzAJBgNVBAYTAkdCMRcwFQYD
VQQIEw5MZWljZXN0ZXJzaGlyZTEVMBMGA1UEBxMMTG91Z2hib3JvdWdoMSAwHgYD
VQQKExdMb3VnaGJvcm91Z2ggVW5pdmVyc2l0eTEbMBkGA1UECxMSQ29tcHV0aW5n
IFNlcnZpY2VzMTYwNAYDVQQDEy1Mb3VnaGJvcm91Z2ggVW5pdmVyc2l0eSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkxLzAtBgkqhkiG9w0BCQEWIENlcnRpZmljYXRlQXV0
aG9yaXR5QGxib3JvLmFjLnVrMB4XDTk4MDgxOTE0MzQ1NFoXDTE5MTIzMTE0MzQ1
NFowgeUxCzAJBgNVBAYTAkdCMRcwFQYDVQQIEw5MZWljZXN0ZXJzaGlyZTEVMBMG
A1UEBxMMTG91Z2hib3JvdWdoMSAwHgYDVQQKExdMb3VnaGJvcm91Z2ggVW5pdmVy
c2l0eTEbMBkGA1UECxMSQ29tcHV0aW5nIFNlcnZpY2VzMTYwNAYDVQQDEy1Mb3Vn
aGJvcm91Z2ggVW5pdmVyc2l0eSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxLzAtBgkq
hkiG9w0BCQEWIENlcnRpZmljYXRlQXV0aG9yaXR5QGxib3JvLmFjLnVrMIGfMA0G
CSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnmviyau80lSzhkkQlV6Y3VfEV0dRTlqk9
Wb3/R58Sb6Vvs5flIvC4D8ZoJWiK4MQII9w9nWxvTK9cCzRuBaIOBEvgr+L1ie4M
WBzXcsnbw0eV1AoVpt9MnGyoTHowIbAnoncNs7rxV0Mx1NGTTvl/tdcB/KMfV6ik
qQ311WvFXQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACBPW8zF3sh04KdAmKpBc2fz
YHxo4wPuJcTpx7AkEJAxr/RXo4+loKh7DOCWNNpFqtFvEdt6OUfU4sGJ84JXymKK
y/OXPNK5k0PHjI/bnS+m/0mZxRbrmNnloMun3WVzzd3y57QDQplqZQaZ4pg7jHdz
QPJovqjf8EQXF5OUej99
-----END CERTIFICATE-----
EOFCert

# Build the config file on the fly...
cat > $PREFIX/etc/wpa_supplicant/lboro/wpa_supplicant.lboro.conf <<EOFconfig
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1
ap_scan=1
fast_reauth=1

network={
	ssid="lboro"
	key_mgmt=WPA-EAP
        # Uncomment the following line to FORCE WPA2 only otherwise it will
        # autonegotiate the protocol (and use WPA2 if possible otherwise WPA)
        # proto=WPA2
	eap=PEAP
	anonymous_identity="anonymous@lboro.ac.uk"
	# Disable the network for now...
	disabled=1
	ca_cert="$PREFIX/etc/wpa_supplicant/lboro/lboro-ca.crt"
	priority=0
	phase2="auth=MSCHAPV2"
}
EOFconfig

# Build the initialisation script on the fly...
cat > $PREFIX/sbin/wifi-lboro.sh <<EOFscript
#!/bin/bash

if test x\$1 == "x-v" || test x\$1 == "x-d"; then
    DEBUG="on"
    echo Debugging output enabled
else
    DEBUG="off"
fi

read -p "Enter your Lboro AD username: " wpa_username
read -p "Enter your Lboro AD password: " -s wpa_password
# Hidden password so need to return to next line down
echo

if test x\$wpa_username = "x"; then
  echo No username passed;
  echo Exiting...;
  exit 1
fi

if test x\$wpa_password = "x"; then
  echo No password passed;
  echo Exiting...;
  exit 1
fi

echo

if test x\$DEBUG == "xoff"; then

    echo Please wait while the connection is established...
    killall -q wpa_supplicant
    killall -q dhclient
    sleep 2
    $loc_sup_exe -B -c $PREFIX/etc/wpa_supplicant/lboro/wpa_supplicant.lboro.conf -i$wireless_int_name -D$wpa_supplicant_driver
    $loc_cli_exe -p /var/run/wpa_supplicant identity 0 \$wpa_username > /dev/null
    $loc_cli_exe -p /var/run/wpa_supplicant password 0 \$wpa_password > /dev/null
    $loc_cli_exe -p /var/run/wpa_supplicant enable_network 0 > /dev/null
    $loc_dhclient_exe -q $wireless_int_name
else 
    echo Killing any occurrences of wpa_supplicant or dhclient
    killall wpa_supplicant
    killall dhclient
    echo Sleeping for two seconds
    sleep 2
    echo Starting wpa_supplicant
    $loc_sup_exe -d -B -c $PREFIX/etc/wpa_supplicant/lboro/wpa_supplicant.lboro.conf -i$wireless_int_name -D$wpa_supplicant_driver
    echo Sending your username to wpa_supplicant
    $loc_cli_exe -p /var/run/wpa_supplicant identity 0 \$wpa_username
    echo Sending your password to wpa_supplicant
    $loc_cli_exe -p /var/run/wpa_supplicant password 0 \$wpa_password
    echo Enabling the connection in wpa_supplicant
    $loc_cli_exe -p /var/run/wpa_supplicant enable_network 0
    echo Getting an IP address
    $loc_dhclient_exe $wireless_int_name
fi

IP_ADDRESS=\`$loc_cli_exe status | grep ip_address | sed 's/ip_address=//'\`
echo Using interface $wireless_int_name with IP address \$IP_ADDRESS
echo Lboro wireless network should now be enabled
EOFscript

# Chmod the files as appropriate
chmod go-rwx,u+rwx $PREFIX/sbin/wifi-lboro.sh
chmod go-rw $PREFIX/etc/wpa_supplicant/lboro/wpa_supplicant.lboro.conf

echo To initiate the wireless link type
echo
echo "  $PREFIX/sbin/wifi-lboro.sh"
echo
echo at a terminal command prompt and enter your Lboro AD username and
echo password when requested

