per-promise 'inform => "false"'?

"'Nick Anderson' via help-cfengine" <[email protected]> Thu, 13 Jul 2023 11:27:45 -0500
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
        I had a recollection from several years ago that a
        "files:" promise could take an attribute:

        * inform => "false"

        Is my memory playing tricks? I've just tried it and got:

        * Unknown attribute 'inform' for promise type 'files'

  Yes, probably a cosmic ray has flipped a bit in your memory.

  There is a promise level `inform' attribute, but, it's not for `files'
  it's for `commands'.

  Here is a fun snippet, show the promise types that have an attribute
  of `inform'.

  ,----
  | exec 2>&1
  | cf-promises --syntax-description json | jq '.promiseTypes | to_entries[] | select(.value.attributes.inform != null) | .key'
  | :
  `----

  ,----
  | "commands"
  `----


  It's a relatively recent addition, introduced in 3.15.0 (2019).

  <https://docs.cfengine.com/docs/3.21/reference-promise-types-commands.html#inform>


        Background. We have been working our way up from 3.10 to
        3.15. Now I'm trying 3.18. Suddenly one of our promises
        has changed from producing a single diagnostic line for
        the file:

        * info: Edit file '...'

        to two diagnostic lines for each and every line changed in
        the file. What pushes this over the acceptability boundary
        for us is that this is a local "state" file, which we
        deliberately empty and re-populate with 400-500 lines each
        and every run of "cf-agent" (so 800-1,000 diagnostic lines
        every run of cf-agent).

        What I ideally wish to do is that apply something like
        "inform => false" to that single promise (with all other
        promises continuing to show their more modest diagnostic
        lines).

        So... is my (supposed) memory of a per-promise "inform =>
        false" (or similar) playing mind-games and tricks on me?
        Or was there once such an attribute? (Maybe even 15 years
        ago when, at another place, I had been using CFE version
        2!) Or, even better, is there such a per-promise
        attribute, but I simply haven't found it?

  Yes, the inform logging became more specific. It's not expected that
  *each* execution of `cf-agent' is done with inform logging, generally
  that's reserved for manual runs or specific cases. As a general rule
  there is an expectation that a regularly scheduled execution of
  `cf-agent' will produce no output unless there was some problem.

  `action' bodies can specify `log_level'
  (<https://docs.cfengine.com/docs/3.21/reference-promise-types.html#log_level>)
  and `report_level'
  (<https://docs.cfengine.com/docs/3.21/reference-promise-types.html#report_level>).
  `log_level' influences what is sent to syslog and `report_level'
  influences standard output. These are useful for *increasing*, not
  decreasing the level of output from the global default. So, if you ran
  `cf-agent' with no log level specified you could for a single promise
  increase it's level to inform for example, but if you run `cf-agent
  --log-level inform' you could not reduce an individual promise log
  level to `error'.

  Here is a small example to illustrate the behavior:

  ,----
  | bundle agent __main__
  | {
  |     methods:
  |       "init";
  |       "example";
  | }
  | bundle agent init
  | {
  |   files:
  |     "/tmp/[1-3].txt"
  |       delete => default:tidy,
  |       action => default:report_level_x( "error" );
  | }
  | bundle agent example
  | {
  |   files:
  |     "/tmp/1.txt"
  |       content => "default report level";
  |
  |     "/tmp/2.txt"
  |       content => "promise specific inform report level",
  |       action => default:report_level_x( "inform" );
  |
  |     "/tmp/3.txt"
  |       content => "promise specific verbose report level",
  |       action => default:report_level_x( "verbose" );
  |
  |
  |   reports:
  |     "/tmp/1.txt" printfile => default:cat( "$(this.promiser)" );
  |     "/tmp/2.txt" printfile => default:cat( "$(this.promiser)" );
  |     "/tmp/3.txt" printfile => default:cat( "$(this.promiser)" );
  |
  | }
  | body action report_level_x( x )
  | {
  |     report_level => "$(x)";
  | }
  `----
  Listing 1: Example Policy

  ,----
  | # cf-agent --no-lock --file /tmp/example.cf
  |     info: Created file '/tmp/2.txt', mode 0600
  |     info: Updated file '/tmp/2.txt' with content 'promise specific inform report level'
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_kw9dYH_25' of type "files" (pass 1)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  |  verbose: No mode was set, choose plain file default 0600
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-kw9dYH' at line 25
  |     info: Created file '/tmp/3.txt', mode 0600
  |  verbose: Replacing '/tmp/3.txt' with content 'promise specific verbose report level'
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-kw9dYH' at line 25
  |     info: Updated file '/tmp/3.txt' with content 'promise specific verbose report level'
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-kw9dYH' at line 25
  |  verbose: files promise '/tmp/3.txt' repaired
  |  verbose: A: Promise REPAIRED
  |  verbose: P: END files promise (/tmp/3.txt)
  | R: /tmp/1.txt
  | R: default report level
  | R: /tmp/2.txt
  | R: promise specific inform report level
  | R: /tmp/3.txt
  | R: promise specific verbose report level
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_kw9dYH_25' of type "files" (pass 2)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_kw9dYH_25' of type "files" (pass 3)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  `----

  Then, when run again with inform as the default, we can see that the
  file deletion still comes out as info, it's not suppressed by setting
  it's `report_level' to `error' because this attribute can only
  *increase* the verbosity.
  ,----
  | # cf-agent --no-lock --log-level inform --file /tmp/example.cf
  |     info: Deleted file '/tmp/1.txt'
  |     info: Deleted file '/tmp/2.txt'
  |     info: Deleted file '/tmp/3.txt'
  |     info: Created file '/tmp/1.txt', mode 0600
  |     info: Updated file '/tmp/1.txt' with content 'default report level'
  |     info: Created file '/tmp/2.txt', mode 0600
  |     info: Updated file '/tmp/2.txt' with content 'promise specific inform report level'
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_JFnoIJ_25' of type "files" (pass 1)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  |  verbose: No mode was set, choose plain file default 0600
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-JFnoIJ' at line 25
  |     info: Created file '/tmp/3.txt', mode 0600
  |  verbose: Replacing '/tmp/3.txt' with content 'promise specific verbose report level'
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-JFnoIJ' at line 25
  |     info: Updated file '/tmp/3.txt' with content 'promise specific verbose report level'
  |  verbose: Additional promise info: source path '/home/nickanderson/org/roam/daily/work/cfengine3-JFnoIJ' at line 25
  |  verbose: files promise '/tmp/3.txt' repaired
  |  verbose: A: Promise REPAIRED
  |  verbose: P: END files promise (/tmp/3.txt)
  | R: /tmp/1.txt
  | R: default report level
  | R: /tmp/2.txt
  | R: promise specific inform report level
  | R: /tmp/3.txt
  | R: promise specific verbose report level
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_JFnoIJ_25' of type "files" (pass 2)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  |  verbose: P: .........................................................
  |  verbose: P: BEGIN promise 'promise_cfengine3_JFnoIJ_25' of type "files" (pass 3)
  |  verbose: P:    Promiser/affected object: '/tmp/3.txt'
  |  verbose: P:    Part of bundle: example
  |  verbose: P:    Base context class: any
  |  verbose: P:    Stack path: /default/main/methods/'example'/default/example/files/'/tmp/3.txt'[1]
  |  verbose: Using literal pathtype for '/tmp/3.txt'
  `----

  So, are you running with `--inform' by default, if so, why?

-- 
You received this message because you are subscribed to the Google Groups "help-cfengine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/87jzv3rd32.fsf%40northern.tech.