blob: 220ac9b66f1895cd03b3a18af14a3719bfd75dd5 [file] [log] [blame]
#!/bin/sh
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This script should be called daily to clean up log files.
CLEANUP_PAUSED_FILE="/var/lib/cleanup_logs_paused"
NUM_DAYS_TO_PRESERVE=7
STATEFUL="/mnt/stateful_partition"
# Threshold for additional histogram reporting (in 1KB blocks), 1GB in total.
ADDITIONAL_REPORTING_THRESHOLD_BLOCKS=1048576
SHADOW="/home/.shadow"
# Paths for the CRX cache. Shared with installer/crx-import.conf
UNVALIDATED_CRX_CACHE=${STATEFUL}/unencrypted/import_extensions
VALIDATED_CRX_CACHE=/var/cache/external_cache
# Get the percentage of space used on the stateful partition.
get_stateful_usage_percent() {
local stateful_space="$(df -P ${STATEFUL} | grep -m 1 ${STATEFUL})"
# Remove everything after and including the "%"
stateful_space="${stateful_space%%%*}"
# Remove all fields except the last one.
stateful_space="${stateful_space##* }"
echo $stateful_space
}
# Get the free space on the stateful partition, in 1KB blocks.
get_stateful_free_space_blocks() {
df -P ${STATEFUL} | grep -m 1 ${STATEFUL} | awk '{print $4}'
}
report_additional_statistics() {
# Number of users on device.
local user_count="$(find $SHADOW -maxdepth 1 -mindepth 1 -type d | wc -l)"
metrics_client -s Platform.DiskUsage.UsersOnDevice "${user_count}"
# Handle case when there are no users on device.
if [ "${user_count}" -le 0 ]; then
return 0
fi
local users_category=${user_count}Users
if [ "${user_count}" -eq 1 ]; then
users_category=1User
fi
if [ "${user_count}" -ge 7 ]; then
users_category=7OrMoreUsers
fi
local stats
local sum_and_max_prog='{ sum += $1;
if (max < $1) max = $1;
}
END { print sum, max }'
# All pass-through directories.
for dir in Cache Downloads GCache; do
# Calculate sum and maximum over all user_count for each directory.
stats=$(du -sk $SHADOW/*/vault/user/$dir 2> /dev/null |
awk "${sum_and_max_prog}")
metrics_client Platform.DiskUsage.${dir}_Max.${users_category} \
${stats##* } $METRICS_ARGS
# Since disk usage is several orders higher that number of users, it is safe
# to use integer division here.
metrics_client Platform.DiskUsage.${dir}_Avg.${users_category} \
$(( ${stats%% *} / ${user_count} )) $METRICS_ARGS
done
# Report days since the least frequently used account signed in.
# It is split over user_count, and is reported upon low disk space to provide
# input information for cleanup tuning.
local least_used_days=$(cryptohome --action=dump_last_activity |
awk '$2 > max {max = $2} END {print max}')
metrics_client Platform.DiskUsage.LeastUsedAccountDays.${users_category} \
${least_used_days} $METRICS_ARGS
}
remove_old_dated_files() {
find "$1" -name "$2" -mtime +${NUM_DAYS_TO_PRESERVE} -exec rm '{}' ';'
}
rotate_file() {
local file="$1"
if [ ! -f "${file}" ]; then
# Avoid creating an empty file if it does not exist to begin with
return
fi
local basename="${file%%.*}"
local extension="${file#*.}"
if [ "${basename}" = "${extension}" ]; then
extension=""
else
extension=".${extension}"
fi
echo Rotating "${file}"
for i in $(seq ${NUM_DAYS_TO_PRESERVE} -1 2); do
mv -f "${basename}.$((i - 1))${extension}" "${basename}.$i${extension}"
done
mv -f "${basename}${extension}" "${basename}.1${extension}"
touch "${basename}${extension}"
}
rotate_logs() {
echo Rotating rsyslogd logs
for x in messages secure net.log faillog session_manager; do
rotate_file "/var/log/${x}"
done
chown syslog /var/log/messages /var/log/secure /var/log/net.log
sudo pkill -HUP rsyslogd
}
# Wipe the unencyrpted CRX cache if it still exists.
wipe_crx_cache() {
# If we are on removable media or we haven't imported the crx cache,
# don't wipe.
local root_dev="$(basename "$(rootdev -s -d)")"
local removable="$(cat "/sys/block/${root_dev}/removable")" || :
local disk_percent="$(get_stateful_usage_percent)" || :
[ -z "${disk_percent}" ] && disk_percent=0
if [ ${removable:-0} -eq 0 ] && [ -d "${UNVALIDATED_CRX_CACHE}" ] && \
[ -f "${VALIDATED_CRX_CACHE}/.initialized" ] && \
[ ${disk_percent} -gt 25 ]; then
echo "Wiping unvalidated crx cache as it has already been imported."
rm -rf "${UNVALIDATED_CRX_CACHE}"
fi
}
if [ -r "${CLEANUP_PAUSED_FILE}" ]; then
echo "Exiting early because ${CLEANUP_PAUSED_FILE} exists."
exit 1
fi
# Remove old chrome logs (not logged in)
remove_old_dated_files /var/log/chrome "chrome_*-*"
# Remove old chrome logs (logged in)
remove_old_dated_files /home/chronos/user/log "chrome_*-*"
# Remove old miscellaneous UI logs
remove_old_dated_files /var/log/ui "ui.*-*"
# Remove old update engine logs
remove_old_dated_files /var/log/update_engine "update_engine.*-*"
# Remove old power manager logs
remove_old_dated_files /var/log/power_manager "power*"
# Rotate other logs
rotate_logs
# Report disk usage statistics
METRICS_ARGS="0 1073741824 50"
metrics_client Platform.DiskUsageVar \
$(du -sxk /var/ | awk '{print $1}') $METRICS_ARGS
metrics_client Platform.DiskUsageChronos \
$(du -sxk /home/chronos | awk '{print $1}') $METRICS_ARGS
# Report overall stateful usage.
metrics_client -e Platform.StatefulUsage "$(get_stateful_usage_percent)" 101
NUMBER_OF_USERS=$(ls /home/user/ | wc -l)
metrics_client Platform.DiskUsage.NumUserHomeDirectories \
$NUMBER_OF_USERS 1 50 50
WEEKLY_USERS_ACTIVE=$(cryptohome --action=dump_last_activity |
awk '$2 <= 7 {++count} END {print count}')
metrics_client -s Login.UsersActiveWeekly ${WEEKLY_USERS_ACTIVE}
if [ $NUMBER_OF_USERS -gt 0 ] ; then
metrics_client -s Login.UsersActiveWeekly.Percent \
$(($WEEKLY_USERS_ACTIVE * 100 / $NUMBER_OF_USERS))
else
metrics_client -s Login.UsersActiveWeekly.Percent 0
fi
# Report days since the least frequently used account signed in.
# It is reported every time to measure effect of autodeletion feature.
DAYS_SINCE_LFU_ACCOUNT_SIGNIN=$(cryptohome --action=dump_last_activity |
awk '$2 > max {max = $2} END {print max}')
# Check if there are any users.
if [ "${DAYS_SINCE_LFU_ACCOUNT_SIGNIN}" != "" ]; then
metrics_client Login.LeastUsedAccountDays \
$DAYS_SINCE_LFU_ACCOUNT_SIGNIN 1 90 90
fi
# Report additional metrics if we are low on free space.
if [ "$(get_stateful_free_space_blocks)" -le \
"$ADDITIONAL_REPORTING_THRESHOLD_BLOCKS" ] ; then
report_additional_statistics
fi
wipe_crx_cache