#+TITLE: CFEngine layer [[file:./img/agent.png]] * Table of Contents :TOC_4_gh:noexport: - [[#description][Description]] - [[#install][Install]] - [[#configuration][Configuration]] - [[#set-file-permission-on-save][Set file permission on save]] - [[#indendation][Indendation]] - [[#key-bindings][Key bindings]] * Description This layer makes working with CFEngine policy easier: - Syntax highlighting - On the fly syntax checks (via =syntax-checking= layer) - Auto completion (via =auto-completion= layer) * 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 ** Indendation 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 * Key bindings | Key Binding | Description | |-------------+-----------------------| | ~ m j~ | Reformats JSON string |