From 1457165f2300dda2a5302aea801808dd6602eea2 Mon Sep 17 00:00:00 2001 From: Victor Moene Date: Mon, 19 Oct 2026 16:24:48 +0200 Subject: [PATCH 1/2] Added cf-reactor to the cfengine3 init script Needed for starting cf-reactor as a daemon on a host without systemd Signed-off-by: Victor Moene --- misc/init.d/cfengine3.in | 22 +++++++++++++++++++++- tests/unit/init_script_test.sh | 18 +++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/misc/init.d/cfengine3.in b/misc/init.d/cfengine3.in index bb320630a8b..8811b86c855 100644 --- a/misc/init.d/cfengine3.in +++ b/misc/init.d/cfengine3.in @@ -53,6 +53,7 @@ fi CFEXECD=${CFTEST_CFEXECD:-$PREFIX/bin/cf-execd} CFSERVD=${CFTEST_CFSERVD:-$PREFIX/bin/cf-serverd} CFMOND=${CFTEST_CFMOND:-$PREFIX/bin/cf-monitord} +CFREACTORD=${CFTEST_CFREACTORD:-$PREFIX/bin/cf-reactor} CFAGENT=${CFTEST_CFAGENT:-$PREFIX/bin/cf-agent} PIDFILE_TEMPLATE=$PREFIX/%s.pid @@ -121,6 +122,7 @@ else RUN_CF_EXECD=1 RUN_CF_SERVERD=1 RUN_CF_MONITORD=1 + RUN_CF_REACTOR=1 fi # Check /sbin/startproc for SUSE @@ -227,7 +229,7 @@ cf_get_matching_pids() for pid in $pids; do # If the last character of the cgroup is not the root directory, # then this is a container process. - if [ -f /proc/$pid/cgroup ] && sed 's_/\(-\|system\|user\).slice__;s_/user-[0-9]*.slice__;s_/session-[0-9]*.scope__;s_/cfengine3.service__;s_/cf-execd.service__;s_/cf-serverd.service__;s_/cf-monitord.service__' /proc/$pid/cgroup | egrep '[0-9]+:devices:/[^:]' > /dev/null; then + if [ -f /proc/$pid/cgroup ] && sed 's_/\(-\|system\|user\).slice__;s_/user-[0-9]*.slice__;s_/session-[0-9]*.scope__;s_/cfengine3.service__;s_/cf-execd.service__;s_/cf-serverd.service__;s_/cf-monitord.service__;s_/cf-reactor.service__' /proc/$pid/cgroup | egrep '[0-9]+:devices:/[^:]' > /dev/null; then if [ $INSIDE_CONTAINER = 1 ]; then echo $pid fi @@ -501,6 +503,11 @@ cf_start_core_daemons() if [ "$RUN_CF_MONITORD" = "1" ]; then cf_start_daemon "$CFMOND" fi + + # start cf-reactor + if [ "$RUN_CF_REACTOR" = "1" ]; then + cf_start_daemon "$CFREACTORD" + fi } cf_stop_core_daemons() @@ -549,6 +556,11 @@ cf_stop_core_daemons() cf_stop_daemon "$CFMOND" && any_process_present=1 fi + # shutdown cf-reactor + if [ "$RUN_CF_REACTOR" = "1" ]; then + cf_stop_daemon "$CFREACTORD" && any_process_present=1 + fi + # In case agents were spawned just as we were trying to kill the # daemons, try killing those too. cf_stop_agents && any_process_present=1 @@ -588,6 +600,14 @@ cf_status_core_daemons() fi fi + # status cf-reactor + if [ "$RUN_CF_REACTOR" = "1" ]; then + cf_status_daemon "$CFREACTORD" + if [ "$?" = "3" ]; then + cf_status_core_daemons_exit=3 + fi + fi + # Return the exit code return $cf_status_core_daemons_exit } diff --git a/tests/unit/init_script_test.sh b/tests/unit/init_script_test.sh index f105ede55d9..f25818efb90 100755 --- a/tests/unit/init_script_test.sh +++ b/tests/unit/init_script_test.sh @@ -64,6 +64,7 @@ export CFTEST_PREFIX=/tmp/init_script_test.sh.$$ export CFTEST_CFEXECD=$CFTEST_PREFIX/bin/cf-test-execd export CFTEST_CFSERVD=$CFTEST_PREFIX/bin/cf-test-serverd export CFTEST_CFMOND=$CFTEST_PREFIX/bin/cf-test-monitord +export CFTEST_CFREACTORD=$CFTEST_PREFIX/bin/cf-test-reactor export CFTEST_CFAGENT=$CFTEST_PREFIX/bin/cf-test-agent export OUTFILE=$CFTEST_PREFIX/outfile @@ -94,6 +95,7 @@ set -e cp init_script_test_helper $CFTEST_PREFIX/bin/cf-test-execd cp init_script_test_helper $CFTEST_PREFIX/bin/cf-test-serverd cp init_script_test_helper $CFTEST_PREFIX/bin/cf-test-monitord +cp init_script_test_helper $CFTEST_PREFIX/bin/cf-test-reactor cp init_script_test_helper $CFTEST_PREFIX/bin/cf-test-agent touch $CFTEST_PREFIX/inputs/promises.cf @@ -150,6 +152,7 @@ verify_none_running() no_matching_pid_exists $CFTEST_PREFIX/bin/cf-test-execd no_matching_pid_exists $CFTEST_PREFIX/bin/cf-test-serverd no_matching_pid_exists $CFTEST_PREFIX/bin/cf-test-monitord + no_matching_pid_exists $CFTEST_PREFIX/bin/cf-test-reactor no_matching_pid_exists $CFTEST_PREFIX/bin/cf-test-agent ) } @@ -172,6 +175,7 @@ echo "TEST: Normal starting" matching_pid_exists $CFTEST_PREFIX/bin/cf-test-execd matching_pid_exists $CFTEST_PREFIX/bin/cf-test-serverd matching_pid_exists $CFTEST_PREFIX/bin/cf-test-monitord +matching_pid_exists $CFTEST_PREFIX/bin/cf-test-reactor echo "TEST: Normal stopping" ../../misc/init.d/cfengine3 stop @@ -184,6 +188,9 @@ verify_none_running $CFTEST_PREFIX/bin/cf-test-monitord ../../misc/init.d/cfengine3 stop verify_none_running +$CFTEST_PREFIX/bin/cf-test-reactor +../../misc/init.d/cfengine3 stop +verify_none_running echo "TEST: Stopping daemons and agents" $CFTEST_PREFIX/bin/cf-test-execd --spawn-process $CFTEST_PREFIX/bin cf-test-agent @@ -302,7 +309,7 @@ verify_none_running $CFTEST_PREFIX/bin/cf-test-execd ../../misc/init.d/cfengine3 status > $OUTFILE \ && retcode=$? || retcode=$? -for i in cf-test-serverd cf-test-monitord +for i in cf-test-serverd cf-test-monitord cf-test-reactor do cat $OUTFILE | grep "$i.*is not running" done @@ -314,9 +321,10 @@ test $retcode = 3 echo "TEST: Verify that status of all daemons works" $CFTEST_PREFIX/bin/cf-test-serverd $CFTEST_PREFIX/bin/cf-test-monitord +$CFTEST_PREFIX/bin/cf-test-reactor ../../misc/init.d/cfengine3 status > $OUTFILE \ && retcode=$? || retcode=$? -for i in cf-test-execd cf-test-serverd cf-test-monitord +for i in cf-test-execd cf-test-serverd cf-test-monitord cf-test-reactor do cat $OUTFILE | egrep "$i.*(\.|is )running" done @@ -329,7 +337,7 @@ echo "TEST: Verify that status of no daemons works" verify_none_running ../../misc/init.d/cfengine3 status > $OUTFILE \ && retcode=$? || retcode=$? -for i in cf-test-execd cf-test-serverd cf-test-monitord +for i in cf-test-execd cf-test-serverd cf-test-monitord cf-test-reactor do cat $OUTFILE | grep "$i.*is not running" done @@ -344,7 +352,7 @@ $CFTEST_PREFIX/bin/cf-test-execd $CFTEST_PREFIX/bin/cf-test-execd ../../misc/init.d/cfengine3 status > $OUTFILE \ && retcode=$? || retcode=$? -for i in cf-test-serverd cf-test-monitord +for i in cf-test-serverd cf-test-monitord cf-test-reactor do cat $OUTFILE | grep "$i.*is not running" done @@ -359,7 +367,7 @@ $CFTEST_PREFIX/bin/cf-test-execd echo 9999999 > $CFTEST_PREFIX/cf-test-execd.pid ../../misc/init.d/cfengine3 status > $OUTFILE \ && retcode=$? || retcode=$? -for i in cf-test-serverd cf-test-monitord +for i in cf-test-serverd cf-test-monitord cf-test-reactor do cat $OUTFILE | grep "$i.*is not running" done From 1361c7dd298b97f5bbb487a1ed06b26bd320ce03 Mon Sep 17 00:00:00 2001 From: Victor Moene Date: Tue, 20 Oct 2026 15:42:21 +0200 Subject: [PATCH 2/2] Made init_script_test.sh ignore the host's cfengine3 defaults file The init script sources /etc/default/cfengine3 (or /etc/sysconfig/cfengine3) when it exists, and only falls back to its built-in RUN_CF_* defaults otherwise. A stale file from a removed CFEngine package on the build host was picked up by the test. Signed-off-by: Victor Moene --- misc/init.d/cfengine3.in | 1 + tests/unit/init_script_test.sh | 3 +++ 2 files changed, 4 insertions(+) diff --git a/misc/init.d/cfengine3.in b/misc/init.d/cfengine3.in index 8811b86c855..98113d3b2aa 100644 --- a/misc/init.d/cfengine3.in +++ b/misc/init.d/cfengine3.in @@ -115,6 +115,7 @@ if [ "$DEBIAN" = "1" ]; then else DEFAULT=/etc/sysconfig/cfengine3 fi +DEFAULT=${CFTEST_DEFAULT:-$DEFAULT} if [ -f $DEFAULT ]; then . $DEFAULT diff --git a/tests/unit/init_script_test.sh b/tests/unit/init_script_test.sh index f25818efb90..b3defb5904a 100755 --- a/tests/unit/init_script_test.sh +++ b/tests/unit/init_script_test.sh @@ -66,6 +66,9 @@ export CFTEST_CFSERVD=$CFTEST_PREFIX/bin/cf-test-serverd export CFTEST_CFMOND=$CFTEST_PREFIX/bin/cf-test-monitord export CFTEST_CFREACTORD=$CFTEST_PREFIX/bin/cf-test-reactor export CFTEST_CFAGENT=$CFTEST_PREFIX/bin/cf-test-agent +# Don't pick up the host's /etc/default/cfengine3 or /etc/sysconfig/cfengine3. +# The file is never created, so the init script's built-in defaults apply. +export CFTEST_DEFAULT=$CFTEST_PREFIX/cfengine3 export OUTFILE=$CFTEST_PREFIX/outfile rm -rf $CFTEST_PREFIX