Advanced Wifi/wrapper
Jump to navigation
Jump to search
This shell wrapper around wpa_supplicant inject custom wifi settings into running wpa_supplicant. More informations about topic can be found at Advanced_Wifi page.
#!/bin/sh ## This is wrapper around wpa_supplicant binary. ## ## version 0.0.1 proof of concept ## no responsibility, no warranty, works for me (Veer 8G, WebOS 2.1.2), YMMV ## ## author: Matej Zagiba ## license: any version of GPL ## ## Installation and usage: ## 1. turn off wifi ## 2. connect to Your WebOS device and copy original binary file: ## # cp /usr/sbin/wpa_supplicant /usr/sbin/wpa_supplicant.real ## 3. put this file on wpa_supplicant's place and rename it: ## # cp /media/internal/wpa_supplicant.wrapper /usr/sbin/wpa_supplicant ## 4. put customized config in /media/internal/.wpa_supplicant.conf ## or any other convenient place. Remember - passwords are stored ## in that file. Update configuration file location in WPA_CONFIG variable ## 5. from http://packages.debian.org/wheezy/wpasupplicant download package ## with correct architecture (HP veer uses armel) extract wpa_cli binary ## and copy it in place e.g.: ## # cp /media/internal/wpa_cli /usr/sbin ## 6. correct permisions: ## # chmod 755 /usr/sbin/wpa_supplicant /usr/sbin/wpa_cli ## ## Installation is now completed ## ## All networks defined in original wifi application will continue working ## and can be managed through original interface. Network settings in custom ## config file will overwrite definitions in built-in application. ## So for any configuration change in custom networks edit configuration ## file by Your favorite editor ## ## To use it: ## - first define new network(s) in the configuration file, ## use any option You wish, use wpa_supplicant config file format: ## every option on single line ## "network={" and "}" and comment also on single line, ## best way for now is to export settings from another system ## - then turn on wifi ## - from WiFi Preferences applet select "Join network" and enter name of the network ## You just configured, select security type - Open ## - Enjoy new wifi connection ## - If there are more than one network in the area, pease turn wifi off and on between ## each new network definition in GUI WPA_CONFIG="/media/internal/.wpa_supplicant.conf" WPA_CLI="/usr/sbin/wpa_cli" ## no user editable settings belove here OIFS="$IFS" ## define functions merge_wifi_settings () { IFS=" " READING_NETWORK=0 # read and apply user configuration # for LINE_IN in `cat "$WPA_CONFIG"`; do IFS="$OIFS" # get rid of leading and trailing blanks and remove comments LINE_IN=`sed -e "s/^[[:space:]]*//" -e "s/[[:space:]]*$//" -e "s/^#.*$//" <<EOF $LINE_IN` # skip empty lines [ "o$LINE_IN" = "o" ] && continue OPTION="${LINE_IN%%=*}" VALUE="${LINE_IN#*=}" case "$LINE_IN" in # start of network block "network={"*) READING_NETWORK=1 ;; # SSID of the network, fun starts here # we expect ssid to be first thing set in network block "ssid="*) NET_SSID="${VALUE#\"}" NET_SSID="${NET_SSID%\"}" # is such a network allready know by wpa_supplicant? NET_ENTRY=`$WPA_CLI list_networks | grep "$NET_SSID"` if [ "o$NET_ENTRY" = "o" ]; then # skipp this network, until it's configured via GUI READING_NETWORK=0 else NET_ID="${NET_ENTRY%% *}" NET_STATUS="${NET_ENTRY##* }" # are we connected to this network? if [ "o$NET_STATUS" = 'o[CURRENT]' ]; then # if yes, no need to reconfigure wpa_supplicant READING_NETWORK=0 else # if no, we disable network to be able modify setting "$WPA_CLI" "DISABLE_NETWORK" "$NET_ID" >/dev/null fi fi ;; # end of network block - enable network, if needed and reset variables "}") if [ "o$READING_NETWORK" = "o1" ]; then "$WPA_CLI" "ENABLE_NETWORK" "$NET_ID" >/dev/null fi READING_NETWORK=0 unset NET_ENTRY NET_ID NET_STATUS OPTION VALUE ;; # update current option if reading network definition *) if [ "o$READING_NETWORK" = "o1" ]; then "$WPA_CLI" SET_NETWORK "$NET_ID" "$OPTION" "$VALUE" >/dev/null fi ;; esac done } ## PmWiFiService will send SIGKILL to wpa_supplicant process, which could ## leave wpa_supplicant.real running and cause problems later. ## so we do some magic with processes... if [ "o$1" = "o--SETUP-WAIT-AND-CLEANUP" ]; then shift ##just to be sure if [ -x "$WPA_CLI" ]; then "$WPA_CLI" terminate >/dev/null else pkill wpa_supplicant fi # SET UP THINGS if [ -f "$WPA_CONFIG" ]; then echo "" >>/tmp/.wpa_supplicant.conf echo "update_config=1" >>/tmp/.wpa_supplicant.conf /usr/sbin/wpa_supplicant.real "$@" -B merge_wifi_settings else /usr/sbin/wpa_supplicant.real "$@" -B fi /usr/sbin/wpa_supplicant --SLEEP-AND-UPDATE & # WAIT wait # and CLEAN UP if [ -x "$WPA_CLI" ]; then "$WPA_CLI" terminate >/dev/null else pkill wpa_supplicant fi rm -rf /tmp/.wpa_supplicant.tmp elif [ "o$1" = "o--SLEEP-AND-UPDATE" ]; then # check some basic stuff - is there executable wpa_cli? # and does user configuration exists? if [ -x "$WPA_CLI" -a -f "$WPA_CONFIG" ]; then ## - can we reach wpa_supplicant? "$WPA_CLI" status >/dev/null || exit $? while true; do sleep 5 merge_wifi_settings done else # we still want to be here and do nothing # just waiting to be killed by PmWiFiService ... while true; do sleep 30 done fi elif [ "o$1" = "o--UPDATE" ]; then # check some basic stuff - is there executable wpa_cli? # and does user configuration exists? if [ -x "$WPA_CLI" -a -f "$WPA_CONFIG" ]; then ## - can we reach wpa_supplicant? "$WPA_CLI" status >/dev/null || exit $? merge_wifi_settings fi else rm -rf /tmp/.wpa_supplicant.tmp ln -s /usr/sbin/wpa_supplicant /tmp/.wpa_supplicant.tmp exec /tmp/.wpa_supplicant.tmp --SETUP-WAIT-AND-CLEANUP "$@" fi
--Zigi004 03:10, 6 November 2012 (PST)