#!/bin/bash # restore a virgin environment for public users # markus@wernig.net 2002-30-04 # # it will remove all user-writable data from user's home # directory and then copy all data from a template directory # back to user's dir. # # this is intended to be called by the logout procedure # on a UNIX/Linux multiuser machine when a user session ends. # # this could be ~/.logout, ~/.bash_logout etc., but since # we mostly use X environments, it might be best called # when a user Xsession is terminated. # # xdm provides the $XDMDIR/Xreset for that. # on my SuSI it is /etc/X11/xdm/Xreset # # MINI-HOWTO: # 1) create user # 2) set up her environment: configure desktop/windowmanager etc # make sure her home is in $HOMEDIR below # 3) copy $HOMEDIR to $CLEAN_DIR (here: /home/.clean/$USER) # $ cp -raf $HOMEDIR $CLEAN_DIR # 4) make sure $CLEAN_DIR is not writable by user # 5) edit this script. set $LOCAL_USER to the user you want cleared # set $HOMEDIR to directory to be cleared # set $CLEAN_DIR to template directory # 6) edit Xreset to call this script (and pass it the filename as reference) # e.g.: /sbin/userclean Xreset # this will depend on your X configuration # # have fun and beware! # logger -p daemon.warn "Called from $1 by $USER ($LOGNAME)" cd /home LOCAL_USER="user" HOMEDIR="/home/${LOCAL_USER}" CLEAN_DIR="/home/.clean/${LOCAL_USER}" DIRCLEAN="true" # run only if user or root if ! [ $USER = ${LOCAL_USER} -o $USER = "root" ]; then logger -p daemon.warn "attempted to run as $USER instead of ${LOCAL_USER} or root" exit 127 fi # first check if we have a clean template directory if [ -d "$CLEAN_DIR" ]; then logger -p daemon.warn "Replacing $HOMEDIR with $CLEAN_DIR" # then remove every file in old home for rem in `ls -a "$HOMEDIR"` do if ! [ -w "$HOMEDIR/$rem" ]; then continue fi if [ "$rem" = "." -o "$rem" = ".." ]; then continue fi if rm -rf "$HOMEDIR/$rem"; then true else DIRCLEAN=false fi done if [ $DIRCLEAN = true ]; then logger -p daemon.warn "removed $HOMEDIR/*" else logger -p daemon.warn "couldn't remove $HOMEDIR/*" fi # now copy back from template dir DIRCLEAN=true for rep in `ls -a "$CLEAN_DIR"` do if [ "$rep" = "." -o "$rep" = ".." ]; then continue fi if cp -raf "$CLEAN_DIR/$rep" "$HOMEDIR"; then true else DIRCLEAN=false fi done if [ $DIRCLEAN = true ]; then logger -p daemon.warn "replaced $HOMEDIR/*" else logger -p daemon.warn "couldn't replace $HOMEDIR/*" fi chown -R "$LOCAL_USER" "$HOMEDIR" # chown root:root "$HOMEDIR/.xinitrc" else logger -p daemon.warn "$CLEAN_DIR is not a directory" fi