#!/bin/sh #Original By Mario Isidoro #Adapted by Bruno Duarte #Adapted by Marco Constancio #http://www.unix.com/shell-programming-and-scripting/26562-sed-command-substitue-first-instance.html LOGGER="/usr/bin/logger -t wpa_sup" DHCP_CLIENT="dhclient3" [ -x /sbin/dhclient ] && DHCP_CLIENT="dhclient" DIALOG="dialog" PROGRAM_NAME="peapconnect" PROGRAM_VERSION="0.4.4" DISABLE_DHCP_CLIENTS=1 DISABLE_NETWORKMANAGER=1 DHCPCD_PATH="/sbin/dhcpcd" DHCLIENT_PATH="/sbin/dhclient" DHCLIENT3_PATH="/sbin/dhclient3" #Used to create a new wpa_suplicant config file INTERFACE="eth1" USERNAME="ei12345@alunos.estg.ipleiria.pt" PASSWORD="12345" DRIVER="wext" AP_SCAN="1" ESSID="e-U" #wpa_supplicant config file WPA_CONF_FILE_PATH="/etc/wpa_supplicant_e-u.conf" WPA_CONF_FILE="ctrl_interface=/var/run/wpa_supplicant ap_scan=$AP_SCAN ctrl_interface_group=0 fast_reauth=1 network={ ssid=\"$ESSID\" scan_ssid=1 key_mgmt=IEEE8021X eap=PEAP identity=\"$USERNAME\" password=\"$PASSWORD\" phase1=\"peapver=0 peaplabel=0 peap_outer_success=0\" phase2=\"auth=MSCHAPV2\" }" #Messages, menu options and loggers text MSG_SETTING_ESSID="Setting essid and enc" MSG_SUCCESS="OK" MSG_FAIL="FAIL" MSG_STARTING_WPA_SUPPLICANT="Starting wpa_supplicant" MSG_DHCP_IP="Requesting ip via dhcp \n" MSG_STOPING_WPA_SUPPLICANT="Stoping wpa_supplicant" MSG_CANCEL_PRESSED="Cancel pressed" MSG_BOX_CLOSED="Box closed" MSG_USAGE_MESSAGE="$PROGRAM_NAME version:$PROGRAM_VERSION Usage: $PROGRAM_NAME [options] options: start: Starts a connection to IPLwifi network\n restart: Restarts the connection to IPLwifi network\n stop: Stops the connection to IPLwifi network\n status: Display connection status config: Configuration Wizard (requires dialog or kdialog) " MSG_CONFIG_TITLE_WIRELESS_CARDS="Placas de Wireless" MSG_CONFIG_WIRELESS_CARD_TYPE="(Wireless)" MSG_CONFIG_WIRELESS_CARDS="Selecione a placa wireless a usar na ligacao:" MSG_CONFIG_TITLE_WIRELESS_DRIVER="Wireless Driver" MSG_CONFIG_WIRELESS_DRIVER="Selecione o driver a usar para a ligacao:" MSG_CONFIG_TITLE_USERNAME="Username" MSG_CONFIG_USERNAME="Introduza o seu Username: (ei12345@alunos.estg.ipleiria.pt ou 12345678@ipleiria.pt):" MSG_CONFIG_TITLE_PASSWORD="Password" MSG_CONFIG_PASSWORD="Introduza a sua password:" MSG_CONFIG_TITLE_AP_SCAN="Opcao Ap Scan"; MSG_CONFIG_AP_SCAN="Selecione a opcao ap_scan para a sua placa wireless, se nao tem a certeza experimente a segunda opcao):"; MSG_CONFIG_SCAN_AP_0_OPTION="0" MSG_CONFIG_SCAN_AP_0_OPTION_INFO="A placa nao suporta a procura de redes." MSG_CONFIG_SCAN_AP_1_OPTION="1" MSG_CONFIG_SCAN_AP_1_OPTION_INFO="O driver define os parametros de procura." MSG_CONFIG_SCAN_AP_2_OPTION="2" MSG_CONFIG_SCAN_AP_2_OPTION_INFO="O Wpa_supplicant define os parametros de procura." MSG_CONFIG_TITLE_ESSID="Essid"; MSG_CONFIG_ESSID="Introduza o essid da rede."; MSG_CONFIG_WIRELESS_DRIVER_WEXT_OPTION="wext" MSG_CONFIG_WIRELESS_DRIVER_WEXT_OPTION_INFO="Linux wireless extensions (generic)" MSG_CONFIG_WIRELESS_DRIVER_HOSTAP_OPTION="hostap" MSG_CONFIG_WIRELESS_DRIVER_HOSTAP_OPTION_INFO="Host AP driver (Intersil Prism2/2.5/3)" MSG_CONFIG_WIRELESS_DRIVER_PRISM54_OPTION="prism54" MSG_CONFIG_WIRELESS_DRIVER_PRISM54_OPTION_INFO="Prism54.org driver (Intersil Prism GT/Duette/Indigo)" MSG_CONFIG_WIRELESS_DRIVER_MADWIFI_OPTION="madwifi" MSG_CONFIG_WIRELESS_DRIVER_MADWIFI_OPTION_INFO="MADWIFI 802.11 support (Atheros, etc.)" MSG_CONFIG_WIRELESS_DRIVER_ATMEL_OPTION="atmel" MSG_CONFIG_WIRELESS_DRIVER_ATMEL_OPTION_INFO="ATMEL AT76C5XXx (USB, PCMCIA)" MSG_CONFIG_WIRELESS_DRIVER_NDIS_OPTION="ndiswrapper" MSG_CONFIG_WIRELESS_DRIVER_NDIS_OPTION_INFO="Linux ndiswrapper" MSG_CONFIG_WIRELESS_DRIVER_IPW_OPTION="ipw" MSG_CONFIG_WIRELESS_DRIVER_IPW_OPTION_INFO="Intel ipw2100/2200 driver (< kernel 2.6.13)" MSG_CONFIG_WIRELESS_DRIVER_IPW3945_OPTION="ipw3945" MSG_CONFIG_WIRELESS_DRIVER_IPW3945_OPTION_INFO="Intel ipw3945 driver" MSG_LOOGER_STARTING_CONNECTION="Starting connection to e-U" MSG_LOOGER_CONNECTED="Connected" MSG_LOOGER_STOPING_CONNECTION="Stoping connection to e-U" MSG_LOOGER_DISCONNECTED="Disconnected" MSG_KILL_DHCPCD="Killed DHCPCD process" MSG_KILL_DHCPCLIENT="Killed DHCPCLIENT process" MSG_KILL_DHCPCLIENT3="Killed DHCPCLIENT3 process" MSG_NETWORKMANAGERDISPATCHER_KILLED="Killed Network Manager Dispatcher process" MSG_NETWORKMANAGER_KILLED="Killed Network Manager process" start() { $LOGGER $MSG_LOOGER_STARTING_CONNECTION #Creates a new wpa_supplicant echo "$WPA_CONF_FILE" > $WPA_CONF_FILE_PATH #Disables dhcp clients a set the DHCP_CLIENT variable if [ $DISABLE_DHCP_CLIENTS -eq 1 ] then [ -x $DHCPCD_PATH ] && killall -15 dhcpcd &> /dev/null && DHCP_CLIENT="dhcpcd -nd" && printf "$MSG_KILL_DHCPCD\n" [ -x $DHCLIENT_PATH ] && killall -15 dhclient &> /dev/null && DHCP_CLIENT="dhclient" && printf "$MSG_KILL_DHCPCLIENT\n" [ -x $DHCLIENT3_PATH ] && killall -15 dhclient3 &> /dev/null && DHCP_CLIENT="dhclient3" && printf "$MSG_KILL_DHCPCLIENT3\n" fi #Disables networkmanager if [ $DISABLE_NETWORKMANAGER -eq 1 ] then #For ubuntu [ -x /etc/dbus-1/event.d/26NetworkManagerDispatcher ] && /etc/dbus-1/event.d/26NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/dbus-1/event.d/25NetworkManager ] && /etc/dbus-1/event.d/25NetworkManager stop &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For Debian, [ -x /etc/init.d/NetworkManagerDispatcher ] && /etc/init.d/NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/init.d/NetworkManager ] && /etc/init.d/NetworkManager stop &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For Archlinux [ -x /etc/rc.d/NetworkManagerDispatcher ] && /etc/rc.d/NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/rc.d/NetworkManager ] && /etc/rc.d/NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For OpenSuse [ -x /usr/sbin/NetworkManagerDispatcher ] && /usr/sbin/NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /usr/sbin/NetworkManager ] && /usr/sbin/NetworkManagerDispatcher stop &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" fi #Set the Wireless card parameters ifconfig $INTERFACE up iwconfig $INTERFACE essid "e-U" enc open >> /var/log/wpa.log printf "$MSG_SETTING_ESSID "; if [ ${?} -eq 0 ] then printf "$MSG_SUCCESS\n\n"; else printf "$MSG_FAIL\n\n"; exit fi sleep 1 printf "$MSG_STARTING_WPA_SUPPLICANT "; #Kill all running wpa_supplicants and start a new one to connect to the network echo `wpa_cli terminate 2>&1` >> /var/log/wpa.log wpa_supplicant -qq -B -Dwext -w -i $INTERFACE -c $WPA_CONF_FILE_PATH >> /var/log/wpa.log if [ ${?} -eq 0 ] then printf "$MSG_SUCCESS\n\n"; else printf "$MSG_FAIL\n\n"; exit fi #Runs the dhcp client a trie to obtain an ip address $DHCP_CLIENT $INTERFACE >> /var/log/wpa.log if [ ${?} -eq 0 ] then printf "$MSG_SUCCESS\n"; printf ".:: Connection Details ::.\n"; wpa_cli status else printf "$MSG_FAIL\n\n"; exit fi $LOGGER $MSG_LOOGER_CONNECTED } stop(){ $LOGGER $MSG_LOOGER_STOPING_CONNECTION printf "$MSG_STOPING_WPA_SUPPLICANT : " #Kill all running wpa_supllicants echo `wpa_cli terminate 2>&1` >> /var/log/wpa.log if [ ${?} -eq 0 ] then printf "$MSG_SUCCESS\n"; else printf "$MSG_FAIL\n"; exit fi #Restart networkmanager if [ $DISABLE_NETWORKMANAGER -eq 1 ] then #For ubuntu [ -x /etc/dbus-1/event.d/26NetworkManagerDispatcher ] && /etc/dbus-1/event.d/26NetworkManagerDispatcher start &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/dbus-1/event.d/25NetworkManager ] && /etc/dbus-1/event.d/25NetworkManager start &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For Debian, [ -x /etc/init.d/NetworkManagerDispatcher ] && /etc/init.d/NetworkManagerDispatcher start &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/init.d/NetworkManager ] && /etc/init.d/NetworkManager start &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For Archlinux [ -x /etc/rc.d/NetworkManagerDispatcher ] && /etc/rc.d/NetworkManagerDispatcher start &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n" [ -x /etc/rc.d/NetworkManager ] && /etc/rc.d/NetworkManagerDispatcher start &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" #For OpenSuse   [ -x /usr/sbin/NetworkManagerDispatcher ] && /usr/sbin/NetworkManagerDispatcher start &> /dev/null && printf "$MSG_NETWORKMANAGERDISPATCHER_KILLED\n"   [ -x /usr/sbin/NetworkManager ] && /usr/sbin/NetworkManager start &> /dev/null && printf "$MSG_NETWORKMANAGER_KILLED\n" fi #Disables dhcp clients a set the DHCP_CLIENT variable if [ $DISABLE_DHCP_CLIENTS -eq 1 ] then [ -x $DHCPCD_PATH ] && killall -15 dhcpcd &> /dev/null && printf "$MSG_KILL_DHCPCD\n" [ -x $DHCLIENT_PATH ] && killall -15 dhclient &> /dev/null && printf "$MSG_KILL_DHCPCLIENT\n" [ -x $DHCLIENT3_PATH ] && killall -15 dhclient3 &> /dev/null && printf "$MSG_KILL_DHCPCLIENT3\n" fi $LOGGER $MSG_LOOGER_DISCONNECTED } restart(){ stop; start; } status(){ #Check the status of the connection MESSAGE=`wpa_cli status 2>&1 | grep "EAP state" | cut -d '=' -f 2` if [ "$MESSAGE" = "SUCCESS" ] then echo "Connected" else echo "Disconnected" fi } config(){ #Check if xdialog is avaible [ -n "$DISPLAY" ] && [ -x /usr/bin/Xdialog ] && DIALOG="Xdialog" #Detects every wireless card installed for device in `cat /proc/net/wireless | grep : | tr -cs "[A-Z][a-z]" | cut -f2 -d' ' | cut -f1 -d':'`; do WLAN_DEVICES=" $WLAN_DEVICES $device $MSG_CONFIG_WIRELESS_CARD_TYPE" done #Asks the user wich wireless card to use $DIALOG --title "$MSG_CONFIG_TITLE_WIRELESS_CARDS" --menu "$MSG_CONFIG_WIRELESS_CARDS" 0 0 5 \ $WLAN_DEVICES 2> /tmp/menu.tmp.$$ retvalwlandevice=$? choice_wlandevice=`cat /tmp/menu.tmp.$$` rm -f /tmp/menu.tmp.$$ case $retvalwlandevice in 0) #Asks the user wich wireless driver to use $DIALOG --title "$MSG_CONFIG_TITLE_WIRELESS_DRIVER" --menu "$MSG_CONFIG_WIRELESS_DRIVER" 15 60 0 \ "$MSG_CONFIG_WIRELESS_DRIVER_WEXT_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_WEXT_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_HOSTAP_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_HOSTAP_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_PRISM54_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_PRISM54_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_MADWIFI_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_MADWIFI_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_ATMEL_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_ATMEL_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_NDIS_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_NDIS_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_IPW_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_IPW_OPTION_INFO" \ "$MSG_CONFIG_WIRELESS_DRIVER_IPW3945_OPTION" "$MSG_CONFIG_WIRELESS_DRIVER_IPW3945_OPTION_INFO" 2> /tmp/menu.tmp.$$ retvaldriver=$? choice_wlandriver=`cat /tmp/menu.tmp.$$` rm -f /tmp/menu.tmp.$$ case $retvaldriver in 0) #Asks the user the username of the connection $DIALOG --title "$MSG_CONFIG_TITLE_USERNAME" --inputbox "$MSG_CONFIG_USERNAME" 0 0 $USERNAME 2> /tmp/inputboxusername.tmp.$$ retvalname=$? input_username=`cat /tmp/inputboxusername.tmp.$$` rm -f /tmp/inputboxusername.tmp.$$ case $retvalname in 0) #Asks the user the password of the connection $DIALOG --title "$MSG_CONFIG_TITLE_PASSWORD" \ --passwordbox "$MSG_CONFIG_PASSWORD" 0 0 2> /tmp/inputboxpassword.tmp.$$ #--password --inputbox "$MSG_CONFIG_PASSWORD" 0 0 2> /tmp/inputboxpassword.tmp.$$ retvalpassword=$? input_password=`cat /tmp/inputboxpassword.tmp.$$` rm -f /tmp/inputboxpassword.tmp.$$ case $retvalpassword in 0) #Asks the user the ap_scan option to use $DIALOG --title "$MSG_CONFIG_TITLE_AP_SCAN" --menu "$MSG_CONFIG_AP_SCAN" 15 60 5 \ "$MSG_CONFIG_SCAN_AP_0_OPTION" "$MSG_CONFIG_SCAN_AP_0_OPTION_INFO" \ "$MSG_CONFIG_SCAN_AP_1_OPTION" "$MSG_CONFIG_SCAN_AP_1_OPTION_INFO" \ "$MSG_CONFIG_SCAN_AP_2_OPTION" "$MSG_CONFIG_SCAN_AP_2_OPTION_INFO" 2> /tmp/menu.tmp.$$ retvalap_scan=$? choice_scan_ap=`cat /tmp/menu.tmp.$$` rm -f /tmp/menu.tmp.$$ case $retvalap_scan in 0) #Asks the user the essid of the network $DIALOG --title "$MSG_CONFIG_TITLE_ESSID" --inputbox "$MSG_CONFIG_ESSID" 10 40 $ESSID 2> /tmp/inputboxessid.tmp.$$ retvalessid=$? input_essid=`cat /tmp/inputboxessid.tmp.$$` rm -f /tmp/inputboxessid.tmp.$$ case $retvalessid in 0) #Rewrite this script, assigning the variables in the begining of this script with the choices made the user earlier sed '-e/INTERFACE=.*/{;s/INTERFACE=.*/INTERFACE="'$choice_wlandevice'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 sed '-e/DRIVER=.*/{;s/DRIVER=.*/DRIVER="'$choice_wlandriver'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 sed '-e/USERNAME=.*/{;s/USERNAME=.*/USERNAME="'$input_username'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 sed '-e/PASSWORD=.*/{;s/PASSWORD=.*/PASSWORD="'$input_password'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 sed '-e/AP_SCAN=.*/{;s/AP_SCAN=.*/AP_SCAN="'$choice_scan_ap'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 sed '-e/ESSID=.*/{;s/ESSID=.*/ESSID="'$input_essid'"/;:a' '-en;ba' '-e}' <$0 > /tmp/menu.tmp.$$ mv /tmp/menu.tmp.$$ $0 chmod +x $0 ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac ;; 1) echo $MSG_CANCEL_PRESSED;; 255) echo $MSG_BOX_CLOSED;; esac } printmsg() { echo "$MSG_USAGE_MESSAGE" exit 0 } if [ $# -lt 1 -o $# -gt 1 ] then printmsg; else if [ $1 = "start" ] then start; exit 0 else if [ $1 = "restart" ] then restart; exit 0 else if [ $1 = "stop" ] then stop; exit 0 else if [ $1 = "status" ] then status; exit 0 else if [ $1 = "config" ] then config; exit 0 else printmsg; fi fi fi fi fi fi