rc: Bring in a simple mechanism to run rc scripts only once.
authorBrad Hoffman <bradleydavidhoffman@gmail.com>
Wed, 18 Jul 2018 14:41:03 +0000 (14:41 +0000)
committerSascha Wildner <saw@online.de>
Fri, 20 Jul 2018 11:38:54 +0000 (13:38 +0200)
The basic mechanism is: If /firstboot exists, rc will also run all
scripts that have the "firstboot" keyword, then delete /firstboot.

This is a simpler version of FreeBSD's work. Specifically, we hardcode
the firstboot sentinel's name to /firstboot and we also remove it a
bit more simply because we assume that at the end of /etc/rc, root is
R/W.

This mechanism is used for example by sysutils/ec2-scripts and is in
preparation for the upcoming ena(4) driver import.

Based-on: FreeBSD

etc/rc
etc/rc.d/localdaemons
share/man/man8/rc.8

diff --git a/etc/rc b/etc/rc
index e2f30d0..c9383bd 100644 (file)
--- a/etc/rc
+++ b/etc/rc
@@ -26,7 +26,6 @@
 #
 #      @(#)rc  5.27 (Berkeley) 6/5/91
 # $FreeBSD: src/etc/rc,v 1.329 2003/05/02 05:27:33 dougb Exp $
-# $DragonFly: src/etc/rc,v 1.4 2005/11/19 18:34:02 joerg Exp $
 #
 
 # System startup script run by init on autoboot or after single-user.
@@ -63,12 +62,22 @@ else
        _boot="start"
 fi
 
-files=`rcorder -s nostart /etc/rc.d/* 2>/dev/null`
+# If the /firstboot sentinel doesn't exist, we want to skip firstboot scripts.
+if ! [ -e /firstboot ]; then
+       skip_firstboot="-s firstboot"
+fi
+
+files=`rcorder -s nostart ${skip_firstboot} /etc/rc.d/* 2>/dev/null`
 
 for _rc_elem in ${files}; do
        run_rc_script ${_rc_elem} ${_boot}
 done
 
+# Assume we are R/W here.
+if [ -e /firstboot ]; then
+       rm -rf /firstboot
+fi
+
 echo ''
 date
 exit 0
index 950ded8..07b71cf 100644 (file)
@@ -54,9 +54,17 @@ locald_start()
                                done
                        fi
                done
+
+               # If the firstboot sentinel doesn't exist, we want to
+               # skip firstboot scripts.
+               #
+               if ! [ -e /firstboot ]; then
+                       skip_firstboot="-s firstboot"
+               fi
+
                script_save_sep="$IFS"
                IFS="${script_name_sep}"
-               sortedslist=`rcorder -s nostart /etc/rc.d/* ${slist} 2>/dev/null | grep -v "^/etc/rc.d/" | tr '\n' "$IFS"`;
+               sortedslist=`rcorder -s nostart ${skip_firstboot} /etc/rc.d/* ${slist} 2>/dev/null | grep -v "^/etc/rc.d/" | tr '\n' "$IFS"`;
                for script in ${sortedslist}; do
                        if [ -x "${script}" ]; then
                                (set -T
@@ -94,9 +102,17 @@ locald_stop()
                                done
                        fi
                done
+
+               # If the firstboot sentinel doesn't exist, we want to
+               # skip firstboot scripts.
+               #
+               if ! [ -e /firstboot ]; then
+                       skip_firstboot="-s firstboot"
+               fi
+
                script_save_sep="$IFS"
                IFS="${script_name_sep}"
-               sortedslist=`rcorder -s nostart /etc/rc.d/* ${slist} 2>/dev/null | grep -v "^/etc/rc.d/" | tr '\n' "$IFS"`;
+               sortedslist=`rcorder -s nostart ${skip_firstboot} /etc/rc.d/* ${slist} 2>/dev/null | grep -v "^/etc/rc.d/" | tr '\n' "$IFS"`;
                for script in `reverse_list ${sortedslist}`; do
                        if [ -x "${script}" ]; then
                                (set -T
index 5b6007d..403fc2e 100644 (file)
@@ -31,7 +31,7 @@
 .\"     @(#)rc.8       8.2 (Berkeley) 12/11/93
 .\" $FreeBSD: src/share/man/man8/rc.8,v 1.22 2002/12/12 17:25:58 ru Exp $
 .\"
-.Dd October 17, 2017
+.Dd July 20, 2018
 .Dt RC 8
 .Os
 .Sh NAME
@@ -113,6 +113,13 @@ speedup will not occur when
 .Nm
 is started up after exiting the single-user shell.
 .It
+If the file
+.Pa /firstboot
+does not exist, add
+.Dq Li firstboot
+to the list of KEYWORDS to skip in
+.Xr rcorder 8 .
+.It
 Invoke
 .Xr rcorder 8
 to order the files in
@@ -137,6 +144,10 @@ and sources the script in a subshell.
 If the script has a
 .Pa .sh
 suffix then it is sourced directly into the current shell.
+.It
+If the file
+.Pa /firstboot
+exists, delete it.
 .El
 .Ss Operation of Nm rc.shutdown
 .Bl -enum