#!/bin/bash
#
# /etc/rc.shutdown
#

###
# Based on initscripts 2008.05-1
###

. /etc/rc.conf
. /etc/rc.d/functions

###############################################################
### These functions have been separated out, so that they can be
### replaced in linhes live systems.

f_saveclock ()
{
    stat_busy "Saving System Clock"
    if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then
        /bin/rm -f /etc/localtime
        /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
    fi

    HWCLOCK_PARAMS="--systohc"
    if [ "$HARDWARECLOCK" = "UTC" ]; then
        HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
    else
        HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
    fi
    if [ "$USEDIRECTISA" = "yes" -o "$USEDIRECTISA" = "YES" ]; then
        HWCLOCK_PARAMS="$HWCLOCK_PARAMS --directisa"
    fi
    /sbin/hwclock $HWCLOCK_PARAMS
    stat_done
}

f_swapoff ()
{
    stat_busy "Deactivating Swap"
    /sbin/swapoff -a
    stat_done
}

f_remountro ()
{
    stat_busy "Remounting Root Filesystem Read-only"
    /bin/mount -n -o remount,ro /
    stat_done
}

###############################################################

### Override above functions if running linhes live system
[ -f /etc/live-shutdown ] && . /etc/live-shutdown

# avoid staircase effect
/bin/stty onlcr

echo " "
printhl "Initiating Shutdown..."
echo " "

# avoid NIS hanging syslog-ng on shutdown by unsetting the domainname
if [ -x /bin/domainname ]; then
    /bin/domainname ""
fi

if [ -x /etc/rc.local.shutdown ]; then
    /etc/rc.local.shutdown
fi

if [ "$PREVLEVEL" = "3" -o "$PREVLEVEL" = "5" ]; then
    # Shutdown daemons
    let i=${#DAEMONS[@]}
    while [ $i -ge 0 ]; do
        if [ "${DAEMONS[$i]:0:1}" != '!' ]; then
            ck_daemon ${DAEMONS[$i]#@} || /etc/rc.d/${DAEMONS[$i]#@} stop
        fi
        let i=i-1
    done
    # find any leftover daemons and shut them down in reverse order
    if [ -d /var/run/daemons ]; then
        for daemon in $(/bin/ls -1t /var/run/daemons); do
            /etc/rc.d/$daemon stop
        done
    fi
fi

# Terminate all processes
stat_busy "Sending SIGTERM To Processes"
/sbin/killall5 -15 &> /dev/null
/bin/sleep 5
stat_done

stat_busy "Sending SIGKILL To Processes"
/sbin/killall5 -9 &> /dev/null
/bin/sleep 1
stat_done

stat_busy "Saving Random Seed"
/bin/dd if=/dev/urandom of=/var/run/random-seed count=1 bs=512 2> /dev/null
stat_done

#F Save system time
f_saveclock

# removing psmouse module to fix some reboot issues on newer laptops
/sbin/modprobe -r psmouse >/dev/null 2>&1

# Write to wtmp file before unmounting
/sbin/halt -w

#F Deactivate swaps
f_swapoff

stat_busy "Unmounting Filesystems"
/bin/umount -a -t noramfs,notmpfs,nosysfs,noproc
stat_done

# Kill non-root encrypted partition mappings
if [ -f /etc/crypttab -a -n "$(/bin/grep -v ^# /etc/crypttab | /bin/grep -v ^$)" ]; then
    stat_busy "Deactivating encrypted volumes:"
    CS=/sbin/cryptsetup.static
    do_uncrypt() {
        if [ $# -ge 3 ]; then
            stat_append "${1}.."
            $CS remove $1 >/dev/null 2>&1
            if [ $? -ne 0 ]; then
                stat_append "failed "
            else
                stat_append "ok "
            fi
        fi
    }
    while read line; do
        eval do_uncrypt "$line"
    done </etc/crypttab
    stat_done
fi

if [ "$USELVM" = "yes" -o "$USELVM" = "YES" ]; then
    if [ -x /sbin/lvm -a -d /sys/block ]; then
        stat_busy "Deactivating LVM2 groups"
        /sbin/lvm vgchange --ignorelockingfailure -an >/dev/null 2>&1
        stat_done
    fi
fi

#F Remount / ro
f_remountro
#Eject the CD

# Power off or reboot
if [ "$RUNLEVEL" = "0" ]; then
    printsep
    printhl "${C_H2}POWER OFF"
    /sbin/poweroff -d -f -h -i
else
    printsep
    printhl "${C_H2}REBOOTING"
    # if kexec is installed and a kernel is loaded, use it
    [ -x /sbin/kexec ] && /sbin/kexec -e > /dev/null 2>&1
    /sbin/reboot -d -f -i
fi

# vim: set ts=2 sw=2 noet:
# End