Print this page
8034 shutdown(1M) needs modernizing
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Peter Tribble <peter.tribble@gmail.com>
*** 23,34 ****
# Use is subject to license terms.
#
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
# All Rights Reserved
-
# Sequence performed to change the init state of a machine. Only allows
# transitions to states 0,1,5,6,s,S (i.e.: down or administrative states).
# This procedure checks to see if you are permitted and allows an
# interactive shutdown. The actual change of state, killing of
--- 23,36 ----
# Use is subject to license terms.
#
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
# All Rights Reserved
+ #
+ # Copyright 2017, OmniTI Computer Consulting, Inc. All rights reserved.
+ #
# Sequence performed to change the init state of a machine. Only allows
# transitions to states 0,1,5,6,s,S (i.e.: down or administrative states).
# This procedure checks to see if you are permitted and allows an
# interactive shutdown. The actual change of state, killing of
*** 42,61 ****
notify() {
/usr/sbin/wall -a <<-!
$*
!
! if [ -x /usr/sbin/showmount -a -x /usr/sbin/rwall ]
! then
! remotes=`/usr/sbin/showmount`
! if [ "X${remotes}" != "X" ]
! then
! /usr/sbin/rwall -q ${remotes} <<-!
! $*
! !
! fi
! fi
}
nologin=/etc/nologin
# Set the PATH so that to guarentee behavior of shell built in commands
--- 44,56 ----
notify() {
/usr/sbin/wall -a <<-!
$*
!
! # We used to do rwall here if showmounts had any output, but
! # rwall is a potential security hole, and it could block this, so
! # we don't bother with it anymore.
}
nologin=/etc/nologin
# Set the PATH so that to guarentee behavior of shell built in commands
*** 126,136 ****
;;
\?) usage
;;
esac
done
! shift `expr $OPTIND - 1`
echo '\nShutdown started. \c'
/usr/bin/date
echo
--- 121,131 ----
;;
\?) usage
;;
esac
done
! shift $(($OPTIND - 1))
echo '\nShutdown started. \c'
/usr/bin/date
echo
*** 143,155 ****
# If other users are on the system (and any grace period is given), warn them.
for i in 7200 3600 1800 1200 600 300 120 60 30 10; do
if [ ${grace} -gt $i ]
then
! hours=`/usr/bin/expr ${grace} / 3600`
! minutes=`/usr/bin/expr ${grace} % 3600 / 60`
! seconds=`/usr/bin/expr ${grace} % 60`
time=""
if [ ${hours} -gt 1 ]
then
time="${hours} hours "
elif [ ${hours} -eq 1 ]
--- 138,150 ----
# If other users are on the system (and any grace period is given), warn them.
for i in 7200 3600 1800 1200 600 300 120 60 30 10; do
if [ ${grace} -gt $i ]
then
! hours=$((${grace} / 3600))
! minutes=$((${grace} % 3600 / 60))
! seconds=$((${grace} % 60))
time=""
if [ ${hours} -gt 1 ]
then
time="${hours} hours "
elif [ ${hours} -eq 1 ]
*** 173,195 ****
fi
fi
(notify \
"The system ${NODENAME} will be shut down in ${time}
! $*") &
- pid1=$!
-
rm $nologin >/dev/null 2>&1
cat > $nologin <<-!
NO LOGINS: System going down in ${time}
$*
!
! /usr/bin/sleep `/usr/bin/expr ${grace} - $i`
grace=$i
fi
done
# Confirm that we really want to shutdown.
--- 168,188 ----
fi
fi
(notify \
"The system ${NODENAME} will be shut down in ${time}
! $*")
rm $nologin >/dev/null 2>&1
cat > $nologin <<-!
NO LOGINS: System going down in ${time}
$*
!
! /usr/bin/sleep $((${grace} - $i))
grace=$i
fi
done
# Confirm that we really want to shutdown.
*** 210,223 ****
# Final shutdown message, and sleep away the final 10 seconds (or less).
(notify \
"THE SYSTEM ${NODENAME} IS BEING SHUT DOWN NOW ! ! !
Log off now or risk your files being damaged
! $*") &
- pid2=$!
-
if [ ${grace} -gt 0 ]
then
/usr/bin/sleep ${grace}
fi
--- 203,214 ----
# Final shutdown message, and sleep away the final 10 seconds (or less).
(notify \
"THE SYSTEM ${NODENAME} IS BEING SHUT DOWN NOW ! ! !
Log off now or risk your files being damaged
! $*")
if [ ${grace} -gt 0 ]
then
/usr/bin/sleep ${grace}
fi
*** 224,234 ****
# Go to the requested initstate.
echo "Changing to init state $initstate - please wait"
! if [ "$pid1" ] || [ "$pid2" ]
! then
! /usr/bin/kill $pid1 $pid2 > /dev/null 2>&1
fi
/sbin/init ${initstate}
--- 215,235 ----
# Go to the requested initstate.
echo "Changing to init state $initstate - please wait"
! # We might be racing with a system that's still booting.
! # Before starting init, check to see if smf(5) is running. The easiest way
! # to do this is to check for the existence of the repository service door.
!
! i=0
! # Try three times, sleeping one second each time...
! while [ ! -e /etc/svc/volatile/repository_door -a $i -lt 3 ]; do
! sleep 1
! i=$(($i + 1))
! done
!
! if [ ! -e /etc/svc/volatile/repository_door ]; then
! notify "Could not find repository door, init-state change may fail!"
fi
/sbin/init ${initstate}