diff options
| author | Manuel Traut <manut@mecka.net> | 2011-04-29 09:09:27 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2011-04-29 09:09:27 +0200 |
| commit | 5238ad5a0c4a9e1c8cd036f5de4055e39bd71297 (patch) | |
| tree | 4407c087b9fb5432b1dc11e70b52dacfa0b99feb /beagle/debian-rfs/lib/init/bootclean.sh | |
| parent | 60ead65c41afba7e6aa4bbcf507a1d52f7a8fe9f (diff) | |
added debootstrap stuff
Signed-off-by: Manuel Traut <manut@mecka.net>
Diffstat (limited to 'beagle/debian-rfs/lib/init/bootclean.sh')
| -rw-r--r-- | beagle/debian-rfs/lib/init/bootclean.sh | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/beagle/debian-rfs/lib/init/bootclean.sh b/beagle/debian-rfs/lib/init/bootclean.sh new file mode 100644 index 0000000..02e6cef --- /dev/null +++ b/beagle/debian-rfs/lib/init/bootclean.sh @@ -0,0 +1,190 @@ +#!/bin/sh +# +# bootclean +# +# Clean /tmp. Clean /var/run and /var/lock if not mounted as tmpfs +# +# DO NOT RUN AFTER S:55bootmisc.sh and do not run this script directly +# in runlevel S. Instead write an initscript to call it. +# + +. /lib/init/vars.sh + +. /lib/lsb/init-functions + +# Should be called outside verbose message block +mkflagfile() +{ + # Prevent symlink attack (See #264234.) + [ -L "$1" ] && log_warning_msg "bootclean: Deleting symbolic link '$1'." + rm -f "$1" || { log_failure_msg "bootclean: Failure deleting '$1'." ; return 1 ; } + # No user processes should be running, so no one should be able to introduce + # a symlink here. As an extra precaution, set noclobber. + set -o noclobber + :> "$1" || { log_failure_msg "bootclean: Failure creating '$1'." ; return 1 ; } + return 0 +} + +clean_tmp() { + cd /tmp || { log_failure_msg "bootclean: Could not cd to /tmp." ; return 1 ; } + + # + # Only clean out /tmp if it is world-writable. This ensures + # it really is a/the temp directory we're cleaning. + # + [ "$(find . -maxdepth 0 -perm -002)" = "." ] || return 0 + + if [ ! "$TMPTIME" ] + then + log_warning_msg "Using default TMPTIME 0." + TMPTIME=0 + fi + + [ "$VERBOSE" = no ] || log_action_begin_msg "Cleaning /tmp" + + # + # Remove regardless of TMPTIME setting + # + rm -f .X*-lock + + # + # Don't clean remaining files if TMPTIME is negative or 'infinite' + # + case "$TMPTIME" in + -*|infinite|infinity) + [ "$VERBOSE" = no ] || log_action_end_msg 0 "skipped" + return 0 + ;; + esac + + # + # Wipe /tmp, excluding system files, but including lost+found + # + # If TMPTIME is set to 0, we do not use any ctime expression + # at all, so we can also delete files with timestamps + # in the future! + # + if [ "$TMPTIME" = 0 ] + then + TEXPR="" + DEXPR="" + else + TEXPR="-mtime +$TMPTIME -ctime +$TMPTIME -atime +$TMPTIME" + DEXPR="-mtime +$TMPTIME -ctime +$TMPTIME" + fi + + EXCEPT='! -name . + ! ( -path ./lost+found -uid 0 ) + ! ( -path ./quota.user -uid 0 ) + ! ( -path ./aquota.user -uid 0 ) + ! ( -path ./quota.group -uid 0 ) + ! ( -path ./aquota.group -uid 0 ) + ! ( -path ./.journal -uid 0 ) + ! ( -path ./.clean -uid 0 ) + ! ( -path './...security*' -uid 0 )' + + mkflagfile /tmp/.clean || return 1 + + report_err() + { + if [ "$VERBOSE" = no ] + then + log_failure_msg "bootclean: Failure cleaning /tmp." + else + log_action_end_msg 1 "bootclean: Failure cleaning /tmp" + fi + } + + # + # First remove all old files... + # + find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete \ + || { report_err ; return 1 ; } + + # + # ...and then all empty directories + # + find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete \ + || { report_err ; return 1 ; } + + [ "$VERBOSE" = no ] || log_action_end_msg 0 + return 0 +} + +clean_lock() { + if [ yes = "$RAMLOCK" ] ; then + return 0 + fi + + cd /var/lock || { log_failure_msg "bootclean: Could not cd to /var/lock." ; return 1 ; } + + [ "$VERBOSE" = no ] || log_action_begin_msg "Cleaning /var/lock" + report_err() + { + if [ "$VERBOSE" = no ] + then + log_failure_msg "bootclean: Failure cleaning /var/lock." + else + log_action_end_msg 1 "bootclean: Failure cleaning /var/lock" + fi + } + find . ! -type d -delete \ + || { report_err ; return 1 ; } + [ "$VERBOSE" = no ] || log_action_end_msg 0 + mkflagfile /var/lock/.clean || return 1 + return 0 +} + +clean_run() { + if [ yes = "$RAMRUN" ] ; then + return 0 + fi + + cd /var/run || { log_action_end_msg 1 "bootclean: Could not cd to /var/run." ; return 1 ; } + + [ "$VERBOSE" = no ] || log_action_begin_msg "Cleaning /var/run" + report_err() + { + if [ "$VERBOSE" = no ] + then + log_failure_msg "bootclean: Failure cleaning /var/run." + else + log_action_end_msg 1 "bootclean: Failure cleaning /var/run" + fi + } + find . ! -xtype d ! -name utmp ! -name innd.pid -delete \ + || { report_err ; return 1 ; } + [ "$VERBOSE" = no ] || log_action_end_msg 0 + mkflagfile /var/run/.clean || return 1 + return 0 +} + +which find >/dev/null 2>&1 || exit 1 +log_begin_msg "Cleaning up temporary files..." + +# If there are flag files that have not been created by root +# then remove them +for D in /tmp /var/run /var/lock +do + if [ -f $D/.clean ] + then + which stat >/dev/null 2>&1 && cleanuid="$(stat -c %u $D/.clean)" + # Poor's man stat %u, since stat (and /usr) might not be + # available in some bootup stages + [ "$cleanuid" ] || cleanuid="$(find $D/.clean -printf %U)" + [ "$cleanuid" ] || { log_failure_msg "bootclean: Could not stat '$D/.clean'." ; exit 1 ; } + if [ "$cleanuid" -ne 0 ] + then + rm -f $D/.clean || { log_failure_msg "bootclean: Could not delete '$D/.clean'." ; exit 1 ; } + fi + fi +done + +[ -f /tmp/.clean ] && [ -f /var/run/.clean ] && [ -f /var/lock/.clean ] && { log_end_msg 0 ; exit 0 ; } + +ES=0 +[ -d /tmp ] && ! [ -f /tmp/.clean ] && { clean_tmp || ES=1 ; } +[ -d /var/run ] && ! [ -f /var/run/.clean ] && { clean_run || ES=1 ; } +[ -d /var/lock ] && ! [ -f /var/lock/.clean ] && { clean_lock || ES=1 ; } +log_end_msg $ES +exit $ES |
