Difference between revisions of "Advanced Wifi/wrapper"
Jump to navigation
Jump to search
m (changes to the script missing $ corrected...) |
m (changed formatting so sed [[ expressions would not get mangled) |
||
Line 2: | Line 2: | ||
More informations about topic can be found at [[Advanced_Wifi]] page. | More informations about topic can be found at [[Advanced_Wifi]] page. | ||
+ | <pre> | ||
+ | #!/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" | ||
− | --[[User:Zigi004|Zigi004]] | + | ## 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 | ||
+ | </pre> | ||
+ | |||
+ | --[[User:Zigi004|Zigi004]] 03:10, 6 November 2012 (PST) |
Latest revision as of 12:10, 6 November 2012
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)