blob: dc85d6839dc1e97f64b15127f272cbd03666c37a [file] [log] [blame]
#!/bin/sh
# Copyright (c) 2010 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 can maintain a log file across stateful partition wiping
# transition.
SCRIPT="$0"
CLOBBER_LOG_FILE="clobber.log"
# Temp folder is always accessible (by tmpfs), but stateful partition may be not
# available. To verify that, check the existence of STATEFUL_LOG_FOLDER.
STATEFUL_LOG_FOLDER="/mnt/stateful_partition/var/log/"
STATEFUL_LOG_PATH="$STATEFUL_LOG_FOLDER/$CLOBBER_LOG_FILE"
TMP_LOG_PATH="/tmp/$CLOBBER_LOG_FILE"
MAX_KEEP_LOG_LINES=512
BLOCK_DUMP_LINES=64
log_prefix() {
echo "$(date --utc '+%Y/%m/%d %H:%M:%S') UTC"
}
preserve_log() {
# Try to copy log from stateful partition to tmp.
local source_path="$STATEFUL_LOG_PATH"
local dest_path="$TMP_LOG_PATH"
# TODO(hungte) store log in some special place, like last sector of stateful
# partition so that logs won't be lost if user interrupts during wiping.
if [ -s "$source_path" ]; then
tail -n $MAX_KEEP_LOG_LINES "$source_path" >"$dest_path"
fi
echo "$(log_prefix) (preserve log): $@" >>"$dest_path"
}
restore_log() {
# Try to copy log from tmp back to stateful partition.
local source_path="$TMP_LOG_PATH"
local dest_path="$STATEFUL_LOG_PATH"
# the mode should be matched to chromeos_startup.
mkdir -p -m 0755 "$STATEFUL_LOG_FOLDER"
if [ -s "$source_path" ]; then
cp "$source_path" "$dest_path"
fi
echo "$(log_prefix) (restore log): $@" >>"$dest_path"
}
find_log_path() {
# Always use log in stateful partition, otherwise create in temp.
local dest_path="$STATEFUL_LOG_PATH"
if [ ! -d "$STATEFUL_LOG_FOLDER" ]; then
dest_path="$TMP_LOG_PATH"
fi
echo "$dest_path"
}
append_log() {
# Add one line of log into the clobber log file.
local dest_path="$(find_log_path)"
echo "$(log_prefix) $@" >>"$dest_path"
}
repair_log() {
# Report detail messages for the status of stateful partition.
local dest_path="$TMP_LOG_PATH"
# TODO(hungte) try to recover logs from some where - see preserve_log.
if [ ! -b "$1" ]; then
echo "$(log_prefix) repair: $1: invalid device file." >>"$dest_path"
return
fi
echo "$(log_prefix) (repair): $@" >>"$dest_path"
# "fsck -n" and "mount -v" may also help.
dumpe2fs -fh "$1" >>"$dest_path" 2>&1
# try to dump first several blocks
echo "-- File system $1 block data (gz+base64):" >>"$dest_path"
dd if="$1" bs=1M count=1 | gzip -c | base64 |
head -n $BLOCK_DUMP_LINES >>"$dest_path" 2>/dev/null
echo "-- File system $1 block data dump complete." >>"$dest_path"
# to read back the block data, extract to a file and do
# cat block | base64 -d | gunzip -c -d > block.bin
}
# Process the very limited commands
case "$1" in
--preserve )
shift
preserve_log "$@"
;;
--restore )
shift
restore_log "$@"
;;
--repair )
shift
repair_log "$@"
;;
-- )
shift
append_log "$@"
;;
* )
append_log "$@"
;;
esac