I want CFEngine to shut down a service that I have blacklisted,
and to notify me that it did so. It does this, but considers this as a promise
kept rather than as a promise repaired. Why? It makes a change to the
system in order to keep a promise, isn't that a repair?
Policy:
{{{
body common control {
inputs => { "/var/cfengine/inputs/cfengine_stdlib.cf" };
}
bundle agent example {
processes:
"cupsd"
process_stop => "/etc/init.d/cups stop",
comment => "We don't want print services on our Web servers."
,
classes => if_repaired("complain_loudly_about_cups");
commands:
complain_loudly_about_cups::
"/bin/echo send up a flare about CUPS";
}
}}}
When I run it (under 3.2.0) it shuts down CUPS but does not run the
reporter/alerter command:
cf3> Observe process table with /bin/ps -eo user,pid,ppid,pgid,pcpu,pmem,
vsz,pri,rss,nlwp,stime,time,args
cf3>
cf3> .........................................................
cf3> Promise handle:
cf3> Promise made by: cupsd
cf3>
cf3> Comment: We don't want print services on our Web servers.
cf3> .........................................................
cf3>
cf3> -> Found matching pid 11821
(root 11821 1 11821 0.0 0.0 78364 17 2612 1 21:30 00
:00:00 cupsd)
Stopping cups: [ OK ]
cf3> -> No restart promised for cupsd
cf3>
cf3> =========================================================
cf3> commands in bundle example (1)
cf3> =========================================================
cf3>
cf3>
cf3> . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cf3> Skipping whole next promise (/bin/echo send up a flare about CUPS),
as context complain_loudly_about_cups is not relevant
cf3> . . . . . . . . . . . . . . . . . . . . . . . . . . . .
So I changed my policy to use if_else() instead of if_repaired(), and
now it works!
cfengine_stdlib.cf:
{{{
body classes if_repaired(x)
{
promise_repaired => { "$(x)" };
}
##
body classes if_else(yes,no)
{
promise_kept => { "$(yes)" };
promise_repaired => { "$(yes)" };
repair_failed => { "$(no)" };
repair_denied => { "$(no)" };
repair_timeout => { "$(no)" };
}
}}}
The working policy:
{{{
body common control {
inputs => { "/var/cfengine/inputs/cfengine_stdlib.cf" };
}
bundle agent example {
processes:
"cupsd"
process_stop => "/etc/init.d/cups stop",
comment => "We don't want print services on our Web servers.",
classes => if_else("complain_loudly_about_cups","complain");
commands:
complain_loudly_about_cups::
"/bin/echo send up a flare about CUPS";
commands:
complain::
"/bin/echo Waaah!";
}
}}}
Is the processes promise in the first example a promise that the
process won't be running?
Or is it a promise to run a command if the process exists? And we do
run a command, so the promise is kept?
Reference Manual states, about promise_kept:
This class is set if no action was necessary by cf-agent because
the promise concerned was aready kept without further action required.
I want to make sure I understand how commands promises relate to
promise_kept/promise_repaired.
The behavior I am seeing is NOT what I expect, so I am confused.
Could this point be clarified in the manual, please?
Aleksey
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine