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