xref: /aosp_15_r20/system/logging/logcat/logpersist (revision 598139dc91b21518d67c408eaea2644226490971)
1*598139dcSAndroid Build Coastguard Worker#! /system/bin/sh
2*598139dcSAndroid Build Coastguard Worker# logpersist cat, start and stop handlers
3*598139dcSAndroid Build Coastguard Workerprogname="${0##*/}"
4*598139dcSAndroid Build Coastguard Workercase `getprop ro.debuggable` in
5*598139dcSAndroid Build Coastguard Worker1) ;;
6*598139dcSAndroid Build Coastguard Worker*) echo "${progname} - Permission denied"
7*598139dcSAndroid Build Coastguard Worker   exit 1
8*598139dcSAndroid Build Coastguard Worker   ;;
9*598139dcSAndroid Build Coastguard Workeresac
10*598139dcSAndroid Build Coastguard Worker
11*598139dcSAndroid Build Coastguard Workerproperty=persist.logd.logpersistd
12*598139dcSAndroid Build Coastguard Worker
13*598139dcSAndroid Build Coastguard Workercase `getprop ${property#persist.}.enable` in
14*598139dcSAndroid Build Coastguard Workertrue) ;;
15*598139dcSAndroid Build Coastguard Worker*) echo "${progname} - Disabled"
16*598139dcSAndroid Build Coastguard Worker   exit 1
17*598139dcSAndroid Build Coastguard Worker   ;;
18*598139dcSAndroid Build Coastguard Workeresac
19*598139dcSAndroid Build Coastguard Worker
20*598139dcSAndroid Build Coastguard Workerlog_uid=logd
21*598139dcSAndroid Build Coastguard Workerlog_tag_property=persist.log.tag
22*598139dcSAndroid Build Coastguard Workerdata=/data/misc/logd/logcat
23*598139dcSAndroid Build Coastguard Workerservice=logcatd
24*598139dcSAndroid Build Coastguard Workersize_default=256
25*598139dcSAndroid Build Coastguard Workerbuffer_default=all
26*598139dcSAndroid Build Coastguard Workerargs="${@}"
27*598139dcSAndroid Build Coastguard Worker
28*598139dcSAndroid Build Coastguard Workersize=${size_default}
29*598139dcSAndroid Build Coastguard Workerbuffer=${buffer_default}
30*598139dcSAndroid Build Coastguard Workerclear=false
31*598139dcSAndroid Build Coastguard Workerwhile [ ${#} -gt 0 ]; do
32*598139dcSAndroid Build Coastguard Worker  case ${1} in
33*598139dcSAndroid Build Coastguard Worker    -c|--clear) clear=true ;;
34*598139dcSAndroid Build Coastguard Worker    --size=*) size="${1#--size=}" ;;
35*598139dcSAndroid Build Coastguard Worker    --rotate-count=*) size="${1#--rotate-count=}" ;;
36*598139dcSAndroid Build Coastguard Worker    -n|--size|--rotate-count) size="${2}" ; shift ;;
37*598139dcSAndroid Build Coastguard Worker    --buffer=*) buffer="${1#--buffer=}" ;;
38*598139dcSAndroid Build Coastguard Worker    -b|--buffer) buffer="${2}" ; shift ;;
39*598139dcSAndroid Build Coastguard Worker    -h|--help|*)
40*598139dcSAndroid Build Coastguard Worker      LEAD_SPACE_="`echo ${progname%.*} | tr '[ -~]' ' '`"
41*598139dcSAndroid Build Coastguard Worker      echo "${progname%.*}.cat             - dump current ${service} logs"
42*598139dcSAndroid Build Coastguard Worker      echo "${progname%.*}.start [--size=<size_in_kb>] [--buffer=<buffers>] [--clear]"
43*598139dcSAndroid Build Coastguard Worker      echo "${LEAD_SPACE_}                 - start ${service} service"
44*598139dcSAndroid Build Coastguard Worker      echo "${progname%.*}.stop [--clear]  - stop ${service} service"
45*598139dcSAndroid Build Coastguard Worker      case ${1} in
46*598139dcSAndroid Build Coastguard Worker        -h|--help) exit 0 ;;
47*598139dcSAndroid Build Coastguard Worker        *) echo ERROR: bad argument ${@} >&2 ; exit 1 ;;
48*598139dcSAndroid Build Coastguard Worker      esac
49*598139dcSAndroid Build Coastguard Worker      ;;
50*598139dcSAndroid Build Coastguard Worker  esac
51*598139dcSAndroid Build Coastguard Worker  shift
52*598139dcSAndroid Build Coastguard Workerdone
53*598139dcSAndroid Build Coastguard Worker
54*598139dcSAndroid Build Coastguard Workerif [ -z "${size}" -o "${size_default}" = "${size}" ]; then
55*598139dcSAndroid Build Coastguard Worker  unset size
56*598139dcSAndroid Build Coastguard Workerfi
57*598139dcSAndroid Build Coastguard Workerif [ -n "${size}" ] &&
58*598139dcSAndroid Build Coastguard Worker  ! ( [ 0 -lt "${size}" ] && [ 2048 -ge "${size}" ] ) >/dev/null 2>&1; then
59*598139dcSAndroid Build Coastguard Worker  echo ERROR: Invalid --size ${size} >&2
60*598139dcSAndroid Build Coastguard Worker  exit 1
61*598139dcSAndroid Build Coastguard Workerfi
62*598139dcSAndroid Build Coastguard Workerif [ -z "${buffer}" -o "${buffer_default}" = "${buffer}" ]; then
63*598139dcSAndroid Build Coastguard Worker  unset buffer
64*598139dcSAndroid Build Coastguard Workerfi
65*598139dcSAndroid Build Coastguard Workerif [ -n "${buffer}" ] && ! logcat -b ${buffer} -g >/dev/null 2>&1; then
66*598139dcSAndroid Build Coastguard Worker  echo ERROR: Invalid --buffer ${buffer} >&2
67*598139dcSAndroid Build Coastguard Worker  exit 1
68*598139dcSAndroid Build Coastguard Workerfi
69*598139dcSAndroid Build Coastguard Worker
70*598139dcSAndroid Build Coastguard Workerlog_tag="`getprop ${log_tag_property}`"
71*598139dcSAndroid Build Coastguard Workerlogd_logpersistd="`getprop ${property}`"
72*598139dcSAndroid Build Coastguard Worker
73*598139dcSAndroid Build Coastguard Workercase ${progname} in
74*598139dcSAndroid Build Coastguard Worker*.cat)
75*598139dcSAndroid Build Coastguard Worker  if [ -n "${size}${buffer}" -o "true" = "${clear}" ]; then
76*598139dcSAndroid Build Coastguard Worker    echo WARNING: Can not use --clear, --size or --buffer with ${progname%.*}.cat >&2
77*598139dcSAndroid Build Coastguard Worker  fi
78*598139dcSAndroid Build Coastguard Worker  su ${log_uid} ls "${data%/*}" |
79*598139dcSAndroid Build Coastguard Worker  tr -d '\r' |
80*598139dcSAndroid Build Coastguard Worker  sort -ru |
81*598139dcSAndroid Build Coastguard Worker  sed "s#^#${data%/*}/#" |
82*598139dcSAndroid Build Coastguard Worker  grep "${data}[.]*[0-9]*\$" |
83*598139dcSAndroid Build Coastguard Worker  su ${log_uid} xargs cat
84*598139dcSAndroid Build Coastguard Worker  ;;
85*598139dcSAndroid Build Coastguard Worker*.start)
86*598139dcSAndroid Build Coastguard Worker  current_buffer="`getprop ${property#persist.}.buffer`"
87*598139dcSAndroid Build Coastguard Worker  current_size="`getprop ${property#persist.}.size`"
88*598139dcSAndroid Build Coastguard Worker  if [ "${service}" = "`getprop ${property#persist.}`" ]; then
89*598139dcSAndroid Build Coastguard Worker    if [ "true" = "${clear}" ]; then
90*598139dcSAndroid Build Coastguard Worker      setprop ${property#persist.} "clear"
91*598139dcSAndroid Build Coastguard Worker    elif [ "${buffer}|${size}" != "${current_buffer}|${current_size}" ]; then
92*598139dcSAndroid Build Coastguard Worker      echo   "ERROR: Changing existing collection parameters from" >&2
93*598139dcSAndroid Build Coastguard Worker      if [ "${buffer}" != "${current_buffer}" ]; then
94*598139dcSAndroid Build Coastguard Worker        a=${current_buffer}
95*598139dcSAndroid Build Coastguard Worker        b=${buffer}
96*598139dcSAndroid Build Coastguard Worker        if [ -z "${a}" ]; then a="${default_buffer}"; fi
97*598139dcSAndroid Build Coastguard Worker        if [ -z "${b}" ]; then b="${default_buffer}"; fi
98*598139dcSAndroid Build Coastguard Worker        echo "           --buffer ${a} to ${b}" >&2
99*598139dcSAndroid Build Coastguard Worker      fi
100*598139dcSAndroid Build Coastguard Worker      if [ "${size}" != "${current_size}" ]; then
101*598139dcSAndroid Build Coastguard Worker        a=${current_size}
102*598139dcSAndroid Build Coastguard Worker        b=${size}
103*598139dcSAndroid Build Coastguard Worker        if [ -z "${a}" ]; then a="${default_size}"; fi
104*598139dcSAndroid Build Coastguard Worker        if [ -z "${b}" ]; then b="${default_size}"; fi
105*598139dcSAndroid Build Coastguard Worker        echo "           --size ${a} to ${b}" >&2
106*598139dcSAndroid Build Coastguard Worker      fi
107*598139dcSAndroid Build Coastguard Worker      echo   "       Are you sure you want to do this?" >&2
108*598139dcSAndroid Build Coastguard Worker      echo   "       Suggest add --clear to erase data and restart with new settings." >&2
109*598139dcSAndroid Build Coastguard Worker      echo   "       To blindly override and retain data, ${progname%.*}.stop first." >&2
110*598139dcSAndroid Build Coastguard Worker      exit 1
111*598139dcSAndroid Build Coastguard Worker    fi
112*598139dcSAndroid Build Coastguard Worker  elif [ "true" = "${clear}" ]; then
113*598139dcSAndroid Build Coastguard Worker    setprop ${property#persist.} "clear"
114*598139dcSAndroid Build Coastguard Worker  fi
115*598139dcSAndroid Build Coastguard Worker  if [ -n "${buffer}${current_buffer}" ]; then
116*598139dcSAndroid Build Coastguard Worker    setprop ${property}.buffer "${buffer}"
117*598139dcSAndroid Build Coastguard Worker    if [ -z "${buffer}" ]; then
118*598139dcSAndroid Build Coastguard Worker      # deal with trampoline for empty properties
119*598139dcSAndroid Build Coastguard Worker      setprop ${property#persist.}.buffer ""
120*598139dcSAndroid Build Coastguard Worker    fi
121*598139dcSAndroid Build Coastguard Worker  fi
122*598139dcSAndroid Build Coastguard Worker  if [ -n "${size}${current_size}" ]; then
123*598139dcSAndroid Build Coastguard Worker    setprop ${property}.size "${size}"
124*598139dcSAndroid Build Coastguard Worker    if [ -z "${size}" ]; then
125*598139dcSAndroid Build Coastguard Worker      # deal with trampoline for empty properties
126*598139dcSAndroid Build Coastguard Worker      setprop ${property#persist.}.size ""
127*598139dcSAndroid Build Coastguard Worker    fi
128*598139dcSAndroid Build Coastguard Worker  fi
129*598139dcSAndroid Build Coastguard Worker  while [ "clear" = "`getprop ${property#persist.}`" ]; do
130*598139dcSAndroid Build Coastguard Worker    continue
131*598139dcSAndroid Build Coastguard Worker  done
132*598139dcSAndroid Build Coastguard Worker  # Tell Settings that we are back on again if we turned logging off
133*598139dcSAndroid Build Coastguard Worker  tag="${log_tag#Settings}"
134*598139dcSAndroid Build Coastguard Worker  if [ X"${log_tag}" != X"${tag}" ]; then
135*598139dcSAndroid Build Coastguard Worker    echo "WARNING: enabling logd service" >&2
136*598139dcSAndroid Build Coastguard Worker    setprop ${log_tag_property} "${tag#,}"
137*598139dcSAndroid Build Coastguard Worker  fi
138*598139dcSAndroid Build Coastguard Worker  # ${service}.rc does the heavy lifting with the following trigger
139*598139dcSAndroid Build Coastguard Worker  setprop ${property} ${service}
140*598139dcSAndroid Build Coastguard Worker  # 20ms done, to permit process feedback check
141*598139dcSAndroid Build Coastguard Worker  sleep 1
142*598139dcSAndroid Build Coastguard Worker  getprop ${property#persist.}
143*598139dcSAndroid Build Coastguard Worker  # also generate an error return code if not found running
144*598139dcSAndroid Build Coastguard Worker  pgrep -u ${log_uid} ${service%d}
145*598139dcSAndroid Build Coastguard Worker  ;;
146*598139dcSAndroid Build Coastguard Worker*.stop)
147*598139dcSAndroid Build Coastguard Worker  if [ -n "${size}${buffer}" ]; then
148*598139dcSAndroid Build Coastguard Worker    echo "WARNING: Can not use --size or --buffer with ${progname%.*}.stop" >&2
149*598139dcSAndroid Build Coastguard Worker  fi
150*598139dcSAndroid Build Coastguard Worker  if [ "true" = "${clear}" ]; then
151*598139dcSAndroid Build Coastguard Worker    setprop ${property#persist.} "clear"
152*598139dcSAndroid Build Coastguard Worker  else
153*598139dcSAndroid Build Coastguard Worker    setprop ${property#persist.} "stop"
154*598139dcSAndroid Build Coastguard Worker  fi
155*598139dcSAndroid Build Coastguard Worker  if [ -n "`getprop ${property#persist.}.buffer`" ]; then
156*598139dcSAndroid Build Coastguard Worker    setprop ${property}.buffer ""
157*598139dcSAndroid Build Coastguard Worker    # deal with trampoline for empty properties
158*598139dcSAndroid Build Coastguard Worker    setprop ${property#persist.}.buffer ""
159*598139dcSAndroid Build Coastguard Worker  fi
160*598139dcSAndroid Build Coastguard Worker  if [ -n "`getprop ${property#persist.}.size`" ]; then
161*598139dcSAndroid Build Coastguard Worker    setprop ${property}.size ""
162*598139dcSAndroid Build Coastguard Worker    # deal with trampoline for empty properties
163*598139dcSAndroid Build Coastguard Worker    setprop ${property#persist.}.size ""
164*598139dcSAndroid Build Coastguard Worker  fi
165*598139dcSAndroid Build Coastguard Worker  while [ "clear" = "`getprop ${property#persist.}`" ]; do
166*598139dcSAndroid Build Coastguard Worker    continue
167*598139dcSAndroid Build Coastguard Worker  done
168*598139dcSAndroid Build Coastguard Worker  ;;
169*598139dcSAndroid Build Coastguard Worker*)
170*598139dcSAndroid Build Coastguard Worker  echo "ERROR: Unexpected command ${0##*/} ${args}" >&2
171*598139dcSAndroid Build Coastguard Worker  exit 1
172*598139dcSAndroid Build Coastguard Workeresac
173*598139dcSAndroid Build Coastguard Worker
174*598139dcSAndroid Build Coastguard Workerif [ X"${log_tag}" != X"`getprop ${log_tag_property}`" ] ||
175*598139dcSAndroid Build Coastguard Worker   [ X"${logd_logpersistd}" != X"`getprop ${property}`" ]; then
176*598139dcSAndroid Build Coastguard Worker  if command -v am >/dev/null; then
177*598139dcSAndroid Build Coastguard Worker    echo "WARNING: killing Settings application to pull in new values" >&2
178*598139dcSAndroid Build Coastguard Worker    am force-stop com.android.settings
179*598139dcSAndroid Build Coastguard Worker  else
180*598139dcSAndroid Build Coastguard Worker    echo "WARNING: could not kill Settings application to pull in new values: am command not found" >&2
181*598139dcSAndroid Build Coastguard Worker  fi
182*598139dcSAndroid Build Coastguard Workerfi
183