X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fmkinit;h=4b39890ce4bb3f6be0adac0eadc9e731b6888ef3;hb=66848b15e247b45c536b4122f8c82663e5fc4b83;hp=0b0dd801810387e9f7cc0b040bebb4cdd3502964;hpb=2bae487c5a63016e67e10aa2d2a18b8a889d5031;p=mkinit diff --git a/src/mkinit b/src/mkinit index 0b0dd80..4b39890 100755 --- a/src/mkinit +++ b/src/mkinit @@ -4,10 +4,14 @@ # See ../COPYING for terms # GLobals -TEST=false -RELOAD=false -FIFO=/lib/mkinit/cmd -INITCTL=/dev/initctl +COMMAND=boot +TESTING=false +if [ $$ == 1 ]; then + DAEMON=true +else + DAEMON=false +fi + PATH=/lib/mkinit/bin:/bin:/sbin:/usr/bin:/usr/sbin export PATH @@ -16,26 +20,59 @@ function usage { echo 'usage: '$0' [options] [command]' echo echo 'Options:' - echo ' -h,--help Print usage information' - echo ' -r,--relaod Prevent spawning listeners when reloading' - echo ' -t,--test Fake all commands' - echo + echo ' -h,--help Print usage information' + echo ' -t,--test Fake all commands' + echo ' -d,--daemon For spawning stdin listener' + echo '' echo 'Command:' - echo ' boot Execute boot-up procedures' - echo ' halt Execute shutdown procedures' - echo ' reload Re-execute init process' - echo ' mk Execute mk rule' + echo ' boot Execute boot-up procedures' + echo ' halt Execute shutdown procedures' + echo ' reload Re-execute init process' + echo ' mk Execute mk rule' echo ' start|stop|restart|zap|status ' - echo ' Start,stop,restart,zap or query status of service' - echo ' eval Execute command in mkinit process' + echo ' Start,stop,restart,zap or query status of service' + echo ' eval Execute command in mkinit process' exit } +# Handle arguments +function doopts { + TMP=`getopt -n "$0" -o htd -l help,test,daemon -- "$@"` + [ $? != 0 ] && + usage + eval set -- "$TMP" + + # Parse options + while [ ! "$1" == "--" ]; do + case "$1" in + -h|--help ) usage ;; + -t|--test ) TESTING=true ;; + -d|--daemon ) DAEMON=true ;; + esac + shift + done + shift + if [ "$*" ]; then + COMMAND=($@) + fi + + # Debugging output + if $TESTING; then + echo 'Options' 1>&2 + echo ' TESTING:' $TESTING 1>&2 + echo ' DAEMON:' $DAEMON 1>&2 + echo ' COMMAND:' $COMMAND 1>&2 + fi +} + # Run mk on the init scripts function runamk { - $TEST && - export P=true - /usr/lib/plan9/bin/mk \ + if $TESTING; then + export P=echo + export MKINIT_STATE=/tmp/mkinit_state + mkdir -p $MKINIT_STATE + fi + /opt/plan9/bin/mk \ -f /etc/init.mk \ -i -k "$@" } @@ -44,128 +81,54 @@ function runamk { function process { cmd=$1 shift - arg=$* + echo mkinit -- running "$cmd" "$@" case "$cmd" in boot ) - echo - echo mkinit -- booting - runamk -a "$arg" + runamk -a "$@" ;; restart ) - if [ "$arg" ]; then - echo mkinit -- restarting $arg - runamk "$arg"-stop - runamk "$arg"-start + if [ "$*" ]; then + runamk "$@"-stop || + runamk "$@"-zap + runamk "$@"-start fi ;; start|stop|zap|status ) - if [ "$arg" ]; then - echo mkinit -- ${cmd}ing $arg - runamk "$arg-$cmd" - fi - ;; - mk|runlevel ) - if [ "$arg" ]; then - [ "$cmd" = mk ] && - echo mkinit -- running mk cmd [$arg] - [ "$cmd" = runlevel ] && - echo mkinit -- entering runlevel $arg - runamk "$arg" + if [ "$*" ]; then + runamk "$@-$cmd" fi ;; reload ) - echo mkinit -- ${cmd}ing - $TEST && + $TESTING && opt=-t exec $0 -r $opt ;; + poweroff|reboot|kexec|halt) + ( runamk "$cmd" "$@" & ) + ;; eval ) - eval $arg + eval "$@" ;; ?* ) - echo mkinit -- unknown command [$cmd] [$arg] + runamk "$cmd" "$@" ;; esac } -# Handle arguments -TMP=`getopt -n "$0" \ - --options hrt \ - --longoptions help,reload,test \ - -- "$@"` -[ $? != 0 ] && - usage -eval set -- "$TMP" -while [ ! "$1" == "--" ]; do - $TEST && - echo '$1=' $1 - case "$1" in - -h|--help ) - usage - ;; - -r|--reload ) - RELOAD=true - ;; - -t|--test ) - TEST=true - FIFO=/tmp/pipe - INITCTL=/tmp/initctl - trap "pkill -HUP -P $$" EXIT - ;; - esac - shift -done -shift; cmd=$1 -shift; arg=$* +# Process arguments +doopts "$@" -# Debugging output -if [ "$TEST" ]; then - echo 'Options' - echo ' test:' $TEST - echo ' reload:' $RELOAD - echo ' cmd:' $cmd - echo ' arg:' $arg -fi - -# Create fifos if they don't exist -test ! -e $FIFO && - mkfifo $FIFO -test ! -e $INITCTL && - mkfifo $INITCTL - -# Initial boot-up -process $cmd $arg - -# Fork listeners -if [ ! "$RELOAD" ]; then - # Fork /dev/initctl listener - ( exec 0<&- 1<&- 2<&- - initctld $INITCTL | - while read line; do - echo $line > $FIFO - done ) & - - # Fork console listener - # Readline uses stdin,stderr - ( exec 1<&-; - while true; do - while read -e -p "mkinit> " line; do - echo $line > $FIFO - history -s $line - done - [ "$TEST" ] && break - exec 0/dev/console - echo "Respawning on /dev/console.." >&2 - sleep 1 - done) <&0 & - - # Close stdin, stderr - exec 0<&- 2<&- -fi +# Run whatever was requested +process "${COMMAND[@]}" -# Main loop -while true; do - while read line; do +# Fork console listener +while $DAEMON; do + while read -ep "mkinit> " line; do process $line - done < $FIFO + history -s $line + done + $TESTING && exit + exec 0/dev/console 2>&1 + echo "Respawning on /dev/console.." + sleep 1 done