#
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Script that turns on useful logging for wpa_supplicant


WPA_LEVEL_LIST="excessive msgdump debug info warning error"

usage(){
  echo "
Usage: wpa_debug [level]|[--reset]|[--help][--list_valid_levels]

  wpa_debug sets the debug level of wpa_supplicant.
  Current debug level is displayed if no parameters are provided

  level: The level is the level we want to set the debugging level to. The valid
         levels can be viewed by using the --list_valid_levels flag

         eg: wpa_debug msgdump
           Sets the wpa_supplicant logging level to msgdump

  --reset : Resets the level to 'info'

  --help : Displays this output

  --list_valid_levels: Displays the valid levels wpa_supplicant can be set to
"
}

CMD_FLAG="<<cmd>>"

WPA_CMD="dbus-send --system --dest=fi.w1.wpa_supplicant1 --print-reply /fi/w1/wpa_supplicant1 org.freedesktop.DBus.Properties.$CMD_FLAG string:fi.w1.wpa_supplicant1 string:DebugLevel"

# Returns whether or not $2 exists in $1 where $1 is a space
# separated list of tags
is_valid_tag(){
  expr " $1 " : ".* $2 .*"> /dev/null
}

get_wpa_logging(){
  set_cmd="`echo $WPA_CMD | sed "s/$CMD_FLAG/Get/"`"
  $set_cmd | sed -e '/string/!d; s/[[:space:]]\+/ /g' | cut -d "\"" -f 2
}

set_wpa_logging(){
  if ! is_valid_tag "$WPA_LEVEL_LIST" "$1"; then
    return 1
  fi

  if [ $1 = `get_wpa_logging` ]; then
    return 1
  fi

  set_cmd="`echo $WPA_CMD | sed "s/$CMD_FLAG/Set/"` variant:string:$1"
  $set_cmd
}


if [ $# -gt 0 ]; then
  for param in "$@"; do
    case $param in
    --reset)
      set_wpa_logging "info"
      ;;
    --list*)
      echo "Valid levels are: `echo $WPA_LEVEL_LIST| sed 's/ /, /g'`"
      exit 0
      ;;
    --help|--*)
      usage
      exit 0
      ;;
    *)
      old_level="`get_wpa_logging`"
      set_wpa_logging "$param"
      echo "Old wpa level: $old_level"
      ;;
    esac
  done
fi

echo "Current wpa level: `get_wpa_logging`"

