Difference between revisions of "Advanced Wifi/wrapper"

From WebOS Internals
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
  
#!/bin/sh
+
## This is wrapper around wpa_supplicant binary.
 
+
##
## 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
## 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
## author: Matej Zagiba
+
##
## license: any version of GPL
+
## Installation and usage:
##
+
## 1. turn off wifi
## Installation and usage:
+
## 2. connect to Your WebOS device and copy original binary file:
## 1. turn off wifi
+
##    # cp /usr/sbin/wpa_supplicant /usr/sbin/wpa_supplicant.real
## 2. connect to Your WebOS device and copy original binary file:
+
## 3. put this file on wpa_supplicant's place and rename it:
##    # cp /usr/sbin/wpa_supplicant /usr/sbin/wpa_supplicant.real
+
##    # cp /media/internal/wpa_supplicant.wrapper /usr/sbin/wpa_supplicant
## 3. put this file on wpa_supplicant's place and rename it:
+
## 4. put customized config in /media/internal/.wpa_supplicant.conf
##    # cp /media/internal/wpa_supplicant.wrapper /usr/sbin/wpa_supplicant
+
##    or any other convenient place. Remember - passwords are stored
## 4. put customized config in /media/internal/.wpa_supplicant.conf
+
##    in that file. Update configuration file location in WPA_CONFIG variable
##    or any other convenient place. Remember - passwords are stored
+
## 5. from http://packages.debian.org/wheezy/wpasupplicant download package
##    in that file. Update configuration file location in WPA_CONFIG variable
+
##    with correct architecture (HP veer uses armel) extract wpa_cli binary
## 5. from http://packages.debian.org/wheezy/wpasupplicant download package
+
##    and copy it in place e.g.:
##    with correct architecture (HP veer uses armel) extract wpa_cli binary
+
##    # cp /media/internal/wpa_cli /usr/sbin
##    and copy it in place e.g.:
+
## 6. correct permisions:
##    # cp /media/internal/wpa_cli /usr/sbin
+
##    # chmod 755 /usr/sbin/wpa_supplicant /usr/sbin/wpa_cli
## 6. correct permisions:
+
##
##    # chmod 755 /usr/sbin/wpa_supplicant /usr/sbin/wpa_cli
+
## Installation is now completed
##
+
##
## 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
## All networks defined in original wifi application will continue working
+
## config file will overwrite definitions in built-in application.
## and can be managed through original interface. Network settings in custom
+
## So for any configuration change in custom networks edit configuration
## config file will overwrite definitions in built-in application.
+
## file by Your favorite editor
## 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,
## To use it:
+
##  use any option You wish, use wpa_supplicant config file format:
## - first define new network(s) in the configuration file,
+
##    every option on single line
##  use any option You wish, use wpa_supplicant config file format:
+
##    "network={" and "}" and comment also on single line,
##    every option on single line
+
##  best way for now is to export settings from another system
##    "network={" and "}" and comment also on single line,
+
## - then turn on wifi
##  best way for now is to export settings from another system
+
## - from WiFi Preferences applet select "Join network" and enter name of the network
## - then turn on wifi
+
##  You just configured, select security type - Open
## - from WiFi Preferences applet select "Join network" and enter name of the network
+
## - Enjoy new wifi connection
##  You just configured, select security type - Open
+
## - If there are more than one network in the area, pease turn wifi off and on between
## - Enjoy new wifi connection
+
##  each new network definition in GUI
## - 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 to ssid 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'sconfigured 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
 
                    # yes, so no need to reconfigure wpa_supplicant
 
                    READING_NETWORK=0
 
                  else
 
                    # no, so we disable network to 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
 
echo "params: $@" >>/tmp/aaa_params
 
    /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
 
  
 +
WPA_CONFIG="/media/internal/.wpa_supplicant.conf"
 +
WPA_CLI="/usr/sbin/wpa_cli"
  
--[[User:Zigi004|Zigi004]] 11:04, 1 November 2012 (PDT)
+
## 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)