1100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn#! /system/bin/sh
22e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn# logpersist cat, start and stop handlers
31b9456a1a55fdf5da9dcc63416de606e3cb09d97Mark Salyzynprogname="${0##*/}"
4d1f41d606b3b3e013014506bfa1cea09c15d2308Mark Salyzyncase `getprop ro.debuggable` in
5d1f41d606b3b3e013014506bfa1cea09c15d2308Mark Salyzyn1) ;;
61b9456a1a55fdf5da9dcc63416de606e3cb09d97Mark Salyzyn*) echo "${progname} - Permission denied"
71b9456a1a55fdf5da9dcc63416de606e3cb09d97Mark Salyzyn   exit 1
81b9456a1a55fdf5da9dcc63416de606e3cb09d97Mark Salyzyn   ;;
91b9456a1a55fdf5da9dcc63416de606e3cb09d97Mark Salyzynesac
102e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn
11100658c303919d8f69c76f6f25eac376795712f0Mark Salyzynproperty=persist.logd.logpersistd
122591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn
132591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyncase `getprop ${property#persist.}.enable` in
142591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyntrue) ;;
152591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn*) echo "${progname} - Disabled"
162591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn   exit 1
172591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn   ;;
182591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzynesac
192591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn
202e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzynlog_uid=logd
216a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzynlog_tag_property=persist.log.tag
222e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyndata=/data/misc/logd/logcat
23100658c303919d8f69c76f6f25eac376795712f0Mark Salyzynservice=logcatd
242e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynsize_default=256
252e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynbuffer_default=all
262e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynargs="${@}"
272e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn
282e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynsize=${size_default}
292e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynbuffer=${buffer_default}
302e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynclear=false
312e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynwhile [ ${#} -gt 0 ]; do
322e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  case ${1} in
332e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    -c|--clear) clear=true ;;
342e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    --size=*) size="${1#--size=}" ;;
352e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    --rotate-count=*) size="${1#--rotate-count=}" ;;
362e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    -n|--size|--rotate-count) size="${2}" ; shift ;;
372e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    --buffer=*) buffer="${1#--buffer=}" ;;
382e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    -b|--buffer) buffer="${2}" ; shift ;;
392e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    -h|--help|*)
402e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      LEAD_SPACE_="`echo ${progname%.*} | tr '[ -~]' ' '`"
411d945119c0b7e99dc720c1872c7b833b0a527476Mark Salyzyn      echo "${progname%.*}.cat             - dump current ${service} logs"
422e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo "${progname%.*}.start [--size=<size_in_kb>] [--buffer=<buffers>] [--clear]"
432e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo "${LEAD_SPACE_}                 - start ${service} service"
442e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo "${progname%.*}.stop [--clear]  - stop ${service} service"
452e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      case ${1} in
462e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        -h|--help) exit 0 ;;
472e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        *) echo ERROR: bad argument ${@} >&2 ; exit 1 ;;
482e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      esac
492e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      ;;
502e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  esac
512e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  shift
522e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyndone
532e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn
542e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynif [ -z "${size}" -o "${size_default}" = "${size}" ]; then
552e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  unset size
56100658c303919d8f69c76f6f25eac376795712f0Mark Salyzynfi
572e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynif [ -n "${size}" ] &&
582e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  ! ( [ 0 -lt "${size}" ] && [ 2048 -ge "${size}" ] ) >/dev/null 2>&1; then
592e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  echo ERROR: Invalid --size ${size} >&2
602e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  exit 1
612e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynfi
622e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynif [ -z "${buffer}" -o "${buffer_default}" = "${buffer}" ]; then
632e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  unset buffer
642e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynfi
652e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynif [ -n "${buffer}" ] && ! logcat -b ${buffer} -g >/dev/null 2>&1; then
662e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  echo ERROR: Invalid --buffer ${buffer} >&2
672e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  exit 1
682e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzynfi
692e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn
706a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzynlog_tag="`getprop ${log_tag_property}`"
716a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzynlogd_logpersistd="`getprop ${property}`"
726a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn
73100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyncase ${progname} in
74100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn*.cat)
752e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  if [ -n "${size}${buffer}" -o "true" = "${clear}" ]; then
762e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    echo WARNING: Can not use --clear, --size or --buffer with ${progname%.*}.cat >&2
772e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
782e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyn  su ${log_uid} ls "${data%/*}" |
79100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  tr -d '\r' |
80100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  sort -ru |
812e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyn  sed "s#^#${data%/*}/#" |
822e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyn  grep "${data}[.]*[0-9]*\$" |
832e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyn  su ${log_uid} xargs cat
84100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  ;;
85100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn*.start)
862591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  current_buffer="`getprop ${property#persist.}.buffer`"
872591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  current_size="`getprop ${property#persist.}.size`"
882591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  if [ "${service}" = "`getprop ${property#persist.}`" ]; then
892e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    if [ "true" = "${clear}" ]; then
902591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn      setprop ${property#persist.} "clear"
912e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    elif [ "${buffer}|${size}" != "${current_buffer}|${current_size}" ]; then
922e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo   "ERROR: Changing existing collection parameters from" >&2
932e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      if [ "${buffer}" != "${current_buffer}" ]; then
942e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        a=${current_buffer}
952e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        b=${buffer}
962e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        if [ -z "${a}" ]; then a="${default_buffer}"; fi
972e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        if [ -z "${b}" ]; then b="${default_buffer}"; fi
982e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        echo "           --buffer ${a} to ${b}" >&2
992e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      fi
1002e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      if [ "${size}" != "${current_size}" ]; then
1012e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        a=${current_size}
1022e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        b=${size}
1032e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        if [ -z "${a}" ]; then a="${default_size}"; fi
1042e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        if [ -z "${b}" ]; then b="${default_size}"; fi
1052e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn        echo "           --size ${a} to ${b}" >&2
1062e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      fi
1072e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo   "       Are you sure you want to do this?" >&2
1082e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo   "       Suggest add --clear to erase data and restart with new settings." >&2
1092e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      echo   "       To blindly override and retain data, ${progname%.*}.stop first." >&2
1102e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn      exit 1
1112e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    fi
112cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  elif [ "true" = "${clear}" ]; then
1132591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    setprop ${property#persist.} "clear"
1142e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
1152e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  if [ -n "${buffer}${current_buffer}" ]; then
1168d2a65572b5aa3d7d3885bd1b46d7c1f22e052b6Mark Salyzyn    setprop ${property}.buffer "${buffer}"
1172591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    if [ -z "${buffer}" ]; then
1182591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn      # deal with trampoline for empty properties
1192591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn      setprop ${property#persist.}.buffer ""
1202591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    fi
1212e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
1222e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  if [ -n "${size}${current_size}" ]; then
1238d2a65572b5aa3d7d3885bd1b46d7c1f22e052b6Mark Salyzyn    setprop ${property}.size "${size}"
1242591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    if [ -z "${size}" ]; then
1252591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn      # deal with trampoline for empty properties
1262591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn      setprop ${property#persist.}.size ""
1272591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    fi
1282e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
1292591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  while [ "clear" = "`getprop ${property#persist.}`" ]; do
130cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn    continue
131cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  done
1326a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn  # Tell Settings that we are back on again if we turned logging off
1336a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn  tag="${log_tag#Settings}"
1346a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn  if [ X"${log_tag}" != X"${tag}" ]; then
1356a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn    echo "WARNING: enabling logd service" >&2
1366a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn    setprop ${log_tag_property} "${tag#,}"
1376a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn  fi
1382e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  # ${service}.rc does the heavy lifting with the following trigger
1398d2a65572b5aa3d7d3885bd1b46d7c1f22e052b6Mark Salyzyn  setprop ${property} ${service}
1402e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  # 20ms done, to permit process feedback check
141100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  sleep 1
1422591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  getprop ${property#persist.}
1431d945119c0b7e99dc720c1872c7b833b0a527476Mark Salyzyn  # also generate an error return code if not found running
1442e5b71873c2e64ff7fd7092ea653e85b6fcea31bMark Salyzyn  pgrep -u ${log_uid} ${service%d}
145100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  ;;
146100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn*.stop)
1472e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  if [ -n "${size}${buffer}" ]; then
1482e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn    echo "WARNING: Can not use --size or --buffer with ${progname%.*}.stop" >&2
1492e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
150cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  if [ "true" = "${clear}" ]; then
151cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn    setprop ${property} "clear"
152cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  else
153cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn    setprop ${property} "stop"
154cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  fi
1552591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  if [ -n "`getprop ${property#persist.}.buffer`" ]; then
1568d2a65572b5aa3d7d3885bd1b46d7c1f22e052b6Mark Salyzyn    setprop ${property}.buffer ""
1572591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    # deal with trampoline for empty properties
1582591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    setprop ${property#persist.}.buffer ""
1592e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
1602591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  if [ -n "`getprop ${property#persist.}.size`" ]; then
1618d2a65572b5aa3d7d3885bd1b46d7c1f22e052b6Mark Salyzyn    setprop ${property}.size ""
1622591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    # deal with trampoline for empty properties
1632591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn    setprop ${property#persist.}.size ""
1642e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  fi
1652591d483c83a09eb8689e6e7869b4ac0bfe418dbMark Salyzyn  while [ "clear" = "`getprop ${property#persist.}`" ]; do
166cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn    continue
167cd5118bf1edc257cfd4ff02ea1145b5d7b3153d9Mark Salyzyn  done
168100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  ;;
169100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn*)
1702e210e4650f3e1ce9be6c7933b4bcbbc12c8eeb7Mark Salyzyn  echo "ERROR: Unexpected command ${0##*/} ${args}" >&2
171100658c303919d8f69c76f6f25eac376795712f0Mark Salyzyn  exit 1
172100658c303919d8f69c76f6f25eac376795712f0Mark Salyzynesac
1736a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn
1746a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzynif [ X"${log_tag}" != X"`getprop ${log_tag_property}`" ] ||
1756a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn   [ X"${logd_logpersistd}" != X"`getprop ${property}`" ]; then
176452eaf7d5b23a866db79756f450287e5a4d9e7c9Mark Salyzyn  echo "WARNING: killing Settings application to pull in new values" >&2
1776a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzyn  am force-stop com.android.settings
1786a7bfd8749982ef9f64179ca9da3d104ebd177f8Mark Salyzynfi
179