Advanced Wifi/wrapper
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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)