Bring up time service using the CFEngine services abstraction of processes and commands.
The non_standard_services bundle below is based on standard_services
bundle in the CFEngine Standard Library. The Standard Library does
not include ntp today, so we have to supply our own code for it.
```cf3 body common control { bundlesequence => { “enable_ntp_service” }; inputs => { “libraries/cfengine_stdlib.cf” };
}
bundle agent enable_ntp_service {
services:
“ntp”
service_policy => "start",
service_method => service_ntp; }
body service_method service_ntp { service_bundle => non_standard_services(“$(this.promiser)”,”$(this.service_policy)”); }
bundle agent non_standard_services(service,state) { reports:
!done::
"Test service promise for \"$(service)\" -> $(state)";
vars:
ubuntu::
"startcommand[ntp]" string => "/etc/init.d/ntp start";
"restartcommand[ntp]" string => "/etc/init.d/ntp restart";
"reloadcommand[ntp]" string => "/etc/init.d/ntp reload";
"stopcommand[ntp]" string => "/etc/init.d/ntp stop";
"pattern[ntp]" string => ".*ntpd.*";
redhat:: “startcommand[ntp]” string => “/etc/init.d/ntpd start”; “restartcommand[ntp]” string => “/etc/init.d/ntpd restart”; “reloadcommand[ntp]” string => “/etc/init.d/ntpd reload”; “stopcommand[ntp]” string => “/etc/init.d/ntpd stop”; “pattern[ntp]” string => “.ntpd.”;
# METHODS that implement these ……………………………………..
classes:
“start” expression => strcmp(“start”,”$(state)”), comment => “Check if to start a service”; “restart” expression => strcmp(“restart”,”$(state)”), comment => “Check if to restart a service”; “reload” expression => strcmp(“reload”,”$(state)”), comment => “Check if to reload a service”; “stop” expression => strcmp(“stop”,”$(state)”), comment => “Check if to stop a service”;
processes:
start::
"$(pattern[$(service)])" -> { "@(stakeholders[$(service)])" }
comment => "Verify that the service appears in the process table",
restart_class => "start_$(service)";
stop::
"$(pattern[$(service)])" -> { "@(stakeholders[$(service)])" }
comment => "Verify that the service does not appear in the process",
process_stop => "$(stopcommand[$(service)])",
signals => { "term", "kill"};
commands:
”$(startcommand[$(service)])” -> { “@(stakeholders[$(service)])” }
comment => "Execute command to start the $(service) service",
ifvarclass => canonify("start_$(service)");
restart:: “$(restartcommand[$(service)])” -> { “@(stakeholders[$(service)])” }
comment => "Execute command to restart the $(service) service";
reload:: “$(reloadcommand[$(service)])” -> { “@(stakeholders[$(service)])” }
comment => "Execute command to reload the $(service) service"; }
```
Example run:
``` # /etc/init.d/ntp stop * Stopping NTP server ntpd [ OK ] # cf-agent -f enable_service.cf -K 2013-06-08T20:11:55-0700 notice: Q: “…init.d/ntp star”: * Starting NTP server ntpd Q: “…init.d/ntp star”: …done.
2013-06-08T20:11:55-0700 notice: R: Test service promise for “ntp” -> start # ```
And again, with Inform:
``` # /etc/init.d/ntp stop * Stopping NTP server ntpd [ OK ] # cf-agent -KIf enable_service.cf 2013-06-08T20:11:32-0700 info: This agent is bootstrapped to ‘192.168.183.208’ 2013-06-08T20:11:33-0700 info: Running full policy integrity checks 2013-06-08T20:11:33-0700 info: /enable_ntp_service/services/’ntp’: Service ‘ntp’ could not be invoked successfully 2013-06-08T20:11:33-0700 info: /enable_ntp_service/services/’ntp’/non_standard_services/processes/’$(pattern[$(service)])’: Making a one-time restart promise for ‘/usr/sbin/ntpd.*’ 2013-06-08T20:11:33-0700 info: Executing ‘no timeout’ … ‘/etc/init.d/ntp start’ 2013-06-08T20:11:33-0700 notice: Q: “…init.d/ntp star”: * Starting NTP server ntpd Q: “…init.d/ntp star”: …done.
2013-06-08T20:11:33-0700 info: Last 2 quoted lines were generated by promiser ‘/etc/init.d/ntp start’ 2013-06-08T20:11:33-0700 info: Completed execution of ‘/etc/init.d/ntp start’ 2013-06-08T20:11:33-0700 notice: R: Test service promise for “ntp” -> start ```