1 # 2 # 3 # Copyright (C) 2012 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 # 17 # 18 # Script that turns on useful logging for flimflam 19 20 FLIMFLAM="org.chromium.flimflam" 21 MANAGER="${FLIMFLAM}.Manager" 22 SEND_FF_CMD="dbus-send --system --dest=${FLIMFLAM} --print-reply / $MANAGER" 23 24 FF_TAGLIST=`${SEND_FF_CMD}.ListDebugTags | sed -e '/string/!d; s/[[:space:]]\+/ /g' | cut -d "\"" -f 2 | tr "+" " "` 25 26 usage(){ 27 echo " 28 Usage: ff_debug [<tag_expression>]|[--reset]|[--help]|[--list_valid_tags]|[--level <level>] 29 30 ff_debug adds and removes debug tags for flimflam. 31 Current debug settings are displayed if no parameters are provided 32 33 <tag_expression> is defined in boolean notation using <debug_tag> separated 34 by an operator [+-], where + and - imply adding and removing of the tag immediately 35 following the operator. An expression beginning with either operators [+-] 36 takes the existing tags and modifies them appropriately. Otherwise, the existing tags 37 are replaced by those specified in the command. 38 39 <debug_tag> can be listed using the --list_valid_tags 40 41 e.g.: ff_debug network+wifi 42 Sets debug tags to network and wifi 43 e.g.: ff_debug +network-service 44 Adds network and removes service tags from the existing debug settings 45 46 --list_valid_tags : Displays all valid tags 47 48 --level: Displays or sets current debug level for logging 49 All messages at, or above, the current log level are logged. Normal log 50 levels range from 4 (LOG_FATAL) to 0 (LOG_INFO). In addition VERBOSE log 51 levels are available starting at -1. 52 53 e.g.: ff_debug --level 4 54 Logs only FATAL messages. 55 e.g.: ff_debug --level 0 56 Logs INFO, WARNING, ERROR, ERROR_REPORT, and FATAL messages. 57 e.g.: ff_debug --level -4 58 Logs everything that "--level 0" does, plus SLOG(<tag>, <n>) messages, 59 where <tag> has been enabled for logging, and <n> <= 4. (NOTE: you must 60 negate SLOG levels for use with ff_debug. In this example, SLOG(<tag>, 4) 61 maps to "--level -4".) 62 63 --reset : Removes all tagging 64 65 --help : Displays this output 66 " 67 } 68 69 get_ff_debug_tags() { 70 ${SEND_FF_CMD}.GetDebugTags 2>/dev/null | sed -e '/string/!d; s/[[:space:]]\+/ /g' | cut -d "\"" -f 2 71 } 72 73 set_ff_debug_tags() { 74 ${SEND_FF_CMD}.SetDebugTags string:"$1" > /dev/null 2>&1 75 } 76 77 get_ff_debug_level() { 78 ${SEND_FF_CMD}.GetDebugLevel 2>/dev/null | sed -e '/int32/!d; s/[[:space:]]\+/ /g' | cut -d " " -f 3 79 } 80 81 set_ff_debug_level() { 82 ${SEND_FF_CMD}.SetDebugLevel int32:"$1" > /dev/null 2>&1 83 } 84 85 starting_ff_tags=`get_ff_debug_tags` 86 # Global strings 87 ff_tags_to_set=$starting_ff_tags 88 89 # Returns whether or not $2 exists in $1 where $1 is a space 90 # separated list of tags 91 is_valid_tag(){ 92 expr " $1 " : ".* $2 .*"> /dev/null 93 } 94 95 # Takes a boolean expression and changes 96 # flimflam string appropriately 97 modify_flimflam_tag_string(){ 98 if [ -n "$1" ]; then 99 for tag in `echo "$1" | sed 's/[+-]/ &/g'`; do 100 101 # Skip the tag if it's not in the list of valid tags 102 if ! is_valid_tag "$FF_TAGLIST" "`echo $tag | sed 's/^[+-]//'`"; then 103 continue 104 fi 105 106 case $tag in 107 -*) 108 tag=`echo $tag | sed 's/-//'` 109 if [ -n "$tag" ]; then 110 # First check/remove instances where it lies between +'s 111 # Then check/remove instances where it lies at the ends 112 ff_tags_to_set=`echo $ff_tags_to_set \ 113 | sed 's/+'$tag'+/+/g' \ 114 | sed 's/\(^\|+\)'$tag'\(+\|$\)//g'` 115 fi 116 ;; 117 +*) 118 tag=`echo $tag | sed 's/+//'` 119 if [ -z "$tag" ]; then 120 continue 121 # Check if exact tag is between + symbols, or at the ends of expression 122 elif [ -n "`echo "$ff_tags_to_set" | egrep "\+$tag\+|\+$tag$|^$tag\+"`" ]; then 123 continue 124 elif [ -n "$ff_tags_to_set" ]; then 125 ff_tags_to_set="${ff_tags_to_set}+${tag}" 126 else 127 ff_tags_to_set="$tag" 128 fi 129 ;; 130 *) 131 ff_tags_to_set="$tag" 132 ;; 133 esac 134 done 135 ff_tags_to_set=`echo "$ff_tags_to_set" | sed 's/^+//'` 136 else 137 ff_tags_to_set="" 138 fi 139 } 140 141 get_or_set_debug_level() { 142 local ff_debug_level=`get_ff_debug_level` 143 if [ -z "$ff_debug_level" ]; then 144 # flimflam does not implement GetDebugLevel / SetDebugLevel, simply return 145 return 146 fi 147 148 if [ $# -gt 0 ]; then 149 echo "Old flimflam debug level: $ff_debug_level" 150 set_ff_debug_level "$1" 151 ff_debug_level=`get_ff_debug_level` 152 fi 153 echo "Current flimflam debug level: $ff_debug_level" 154 } 155 156 if [ $# -gt 0 ]; then 157 while [ $# -gt 0 ]; do 158 case "$1" in 159 --reset) 160 ff_tags_to_set="" 161 break 162 ;; 163 --level) 164 shift # move forward to the <level> argument if specified 165 get_or_set_debug_level "$@" 166 exit 0 167 ;; 168 --list*) 169 echo "Valid Tags: [`echo $FF_TAGLIST | sed 's/ /, /g'`]" 170 exit 0 171 ;; 172 --help|--*) 173 usage 174 exit 0 175 ;; 176 *) 177 modify_flimflam_tag_string "$1" 178 ;; 179 esac 180 shift 181 done 182 183 # set tags only when the starting and ending are different 184 if [ "$ff_tags_to_set" != "$starting_ff_tags" ]; then 185 set_ff_debug_tags "$ff_tags_to_set" 186 fi 187 echo "Old flimflam tags: [$starting_ff_tags]" 188 fi 189 echo "Current flimflam tags: [`get_ff_debug_tags`]" 190