#+TITLE: CFEngine layer

#+TAGS: layer|tool

#+PROPERTY: header-args :eval never-export

[[file:./img/agent.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
- [[#configuration][Configuration]]
  - [[#set-file-permission-on-save][Set file permission on save]]
  - [[#indentation][Indentation]]
- [[#execution-of-cfengine3-src-blocks][Execution of =cfengine3= SRC blocks]]
- [[#key-bindings][Key bindings]]

* Description
This layer adds support for CFEngine policies to Spacemacs.

** Features:
- Syntax highlighting (CFEngine DSL, Mustache)
- On the fly syntax checking via =flycheck= integration.
- Auto completion via =company= integration.
- Execution of =cfengine3= =SRC= blocks in =org-mode= via =ob-cfengine3= package.

* Install
Add =cfengine= to the =dotspacemacs-configuration-layers= in your =~/.spacemacs=
to use this layer.

* Configuration
** Set file permission on save
Here is a function to set permissions to 600 on save, this can help avoid
errors like:

=File ./example.cf (owner 1000) is writable by others (security exception)=

#+BEGIN_SRC elisp
  (defun cfengine-permissions-policy-owner-only ()
    "If file starts with a shebang, make `buffer-file-name' executable"
    (save-excursion
      (set-file-modes buffer-file-name #o600)
      (message (concat "Made " buffer-file-name " accessibly only by the owner (600)."))))

  (add-hook 'after-save-hook 'cfengine-permissions-policy-owner-only nil 'make-it-local)
#+END_SRC

** Indentation
If you like attributes to be intended from the promiser set =Indentation amount
from anchor= to =2=. For example:

#+BEGIN_SRC cfengine3
  bundle agent main
  {
    vars:

        "promiser"
          string => "value",
          comment => "Indented 2 spaces from promiser";
  }
#+END_SRC

* Execution of =cfengine3= SRC blocks
This layers add support for =cfengine3= source blocks in org files.
With the insertion point inside the SRC block press ~,,~ or ~CTRL-c Ctrl-c~

#+BEGIN_SRC cfengine3
  bundle agent main
  {
    reports:

        "Hello World!";
  }
#+END_SRC

See the ob-cfengine3 [[https://github.com/nickanderson/ob-cfengine3/blob/master/README.org][README]] for information on controlling inclusion of the
stdlib, definition of classes and controlling the =bundlesequence= using header
args.

To suppress the confirmation when executing a block set
=(setq org-confirm-babel-evaluate nil)= in =dotspacemacs/user-config()=.

* Key bindings

| Key binding | Description           |
|-------------+-----------------------|
| ~SPC m j~   | Reformats JSON string |
