Markdown Cheatsheet

Markdown formatting is simple, and the CFEngine generator adds a few things to make it even simpler. Here's a list of the most commonly used formats.

Remember

  • "Always pull never push"

Basic Formatting

One
Paragraph

Two
Paragraphs

One Paragraph

Two Paragraphs

**Bold** Bold

*Italic* Italic

You can link to any documentation page section using [linktext][PageTitle#optional section].

For example I can link to collecting functions using [collecting functions][Functions#collecting functions].

[top of the page][Markdown Cheatsheet], to the [Markdown Cheatsheet][], [inside page][Markdown Cheatsheet#Links] and [inside current page][Markdown Cheatsheet#Links]

top of the page, to the Markdown Cheatsheet, inside page and inside current page

Note: For known pages, see the _references.md file.

NOTE: Anchors with underscores are problematic!

For example services_autorun in the MPF documentation the underscore needs to be escaped with a \.

See Also: services_autorun in the Masterfiles Policy Framework

The documentation pre-processor will create those automatically.

`classes` and `readfile()`

classes and readfile()

However, the preprocess will not create links if the code word is in triple backticks:

```classes``` and ```readfile()```

classes and readfile()

[Markdown Documentation](http://daringfireball.net/projects/markdown/)

Markdown Documentation

Lists

Unordered lists - Markdown supports other markers than the asterisk, but in CFEngine we use only *.

* Item 1
* Item 2
   * Item 2a
* Multi paragraph item

    Four spaces indented
  • Item 1
  • Item 2
    • Item 2a
  • Multi paragraph item

    Four spaces indented

Ordered lists - the numbers you use don't matter.

1. first
1. second
9. Third
  1. first
  2. second
  3. Third

Tables

Wiki-syntax for tables is supported, and you can be a bit sloppy about it, although it's better to align the | properly.

| Header | Left aligned | Centered | Right aligned |
|--------|:-------------|:--------:|--------------:|
|text    | text | X | 234 |
Header Left aligned Centered Right aligned
text text X 234

Code

Inline code

This renders as `inline code`.

This renders as inline code.

This also renders as ```inline code```.

This also renders as inline code.

See the note above on implicit linking - single backticks will link, triple backticks won't.

Code Blocks

Code blocks are either indendented by four spaces:

Just indent by four spaces:

    $ code block
    $ without syntax highlighting
$ code block
$ without syntax highlighting

or use three backticks:

```
some more code
in a block
```
some more code
in a block

To turn on syntax highlighting, specify the brush directly after the opening three backticks. Syntax highlighting is provided by pygments. Find all available lexers here.

CFEngine Code Blocks

If you want CFEngine syntax highlighting, use

```cf3
# CFEngine block

bundle agent example()
{
}
```
# CFEngine code block

bundle agent example()
{
}

Other frequently used syntax highlighers shown below.

Bash Script Code Blocks

    ```bash
    #!/bin/bash
    echo hi
    for i in `seq 1 10`;
    do
      echo $i
    done
    ```
#!/bin/bash
echo hi
for i in `seq 1 10`;
do
  echo $i
done

Console Blocks

    ```console
    root@policy_server # /etc/init.d/cfengine3 stop
    ```
root@policy_server # /etc/init.d/cfengine3 stop

SQL Code Blocks

    ```sql
    SELECT
         FileChanges.FileName,
         Count(Distinct(FileChanges.HostKey)) AS DistinctHostCount,
         COUNT(1) AS ChangeCount
      FROM
         FileChanges JOIN Contexts
      WHERE
         Contexts.ContextName='ubuntu'
      GROUP BY
         FileChanges.FileName
      ORDER BY
         ChangeCount DESC
    ```
SELECT
     FileChanges.FileName,
     Count(Distinct(FileChanges.HostKey)) AS DistinctHostCount,
     COUNT(1) AS ChangeCount
  FROM
     FileChanges JOIN Contexts
  WHERE
     Contexts.ContextName='ubuntu'
  GROUP BY
     FileChanges.FileName
  ORDER BY
     ChangeCount DESC

Diff Code Blocks

    ```diff
    diff --git a/README.md b/README.md
    index 92555a2..b49c0bb 100644
    --- a/README.md
    +++ b/README.md
    @@ -377,8 +377,12 @@ As a general note, avoiding abbreviations provides better readability.

     * follow the [Policy Style Guide](manuals/policy-style.markdown)
       in examples and code snippets
    -* always run it through Pygments plus the appropriate lexer (only cf3
    -  supported for now)
    +* always run it through Pygments plus the appropriate lexer
    +
    +Most important are the `cf3` lexer, as well as `bash`, `console`,
    +`diff`, `shell-session` and `postgresql`. But Jekyll supports
    +[many more lexers](http://pygments.org/docs/lexers/)
    +
     * avoid custom color schemes and hand-coded HTML
     * document the example after the example code
    ```
diff --git a/README.md b/README.md
index 92555a2..b49c0bb 100644
--- a/README.md
+++ b/README.md
@@ -377,8 +377,12 @@ As a general note, avoiding abbreviations provides better readability.

 * follow the [Policy Style Guide](manuals/policy-style.markdown)
   in examples and code snippets
-* always run it through Pygments plus the appropriate lexer (only cf3
-  supported for now)
+* always run it through Pygments plus the appropriate lexer
+
+Most important are the `cf3` lexer, as well as `bash`, `console`,
+`diff`, `shell-session` and `postgresql`. But Jekyll supports
+[many more lexers](http://pygments.org/docs/lexers/)
+
 * avoid custom color schemes and hand-coded HTML
 * document the example after the example code

JSON Code Blocks

{
  "classes":{
    "services_autorun": [ "any" ]
  }
}
{
  "classes":{
    "services_autorun": [ "any" ]
  }
}

YAML Code Blocks

---
  classes:
    services_autorun:
      - "any"
---
  classes:
    services_autorun:
      - "any"

Code Blocks and Lists

If you want to include a code block within a list, put two tabs (8 spaces) in front of the entire block (4 to make the paragraph part of the list item, and 4 for it a code block):

* List item with code

        <code goes here>
  • List item with code

    <code goes here>
    

You can also use backticks (and get syntax highlighting) - just make sure the backticks are indented once:

1. First

    ```cf3
    # CFEngine block

    bundle agent example()
    {
    }
    ```

2. Second
3. Third
  1. First

    # CFEngine block
    
    bundle agent example()
    {
    }
    
  2. Second

  3. Third


Headers

Horizontal bar

***


# Level 1

Level 1

## Level 2

Level 2

### Level 3

Level 3

#### Level 4

Level 4

##### Level 5

Level 5

###### Level 6

Level 6

Including External Files

Sometimes it's nice to include an external file

# Changelog
Notable changes to the framework should be documented here

3.12.7:
    - Added .ps1 to list of file patterns considered during policy update
      (CFE-3425, ENT-4094)
    - Added apk package module support for alpinelinux (CFE-3451)
    - Added default cf_version_release of 1 when sys var missing (ENT-6219)
    - Added missing packages modules scripts in makefile (ENT-6814)
    - Added standalone self upgrade capability for Windows agents
      (ENT-6219, ENT-6823, ENT-4094)
    - Added verbose logfile for msiexec package module file installs
      (ENT-6220, ENT-6824)
    - Adjust modules/packages/Makefile.am for lack of msiexec packages module
      (CFE-3607)
    - Disabled TLSv1 by default for Mission Portal's web server (ENT-6783)
    - Fixed ability to define users authorized for using cf-runagent on policy servers
      (CFE-3546)
    - Fixed alpine apk packages module to parse names properly (CFE-3585)
    - Fixed docs describing xdev behavior in depth_search bodies (CFE-3541)
    - Fixed loading of platform specific inventory on AIX (CFE-3614)
    - Suppressed output from watchdog on AIX to prevent the mail spool from filling up
      (CFE-3630)
    - Use VBScript to enumerate installed packages on Windows (ENT-4669)
    - service status on FreeBSD now uses onestatus (CFE-3515)

3.12.6:
    - Added inventory for Timezone and GMT Offset (ENT-6161)
    - Added inventory for policy servers (ENT-6212)
    - Aligned systemd services behavior for service_policy => "enable|enabled|disable|disabled"
      (ENT-6073)
    - Changed group for state dir files promise to match defaults per OS (CFE-3362)
    - Replaced @ignore with useful doc strings (CFE-3378)
    - Stopped disabling disabled systemd unit each run when disabled state requested
      (CFE-3367)
    - Stopped trying to edit fields in manage_variable_values_ini (CFE-3372)
    - Fixed converge edit_line bundle not deleting lines containing marker (CFE-3482)
    - Added bundle edit_line converge_prepend with same behavior as bundle edit_line converge,
      but inserting at start of content. (CFE-3483)

3.12.5:
    - Admitted ::1 as a query source on Enterprise hubs (ENT-5531)
    - Changed m_inventory dumping behavior to exclude when values are null
      (ENT-5562)
    - Fixed typo preventing recommendation bundles from running (CFE-3305)
    - Made python symlink fall back to platform-python (CFE-3291)
    - Modified cftransport cleanup to avoid errors (ENT-5555)
    - Release number was added to MPF tarballs (ENT-5429)
    - Stopped continual repair of ha_enabled semaphore (ENT-4715)
    - The zypper module is now fully compatible with Python 3 (CFE-3364)

3.12.4:
    - Added 'data' shortcut to cf-serverd, defaults to sys.workdir/data
    - Added inventory of NFS servers in use (from /proc/mounts, on linux)
      (CFE-3259)
    - Added paths support for opensuse (CFE-3283)
    - Added zypper as default package manager for opensuse (CFE-3284)
    - Corrected application/logs path to outside of docroot (ENT-5255)
    - Enabled SUSE 12 for self upgrade (ENT-5152)
    - Fixed Python 3 incompatibility in yum package module
    - Improved resliliance of cron watchdog for linux (CFE-3258)
    - Modified federated reporting's import_file.sh to catch errors in psql run (ENT-5040)
    - Move 'selinux_enabled' class to config bundle and namespace scope it
    - Prevented inventory of unresolved variables for diskfree and loadavg
      (ENT-5190)
    - Setup our own symlink for Python interpreter and use it
      (ENT-4668, ENT-4682)
    - Standard services now considers systemd services in ActiveState=activating active
      (CFE-3238)
    - Fixed selection of standard_services when used explicitly from non-default namespace (ENT-5406)

3.12.3:
    - Extended watchdog for AIX (ENT-4995)
    - Added AIX support to body perms system_owned (ENT-4773)
    - Added ability to avoid limiting robot agents (CFE-3161)
    - Added and transitioned to using master_software_updates shortcut
      (ENT-4953)
    - Added continual checking for policy_server state (CFE-3073)
    - Added documentation how to enable systemd unit management and disable
      agents on all hosts (CFE-3416)
    - Added package_module for snap (CFE-2811)
    - Added scripts and templates for Federated Reporting (ENT-4473)
    - Added support for 'awk' filters in the FR dump-import process (ENT-4839)
    - Added support for configuring abortclasses and abortbundleclasses via
      augments (ENT-4823)
    - Added support for filtering in both dump and import phases of the FR
      ETL process (ENT-4839)
    - Added support for ordering FR awk and sed scripts (ENT-4839)
    - Added support for setting periodic package inventory refresh interval
      via augments (CFE-2771)
    - Always set files_single_copy from augments if available (CFE-3064)
    - Changed FR policy to honor target_state properly (ENT-4874)
    - Copy .awk and .sed files from masterfiles to inputs (ENT-4839)
    - Do not run DB maintenance tasks on a passive HA hub (ENT-4706)
    - Fixed agent disabling on systemd systems (CFE-2429, CFE-3416)
    - Fixed cleanup of future timestamps from status table (ENT-4331,
      ENT-4992)
    - Fixed pkgsrc in case where multiple Prefix paths are returned for
      pkg_install (CFE-3153)
    - Fixed pkgsrc module on Solaris/NetBSD (CFE-3151)
    - Fixed re-spawning of cf-execd or cf-monitord after remediating
      duplicate concurrent processes (CFE-3150)
    - Fixed state ownership on aix (ENT-4773)
    - Fixed synchronization of important configuration files from active to
      passive hub (ENT-4944)
    - Fixed the CFEngine 3.7.x class guard in standalone_self_upgrade.cf
      (CFE-3182)
    - Made keys of all types from feeder hubs trusted on a superhub
      (ENT-4917)
    - Set default access promises for directories to only share if directory
      exists (CFE-3060)
    - Speeded-up FR import process by merging INSERT INTO statements
      (ENT-4839)
    - Suppressed stderr output from lldpctl when using path defined by
      def.lldpctl_json (CFE-3109)
    - added SQL to update feeder update timestamp during import (ENT-4776)
    - added ssh_home_t type to cftransport .ssh dir (ENT-4906)
    - fix use of _stdlib_path_exists_ in FR transport_user policy
      bundle (ENT-4906)
    - lib/paths.cf: Add usermod path for redhat systems
    - modules/packages/zypper.in: Moved zypper package module errors to the
      cf-agent output (CFE-3154)
    - partitioned __inventory table for federated reporting (ENT-4842)
    - psql_wrapper needed full path to psql binary (ENT-4912)
    - yum package_module gets updates available from online repos if local
      cache fails (CFE-3094)

3.12.2:
    - Fixed isvariable() syntax error in update_def.cf (CFE-2953)
    - Fixed maintenance policy for promise log cleanup to respect history_length_days (ENT-4588)
    - Added setfacl to paths
    - Added path support for timedatectl and journalctl (CFE-3013)
    - Added trailing slash to access promises expecting directories (CFE-3024)
    - Conditioned use of curl for ec2 metadata cache on curl binary being executable (CFE-3049)
    - Instrumented cf-hub pull schedule for augments (ENT-4269)
    - Stopped suppressing repair outcome for starting cf-monitord or cf-execd (CFE-2964)
    - Enforced restrictive permissions on hub install log (ENT-4506)
    - Ensured that asynchronous query API semaphores are writable (ENT-4551)
    - Fixed standalone_self_upgrade not triggering because of stale data (ENT-4317)
    - Improved efficiency and error handling of user specified policy update bundle
    - Improved performance of enterprise license utilization logging
    - Added version logging for Enterprise agent outside of state (ENT-4352)
    - Added package_module for managing windows packages using msiexec (ENT-3719)
    - Prevented inventorying un-expanded free memory from cf-monitord
    - Prevented mon.value_mem_total from being inventoried if not defined (ENT-4522)
    - Prevented performance overhead on hubs that don't enable license utilization logging (ENT-4333)
    - Added purging of future status records (ENT-4362)
    - Reduced cost of knowing when setopt is available in yum (CFE-2993)
    - Added restart of runalerts if modified (ENT-4273)
    - Separated kill signals from restart class to avoid warning (CFE-2974)
    - Separated termination and observation promises for cf-monitord (CFE-2963)
    - Set default value for purge_scheduled_reports_older_than_days (ENT-4404)
    - Changed internal class name to describes daemon state instead of desired action
    - Changed internal class names to be more descriptive when identifying concurrent daemons
    - Implemented augments support for collect_window in body server control (ENT-4283)
    - Added guard for vars promises in cfe_internal_enterprise_mission_portal_apache
      Constrain vars promises in cfe_internal_enterprise_mission_portal_apache
      to policy_server.enterprise_edition::, otherwise "cf-promises --show-vars"
      includes a dump of the entire datastate from the "data" variable in
      cfe_internal_enterprise_mission_portal_apache (line over 100K long).
      (CFE-3011)
    - Stopped defining redhat_pure on Fedora hosts (CFE-3022)

3.12.1:
    - Add 'system-uuid' to default dmidecode inventory (CFE-2925)
    - Add inventory of AWS EC2 linux instances (CFE-2924)
    - Add ubuntu 18 to package map for self upgrade (ENT-4118)
    - Allow dmidefs inventory to be overridden via augments (CFE-2927)
    - Also list  packages updates for hold packages: (CFE-2855)
    - Analyze yum return code before parsing its output (CFE-2868)
    - Fixed an issue when Promise to edit file that does not exist caused
      "promise not kept" condition (ENT-3965)
    - Avoid trying to read /proc/meminfo when it doesn't exist (CFE-2922)
    - Avoid use of $(version) for package_version in legacy implementation
      (ENT-3963)
    - Cleanup old report data relative to the most recent changetimestamp
      (ENT-4807)
    - Configure agent_expireafter from augments (ENT-4308)
    - Consider sles when considering suse (CFE-2897)
    - Fixed an issue when standalone self upgrade policy did not create
      desired-cfengine-package-version.json file (ENT-3937)
    - Cron based watchdog for cf-execd on AIX (ENT-3963)
    - Detect systemd service enablement for non native services (CFE-2932)
    - Document how def.acl is used and how to configure it (CFE-2861)
    - Fix name of tunable to control max client side report history
      (CFE-2926)
    - Fix package_latest detecting larger version in some cases (CFE-1743)
    - Fix standalone self upgrade when path contains spaces (ENT-4117)
    - Fix unattended self upgrade on AIX (ENT-3972)
    - Inventory Memory on HPUX (ENT-4188)
    - Inventory Physical Memory MB when dmidecode is found (CFE-2896)
    - Inventory memory on Windows (ENT-4187)
    - Make recommendations about postgresql.conf (ENT-3958)
    - Only consider files that exist for rotation (ENT-3946)
    - Prevent noise when a service that should be disabled is missing.
      (CFE-2690)
    - Prevent standalone self upgrade from triggering un-necessarily
      (ENT-4092)
    - Remove un-necessary agent run during self upgrade (ENT-4116)
    - Specify scope => "namespace" when using persistent classes (CFE-2860)
    - Store timestamp for packages managed by zypper module (CFE-2875)
    - Store timestamp of packages in cache db with zypper
    - Sync cf-runalerts override unit template with package (ENT-3923)
    - Updated yum package module to take arbitrary options (ENT-4177)
    - Use default for package arch on aix (ENT-3963)
    - Use rpmvercmp for version comparison on AIX (ENT-3963)
    - Users allowed to request execution via cf-runagent can be configured
          via augments (ENT-4054)
    - apt_get package module includes held packages when listing updates
      (CFE-2855)

3.12.0:
    - Avoid executing self upgrade policy unnecessarily (ENT-3592)
    - Add amazon_linux class to yum package module
    - Introduce ability to set policy update bundle via augments (CFE-2687)
    - Localize delete tidy in ha update policy (ENT-3659)
    - Improve context notifying user of missing policy update bundle
      (ENT-3624)
    - Configure ignore_missing_inputs and ignore_missing_bundles via augments
      (CFE-2773)
    - Change class identifying runagent initiated executions from cfruncommand to cf_runagent_initated
    - Support enablerepo and disablerepo options in yum package_module
      (CFE-2806)
    - Fix cf-runagent during 3.7.x -> 3.10.x migration
      (CFE-2776, CFE-2781, CFE-2782)
    - Makes it possible to tune policy master_location via augments in update policy
      (ENT-3692)
    - Fix inventory for total memory on AIX (CFE-2797)
    - Do not manage redis since it's no longer used (ENT-2797)
    - Server control maxconnections can be configured via augments
      (CFE-2660)
    - Allow configuration of allowlegacyconnects from augments (ENT-3375)
    - Fix ability for zypper package_module to downgrade packages
    - Splaytime in body executor control can now be configured via augments
      (CFE-2699)
    - Add maintenance policy to refresh events table on enterprise hubs
      (ENT-3537)
    - Add apache config for new LDAP API (ENT-3265)
    - update.cf bundlesequence can be configured via augments (CFE-2521)
    - Update policy inputs can be extended via augments (CFE-2702)
    - Add oracle linux support to standalone self upgrade
    - Add bundle to track component variables to restart when necessary
      (CFE-2326)
    - Retention of files found in log directories can now be configured via augments
      (CFE-2539)
    - Allow multiple sections in insert_ini_section (CFE-2721)
    - Add lines_present edit_lines bundle
    - Schedule in body executor control can now be configured via augments
      (CFE-2508)
    - Include scheduled report assets in self maintenance (ENT-3558)
    - Remove unused body action aggregator and body file_select folder
    - Remove unused body process_count check_process
    - Prevent yum from locking in package_methods when possible
      (CFE-2759)
    - Render variables tagged for inventory from agent host_info_report
      (CFE-2750)
    - Make apt_get package module work with repositories containing spaces in the label
      (ENT-3438)
    - Allow hubs to collect from themselves over loopback (ENT-3329)
    - Log file max size and rotation limits can now be configured via augments
      (CFE-2538)
    - Change: Do not silence Enterprise hub maintenance
    - Ensure HA standby hubs have am_policy_hub state marker (ENT-3328)
    - Add support for 32bit rpms in standalone self upgrade (ENT-3377)
    - Add enterprise maintenance bundles to host info report (ENT-3537)
    - Removed unnecessary promises for OOTB package inventory
    - Add external watchdog support for stuck cf-execd (ENT-3251)
    - Be less noisy when a promised service is not found (CFE-2690)
    - Ignore empty options in apt_get module (CFE-2685)
    - Add postgres.log to enterprise log file rotation (ENT-3191)
    - Removed unnecessary support for including 3.6 controls
    - Fix systemctl path detection
    - Policy Release Id is now inventoried by default (CFE-2097)
    - Fix to frequent logging of enterprise license utilization (ENT-3390)
    - Maintain access to exported CSV reports in older versions (ENT-3572)
    - cf-execd service override template now only kills cf-execd on stop
      (ENT-3395)
    - Fix self upgrade for hosts older than 3.7.4 (ENT-3368)
    - Avoid self upgrade from triggering during bootstrap (ENT-3394)
    - Add json templates for rendering serial and multiline data (CFE-2713)
    - Removed unused libraries and controls
    - Fixed an error in the file_make_mustache_*, incorrect variable name used
      (CFE-2714)
    - Fix augments control state paths to work on windows (ENT-3839)
    - Remove templates for deprecated components (ENT-3781)
    - Replace unicode smartquotes with apostrophe (ENT-3823)
    - Configure Enterprise hub pull collection schedule via augments
      (ENT-3834)

3.11.0:
    - Rename enable_client_initiated_reporting to client_initiated_reporting_enabled
    - Directories for ubuntu 16 and centos 7 should exist in master_software_updates
      (ENT-3136)
    - Fix: Automatic client upgrades for deb hosts
    - Add AIX OOTB oslevel inventory (ENT-3117)
    - Disable package inventory via modules on redhat like systems with unsupported python versions
      (CFE-2602)
    - Make stock policy update more resiliant (CFE-2587)
    - Configure networks allowed to initiate report collection (client initiated reporting) via augments (#910)
      (CFE-2624)
    - apt_get package module: Fix bug which prevented updates
      from being picked up if there was more than one source listed in the
      'apt upgrade' output, without a comma in between (CFE-2605)
    - Enable specification of monitoring_include via augments (CFE-2505)
    - Configure call_collect_interval from augments (enable_client_initiated_reporting) (#905)
      (CFE-2623)
    - Add templates shortcut (CFE-2582)
    - Behaviour change: when used with CFEngine 3.10.0 or greater,
      bundles set_config_values() and set_line_based() are appending a
      trailing space when inserting a configuration option with empty value
      (CFE-2466)
    - Add default report collection exclusion based on promise handle
      (ENT-3061)
    - Fix ability to select INI region with metachars (CFE-2519)
    - Change: Verify transfered files during policy update
    - Change select_region INI_section to match end of section or end of file
      (CFE-2519)
    - Add class to enable post transfer verrification during policy updates
    - Add: prunetree bundle to stdlib
      The prunetree bundle allws you to delete files and directories up to a
      sepcified depth older than a specified number of days
    - Do not symlink agents to /usr/local/bin on coreos (ENT-3047)
    - Add: Ability to set default_repository via augments
    - Enable settig def.max_client_history_size via augments (CFE-2560)
    - Change self upgrade now uses standalone policy (ENT-3155)
    - Fix apt_get package module incorrectly using interactive mode
    - Add ability to append to bundlesequnece with def.json (CFE-2460)
    - Enable paths to POSIX tools by default instead of native tools
    - Remove bundle agent cfe_internal_bins (CFE-2636)
    - Include previous_state and untracked reports when client clear a buildup of unreported data
      (ENT-3161)
    - Fix command to restart apache on config change (ENT-3134)
    - cf-serverd listens on ipv4 and ipv6 by default (CFE-528)
    - FixesMake apt_get module compatible with Ubuntu 16.04 (CFE-2445)
    - Fix rare bug that would sometimes prevent redis-server from launching
    - Add oslevel to well known paths (ENT-3121)
    - Add policy to track CFEngine Enterprise license utilization
      (ENT-3186)
    - Ensure MP SSL Cert is readable (ENT-3050)

3.10.0:
    - Add: Classes body tailored for use with diff
    - Change: Session Cookies use HTTPOnly and secure attribtues (ENT-2781)
    - Change: Verify transfered files during policy update
    - Add: Inventory for system product name (model) (ENT-2780)
    - Add: Ensure appropriate permissions for SSL files (ENT-760)
    - Fix rare bug that would sometimes prevent redis-server from launching.
    - Change: Enable strict transport security
    - Add: Definition of from_cfexecd for cf-execd initiated runs
      (CFE-2386)
    - Add testing jUnit and TAP bundles and include them in stdlib.cf
    - Change: Rename duplicate bodies in ha_update.cf (ENT-2753)
    - Change: Disable RC4 Cipher for ssl in Mission Portal
    - Pass package promise options to underlying apt-get call (#802)
      (CFE-2468)
    - Change: Enable agent component management policy on systemd hosts
      (CFE-2429)
    - Add: Enterprise appliaction log dir to rotation
    - Change: re-enable hub process maintainance
    - Add: edit_line contains_literal_string to stdlib
    - Fix: Services starting or stopping unnecessarily (CFE-2421)
    - Allow specifying agent maxconnections via def.json (CFE-2461)
    - Change: Disable http TRACE method
    - Change: Reduce Enteprise webserver info
    - Change: cronjob bundle tolerates different spacing
    - Fix: CFEngine choking on standard services (CFE-2806)
    - Change select_region INI_section to match end of section or end of file
      (CFE-2519)
    - Fix ability to manage INI sections with metachars for
      manage_variable_values_ini and set_variable_values_ini (CFE-2519)
    - Fix apt_get package module incorrectly using interactive mode.
    - Add ability to append to bundlesequnece with def.json (CFE-2460)
    - Behaviour change: when used with CFEngine 3.10.0 or greater,
      bundles set_config_values() and set_line_based() are appending a
      trailing space when inserting a configuration option with empty value.
      (CFE-2466)

3.7.0:
 - Support for user specified overring of framework defaults without modifying
   policy supplied by the framework itself (see example_def.json)
 - Support for def.json class augmentation in update policy
 - Run vacuum operation on postgresql every night as a part of maintenance.
 - Add measure_promise_time action body to lib (3.5, 3.6, 3.7, 3.8)
 - New negative class guard `cfengine_internal_disable_agent_email` so that
   agent email can be easily disabled by augmenting def.json
 - Relocate def.cf to controls/VER/
 - Relocate update_def to controls/VER
 - Relocate all controls to controls/VER
 - Only load cf_hub and reports.cf on CFEngine Enterprise installs
 - Relocate acls related to report collection from bundle server access_rules
   to controls/VER/reports.cf into bundle server report_access_rules
 - Re-organize cfe_internal splitting core from enterprise specific policies
   and loading the appropriate inputs only when necessary
 - Moved update directory into cfe_internal as it is not generally intended to
   be modified
 - services/autorun.cf moved to lib/VER/ as it is not generally intended to be
   modified
 - To improve predictibility autorun bundles are activated in lexicographical
   order
 - Relocate services/file_change.cf to cfe_internal/enterprise. This policy is
   most useful for a good OOTB experience with CFEngine Enterprise Mission
   Portal.
 - Relocate service_catalogue from promsies.cf to services/main.cf. It is
   intended to be a user entry. This name change correlates with the main
   bundle being activated by default if there is no bundlesequence specified.
 - Reduce benchmarks sample history to 1 day.
 - Update policy no longer generates a keypair if one is not found. (Redmine: #7167)
 - Relocate cfe_internal_postgresql_maintenance bundle to lib/VER/
 - Set postgresql_monitoring_maintenance only for versions 3.6.0 and 3.6.1
 - Move hub specific bundles from lib/VER/cfe_internal.cf into lib/VER/cfe_internal_hub.cf
   and load them only if policy_server policy if set.
 - Re-organize lib/VER/stdlib.cf from lists into classic array for use with getvalues
 - inform_mode classes changed to DEBUG|DEBUG_$(this.bundle):: (Redmine: #7191)
 - Enabled limit_robot_agents in order to work around multiple cf-execd
   processes after upgrade. (Redmine #7185)
 - Remove Diff reporting on /etc/shadow (Enterprise)
 - Update policy from promise.cf inputs. There is no reason to include the
   update policy into promsies.cf, update.cf is the entry for the update policy
 - _not_repaired outcome from classes_generic and scoped_classes generic (Redmine: # 7022)
 - standard_services now restarts the service if it was not already running
   when using service_policy => restart with chkconfig (Redmine #7258)
 - Fix process_result logic to match the purpose of body process_select
   days_older_than (Redmine #3009)

Including chunks of policy from the MPF

Here I am including a bundle named cfe_autorun_inventory_listening_ports. It may be a common or an agent bundle (in case the bundle ever changes types).


```cf3
bundle agent cfe_autorun_inventory_listening_ports
{
  vars:
      "ports" -> { "ENT-150" }
        slist => sort( "mon.listening_ports", "int"),
        meta => { "inventory", "attribute_name=Ports listening" },
        ifvarclass => some("[0-9]+", "mon.listening_ports"),
        comment => "We only want to inventory the listening ports if we have
                    values that make sense.";
}
```
bundle agent cfe_autorun_inventory_listening_ports
{
  vars:
      "ports" -> { "ENT-150" }
        slist => sort( "mon.listening_ports", "int"),
        meta => { "inventory", "attribute_name=Ports listening" },
        ifvarclass => some("[0-9]+", "mon.listening_ports"),
        comment => "We only want to inventory the listening ports if we have
                    values that make sense.";
}

Comments inside documentation

Sometimes it's nice to be able to put an internal comment into the documentation that will not be rendered.

You can use the comment and endcomment tags in markdown files.

For example:

{% comment %} TODO: We should try to improve this at some point.{% endcomment %}

Would render like this:


Sandbox

body link_from ln_s(x)
{
      link_type => "symlink";
      source => "$(x)";
      when_no_source => "force";
}

Self Documenting Policy

For the stdlib:

agent bundles

daemonize

Prototype: daemonize(command)

Description: Run a command as a daemon. I.e., fully detaches from Cfengine.

Arguments:

  • command: The command to run detached Note: There will be no output from the command reported by cf-agent. This bundle has no effect on windows

Example: cf3 methods: "Launch Daemon" usebundle => daemonize("/bin/sleep 30");

Implementation:

bundle agent daemonize(command)
{
  commands:
    !windows::
      "exec 1>&-; exec 2>&-; $(command) &"
        contain => in_shell;

  reports:
    "windows.(DEBUG|DEBUG_$(this.bundle))"::
      "DEBUG $(this.bundle): This bundle does not support Windows";
}

contain bodies

silent

Prototype: silent

Description: suppress command output

Implementation:

body contain silent
{
      no_output => "true";
}

in_dir

Prototype: in_dir(dir)

Description: run command after switching to directory "dir"

Arguments:

  • dir: directory to change into

Example:

 commands:
   "/bin/pwd"
     contain => in_dir("/tmp");

Implementation:

body contain in_dir(dir)
{
      chdir => "$(dir)";
}

in_dir_shell

Prototype: in_dir_shell(dir)

Description: run command after switching to directory "dir" with full shell

Arguments:

  • dir: directory to change into

Example:

 commands:
   "/bin/pwd | /bin/cat"
     contain => in_dir_shell("/tmp");

Implementation:

body contain in_dir_shell(dir)
{
      chdir => "$(dir)";
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
}

silent_in_dir

Prototype: silent_in_dir(dir)

Description: run command after switching to directory and suppress output

Arguments:

  • dir: directory to change into

Example:

   "/bin/pwd"
     contain => silent_in_dir("/tmp");

Implementation:

body contain silent_in_dir(dir)
{
      chdir => "$(dir)";
      no_output => "true";
}

in_shell

Prototype: in_shell

Description: run command in shell

Example:

 commands:
   "/bin/pwd | /bin/cat"
     contain => in_shell;

Implementation:

body contain in_shell
{
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
}

in_shell_bg

Prototype: in_shell_bg

Description: deprecated This bundle previously had an invalid background attribute that was caught by parser strictness enhancements. Backgrounding is handeled by the body action background attribute.

Implementation:

body contain in_shell_bg
{
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
}

in_shell_and_silent

Prototype: in_shell_and_silent

Description: run command in shell and suppress output

Example:

 commands:
   "/bin/pwd | /bin/cat"
     contain => in_shell_and_silent,
     comment => "Silently run command in shell";

Implementation:

body contain in_shell_and_silent
{
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
      no_output => "true";
}

in_dir_shell_and_silent

Prototype: in_dir_shell_and_silent(dir)

Description: run command in shell after switching to 'dir' and suppress output

Arguments:

  • dir: directory to change into

Example:

 commands:
   "/bin/pwd | /bin/cat"
     contain => in_dir_shell_and_silent("/tmp"),
     comment => "Silently run command in shell";

Implementation:

body contain in_dir_shell_and_silent(dir)
{
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
      no_output => "true";
      chdir => "$(dir)";
}

setuid

Prototype: setuid(owner)

Description: run command as specified user

Arguments:

  • owner: username or uid to run command as

Example:

 commands:
   "/usr/bin/id"
     contain => setuid("apache");
   "/usr/bin/id"
     contain => setuid("503");

Implementation:

body contain setuid(owner)
{
      exec_owner => "$(owner)";
}

setuid_sh

Prototype: setuid_sh(owner)

Description: run command as specified user in shell

Arguments:

  • owner: username or uid to run command as

Example:

 commands:
   "/usr/bin/id | /bin/cat"
     contain => setuid("apache");
   "/usr/bin/id | /bin/cat"
     contain => setuid("503");

Implementation:

body contain setuid_sh(owner)
{
      exec_owner => "$(owner)";
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
}

setuidgid_dir

Prototype: setuidgid_dir(owner, group, dir)

Description: run command as specified owner and group in shell

Arguments:

  • owner: username or uid to run command as
  • group: groupname or gid to run command as
  • dir: directory to run command from

Implementation:

body contain setuidgid_dir(owner,group,dir)
{
      exec_owner => "$(owner)";
      exec_group => "$(group)";
      chdir      => "$(dir)";
}

setuidgid_sh

Prototype: setuidgid_sh(owner, group)

Description: run command as specified owner and group in shell

Arguments:

  • owner: username or uid to run command as
  • group: groupname or gid to run command as

Implementation:

body contain setuidgid_sh(owner,group)
{
      exec_owner => "$(owner)";
      exec_group => "$(group)";
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
}

jail

Prototype: jail(owner, jail_root, dir)

Description: run command as specified user in specified directory of jail

Arguments:

  • owner: username or uid to run command as
  • jail_root: path that will be the root directory for the process
  • dir: directory to change to before running command (must be within 'jail_root')

Implementation:

body contain jail(owner,jail_root,dir)
{
      exec_owner => "$(owner)";
      useshell => "true"; # canonical "useshell" but this is backwards-compatible
      chdir => "$(dir)";
      chroot => "$(jail_root)";
}

setuid_umask

Prototype: setuid_umask(owner, umask)

Description: run command as specified user with umask

Valid Values Umask Octal (files) Symbolic (files) Octal (dirs) Symbolic (dirs)
0 000 666 (rw-rw-rw-) 777 (rwxrwxrwx)
002 002 664 (rw-rw-r--) 775 (rwxrwxr-x)
22, 022 022 644 (rw-r--r--) 755 (rwxr-xr-x)
27, 027 027 640 (rw-r-----) 750 (rwxr-x---)
77, 077 077 600 (rw-------) 700 (rwx------)
72, 072 072 604 (rw----r--) 705 (rwx---r-x)

Arguments:

  • owner: username or uid to run command as
  • umask: controls permissions of created files and directories

Example:

 commands:
   "/usr/bin/git pull"
     contain => setuid_umask("git", "022");

Implementation:

body contain setuid_umask(owner, umask)
{
      exec_owner => "$(owner)";
      umask => "$(umask)";
}

setuid_gid_umask

Prototype: setuid_gid_umask(uid, gid, umask)

Description: run command as specified user with umask

Valid Values Umask Octal (files) Symbolic (files) Octal (dirs) Symbolic (dirs)
0 000 666 (rw-rw-rw-) 777 (rwxrwxrwx)
002 002 664 (rw-rw-r--) 775 (rwxrwxr-x)
22, 022 022 644 (rw-r--r--) 755 (rwxr-xr-x)
27, 027 027 640 (rw-r-----) 750 (rwxr-x---)
77, 077 077 600 (rw-------) 700 (rwx------)
72, 072 072 604 (rw----r--) 705 (rwx---r-x)

Arguments:

  • uid: username or uid to run command as
  • gid: group name or gid to run command as
  • umask: controls permissions of created files and directories

Example:

 commands:
   "/usr/bin/git pull"
     contain => setuid_gid_umask("git", "minions", "022");

Implementation:

body contain setuid_gid_umask(uid, gid, umask)
{
      exec_owner => "$(uid)";
      exec_group => "$(uid)";
      umask => "$(umask)";
}

For update.cf?

common bodies

cfengine_update_controls

Prototype: cfengine_update_controls

Implementation:

bundle common cfengine_update_controls
{
  vars:
       "update_def_inputs"
        slist => {
                   "controls/update_def.cf",
                   "controls/update_def_inputs.cf",
                 };

  reports:
    DEBUG|DEBUG_cfengine_update_controls::
      "DEBUG $(this.bundle): update def inputs='$(update_def_inputs)'";
}

agent bundles

cfengine_internal_standalone_self_upgrade

Prototype: cfengine_internal_standalone_self_upgrade

Description: Manage desired version state and execution of policy to reach the target version.

Implementation:

bundle agent cfengine_internal_standalone_self_upgrade
{
  methods:
      "cfengine_internal_standalone_self_upgrade_state_data";
      "cfengine_internal_standalone_self_upgrade_execution";
}

cfengine_internal_standalone_self_upgrade_state_data

Prototype: cfengine_internal_standalone_self_upgrade_state_data

Description: Clear stale recorded desired version information from state

Implementation:

bundle agent cfengine_internal_standalone_self_upgrade_state_data
{
  vars:

      "binary_upgrade_entry"
        string => "$(this.promise_dirname)/standalone_self_upgrade.cf";

      "desired_pkg_data_path" string =>
        "$(cfengine_internal_standalone_self_upgrade_execution.desired_pkg_data_path)";

  files:

      # We consider the data stale if it's older than the policy that generated it
      "$(desired_pkg_data_path)" -> { "ENT-4317" }
        delete => u_tidy,
        if => isnewerthan( $(binary_upgrade_entry) , $(desired_pkg_data_path) );
}

cfengine_internal_standalone_self_upgrade_execution

Prototype: cfengine_internal_standalone_self_upgrade_execution

Description: Manage the version of CFEngine that is currently installed. This policy executes a stand alone policy as a sub agent. If systemd is found we assume that it is necessary to escape the current unit via systemd-run.

If the running version matches either the desired version information in state or the version supplied from augments, then we skip running the standalone upgrade policy.

Implementation:

bundle agent cfengine_internal_standalone_self_upgrade_execution
{
  vars:

      "exec_prefix"
        string => ifelse( isexecutable("/bin/systemd-run"), "/bin/systemd-run --unit=cfengine-upgrade --scope ", # trailing space in commands important
                          isexecutable( "/usr/bin/systemd-run" ), "/usr/bin/systemd-run --unit=cfengine-upgrade --scope ",
                          "");

      "desired_pkg_data_path" -> { "ENT-3592" }
        string => "$(sys.statedir)/MPF/desired-cfengine-package-version.json";

      "desired_pkg_data" -> { "ENT-3592" }
        data => readjson( $(desired_pkg_data_path), inf ),
        if => fileexists( $(desired_pkg_data_path) );

      "local_update_log_dir"
        string => translatepath("$(sys.workdir)/software_updates/update_log"),
        comment => "This directory is used for logging the current version of cfengine running.";

  classes:
      # If we are running the version desired by the self upgrade policy
      "at_desired_version_by_policy_specification" -> { "ENT-3592" }
        expression => strcmp( "$(desired_pkg_data[version])", "$(sys.cf_version)"  );

      # If we are running the version explicitly defined by the user
      "at_desired_version_by_user_specification" -> { "ENT-3592" }
        expression => strcmp( "$(def.cfengine_software_pkg_version)", "$(sys.cf_version)" );

      "at_desired_version"
        or => { "at_desired_version_by_user_specification", "at_desired_version_by_policy_specification" };

  files:

    enterprise_edition::

      "$(local_update_log_dir)/$(sys.cf_version)_is_running" -> { "ENT-4352" }
        comment => "This results in a record of the first time the enterprise
                    agent of a given version is seen to run on a host.",
        handle => "cfe_internal_update_bins_files_version_is_running",
        create => "true";

  commands:

    trigger_upgrade.!at_desired_version::

      '$(exec_prefix)$(sys.cf_agent) --inform --timestamp --file "$(this.promise_dirname)$(const.dirsep)standalone_self_upgrade.cf" --define trigger_upgrade,update_cf_initiated >"$(sys.workdir)$(const.dirsep)outputs/standalone_self_upgrade_$(sys.cdate).log"'
      handle => "standalone_self_upgrade",
      contain => in_shell;

  reports:

    trigger_upgrade.(inform_mode|verbose_mode|DEBUG|DEBUG_cfengine_internal_standalone_self_upgrade)::
      "Skipped self upgrade because we are running the desired version $(sys.cf_version)" -> { "ENT-3592" }
        if => "at_desired_version";

}

common bodies

control

Prototype: control

Implementation:

body common control
{
      bundlesequence => {
                          "update_def",
                          "u_cfengine_enterprise",
                          @(u_cfengine_enterprise.def),
                          "cfe_internal_dc_workflow",
                          "cfe_internal_update_policy",
                          "cfengine_internal_standalone_self_upgrade",
                          "cfe_internal_update_processes",
                          @(update_def.bundlesequence_end), # Define control_common_update_bundlesequnce_end via augments
      };

      version => "update.cf $(update_def.current_version)";

      inputs => {
                  "cfe_internal/update/lib.cf",
                  "cfe_internal/update/systemd_units.cf",
                  @(cfengine_update_controls.update_def_inputs),
                  "cfe_internal/update/cfe_internal_dc_workflow.cf",
                  "cfe_internal/update/cfe_internal_local_git_remote.cf",
                  "cfe_internal/update/cfe_internal_update_from_repository.cf",
                  "cfe_internal/update/update_policy.cf",
                  "cfe_internal/update/update_processes.cf",
                  @(update_def.augments_inputs)
      };

    any::
        ignore_missing_bundles => "$(update_def.control_common_ignore_missing_bundles)";
        ignore_missing_inputs => "$(update_def.control_common_ignore_missing_inputs)";

}

agent bodies

control

Prototype: control

Implementation:

body agent control
{
      ifelapsed => "1";
      skipidentify => "true";
}

classes bodies

u_kept_successful_command

Prototype: u_kept_successful_command

Description: Set command to "kept" instead of "repaired" if it returns 0

Implementation:

body classes u_kept_successful_command
{
      kept_returncodes => { "0" };
      failed_returncodes => { "1" };
}

contain bodies

in_shell

Prototype: in_shell

Implementation:

body contain in_shell
{
  useshell => "true";
}

for Promises.cf?

common bodies

inventory

Prototype: inventory

Description: Set up inventory inputs

This bundle creates the inputs for inventory bundles.

Inventory bundles are simply common bundles loaded before anything else in promises.cf

Tested to work properly against 3.5.x

Implementation:

{
  classes:
      "other_unix_os" expression => "!(windows|macos|linux|freebsd|aix)";
      "specific_linux_os" expression => "redhat|debian|suse|sles";

  vars:
      # This list is intended to grow as needed
    debian::
      "inputs" slist => { "inventory/any.cf", "inventory/linux.cf", "inventory/lsb.cf", "inventory/debian.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_linux", "inventory_lsb", "inventory_debian", "inventory_os" };
    redhat::
      "inputs" slist => { "inventory/any.cf", "inventory/linux.cf", "inventory/lsb.cf", "inventory/redhat.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_linux", "inventory_lsb", "inventory_redhat", "inventory_os" };
    suse|sles::
      "inputs" slist => { "inventory/any.cf", "inventory/linux.cf", "inventory/lsb.cf", "inventory/suse.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_linux", "inventory_lsb", "inventory_suse", "inventory_os" };
    windows::
      "inputs" slist => { "inventory/any.cf", "inventory/windows.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_windows", "inventory_os" };
    macos::
      "inputs" slist => { "inventory/any.cf", "inventory/macos.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_macos", "inventory_os" };
    freebsd::
      "inputs" slist => { "inventory/any.cf", "inventory/freebsd.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_freebsd", "inventory_os" };
    linux.!specific_linux_os::
      "inputs" slist => { "inventory/any.cf", "inventory/linux.cf", "inventory/lsb.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_linux", "inventory_lsb", "inventory_os" };
    aix::
      "inputs" slist => { "inventory/any.cf", "inventory/generic.cf", "inventory/aix.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_generic", "inventory_aix", "inventory_os" };
    other_unix_os::
      "inputs" slist => { "inventory/any.cf", "inventory/generic.cf", "inventory/os.cf" };
      "bundles" slist => { "inventory_control", "inventory_any", "inventory_autorun", "inventory_generic", "inventory_os" };

  reports:
    verbose_mode::
      "$(this.bundle): loading inventory module '$(inputs)'";
}

cfe_internal_inputs

Prototype: cfe_internal_inputs

Description: Include internal self management policies

Implementation:

}
{
  vars:
    any::

      "input[cfe_internal_management]"
        string => "cfe_internal/CFE_cfengine.cf",
        comment => "This policy activates internal management policies
                    for both core and enterprise";

      "input[core_main]"
        string => "cfe_internal/core/main.cf",
        comment => "This policy activates other core policies";

      "input[core_limit_robot_agents]"
        string => "cfe_internal/core/limit_robot_agents.cf",
        comment => "The policy here ensures that we don't have too many
                    cf-monitord or cf-execd processes";

      "input[core_log_rotation]"
        string => "cfe_internal/core/log_rotation.cf",
        comment => "This policy ensures that various cfengine log files
                    do not grow without bound and fill up the disk";

      "input[core_host_info_report]"
        string => "cfe_internal/core/host_info_report.cf",
        comment => "This policy produces a text based host info report
                    and serves as a functional example of using mustache templates";

      "input[cfengine_internal_core_watchdog]"
        string => "cfe_internal/core/watchdog/watchdog.cf",
        comment => "This policy configures external watchdogs to ensure that
                    cf-execd is always running.";

    enterprise_edition.(policy_server|am_policy_hub)::

      "input[enterprise_hub_specific]"
        string => "cfe_internal/enterprise/CFE_hub_specific.cf",
        comment => "Policy relating to CFEngine Enterprise Hub, for example
                    software updates, webserver configuration, and alerts";

@if minimum_version(3.12)
      "input[enterprise_hub_federation]"
        string => "cfe_internal/enterprise/federation/federation.cf",
        comment => "Policy relating to CFEngine Federated Reporting";
@endif

    enterprise_edition::

      "input[enterprise_knowledge]"
        string => "cfe_internal/enterprise/CFE_knowledge.cf",
        comment => "Settings mostly releated to CFEngine Enteprise Mission Portal";

      "input[enterprise_main]"
        string => "cfe_internal/enterprise/main.cf",
        comment => "This policy activates other enterprise specific policies";

      "input[change_management]"
        string => "cfe_internal/enterprise/file_change.cf",
        comment => "This policy monitors critical system files for change";

      "input[enterprise_mission_portal]"
        string => "cfe_internal/enterprise/mission_portal.cf",
        comment => "This policy manages Mission Portal related configurations.";

    any::
      "inputs" slist => getvalues("input");
}

cfengine_stdlib

Prototype: cfengine_stdlib

Description: Include the standard library

Implementation:

    any::
{
  vars:

    !cfengine_3_7::
      # CFEngine 3.6 can include through a secondary file
      # CFEngine version 3.6 and prior use the split library to avoid syntax
      # errors introduced by new functionality. For example new functions.
      # This also works for 3.8 because local_libdir should be set to lib
      # instead of lib/3.8
      "inputs" slist => { "$(sys.local_libdir)/stdlib.cf" };


      # As part of ENT-2719 3.12.2 introduced package_method attributes for
      # specifying the interpreter and specifying the module path. These
      # attributes are not known in previous versions and must not be seen by
      # the parser or they will be seen as syntax errors. A cleaner way to do
      # this using the minimum_version macro is possible, but that would break
      # masterfiles compatibility in 3.12 with 3.7 binaries since 3.7 binaries
      # do not support major.minor.patch with minimum_version, only major.minor.

    windows.cfengine_3_12.!(cfengine_3_12_0|cfengine_3_12_1)::
      "inputs" slist => { "$(sys.local_libdir)/stdlib.cf",
                          "$(sys.local_libdir)/packages-ENT-3719.cf" };
@if minimum_version(3.14)
    windows::
      "inputs" slist => { "$(sys.local_libdir)/stdlib.cf",
                          "$(sys.local_libdir)/packages-ENT-3719.cf" };
@endif

    cfengine_3_7::
      # CFEngine 3.7 has local_libdir set to $(sys.inputdir)/lib/3.7, but with
      # the @if macro support we can re-unify the split library for 3.7+ so we
      # specify the unified lib relative to local_libdir.
      "inputs" slist => { "$(sys.local_libdir)/../stdlib.cf" };


  reports:
    verbose_mode::
      "$(this.bundle): defining inputs='$(inputs)'";
}

cfengine_controls

Prototype: cfengine_controls

Description: Include various agent control policies

Implementation:

      "inputs" slist => { "$(sys.local_libdir)/../stdlib.cf" };
{
  vars:

      "def_inputs"
        slist => {
                   "controls/def.cf",
                   "controls/def_inputs.cf",
                 },
        comment => "We strictly order the def inputs because they should be parsed first";


      "input[cf_agent]"
        string => "controls/cf_agent.cf",
        comment => "Agent control options";

      "input[cf_execd]"
        string => "controls/cf_execd.cf",
        comment => "Executor (scheduler) control options";

      "input[cf_monitord]"
        string => "controls/cf_monitord.cf",
        comment => "Monitor/Measurement control options";

      "input[cf_serverd]"
        string => "controls/cf_serverd.cf",
        comment => "Server control options";

      "input[cf_runagent]"
        string => "controls/cf_runagent.cf",
        comment => "Runagent (remote activation request) control options";

    enterprise_edition::

      "input[cf_hub]" -> { "CFEngine Enterprise" }
        string => "controls/cf_hub.cf",
        comment => "Hub (agent report collection) control options";

      "input[reports]" -> { "CFEngine Enterprise" }
        string => "controls/reports.cf",
        comment => "Report collection options";

    any::

      "inputs" slist => getvalues(input);

  reports:
    DEBUG|DEBUG_cfengine_controls::
      "DEBUG $(this.bundle)";
        "$(const.t)defining inputs='$(inputs)'";
}

services_autorun

Prototype: services_autorun

Description: Include autorun policy and discover autorun bundles if enabled

Implementation:

      "inputs" slist => getvalues(input);
{
  vars:
    !cfengine_3_7.services_autorun::
      # 3.8+ can use local_libdir and will use the common lib as it supports the
      # @if macro
      "inputs" slist => { "$(sys.local_libdir)/autorun.cf" };
      "found_inputs" slist => lsdir("$(this.promise_dirname)/services/autorun", ".*\.cf", "true");
      "bundles" slist => { "autorun" }; # run loaded bundles

    cfengine_3_7.services_autorun::
      # We have to point 3.7 at the unified library because sys.local_libdir in
      # 3.7 binaries it is set to a version specific path. However since 3.7
      # knows about the @if macro it is safe to share the same policy as 3.8+
      "inputs" slist => { "$(sys.local_libdir)/../autorun.cf" };
      "found_inputs" slist => lsdir("$(this.promise_dirname)/services/autorun", ".*\.cf", "true");
      "bundles" slist => { "autorun" }; # run loaded bundles

    !services_autorun::
      # If services_autorun is not enabled, then we should not extend inputs
      # automatically.
      "inputs" slist => { };
      "found_inputs" slist => {};
      "bundles" slist => { "services_autorun" }; # run self

  reports:
    DEBUG|DEBUG_services_autorun::
      "DEBUG $(this.bundle): Services Autorun Disabled"
        ifvarclass => "!services_autorun";

      "DEBUG $(this.bundle): Services Autorun Enabled"
        ifvarclass => "services_autorun";

      "DEBUG $(this.bundle): adding input='$(inputs)'"
        ifvarclass => isvariable("inputs");

      "DEBUG $(this.bundle): adding input='$(found_inputs)'"
        ifvarclass => isvariable("found_inputs");
}

common bodies

control

Prototype: control

Description: Control options common to all agents

Implementation:

body common control
{

      bundlesequence => {
                        # Common bundle first (Best Practice)
                          inventory_control,
                          @(inventory.bundles),
                          def,
                          @(cfengine_enterprise_hub_ha.classification_bundles),

                          # Design Center
                          cfsketch_run,

                          # autorun system
                          services_autorun,
                          @(services_autorun.bundles),

                         # Agent bundle
                          cfe_internal_management,   # See cfe_internal/CFE_cfengine.cf
                          main,
                          @(cfengine_enterprise_hub_ha.management_bundles),
                          @(def.bundlesequence_end),

      };

      inputs => {
                 # File definition for global variables and classes
                  @(cfengine_controls.def_inputs),

                # Inventory policy
                  @(inventory.inputs),

                 # Design Center
                  "sketches/meta/api-runfile.cf",
                  @(cfsketch_g.inputs),

                 # CFEngine internal policy for the management of CFEngine itself
                  @(cfe_internal_inputs.inputs),

                 # Control body for all CFEngine robot agents
                  @(cfengine_controls.inputs),

                 # COPBL/Custom libraries.  Eventually this should use wildcards.
                  @(cfengine_stdlib.inputs),

                  # autorun system
                  @(services_autorun.inputs),

                  "services/main.cf",
      };

      version => "CFEngine Promises.cf 3.12.8a.ff51a7d2f";

      # From 3.7 onwards there is a new package promise implementation using package
      # modules in which you MUST provide package modules used to generate
      # software inventory reports. You can also provide global default package module
      # instead of specifying it in all package promises.
    (debian).!disable_inventory_package_refresh::
          package_inventory => { $(package_module_knowledge.platform_default) };

      # We only define pacakge_invetory on redhat like systems that have a
      # python version that works with the package module.
    (redhat|centos|suse|sles|opensuse|amazon_linux).cfe_yum_package_module_supported.!disable_inventory_package_refresh::
        package_inventory => { $(package_module_knowledge.platform_default) };

    (debian|redhat|suse|sles|opensuse|amazon_linux)::
          package_module => $(package_module_knowledge.platform_default);

      # CFEngine 3.12.2+ and 3.14+ have new package module on Windows
    windows.cfengine_3_12.!(cfengine_3_12_0|cfengine_3_12_1)::
          package_inventory => { $(package_module_knowledge.platform_default) };
          package_module => $(package_module_knowledge.platform_default);
@if minimum_version(3.14)
    windows::
          package_inventory => { $(package_module_knowledge.platform_default) };
          package_module => $(package_module_knowledge.platform_default);
@endif

    alpinelinux::
          package_module => $(package_module_knowledge.platform_default);


    any::
        ignore_missing_bundles => "$(def.control_common_ignore_missing_bundles)";
        ignore_missing_inputs => "$(def.control_common_ignore_missing_inputs)";


}

Variables

Referencing a version of CFEngine? Consider if that appearance should be updated with each new version.

Variables that are defined in the front matter (thats the content between the three dashes at the top) or in _config.yaml in the documentation-generator repository can be used directly within markdown.

For example this is the '3.12' version of the documentation. That variable comes from _config.yaml.

Since liquid variables look a lot like mustache variables any time you want to show the actual variables will need to be inside of raw tags.

site.CFE_manuals_version {{ site.CFE_manuals_version }}