#!/bin/sh # # sys-chroots Starts and stops services in chroots # # chkconfig: 2345 99 01 # description: This shell script starts and stops services in chroots [ -r /etc/sysconfig/system ] && . /etc/sysconfig/system [ -n "$2" ] && SYSTEM_CHROOTS="$2" if [ -z "$SYSTEM_CHROOTS" ]; then case "$1" in start|stop|restart) exit 0 ;; esac fi CMD="$1" set $(runlevel) runlevel=$2 previous=$1 export runlevel previous [ -z "$runlevel" -o -z "$previous" -o "$runlevel" = "$previous" ] && exit 0 # Source function library. . /etc/rc.d/init.d/functions start() { if [ "$previous" = "N" ]; then runlevel=5 previous=0 export runlevel previous fi if [ -f /var/lock/subsys/sys-chroots ]; then msg_already_running "System chroots services" return fi msg_starting "System chroots services"; started for dir in $SYSTEM_CHROOTS; do [ ! -x "$dir/etc/rc.d/rc" ] && continue msg_starting "System chroots services for $dir"; started # Cleaning part, keep in sync with rc.sysinit chroot $dir sh -c ' . /etc/rc.d/init.d/functions # Clear mtab > /etc/mtab [ -f /etc/cryptomtab ] && > /etc/cryptomtab # Remove stale backups rm -f /etc/mtab~ /etc/mtab~~ /etc/cryptomtab~ /etc/cryptomtab~~ # Clean up /var # I would d use find, but /usr may not be mounted. for afile in /var/lock/* /var/run/*; do bafile=$(basename $afile) if [ -d "$afile" ]; then [ "$bafile" != "news" -a "$bafile" != "sudo" -a "$bafile" != "mon" ] && rm -rf $afile/* else [ "$bafile" != "hwprofile" ] && rm -f $afile 2> /dev/null fi done # Delete stale files rm -f /var/lib/rpm/__db* /var/spool/postoffice/.pid.* /tmp/.X*-lock \ /tmp/.lock.* /tmp/.gdm_socket /tmp/.s.PGSQL.* rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \ /tmp/kde-* /tmp/ksocket-* /tmp/mc-* /tmp/mcop-* /tmp/orbit-* \ /tmp/scrollkeeper-* /tmp/ssh-* # Clean up utmp/wtmp rm -f /var/run/utmpx > /var/run/utmp if [ -e /var/log/wtmpx ]; then if [ -e /var/log/wtmp ]; then rm -f /var/log/wtmpx else mv /var/log/wtmpx /var/log/wtmp fi fi touch /var/log/wtmp chown root:utmp /var/run/utmp /var/log/wtmp chmod 0664 /var/run/utmp /var/log/wtmp # Clean /tmp if is_yes "$CLEAN_TMP"; then rm -rf /tmp/* /tmp/.[a-zA-Z0-9]* fi ' # Do our things # proc chroot $dir mount -o gid=17 -t proc proc /proc # usbfs, if available if [ -f /proc/bus/usb/devices ]; then chroot $dir mount -t usbfs usbfs /proc/bus/usb fi # sysfs is also needed before any other things (under kernel > 2.5) if grep -q sysfs /proc/filesystems ; then chroot $dir mount -o gid=17 -t sysfs sysfs /sys fi # selinux if grep -q selinuxfs /proc/filesystems ; then chroot $dir mount -o gid=17 -t selinuxfs selinuxfs /selinux fi chroot $dir mount -a # network [ -f /var/lock/subsys/network ] && touch $dir/var/lock/subsys/network # other chroot $dir /sbin/chkconfig single off rm -f $dir/etc/rc.d/rc*.d/K*single # run it chroot $dir /etc/rc.d/rc $runlevel chroot done touch /var/lock/subsys/sys-chroots } stop() { # Stop daemons. if [ "$previous" = "N" ]; then runlevel=0 previous=5 export runlevel previous fi if [ ! -f /var/lock/subsys/sys-chroots ]; then msg_not_running "System chroots services" return fi msg_stopping "System chroots services"; started for dir in $SYSTEM_CHROOTS; do [ ! -x "$dir/etc/rc.d/rc" ] && continue msg_stopping "System chroots services for $dir"; started rm -f $dir/var/lock/subsys/network chroot $dir /etc/rc.d/rc $runlevel chroot chroot $dir sh -c "grep -q selinuxfs /proc/filesystems && umount /selinux" chroot $dir sh -c "grep -q sysfs /proc/filesystems && umount /sys" chroot $dir umount -a chroot $dir umount /proc done rm -f /var/lock/subsys/sys-chroots >/dev/null 2>&1 } RETVAL=0 # See how we were called. case "$CMD" in start) start ;; stop) stop ;; restart) stop start ;; status) # TODO: running each service with status parameter for dir in $SYSTEM_CHROOTS; do echo "System chroots services for $dir" chroot $dir /sbin/chkconfig --list done exit $? ;; *) msg_usage "$0 {start|stop|restart|status}" exit 3 esac exit $RETVAL