fixfiles revision 275560b2a380a5f34041fd4569a38791f25aa195
113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#!/bin/bash
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# fixfiles
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Script to restore labels on a SELinux box
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
6f77e475fd839d26face3deaa7fa27c7265618a02Joshua Brindle# Copyright (C) 2004-2009 Red Hat, Inc.
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Authors: Dan Walsh <dwalsh@redhat.com>
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# This program is free software; you can redistribute it and/or modify
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# it under the terms of the GNU General Public License as published by
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# the Free Software Foundation; either version 2 of the License, or
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# (at your option) any later version.
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# This program is distributed in the hope that it will be useful,
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# but WITHOUT ANY WARRANTY; without even the implied warranty of
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# GNU General Public License for more details.
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# You should have received a copy of the GNU General Public License
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# along with this program; if not, write to the Free Software
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
23275560b2a380a5f34041fd4569a38791f25aa195Eric Parisexclude_dirs_from_relabelling() {
24275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    exclude_from_relabelling=
25275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    if [ -e /etc/selinux/fixfiles_exclude_dirs ]
26275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    then
27275560b2a380a5f34041fd4569a38791f25aa195Eric Paris        while read i
28275560b2a380a5f34041fd4569a38791f25aa195Eric Paris        do
29275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          # skip blank line and comment
30275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          # skip not absolute path
31275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          # skip not directory
32275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          [ -z "${i}" ] && continue
33275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          [[ "${i}" =~ "^[[:blank:]]*#" ]] && continue
34275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          [[ ! "${i}" =~ ^/.* ]] && continue
35275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          [[ ! -d "${i}" ]] && continue
36275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          exclude_from_relabelling="$exclude_from_relabelling -e $i"
37275560b2a380a5f34041fd4569a38791f25aa195Eric Paris          logit "skipping the directory $i from relabelling"
38275560b2a380a5f34041fd4569a38791f25aa195Eric Paris        done < /etc/selinux/fixfiles_exclude_dirs
39275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    fi
40275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    echo "$exclude_from_relabelling"
41275560b2a380a5f34041fd4569a38791f25aa195Eric Paris}
42275560b2a380a5f34041fd4569a38791f25aa195Eric Paris
43275560b2a380a5f34041fd4569a38791f25aa195Eric Parisexclude_dirs() {
44275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    exclude=
45275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    for i in /home /root /tmp /dev; do
46275560b2a380a5f34041fd4569a38791f25aa195Eric Paris        [ -e $i ]  && exclude="$exclude -e $i";
47275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    done
48275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    exclude="$exclude `exclude_dirs_from_relabelling`"
49275560b2a380a5f34041fd4569a38791f25aa195Eric Paris    echo "$exclude"
50275560b2a380a5f34041fd4569a38791f25aa195Eric Paris}
51275560b2a380a5f34041fd4569a38791f25aa195Eric Paris
5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Set global Variables
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
5513cd4c8960688af11ad23b4c946149015c80d54Joshua BrindlefullFlag=0
5613cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleFORCEFLAG=""
5713cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleDIRS=""
5813cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleRPMILES=""
5913cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleLOGFILE=`tty`
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ $? != 0 ]; then
6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    LOGFILE="/dev/null"
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
6313cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleSYSLOGFLAG="-l"
6413cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleLOGGER=/usr/sbin/logger
6513cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleSETFILES=/sbin/setfiles
6613cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleRESTORECON=/sbin/restorecon
67f77e475fd839d26face3deaa7fa27c7265618a02Joshua BrindleFILESYSTEMSRW=`mount | grep -v "context=" | egrep -v '\((|.*,)bind(,.*|)\)' | awk '/(ext[234]| ext4dev | gfs2 | xfs | jfs | btrfs ).*\(rw/{print $3}';`
68f77e475fd839d26face3deaa7fa27c7265618a02Joshua BrindleFILESYSTEMSRO=`mount | grep -v "context=" | egrep -v '\((|.*,)bind(,.*|)\)' | awk '/(ext[234]| ext4dev | gfs2 | xfs | jfs | btrfs ).*\(ro/{print $3}';`
6913cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleFILESYSTEMS="$FILESYSTEMSRW $FILESYSTEMSRO"
7013cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleSELINUXTYPE="targeted"
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ -e /etc/selinux/config ]; then
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    . /etc/selinux/config
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    FC=/etc/selinux/${SELINUXTYPE}/contexts/files/file_contexts 
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleelse
7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    FC=/etc/security/selinux/file_contexts
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Log to either syslog or a LOGFILE
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlelogit () {
8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ -n $LOGFILE ]; then
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    echo $1 >> $LOGFILE
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Compare PREVious File Context to currently installed File Context and 
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# run restorecon on all files affected by the differences.
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlediff_filecontext() {
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ -f ${PREFC} -a -x /usr/bin/diff ]; then
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	TEMPFILE=`mktemp ${FC}.XXXXXXXXXX`
9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	test -z "$TEMPFILE" && exit
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	PREFCTEMPFILE=`mktemp ${PREFC}.XXXXXXXXXX`
9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	sed -r -e 's,:s0, ,g' $PREFC | sort -u > ${PREFCTEMPFILE}
9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	sed -r -e 's,:s0, ,g' $FC | sort -u | \
9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/usr/bin/diff -b ${PREFCTEMPFILE} - | \
9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    grep '^[<>]'|cut -c3-| grep ^/ | \
9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    egrep -v '(^/home|^/root|^/tmp|^/dev)' |\
10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	sed -r -e 's,[[:blank:]].*,,g' \
10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle               -e 's|\(([/[:alnum:]]+)\)\?|{\1,}|g' \
10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	       -e 's|([/[:alnum:]])\?|{\1,}|g' \
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle               -e 's|\?.*|*|g' \
10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	       -e 's|\(.*|*|g' \
10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	       -e 's|\[.*|*|g' \
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle               -e 's|\.\*.*|*|g' \
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle               -e 's|\.\+.*|*|g' | \
10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    # These two sorts need to be separate commands \
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	sort -u | \
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	sort -d | \
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        while read pattern ; \
11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    do if ! echo "$pattern" | grep -q -f ${TEMPFILE} 2>/dev/null; then \
11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle                  echo "$pattern"; \
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle                  case "$pattern" in *"*") \
11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	               echo "$pattern" | sed -e 's,^,^,' -e 's,\*$,,g' >> ${TEMPFILE};;  
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle                  esac; \
11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle               fi; \
11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle            done | \
1192d0c192355ae836ffe047cacfc7c25e146f1fccbEric Paris	${RESTORECON} -f - -R -p `exclude_dirs`; \
12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	rm -f ${TEMPFILE} ${PREFCTEMPFILE}
12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Log all Read Only file systems 
12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
12613cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleLogReadOnly() {
12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ ! -z "$FILESYSTEMSRO" ]; then
12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    logit "Warning: Skipping the following R/O filesystems:"
12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    logit "$FILESYSTEMSRO"
13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlerpmlist() {
13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlerpm -q --qf '[%{FILESTATES} %{FILENAMES}\n]' "$1" | grep '^0 ' | cut -f2- -d ' '
13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle[ ${PIPESTATUS[0]} != 0 ] && echo "$1 not found" >/dev/stderr
13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# 
13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# restore
14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# if called with -n will only check file context
14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlerestore () {
14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ ! -z "$PREFC" ]; then
14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    diff_filecontext $*
14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    exit $?
14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ ! -z "$RPMFILES" ]; then
14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    for i in `echo "$RPMFILES" | sed 's/,/ /g'`; do
14970849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh	rpmlist $i | ${RESTORECON} ${FORCEFLAG} $* -R -i -f - 2>&1 >> $LOGFILE
15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    done
15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    exit $?
15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ ! -z "$FILEPATH" ]; then
15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ -x /usr/bin/find ]; then
15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/usr/bin/find "$FILEPATH" \
15673a1f3a8f3a5ce34a76104b0066986086fe78939Daniel J Walsh	    ! \( -fstype ext2 -o -fstype ext3 -o -fstype ext4 -o -fstype ext4dev -o -fstype gfs2 -o -fstype jfs -o -fstype xfs -o -fstype btrfs \) -prune  -o -print0 | \
15770849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh	    ${RESTORECON} ${FORCEFLAG} $* -0 -f - 2>&1 >> $LOGFILE
15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else
15970849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh	${RESTORECON} ${FORCEFLAG} -R $* $FILEPATH 2>&1 >> $LOGFILE
16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    return
16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
16370849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh[ -x /usr/sbin/genhomedircon ] && /usr/sbin/genhomedircon
16413cd4c8960688af11ad23b4c946149015c80d54Joshua BrindleLogReadOnly
165275560b2a380a5f34041fd4569a38791f25aa195Eric Paris#
166275560b2a380a5f34041fd4569a38791f25aa195Eric Parisexclude_dirs="`exclude_dirs_from_relabelling`"
167275560b2a380a5f34041fd4569a38791f25aa195Eric Parisif [ -n "${exclude_dirs}" ]
168275560b2a380a5f34041fd4569a38791f25aa195Eric Paristhen
169275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	TEMPFCFILE=`mktemp ${FC}.XXXXXXXXXX`
170275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	test -z "$TEMPFCFILE" && exit
171275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	/bin/cp -p ${FC} ${TEMPFCFILE} &>/dev/null || exit
172275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	exclude_dirs=${exclude_dirs//-e/}
173275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	for p in ${exclude_dirs}
174275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	do
175275560b2a380a5f34041fd4569a38791f25aa195Eric Paris		p="${p%/}"
176275560b2a380a5f34041fd4569a38791f25aa195Eric Paris		p1="${p}(/.*)? -- <<none>>"
177275560b2a380a5f34041fd4569a38791f25aa195Eric Paris		echo "${p1}" >> $TEMPFCFILE
178275560b2a380a5f34041fd4569a38791f25aa195Eric Paris		logit "skipping the directory ${p} from relabelling"
179275560b2a380a5f34041fd4569a38791f25aa195Eric Paris	done
180275560b2a380a5f34041fd4569a38791f25aa195Eric ParisFC=$TEMPFCFILE
181275560b2a380a5f34041fd4569a38791f25aa195Eric Parisfi
18270849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh${SETFILES} -q ${SYSLOGFLAG} ${FORCEFLAG} $* ${FC} ${FILESYSTEMSRW} 2>&1 >> $LOGFILE
183275560b2a380a5f34041fd4569a38791f25aa195Eric Parisrm -rf /tmp/gconfd-* /tmp/pulse-* /tmp/orbit-* $TEMPFCFILE
184275560b2a380a5f34041fd4569a38791f25aa195Eric Paris
1852bd5fd1642ef190fa593c2cc608970fe29771d54Eric Parisfind /tmp \( -context "*:file_t*" -o -context "*:unlabeled_t*" \) \( -type s -o -type p \) -delete
18695e4b5c3cc37f2c62bf99428275908d7da6e4a0eJoshua Brindlefind /tmp \( -context "*:file_t*" -o -context "*:unlabeled_t*" \) -exec chcon -t tmp_t {} \;
18795e4b5c3cc37f2c62bf99428275908d7da6e4a0eJoshua Brindlefind /var/tmp \( -context "*:file_t*" -o -context "*:unlabeled_t*" \) -exec chcon -t tmp_t {} \;
188593154505a8f8c99e8f19b0aae352cd4d1d7e173Eric Parisfind /var/run \( -context "*:file_t*" -o -context "*:unlabeled_t*" \) -exec chcon -t var_run_t {} \;
189593154505a8f8c99e8f19b0aae352cd4d1d7e173Eric Paris[ -e /var/lib/debug ] && find /var/lib/debug \( -context "*:file_t*" -o -context "*:unlabeled_t*" \) -exec chcon -t lib_t {} \;
19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleexit $?
19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefullrelabel() {
19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    logit "Cleaning out /tmp"
1956084f72aafc8c7f70ef972e950dcc73777594c32Eric Paris    find /tmp/ -mindepth 1 -delete
19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    LogReadOnly
19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    restore
19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlerelabel() {
20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ ! -z "$RPMFILES" ]; then
20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	restore 
20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ $fullFlag == 1  ]; then
20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fullrelabel
20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    echo -n "
21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    Files in the /tmp directory may be labeled incorrectly, this command 
21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    can remove all files in /tmp.  If you choose to remove files from /tmp, 
21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    a reboot will be required after completion.
21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    
21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    Do you wish to clean out the /tmp directory [N]? "
21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    read answer
21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ "$answer" = y -o  "$answer" = Y ]; then 
21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fullrelabel
21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else
21913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	restore
22013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
22113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
22213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
22313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleprocess() {
22413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
22513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Make sure they specified one of the three valid commands
22613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
22713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlecase "$1" in
22813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    restore) restore -p ;;
22913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    check) restore -n -v;;
23013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    verify) restore -n -o -;;
23113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    relabel) relabel;;
23213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    onboot)
23313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	touch /.autorelabel
23413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	echo "System will relabel on next boot"
23513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	;;
23613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    *)
23713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    usage
23813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    exit 1
23913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleesac
24013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
24113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleusage() {
24270849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh      	echo $"""
24370849975f81d2494fb996efe09c50a5bc63f7b33Daniel J WalshUsage: $0 [-F] [-l logfile ] { check | restore| [-f] relabel | verify } [[dir/file] ... ] 
24470849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walshor
24570849975f81d2494fb996efe09c50a5bc63f7b33Daniel J WalshUsage: $0 [-F] -R rpmpackage[,rpmpackage...] [-l logfile ] { check | restore | verify }
24670849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walshor
24770849975f81d2494fb996efe09c50a5bc63f7b33Daniel J WalshUsage: $0 [-F] -C PREVIOUS_FILECONTEXT { check | restore | verify }
24870849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walshor
24970849975f81d2494fb996efe09c50a5bc63f7b33Daniel J WalshUsage: $0 onboot
25070849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walsh"""
25113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
25213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
25313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ $# = 0 ]; then
25413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	usage
25513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	exit 1
25613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
25713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
25813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# See how we were called.
25970849975f81d2494fb996efe09c50a5bc63f7b33Daniel J Walshwhile getopts "C:FfR:l:" i; do
26013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    case "$i" in
26113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	f)
26213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		fullFlag=1
26313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		;;
26413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        R)
26513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		RPMFILES=$OPTARG
26613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		;;
26713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        l)
26813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		LOGFILE=$OPTARG
26913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		;;
27013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle        C)
27113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		PREFC=$OPTARG
27213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		;;
27313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	F)
27413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		FORCEFLAG="-F"
27513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		;;
27613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	*)
27713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    usage
27813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    exit 1
27913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleesac
28013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindledone
28113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
28213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Move out processed options from arguments
28313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleshift $(( OPTIND - 1 ))
28413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
28513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Check for the command
28613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlecommand=$1
28713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ -z $command ]; then
28813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    usage
28913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
29013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# Move out command from arguments
29213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleshift
29313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
29513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# check if they specified both DIRS and RPMFILES
29613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#
29713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleif [ ! -z "$RPMFILES" ]; then
29913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    process $command
30013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ $# -gt 0 ]; then
30113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    usage
30213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
30313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleelse
30413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    if [ -z "$1" ]; then
30513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	process $command
30613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    else
30713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	while [ -n "$1" ]; do 
30813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    FILEPATH=$1
30913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    process $command 
31013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    shift
31113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    	done
31213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle    fi
31313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlefi
31413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleexit $?
315