2591d483c8
Best practices so that device can set logd.logpersistd properties. Values can be overriden with trampolines for persist.logd.logpersistd values except as designed for empty content to keep out of the way. This allows us to set logd.logpersistd* for a non-persistent collection that does not survive a reboot, and to use persist.logd.logpersistd* for persistent collection that does survive a reboot. Added logd.logpersistd.enable to gate when logpersist service can be run allowing the properties to be adjusted safely prior to this state as is the case for device property. NB: /init will complain when trying to trampoline an empty property, this is acceptable for functionality, but may be considered annoying from the logging perspective. Bug: 28936216 Bug: 29831823 Change-Id: I97317e8eedfae4daa8e3ef39e64e7c5c23d8b573
160 lines
4.8 KiB
Bash
Executable file
160 lines
4.8 KiB
Bash
Executable file
#! /system/bin/sh
|
|
# logpersist cat, start and stop handlers
|
|
progname="${0##*/}"
|
|
case `getprop ro.debuggable` in
|
|
1) ;;
|
|
*) echo "${progname} - Permission denied"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
property=persist.logd.logpersistd
|
|
|
|
case `getprop ${property#persist.}.enable` in
|
|
true) ;;
|
|
*) echo "${progname} - Disabled"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
data=/data/misc/logd
|
|
service=logcatd
|
|
size_default=256
|
|
buffer_default=all
|
|
args="${@}"
|
|
|
|
size=${size_default}
|
|
buffer=${buffer_default}
|
|
clear=false
|
|
while [ ${#} -gt 0 ]; do
|
|
case ${1} in
|
|
-c|--clear) clear=true ;;
|
|
--size=*) size="${1#--size=}" ;;
|
|
--rotate-count=*) size="${1#--rotate-count=}" ;;
|
|
-n|--size|--rotate-count) size="${2}" ; shift ;;
|
|
--buffer=*) buffer="${1#--buffer=}" ;;
|
|
-b|--buffer) buffer="${2}" ; shift ;;
|
|
-h|--help|*)
|
|
LEAD_SPACE_="`echo ${progname%.*} | tr '[ -~]' ' '`"
|
|
echo "${progname%.*}.cat - dump current ${service} logs"
|
|
echo "${progname%.*}.start [--size=<size_in_kb>] [--buffer=<buffers>] [--clear]"
|
|
echo "${LEAD_SPACE_} - start ${service} service"
|
|
echo "${progname%.*}.stop [--clear] - stop ${service} service"
|
|
case ${1} in
|
|
-h|--help) exit 0 ;;
|
|
*) echo ERROR: bad argument ${@} >&2 ; exit 1 ;;
|
|
esac
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ -z "${size}" -o "${size_default}" = "${size}" ]; then
|
|
unset size
|
|
fi
|
|
if [ -n "${size}" ] &&
|
|
! ( [ 0 -lt "${size}" ] && [ 2048 -ge "${size}" ] ) >/dev/null 2>&1; then
|
|
echo ERROR: Invalid --size ${size} >&2
|
|
exit 1
|
|
fi
|
|
if [ -z "${buffer}" -o "${buffer_default}" = "${buffer}" ]; then
|
|
unset buffer
|
|
fi
|
|
if [ -n "${buffer}" ] && ! logcat -b ${buffer} -g >/dev/null 2>&1; then
|
|
echo ERROR: Invalid --buffer ${buffer} >&2
|
|
exit 1
|
|
fi
|
|
|
|
case ${progname} in
|
|
*.cat)
|
|
if [ -n "${size}${buffer}" -o "true" = "${clear}" ]; then
|
|
echo WARNING: Can not use --clear, --size or --buffer with ${progname%.*}.cat >&2
|
|
fi
|
|
su logd ls "${data}" |
|
|
tr -d '\r' |
|
|
sort -ru |
|
|
sed "s#^#${data}/#" |
|
|
su logd xargs cat
|
|
;;
|
|
*.start)
|
|
current_buffer="`getprop ${property#persist.}.buffer`"
|
|
current_size="`getprop ${property#persist.}.size`"
|
|
if [ "${service}" = "`getprop ${property#persist.}`" ]; then
|
|
if [ "true" = "${clear}" ]; then
|
|
setprop ${property#persist.} "clear"
|
|
elif [ "${buffer}|${size}" != "${current_buffer}|${current_size}" ]; then
|
|
echo "ERROR: Changing existing collection parameters from" >&2
|
|
if [ "${buffer}" != "${current_buffer}" ]; then
|
|
a=${current_buffer}
|
|
b=${buffer}
|
|
if [ -z "${a}" ]; then a="${default_buffer}"; fi
|
|
if [ -z "${b}" ]; then b="${default_buffer}"; fi
|
|
echo " --buffer ${a} to ${b}" >&2
|
|
fi
|
|
if [ "${size}" != "${current_size}" ]; then
|
|
a=${current_size}
|
|
b=${size}
|
|
if [ -z "${a}" ]; then a="${default_size}"; fi
|
|
if [ -z "${b}" ]; then b="${default_size}"; fi
|
|
echo " --size ${a} to ${b}" >&2
|
|
fi
|
|
echo " Are you sure you want to do this?" >&2
|
|
echo " Suggest add --clear to erase data and restart with new settings." >&2
|
|
echo " To blindly override and retain data, ${progname%.*}.stop first." >&2
|
|
exit 1
|
|
fi
|
|
elif [ "true" = "${clear}" ]; then
|
|
setprop ${property#persist.} "clear"
|
|
fi
|
|
if [ -n "${buffer}${current_buffer}" ]; then
|
|
setprop ${property}.buffer "${buffer}"
|
|
if [ -z "${buffer}" ]; then
|
|
# deal with trampoline for empty properties
|
|
setprop ${property#persist.}.buffer ""
|
|
fi
|
|
fi
|
|
if [ -n "${size}${current_size}" ]; then
|
|
setprop ${property}.size "${size}"
|
|
if [ -z "${size}" ]; then
|
|
# deal with trampoline for empty properties
|
|
setprop ${property#persist.}.size ""
|
|
fi
|
|
fi
|
|
while [ "clear" = "`getprop ${property#persist.}`" ]; do
|
|
continue
|
|
done
|
|
# ${service}.rc does the heavy lifting with the following trigger
|
|
setprop ${property} ${service}
|
|
# 20ms done, to permit process feedback check
|
|
sleep 1
|
|
getprop ${property#persist.}
|
|
# also generate an error return code if not found running
|
|
pgrep -u ${data##*/} ${service%d}
|
|
;;
|
|
*.stop)
|
|
if [ -n "${size}${buffer}" ]; then
|
|
echo "WARNING: Can not use --size or --buffer with ${progname%.*}.stop" >&2
|
|
fi
|
|
if [ "true" = "${clear}" ]; then
|
|
setprop ${property} "clear"
|
|
else
|
|
setprop ${property} "stop"
|
|
fi
|
|
if [ -n "`getprop ${property#persist.}.buffer`" ]; then
|
|
setprop ${property}.buffer ""
|
|
# deal with trampoline for empty properties
|
|
setprop ${property#persist.}.buffer ""
|
|
fi
|
|
if [ -n "`getprop ${property#persist.}.size`" ]; then
|
|
setprop ${property}.size ""
|
|
# deal with trampoline for empty properties
|
|
setprop ${property#persist.}.size ""
|
|
fi
|
|
while [ "clear" = "`getprop ${property#persist.}`" ]; do
|
|
continue
|
|
done
|
|
;;
|
|
*)
|
|
echo "ERROR: Unexpected command ${0##*/} ${args}" >&2
|
|
exit 1
|
|
esac
|