Compare commits

..
11 Commits
Author SHA1 Message Date
Joachim Wiberg 338521a748 Update ChangeLog and bump for v4.5-rc3
No more changes are expected after -rc3.  Will be used for testing in
Infix and br2-ext-finit before the final v4.5 GA.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-24 14:04:28 +02:00
Joachim Wiberg 6ae1083c99 Add support for SysV-only scripts in runparts
This patch extens the SysV compatibility support in Finit by adding
support for limiting `runparts` to run only SNNfoo, or KNNfoo, style
scripts from a directory.

Additionally, by default `runparts` now runs entirely in the background
without any progress.  To enable progress, an optional argument has been
added to the runparts command line.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-24 13:25:35 +02:00
Joachim Wiberg 846806747b Fix #366: document fsck.* command line options and simplify code
As pointed out in #366, the configure options --enable-fastboot and
--enable-fsckfix should just alter the default values of the two fsck
command line options.

This commit simplifies the code and makes it possible to override using
the command line regardless of the two build options.

Finally, add the two command line options to doc/cmdline.md

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-24 11:58:07 +02:00
Joachim Wiberg 8904ca993e test: reindent
Standard Emacs shell-mode 4-space indent.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-18 06:38:59 +02:00
Joachim Wiberg efed0db16b test: reindent, don't warn on PID 0
PID 0 for a collected task is not a bug, 1 or < 0 is a bug.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-16 10:28:48 +02:00
Joachim Wiberg 11946f12d3 contrib: disable bundled watchdog for Alpine builds
In the Alpine reference builds we use 'watchdog' from the BusyBox suite.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-16 10:28:48 +02:00
Joachim Wiberg 2ba359ed80 Merge pull request #365 from markand/man-typo 2023-09-15 12:31:14 +02:00
David Demelier fafd524701 doc: fix typo in finit.8 manual page 2023-09-15 10:50:31 +02:00
Joachim Wiberg 1ee6c9f46b watchdogd: drop startup message, leaks to console
We use LOG_CONS to ensure log messages reach the operator, but since
watchdogd starts very early this means non-critical messages like the
initial greeting leaks to console because syslogd has not yet started.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-15 09:47:42 +02:00
Joachim Wiberg a88eb82a68 Simplify overly complex description, drop links to older versions
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-14 10:03:49 +02:00
Joachim Wiberg a436a1c8cb .github: speed up release job, and support for setting pre-release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-09-14 09:40:55 +02:00
52 changed files with 535 additions and 419 deletions
+13
View File
@@ -10,12 +10,24 @@ jobs:
name: Build and upload release tarball
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
env:
MAKEFLAGS: -j3
steps:
- uses: actions/checkout@v3
- name: Installing dependencies ...
run: |
sudo apt-get -y update
sudo apt-get -y install pkg-config jq libuev-dev libite-dev
- name: Setting release variables ...
id: build
run: |
ver=${GITHUB_REF#refs/tags/}
echo "ver=${ver}" >> $GITHUB_OUTPUT
if echo $ver | grep -qE '[0-9.]+(-alpha|-beta|-rc)[0-9]*'; then
echo "pre=true" >> $GITHUB_OUTPUT
else
echo "pre=false" >> $GITHUB_OUTPUT
fi
- name: Creating Makefiles ...
run: |
./autogen.sh
@@ -36,5 +48,6 @@ jobs:
- uses: ncipollo/release-action@v1
with:
name: Finit v${{ github.ref_name }}
prerelease: ${{ needs.build.outputs.pre }}
bodyFile: "release.md"
artifacts: "artifacts/*"
+11 -5
View File
@@ -4,13 +4,12 @@ Change Log
All relevant changes are documented in this file.
[4.5][] - 2023-09-15
[4.5][] - 2023-09-24
--------------------
### Changes
- Refactor `runparts` and `/etc/rc.local` to no longer block the main
loop, allowing these scripts to call `initctl` to interact with Finit.
Still in a limited way due to them being used at bootstrap, issue #356
loop, allowing `initctl` calls to interact with Finit. Issue #356
- Refactor the `run` stanza to no longer block the main loop, issue #362
- Allow `sulogin` with a user different from `root`, issue #357
- Allow disabling invocation of rescue mode from kernel command line
@@ -25,20 +24,27 @@ All relevant changes are documented in this file.
- Update `finit.conf(5)` man page with the recommended directory
hierarchy in `/etc/finit.d/`
- The `runparts` code has been split into `/libexec/finit/runparts`
- The `runparts` command now takes two options: `sysv` and `progress`.
The former ensures only `SNNfoo` and `KNNfoo` scripts are run.
- Add SysV Init Compatibility section to documentation
- Increased MAX path for commands, and arguments: 64 -> 256
- The bundled watchdog daemon no longer tries to log at startup, because
syslog is not available yet, any startup message leak to console
### Fixes
- Fix #227: believed to have been fixed in [4.3][], the root cause was
- Fix #227: believed to have been fixed in v4.3, the root cause was
actually that Finit was waiting for a process that was no longer in
the system. The fix is to ask the kernel on process-stop-timeout and
replay the lost PID so that Finit can continue with reboot/shutdown
- Fix #358: fix inotify events for `/etc/finit.conf`, improved log
messages and error handling
- Fix #361: cgroup move fail if run/task/services start as non-root.
Regression in the [4.4][] release cycle while adding support for the
Regression in the v4.4 release cycle while adding support for the
pre:/post:/ready: scripts. Now the latter scripts also properly run
in their correct cgroup
- Fix #366: document `fsck.*` kernel command line options and simplify
the configure flags `--enable-fsckfix` and `--enable-fastboot` to
only adjust the default values for the `fsck.*` options.
- The `runparts` executor now skips backup files (`foo~`)
- The `runparts` stanza now properly appends ` start` to scripts that
start with `S[0-9]+`. This has been broken for a very long time.
+1 -1
View File
@@ -1,4 +1,4 @@
AC_INIT([Finit],[4.5-rc2],[https://github.com/troglobit/finit/issues],[finit],[https://troglobit.com/projects/finit/])
AC_INIT([Finit],[4.5-rc3],[https://github.com/troglobit/finit/issues],[finit],[https://troglobit.com/projects/finit/])
AC_CONFIG_AUX_DIR(aux)
AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects])
AM_SILENT_RULES([yes])
+1 -1
View File
@@ -17,7 +17,7 @@ PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure \
--prefix=/usr --exec-prefix= \
--sysconfdir=/etc --localstatedir=/var \
--enable-dbus-plugin --enable-x11-common-plugin \
--enable-alsa-utils-plugin --with-watchdog \
--enable-alsa-utils-plugin --without-watchdog \
--with-keventd --with-sulogin
echo
-10
View File
@@ -9,16 +9,6 @@ value in the project turned out to be:
> systems, container, and dedicated server applications.
Before Next Release
-------------------
* When did runparts +arg break?
* Should we update the =runparts DIR= syntax to =runparts [progress] [debug] DIR=?
* Add SNN-only option top runparts, for Buildroot
* Calling `initctl runlevel` at bootstrap => N 10, what should it be?
* Reindent all shell scripts in true emacs shell-script-mode (4 chars)
Misc TODOs
----------
+9
View File
@@ -12,6 +12,15 @@ The `bool` setting is one of `on, off, true false, 1, 0`.
* `debug`: Enable kernel debug. Debug messages are printed to the
console until Finit starts up, unless `loglevel=7` (below) is used.
* `fsck.mode=<auto,force,skip>`, default: `auto`, unless built with
`configure --enable-fastboot`, in which case the default is `skip`
* `fsck.repair=<preen,yes,no>`, default: `preen`, unless built with
`configure --enable-fsckfix`, in which case the default is `yes`.
This configure option also sets `fsck.mode=force`, unless fastboot
is selected at the same time. I.e., the `--enable-fastboot` build
option overrides the `fsck.mode` default value.
* `finit.cond=foo[,bar[,baz]]`: set `<boot/foo>` condition, optionally
multiple conditions can be set using the same option, separated with a
comma. Alternatively, multiple `foo.cond=arg` can be given. Each will
+19 -19
View File
@@ -842,7 +842,7 @@ the above `kill:SEC` syntax.
### Run-parts Scripts
**Syntax:** `runparts <DIR>`
**Syntax:** `runparts [progress] [sysv] <DIR>`
Call [run-parts(8)][] on `DIR` to run start scripts. All executable
files, or scripts, in the directory are called, in alphabetic order.
@@ -854,25 +854,23 @@ services, which Finit will then apply when changing runlevel from S to
whatever the next runlevel is set to be (default 2). E.g., generate a
`/etc/chrony.conf` and call `initctl enable chronyd`.
**Options:**
- `progress`: display the progress of each script being executed
- `sysv`: run only SysV style scripts, i.e., `SNNfoo`, or `KNNbar`,
where `NN` is a number (0-99).
If global debug mode is enabled, the `runparts` program is also called
with the debug flag.
**Limitations:**
Scripts called from `runparts`, or hook scripts (see below), are limited
in what they can do and expect from Finit:
1. Finit is single threaded and all scripts executed from these two
mechanisms are limited to file system operations (early or late
hooks may not have write access!) and standard UNIX programs.
2. Thus, it is *not possible* to call `initctl` to query status of
services since that calls Finit over the `/run/finit/socket`.
3. Confusingly enough, there are some commands to `initctl` that are
available; `ls`, `enable`, `disable`, `touch`, `create`, `delete`,
and all the `cond` commands. Because all these are basically just
wrappers for manipulating files (again, write access for early/late
hooks may not be available).
Also, similar to the `/etc/rc.local` shell script, make sure that all
your services and programs either terminate or start in the background
or you will block Finit.
in their interaction with Finit. Like the standalone `run` stanza and
the `/etc/rc.local` shell script, Finit waits for their completion
before continuing. None of them can issue commands to start, stop, or
restart other services. Also, ensure all your services and programs
either terminate or start in the background or you will block Finit.
> **Note:** `runparts` scrips are only read and executed in runlevel S
> ([bootstrap][]). See [hook scripts](plugins.md#hooks) for other ways
@@ -1073,8 +1071,10 @@ sync(2) has been called, twice.
SysV Init Compatibility
-----------------------
Finit comes with a few SysV Init compatibility features to ease the
transition from a serialized boot process.
It is not possible to run unmodified SysV init systems with Finit. This
was never the intention and is not the strength of Finit. However, it
comes with a few SysV Init compatibility features to ease the transition
from a serialized boot process.
### `runparts DIRECTORY`
+1 -1
View File
@@ -275,7 +275,7 @@ The following condition families are available today:
Linux netlink events, e.g. net/route/default, net/eth0/up, and
net/et0/running
.It Cm pid
PID files basd on the service declaration
PID files based on the service declaration
.Cm name:id ,
gives the condition pid/name:id
.It Cm service
+1 -1
View File
@@ -45,7 +45,7 @@ static void setup(void *arg)
touch("/etc/resolvconf/run/enable-updates");
chdir("/etc/resolvconf/run/interface");
run_parts("/etc/resolvconf/update.d", "-i", NULL, 0);
run_parts("/etc/resolvconf/update.d", "-i", NULL, 0, 0);
chdir("/");
}
+38 -1
View File
@@ -62,8 +62,29 @@ static TAILQ_HEAD(, env_entry) env_list = TAILQ_HEAD_INITIALIZER(env_list);
struct rlimit initial_rlimit[RLIMIT_NLIMITS];
struct rlimit global_rlimit[RLIMIT_NLIMITS];
/*
* --enable-fastboot => fsck_mode: NULL => no fsck by default
* --enable-fsckfix => fsck_mode: "-f" + fsck_repair: "y"
*/
#ifdef FSCK_FIX
# ifdef FAST_BOOT
char *fsck_mode = NULL;
# else
char *fsck_mode = "-f";
# endif
char *fsck_repair = "-y";
#else
# ifdef FAST_BOOT
char *fsck_mode = NULL;
# else
char *fsck_mode = "";
# endif
char *fsck_repair = "-p";
#endif
char *runparts = NULL;
int runparts_progress;
int runparts_sysv;
char cgroup_current[16]; /* cgroup.NAME sets current cgroup for a set of services */
@@ -778,6 +799,15 @@ static int parse_static(char *line, int is_rcsd)
if (BOOTSTRAP && MATCH_CMD(line, "runparts ", x)) {
if (runparts) free(runparts);
runparts_progress = runparts_sysv = 0;
while (x) {
if (MATCH_CMD(x, "progress", x))
runparts_progress = 1;
else if (MATCH_CMD(x, "sysv", x))
runparts_sysv = 1;
else
break;
}
runparts = strdup(strip_line(x));
return 0;
}
@@ -1463,7 +1493,14 @@ int conf_init(uev_ctx_t *ctx)
*/
if (runparts && fisdir(runparts) && !rescue) {
char conf[sizeof(_PATH_RUNPARTS) + strlen(runparts) + 100];
char *args = debug ? "-d" : "-p";
char args[10] = { 0 };
if (debug)
strlcat(args, "-d ", sizeof(args));
if (runparts_progress)
strlcat(args, "-p ", sizeof(args));
if (runparts_sysv)
strlcat(args, "-s ", sizeof(args));
snprintf(conf, sizeof(conf), "[S] <int/bootstrap> log:console %s %s %s"
" -- Calling runparts %s in the background",
+1 -7
View File
@@ -75,7 +75,6 @@ char *fstab = NULL;
char *sdown = NULL;
char *network = NULL;
char *hostname = NULL;
char *runparts = NULL;
char *osheading = NULL;
uev_ctx_t *ctx = NULL; /* Main loop context */
@@ -255,11 +254,7 @@ static int fsck(int pass)
continue;
}
#ifdef FSCK_FIX
snprintf(cmd, sizeof(cmd), "fsck -yf %s", dev);
#else
snprintf(cmd, sizeof(cmd), "fsck %s %s %s", fsck_mode, fsck_repair, dev);
#endif
dbg("Running pass %d fsck command %s", pass, cmd);
fsck_rc = run_interactive(cmd, "Checking filesystem %s", dev);
/*
@@ -282,7 +277,6 @@ static int fsck(int pass)
static int fsck_all(void)
{
int rc = 0;
#ifndef FAST_BOOT
int pass;
if (!fsck_mode)
@@ -293,7 +287,7 @@ static int fsck_all(void)
if (rc)
break;
}
#endif
return rc;
}
+1 -1
View File
@@ -89,7 +89,7 @@ int exec_runtask (char *cmd, char *args[]);
pid_t run_getty (char *tty, char *cmd, char *args[], int noclear, int nowait, struct rlimit rlimit[]);
pid_t run_sh (char *tty, int noclear, int nowait, struct rlimit rlimit[]);
pid_t run_bg (char *cmd, char *args[]);
int run_parts (char *dir, char *cmd, const char *env[], int progress);
int run_parts (char *dir, char *cmd, const char *env[], int progress, int sysv);
/*
* Defaults to user "root" and group "wheel" (root) if:
+1 -1
View File
@@ -230,7 +230,7 @@ void plugin_script_run(hook_point_t no)
} else
env[2] = NULL;
run_parts(path, NULL, env, 0);
run_parts(path, NULL, env, 0, 0);
}
#else
void plugin_script_run(hook_point_t no)
+13 -5
View File
@@ -83,7 +83,7 @@ static void run_env(const char *env[])
}
}
int run_parts(char *dir, char *cmd, const char *env[], int progress)
int run_parts(char *dir, char *cmd, const char *env[], int progress, int sysv)
{
size_t cmdlen = cmd ? strlen(cmd) : strlen("start");
struct dirent **d;
@@ -127,6 +127,11 @@ int run_parts(char *dir, char *cmd, const char *env[], int progress)
continue;
}
if (sysv && name[0] != 'S' && name[0] != 'K') {
dbg("S-only flag set, skipping non-SysV script: %s", name);
continue;
}
/* If the callee didn't supply a run_parts() argument */
if (!cmd) {
/* Check if S<NUM>service or K<NUM>service notation is used */
@@ -179,16 +184,16 @@ int run_parts(char *dir, char *cmd, const char *env[], int progress)
#ifndef __FINIT__
static int usage(int rc)
{
warnx("usage: runparts [-dh?] DIRECTORY");
warnx("usage: runparts [-dhps?] DIRECTORY");
return rc;
}
int main(int argc, char *argv[])
{
int rc, c, progress = 0;
int rc, c, progress = 0, sysv = 0;
char *dir;
while ((c = getopt(argc, argv, "dh?p")) != EOF) {
while ((c = getopt(argc, argv, "dh?ps")) != EOF) {
switch(c) {
case 'd':
debug = 1;
@@ -199,6 +204,9 @@ int main(int argc, char *argv[])
case 'p':
progress = 1;
break;
case 's':
sysv = 1;
break;
default:
return usage(1);
}
@@ -213,7 +221,7 @@ int main(int argc, char *argv[])
prctl(PR_SET_CHILD_SUBREAPER, 1);
rc = run_parts(dir, NULL, NULL, progress);
rc = run_parts(dir, NULL, NULL, progress, sysv);
if (rc == -1)
err(1, "failed run-parts %s", dir);
-1
View File
@@ -60,7 +60,6 @@ static int init(char *progname, char *devnode)
signal(SIGPWR, sighandler);
openlog(&progname[1], LOG_CONS | LOG_PID, LOG_DAEMON);
syslog(LOG_INFO, "Finit v%s watchdog %s starting ...", VERSION, devnode);
fd = open(devnode, O_WRONLY);
if (fd == -1)
+6 -1
View File
@@ -2,9 +2,12 @@ SUBDIRS = lib src
EXTRA_DIST = skel/bin/busybox-x86_64.sha256 skel/sbin/service.sh skel/etc/env \
skel/bin/pre.sh skel/bin/post.sh skel/bin/ready.sh skel/bin/slay \
skel/sbin/fail.sh skel/usr/share/runlevel/ref.log \
skel/sbin/fail.sh skel/usr/share/runparts/ref.log \
skel/usr/share/runparts/sysv.log \
skel/etc/rc.d/foo.sh skel/etc/rc.d/S01abc.sh \
skel/etc/rc.d/test.sh skel/etc/rc.d/S02def.sh \
skel/etc/rcS.d/foo.sh skel/etc/rcS.d/test.sh \
skel/etc/rcS.d/S01abc.sh skel/etc/rcS.d/S02def.sh \
skel/cdrom/.empty skel/dev/shm/.empty skel/dev/pts/.empty \
skel/etc/inittab skel/etc/hostname skel/etc/fstab \
skel/etc/init.d/rcS skel/etc/init.d/rcK skel/tmp/.empty \
@@ -41,6 +44,7 @@ EXTRA_DIST += runlevel.sh
EXTRA_DIST += run-restart-forever.sh
EXTRA_DIST += run-task-tricks.sh
EXTRA_DIST += runparts.sh
EXTRA_DIST += sysvparts.sh
EXTRA_DIST += start-stop-service.sh
EXTRA_DIST += start-stop-service-sub-config.sh
EXTRA_DIST += start-kill-service.sh
@@ -80,6 +84,7 @@ TESTS += rclocal.sh
TESTS += ready-serv.sh
TESTS += restart-self.sh
TESTS += runlevel.sh
TESTS += sysvparts.sh
TESTS += run-restart-forever.sh
TESTS += run-task-tricks.sh
TESTS += runparts.sh
@@ -6,10 +6,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_RCSD/service.conf"
say "Running test teardown."
run "rm -f $FINIT_RCSD/service.conf"
}
# shellcheck source=/dev/null
+3 -3
View File
@@ -6,10 +6,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+53 -53
View File
@@ -9,77 +9,77 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Running test teardown."
run "rm -f $TEST_CONF"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $TEST_CONF"
}
test_one()
{
cond=$1
stanza=$2
cond=$1
stanza=$2
sleep 5
say 'Enable finit debug, try to figure out what is going on ...'
run "initctl debug"
sleep 5
say 'Enable finit debug, try to figure out what is going on ...'
run "initctl debug"
say "Add stanza '$stanza' to $TEST_CONF ..."
run "echo '$stanza' > $TEST_CONF"
say "Add stanza '$stanza' to $TEST_CONF ..."
run "echo '$stanza' > $TEST_CONF"
run "ls -l /run/ /run/finit/"
say 'Reload Finit'
run "initctl ls"
run "initctl reload"
run "initctl status"
run "ps"
run "ls -l /run/ /run/finit/"
say 'Reload Finit'
run "initctl ls"
run "initctl reload"
run "initctl status"
run "ps"
date
sleep 2
date
run "ls -l /run/ /run/finit/"
say 'Asserting condition'
run "initctl cond set $cond"
date
sleep 2
date
run "ls -l /run/ /run/finit/"
say 'Asserting condition'
run "initctl cond set $cond"
date
sleep 2
date
run "ls -l /run/ /run/finit/"
run "initctl status"
run "ps"
run "initctl status task.sh"
date
sleep 2
date
run "ls -l /run/ /run/finit/"
run "initctl status"
run "ps"
run "initctl status task.sh"
sleep 1
run "echo Hej; cat /run/task.state"
sleep 1
run "echo Hej; cat /run/task.state"
assert_file_contains /run/task.state 1
assert_file_contains /run/task.state 1
say 'Reload Finit'
run "initctl reload"
sleep 1
say 'Ensure task has not run again ...'
assert_file_contains /run/task.state 1
say 'Reload Finit'
run "initctl reload"
sleep 1
say 'Ensure task has not run again ...'
assert_file_contains /run/task.state 1
say 'Switch to another runlevel ...'
run "initctl runlevel 3"
sleep 1
say 'Ensure task has run again ...'
assert_file_contains /run/task.state 2
say 'Touch task.sh .conf file and reload Finit ...'
run "touch $TEST_CONF"
run "initctl reload"
sleep 1
# run "initctl status task.sh"
assert_file_contains /run/task.state 3
say 'Switch to another runlevel ...'
run "initctl runlevel 3"
sleep 1
say 'Ensure task has run again ...'
assert_file_contains /run/task.state 2
say 'Touch task.sh .conf file and reload Finit ...'
run "touch $TEST_CONF"
run "initctl reload"
sleep 1
# run "initctl status task.sh"
assert_file_contains /run/task.state 3
say "Done, drop stanza from $TEST_CONF ..."
run "rm $TEST_CONF"
run "initctl reload"
say "Done, drop stanza from $TEST_CONF ..."
run "rm $TEST_CONF"
run "initctl reload"
}
+33 -33
View File
@@ -7,57 +7,57 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF" "/tmp/post"
say "Running test teardown."
run "rm -f $FINIT_CONF" "/tmp/post"
}
crashit()
{
nm=$1
nm=$1
say 'Simulate service crash (kill -9 ..)'
i=0
laps=100
while [ $i -lt $laps ]; do
i=$((i + 1))
say "Lap $i/$laps, killing service $nm ..." # we have this, no sleep needed
if ! run "slay $nm"; then
break;
fi
done
say 'Simulate service crash (kill -9 ..)'
i=0
laps=100
while [ $i -lt $laps ]; do
i=$((i + 1))
say "Lap $i/$laps, killing service $nm ..." # we have this, no sleep needed
if ! run "slay $nm"; then
break;
fi
done
}
test_one()
{
type=$1
shift
nm=$1
shift
args=$*
type=$1
shift
nm=$1
shift
args=$*
say "Add service stanza in $FINIT_CONF"
run "echo service log:stderr oncrash:script post:/bin/post.sh $nm $args > $FINIT_CONF"
say "Add service stanza in $FINIT_CONF"
run "echo service log:stderr oncrash:script post:/bin/post.sh $nm $args > $FINIT_CONF"
say 'Reload Finit'
run "initctl reload"
say 'Reload Finit'
run "initctl reload"
if [ "$type" = "sig" ]; then
retry "assert_num_children 1 $nm"
run "initctl status $nm"
crashit "$nm"
fi
if [ "$type" = "sig" ]; then
retry "assert_num_children 1 $nm"
run "initctl status $nm"
crashit "$nm"
fi
retry "assert_status $nm crashed" 500
run "cat /tmp/post"
assert_file_contains "/tmp/post" "POST"
run "rm -f /tmp/post"
retry "assert_status $nm crashed" 500
run "cat /tmp/post"
assert_file_contains "/tmp/post" "POST"
run "rm -f /tmp/post"
}
# shellcheck source=/dev/null
+30 -30
View File
@@ -16,15 +16,15 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Running test teardown."
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF" "/tmp/post"
run "rm -f $FINIT_CONF" "/tmp/post"
}
# shellcheck source=/dev/null
@@ -35,36 +35,36 @@ test_teardown()
test_one()
{
cond=$1
say "Verifying foo -> <$cond> bar ..."
run "echo service log:stderr name:foo serv -np -i foo -f /tmp/arrakis > $FINIT_CONF"
run "echo service log:stderr name:bar \<!$cond\> serv -np -i bar -F /tmp/arrakis >> $FINIT_CONF"
run "cat $FINIT_CONF"
cond=$1
say "Verifying foo -> <$cond> bar ..."
run "echo service log:stderr name:foo serv -np -i foo -f /tmp/arrakis > $FINIT_CONF"
run "echo service log:stderr name:bar \<!$cond\> serv -np -i bar -F /tmp/arrakis >> $FINIT_CONF"
run "cat $FINIT_CONF"
say 'Reload Finit'
run "initctl reload"
say 'Reload Finit'
run "initctl reload"
run "initctl status"
assert_status "foo" "running"
assert_cond "$cond"
assert_status "bar" "running"
run "initctl status"
assert_status "foo" "running"
assert_cond "$cond"
assert_status "bar" "running"
say "Verify bar is restarted when foo is ..."
pid=$(texec initctl |grep bar | awk '{print $1;}')
run "initctl restart foo"
run "initctl status"
assert "bar is restarted" "$(texec initctl |grep bar | awk '{print $1;}')" != "$pid"
say "Verify bar is restarted when foo is ..."
pid=$(texec initctl |grep bar | awk '{print $1;}')
run "initctl restart foo"
run "initctl status"
assert "bar is restarted" "$(texec initctl |grep bar | awk '{print $1;}')" != "$pid"
# Wait for spice to be stolen by the Harkonnen
sleep 3
# bar should now have detected the loss of spice and be in restart
run "initctl status"
assert_status "bar" "restart"
# verify bar is stopped->waiting and no longer in restart after stopping foo
run "initctl stop foo"
run "initctl status"
run "initctl status bar"
assert_status "bar" "waiting"
# Wait for spice to be stolen by the Harkonnen
sleep 3
# bar should now have detected the loss of spice and be in restart
run "initctl status"
assert_status "bar" "restart"
# verify bar is stopped->waiting and no longer in restart after stopping foo
run "initctl stop foo"
run "initctl status"
run "initctl status bar"
assert_status "bar" "waiting"
}
sep
+22 -22
View File
@@ -9,52 +9,52 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Running test teardown."
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF /tmp/post"
run "rm -f $FINIT_CONF /tmp/post"
}
# Cannot run mknod as non-root even in a chroot
# touch is close enough for our needs
mkdev()
{
dir=$(dirname "$1")
run "mkdir -p $dir"
run "touch $1"
dir=$(dirname "$1")
run "mkdir -p $dir"
run "touch $1"
}
rmdev()
{
run "rm $1"
run "rm $1"
}
test_one()
{
cond="$1"
node="/$cond"
cond="$1"
node="/$cond"
say "Checking cond $cond and device $node ..."
run "echo service log:null \<$cond\> serv -np >> $FINIT_CONF"
run "cat $FINIT_CONF"
run "initctl reload"
say "Checking cond $cond and device $node ..."
run "echo service log:null \<$cond\> serv -np >> $FINIT_CONF"
run "cat $FINIT_CONF"
run "initctl reload"
assert_status "serv" "waiting"
assert_status "serv" "waiting"
mkdev "$node"
assert_status "serv" "running"
mkdev "$node"
assert_status "serv" "running"
rmdev "$node"
assert_status "serv" "waiting"
rmdev "$node"
assert_status "serv" "waiting"
say "Cleaning up ..."
run "rm $FINIT_CONF"
run "initctl reload"
say "Cleaning up ..."
run "rm $FINIT_CONF"
run "initctl reload"
}
# shellcheck source=/dev/null
+5 -5
View File
@@ -8,16 +8,16 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
run "mkdir -p /etc/default"
say "Test start $(date)"
run "mkdir -p /etc/default"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+4 -4
View File
@@ -5,15 +5,15 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+8 -8
View File
@@ -9,28 +9,28 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
test_init()
{
run "echo '# Three foo and one bar enter Finit' > $FINIT_CONF"
run "echo '# Three foo and one bar enter Finit' > $FINIT_CONF"
}
test_add_one()
{
service=$1
service=$1
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' >> $FINIT_CONF"
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' >> $FINIT_CONF"
}
# shellcheck source=/dev/null
+7 -7
View File
@@ -4,10 +4,10 @@ set -eu
cmd=""
if [ "$#" -lt 1 ]; then
cmd="/bin/sh"
cmd="/bin/sh"
else
cmd=$1
shift
cmd=$1
shift
fi
TEST_DIR=$(dirname "$0")/..
@@ -15,11 +15,11 @@ SYSROOT="${SYSROOT:-$(pwd)/${TEST_DIR}/sysroot}"
PID_FILE="$SYSROOT/running_test.pid"
if [ -f "$PID_FILE" ] ; then
target=$(cat "$PID_FILE")
target=$(pgrep -P "$target")
target=$(cat "$PID_FILE")
target=$(pgrep -P "$target")
else
echo "No test running!"
exit 1
echo "No test running!"
exit 1
fi
# shellcheck disable=SC1091
+12 -12
View File
@@ -24,9 +24,9 @@
set -eu
if [ "$#" -lt 2 ]; then
echo "Usage:"
echo " $0 [target-pid] [command [arguments]]"
exit 1
echo "Usage:"
echo " $0 [target-pid] [command [arguments]]"
exit 1
fi
target="$1"
shift
@@ -46,12 +46,12 @@ PATH="$TESTENV_PATH"
export PATH
"$nsenter" \
--preserve-credentials \
--user \
--mount \
--uts \
--ipc \
--net \
--pid \
-w -t "$target" \
"$chroot" "$SYSROOT" "$@"
--preserve-credentials \
--user \
--mount \
--uts \
--ipc \
--net \
--pid \
-w -t "$target" \
"$chroot" "$SYSROOT" "$@"
+8 -8
View File
@@ -342,17 +342,17 @@ echo "Finit running as PID $finit_pid"
i=0
set +u
while [ -z "$BOOTSTRAP" ] && [ $i -lt 10 ]; do
lvl=$(texec sh -c "initctl runlevel | awk '{print \$2;}'")
if [ "$lvl" = "$FINIT_RUNLEVEL" ]; then
say "Reached runlevel $FINIT_RUNLEVEL, releasing test."
break;
fi
i=$((i + 1))
sleep 1
lvl=$(texec sh -c "initctl runlevel | awk '{print \$2;}'")
if [ "$lvl" = "$FINIT_RUNLEVEL" ]; then
say "Reached runlevel $FINIT_RUNLEVEL, releasing test."
break;
fi
i=$((i + 1))
sleep 1
done
set -u
if type test_setup > /dev/null 2>&1 ; then
test_setup
test_setup
fi
wdstart $TEST_TIMEOUT
+18 -18
View File
@@ -8,16 +8,16 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
run "mkdir -p /etc/default"
say "Test start $(date)"
run "mkdir -p /etc/default"
}
test_teardown()
{
say "Test done $(date)"
say "Running test teardown."
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
run "rm -f $FINIT_CONF"
}
test_one()
@@ -37,11 +37,11 @@ test_one()
run "initctl reload"
sleep 1
# run "initctl status serv"
# run "initctl status serv"
assert_status "serv" "running"
sleep 2
# run "initctl cond dump"
# run "initctl cond dump"
assert_cond "service/serv/ready"
say "Verify 'ready' is set after SIGHUP ..."
@@ -52,7 +52,7 @@ test_one()
# Issue #343
say "Verify 'ready' is reasserted if service crashes and is restarted ..."
# run "initctl status serv"
# run "initctl status serv"
run "initctl signal serv 9"
retry 'assert_status "serv" "running"' 2 1
retry 'assert_cond "service/serv/ready"' 3 1
@@ -67,7 +67,7 @@ test_one()
say "Verify 'ready' is reasserted on 'initctl reload' ..."
run "initctl reload"
sleep 1
# run "initctl; initctl cond dump"
# run "initctl; initctl cond dump"
assert_status "serv" "running"
assert_cond "service/serv/ready"
@@ -75,12 +75,12 @@ test_one()
# 'started' when they created their PID file. The serv test daemon
# waits 3 sec between pidfile and notify to trigger this bug.
if [ "$type" != "native" ]; then
say "Verify 'ready' is *not* asserted immediately on restart + reload"
run "initctl restart serv"
run "initctl reload"
sleep 1
assert_nocond "service/serv/ready"
retry 'assert_cond "service/serv/ready"' 5 0.5
say "Verify 'ready' is *not* asserted immediately on restart + reload"
run "initctl restart serv"
run "initctl reload"
sleep 1
assert_nocond "service/serv/ready"
retry 'assert_cond "service/serv/ready"' 5 0.5
fi
say "Verify 'ready' is deasserted on stop ..."
@@ -93,9 +93,9 @@ test_one()
run "rm -f $FINIT_CONF"
run "initctl reload"
# sleep 2
# num=$(run "find /proc/1/fd |wc -l")
# say "finit: number of open file descriptors after test: $num"
# sleep 2
# num=$(run "find /proc/1/fd |wc -l")
# say "finit: number of open file descriptors after test: $num"
}
# shellcheck source=/dev/null
+14 -14
View File
@@ -7,32 +7,32 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Running test teardown."
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF" "/tmp/post"
run "rm -f $FINIT_CONF" "/tmp/post"
}
test_one()
{
pidfn=$1
service=$2
pidfn=$1
service=$2
sep
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
run "initctl reload"
sep
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
run "initctl reload"
assert_is_pidfile "serv" "$pidfn"
assert_is_pidfile "serv" "$pidfn"
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
}
# shellcheck source=/dev/null
+28 -28
View File
@@ -5,49 +5,49 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
test_one()
{
pre=$1
precont=$2
service=$3
post=$4
postcont=$5
pre=$1
precont=$2
service=$3
post=$4
postcont=$5
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say 'Reload Finit'
run "initctl reload"
say 'Reload Finit'
run "initctl reload"
retry 'assert_num_children 1 serv'
if [ -n "$pre" ]; then
assert_file_contains "$pre" "$precont"
run "rm -f $pre"
fi
retry 'assert_num_children 1 serv'
if [ -n "$pre" ]; then
assert_file_contains "$pre" "$precont"
run "rm -f $pre"
fi
say 'Stop the service'
run "initctl stop serv"
say 'Stop the service'
run "initctl stop serv"
retry 'assert_num_children 0 serv'
if [ -n "$post" ]; then
assert_file_contains "$post" "$postcont"
run "rm -f $post"
fi
retry 'assert_num_children 0 serv'
if [ -n "$post" ]; then
assert_file_contains "$post" "$postcont"
run "rm -f $post"
fi
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
}
# shellcheck source=/dev/null
+2 -2
View File
@@ -12,12 +12,12 @@ RCLOCAL="echo 'KILROY WAS HERE' > /tmp/rclocal"
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
}
sleep 1
+19 -19
View File
@@ -6,39 +6,39 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
test_one()
{
service=$1
file=/tmp/ready
service=$1
file=/tmp/ready
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say 'Reload Finit'
run "initctl reload"
say 'Reload Finit'
run "initctl reload"
retry 'assert_num_children 1 serv'
assert_file_contains "$file" "READY"
run "rm -f $file"
retry 'assert_num_children 1 serv'
assert_file_contains "$file" "READY"
run "rm -f $file"
say 'Stop the service'
run "initctl stop serv"
retry 'assert_num_children 0 serv'
say 'Stop the service'
run "initctl stop serv"
retry 'assert_num_children 0 serv'
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
}
# shellcheck source=/dev/null
+6 -6
View File
@@ -6,21 +6,21 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
run "mkdir -p /etc/default"
say "Test start $(date)"
run "mkdir -p /etc/default"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
check_restarts()
{
assert "serv restarts" "$(texec cat "$1" | awk '{print $1;}')" -ge "$2"
assert "serv restarts" "$(texec cat "$1" | awk '{print $1;}')" -ge "$2"
}
+6 -6
View File
@@ -9,17 +9,17 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
run "mkdir -p /etc/default"
export TEST_TIMEOUT=5
say "Test start $(date)"
run "mkdir -p /etc/default"
export TEST_TIMEOUT=5
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+3 -3
View File
@@ -9,12 +9,12 @@ FINIT_RUNLEVEL=9
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
}
# shellcheck source=/dev/null
@@ -23,7 +23,7 @@ test_teardown()
say 'Check runlevel'
lvl=$(run "initctl runlevel | awk '{print \$2;}'")
if [ "$lvl" -eq "9" ]; then
return 0
return 0
fi
return 1
+2 -2
View File
@@ -37,5 +37,5 @@ while true; do
sleep 1
done
texec diff -u /usr/share/runlevel/ref.log /tmp/runparts.log
texec cmp /usr/share/runlevel/ref.log /tmp/runparts.log || fail "runparts in wrong order"
texec diff -u /usr/share/runparts/ref.log /tmp/runparts.log
texec cmp /usr/share/runparts/ref.log /tmp/runparts.log || fail "runparts in wrong order"
+2 -2
View File
@@ -13,11 +13,11 @@ FINITBIN="$(pwd)/$top_builddir/src/finit" DEST="$SYSROOT" make -f "$srcdir/lib/s
# Drop plugins we don't need in test, only causes confusing FAIL in logs.
for plugin in tty.so urandom.so rtc.so modprobe.so hotplug.so; do
find "$SYSROOT" -name $plugin -delete
find "$SYSROOT" -name $plugin -delete
done
# Drop system .conf files we don't need in test, same as above
for conf in hotplug.conf; do
find "$SYSROOT" -name $conf -delete
find "$SYSROOT" -name $conf -delete
done
+3 -3
View File
@@ -7,10 +7,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+32 -31
View File
@@ -2,50 +2,51 @@
nm=$1
# shellcheck disable=SC2046
getpid()
{
initctl status "$1" |awk '/PID :/{ print $3; }'
initctl status "$1" |awk '/PID :/{ print $3; }'
}
pid=$(getpid "$nm")
if [ -f oldpid ]; then
oldpid=$(cat oldpid)
oldpid=$(cat oldpid)
if [ "$oldpid" = "$pid" ]; then
echo "Looks bad, wait for it ..."
sleep 3
pid=$(getpid "$nm")
if [ "$oldpid" = "$pid" ]; then
echo "Looks bad, wait for it ..."
sleep 3
pid=$(getpid "$nm")
if [ "$oldpid" = "$pid" ]; then
echo "Finit did not deregister old PID $oldpid vs $pid"
initctl status "$nm"
ps
echo "Reloading finit ..."
initctl reload
sleep 1
initctl status "$nm"
exit 1
fi
echo "Finit did not deregister old PID $oldpid vs $pid"
initctl status "$nm"
ps
echo "Reloading finit ..."
initctl reload
sleep 1
initctl status "$nm"
exit 1
fi
fi
fi
timeout=50
while [ "$pid" -le 1 ]; do
sleep 0.1
pid=$(getpid "$nm")
if [ "$pid" -le 1 ]; then
timeout=$((timeout - 1))
if [ "$timeout" -gt 0 ]; then
continue
fi
echo "Got a bad PID: $pid, aborting ..."
ps
sleep 1
initctl status "$nm"
ps
exit 1
sleep 0.1
pid=$(getpid "$nm")
if [ "$pid" -le 1 ]; then
timeout=$((timeout - 1))
if [ "$timeout" -gt 0 ]; then
continue
fi
break
if [ $pid -ne 0 ]; then
echo "Got a bad PID: $pid, aborting ..."
ps
sleep 1
initctl status "$nm"
ps
fi
exit 1
fi
break
done
echo "$pid" > /tmp/oldpid
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
echo "$0 $*" >> /tmp/sysv.log
+1
View File
@@ -0,0 +1 @@
S01abc.sh
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
echo "$0" >> /tmp/sysv.log
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
echo "$0" >> /tmp/sysv.log
+2
View File
@@ -0,0 +1,2 @@
/etc/rcS.d/S01abc.sh start
/etc/rcS.d/S02def.sh start
+6 -6
View File
@@ -8,10 +8,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
@@ -35,9 +35,9 @@ say 'Simulate service crash (kill -9 ..)'
i=0
laps=1000
while [ $i -lt $laps ]; do
i=$((i + 1))
say "Lap $i/$laps, killing service ..." # we have this, no sleep needed
run "slay service.sh"
i=$((i + 1))
say "Lap $i/$laps, killing service ..." # we have this, no sleep needed
run "slay service.sh"
done
retry 'assert_new_pid service.sh /run/service.pid'
+27 -27
View File
@@ -5,51 +5,51 @@ TEST_DIR=$(dirname "$0")
test_setup()
{
say "Test start $(date)"
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
test_one()
{
pidfn=$1
service=$2
pidfn=$1
service=$2
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say "Add service stanza '$service' to $FINIT_CONF ..."
run "echo '$service' > $FINIT_CONF"
say 'Reload Finit'
#run "initctl debug"
run "initctl reload"
#run "initctl status"
#run "ps"
say 'Reload Finit'
#run "initctl debug"
run "initctl reload"
#run "initctl status"
#run "ps"
#run "initctl status"
#run "ps"
#run "initctl status serv"
#run "initctl status"
#run "ps"
#run "initctl status serv"
retry 'assert_num_children 1 serv'
retry "assert_has_pidfile $pidfn" 1
retry 'assert_num_children 1 serv'
retry "assert_has_pidfile $pidfn" 1
say 'Stop the service'
run "initctl stop serv"
say 'Stop the service'
run "initctl stop serv"
retry 'assert_num_children 0 serv'
retry 'assert_num_children 0 serv'
say 'Start the service again'
run "initctl start serv"
say 'Start the service again'
run "initctl start serv"
retry 'assert_num_children 1 serv'
retry 'assert_num_children 1 serv'
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
say "Done, drop service from $FINIT_CONF ..."
run "rm $FINIT_CONF"
run "initctl reload"
}
# shellcheck source=/dev/null
+3 -3
View File
@@ -6,10 +6,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_RCSD/service.conf"
say "Running test teardown."
run "rm -f $FINIT_RCSD/service.conf"
}
# shellcheck source=/dev/null
+3 -3
View File
@@ -6,10 +6,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+3 -3
View File
@@ -6,10 +6,10 @@ TEST_DIR=$(dirname "$0")
test_teardown()
{
say "Test done $(date)"
say "Test done $(date)"
say "Running test teardown."
run "rm -f $FINIT_CONF"
say "Running test teardown."
run "rm -f $FINIT_CONF"
}
# shellcheck source=/dev/null
+42
View File
@@ -0,0 +1,42 @@
#!/bin/sh
#
# Verifies SysV runparts behavior: to run all scripts in a directory at
# the end of system bootstrap, right before calling /etc/rc.local:
#
# - only SNNfoo or KNNfoo executable scripts should be called
# - always in alphabetical order
# - SNNfoo should be called with a 'start' argument
# - KNNfoo should be called with a 'stop' argument
#
TEST_DIR=$(dirname "$0")
#DEBUG=1
# shellcheck disable=SC2034
BOOTSTRAP="runparts sysv /etc/rcS.d"
# shellcheck source=/dev/null
. "$TEST_DIR/lib/setup.sh"
test_setup()
{
say "Test start $(date)"
}
test_teardown()
{
say "Test done $(date)"
}
while true; do
lvl=$(texec initctl runlevel)
say "Current runlevel $lvl"
if [ "$lvl" = "N 2" ]; then
break;
fi
sleep 1
done
texec cat /tmp/sysv.log
texec diff -u /usr/share/runparts/sysv.log /tmp/sysv.log
texec cmp /usr/share/runparts/sysv.log /tmp/sysv.log || fail "runparts sysv in wrong order"