sipXecs 4.6 now bundles the open source tool called "cfengine" to apply configuration to a system and manage services. This is a role that a C++ service called "sipxsupervisor" previously filled. sipxsupervisor will continue to be installed and used for until all management is converted to cfengine scripts.
cfengine has many advantages over sipxsupervisor including:
- scripts you can develop without compiling
- rich libraries of scripts to perform common operations
- documentation and written books
- support for idempotent operations.
- scripts that execute then exit so cannot leave memory leaks
- reporting
- key based security built in
Here are some helpful tips with working with cfengine.
Online documentation
- Reference Manual - Best doc for explaining what functions are built into cfengine
- Reference Manual - Goes into theory so not the greatest tutorial. You may find some useful explanations however. Much of it may not apply to how sipXecs uses cfengine.
- Standard cfengine Library - There's a library of utilities we including in sipXecs that are available to you scripts.
How to develop cfengine scripts independently
Like a shell script, many times it makes sense to develop your cfengine script outside of sipXecs. Here is the simplest script you could write, and how you could execute it.
# this is a comment bundle agent mytest { vars: any:: "foo" string => "bar"; commands: any:: "/bin/touch" args => "/tmp/bar"; classes: any:: "myflag" expression => fileexists("/tmp/foobar"); files: any:: "/tmp/foo" create => "true"; reports: linux:: "foo variable is $(foo)"; myflag:: "/tmp/foobar does exist"; !myflag:: "/tmp/foobar does *not* exist"; } body common control { bundlesequence => { "mytest" }; }
And how to run script
cd /var/cfengine/inputs cf-agent -IKvf mytest.cf
"classes" are just booleans
If you're coming from a programming background, classes usually mean OOP. In cfengine, think of them as booleans or flags you define.