Difference between revisions of "Advanced Wifi/wrapper"
Jump to navigation
Jump to search
(Created page with "=Advanced WiFi wrapper= This shell wrapper arround wpa_supplicant inject custom wifi settings intorunning wpa_supplicant. More informations about topic can be found at [[Advance...") |
m (changed formatting so sed [[ expressions would not get mangled) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | = | + | 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. | ||
+ | |||
+ | <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" | ||
+ | |||
+ | ## 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]] 10 | + | --[[User:Zigi004|Zigi004]] 03:10, 6 November 2012 (PST) |
Latest revision as of 11: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)