Indeed, it works now, after compiling from svn.

Thanks for the help! More questions are forthcoming... :-)

--Diego

On Fri, Jan 29, 2010 at 6:00 AM, Mark Burgess <mark.burg...@iu.hio.no> wrote:
>
> Diego,
>
> this  results from a bug that was just fixed in svn 747. No exit status was 
> set for a
> pattern that was not found. If the pattern was not found, then the promise is 
> considered
> to be kept.
>
> See new version in SVN.
>
> Diego Zamboni wrote:
>> Hi,
>>
>> I am still banging my head on this. For a brief moment I thought the
>> problem would be traced to a typo in the source (reapir_denied,
>> reported a few days ago on this list, and hence patched in svn), but I
>> have applied the patch and the problem persists.
>>
>> The problem is that when the pattern specified in replace_patterns in
>> an edit_line body does not appear in the file at all, it seems none of
>> the classes clauses is triggered. For reference, below is my
>> self-contained example. When the pattern appears in the file,
>> everything works fine, but when the pattern is not there, replace_done
>> is not defined, and thus the line is not appended.
>>
>> Thanks for any help,
>> --Diego
>>
>> body common control
>> {
>>   bundlesequence => { "linereplace" };
>> }
>>
>> bundle agent linereplace
>> {
>> vars:
>>   "file" string => "/root/sshd_config";
>>   # Pattern is automatically anchored to the beginning/end of line
>>   "pattern" string => "(# *Protocol .*| *Protocol .*1.*)";
>>   "line" string => "Protocol 2";
>>
>> files:
>>   "$(file)"
>>   edit_line => replace_or_add("$(pattern)","$(line)");
>>
>> }
>>
>> bundle edit_line replace_or_add(pattern,line)
>> {
>> replace_patterns:
>>   "^${pattern}$"
>>   replace_with => value("${line}"),
>>   classes => always("replace_done");
>>
>> insert_lines:
>>   replace_done::
>>   "${line}";
>>
>> }
>>
>> body replace_with value(x)
>> {
>> replace_value => "$(x)";
>> occurrences => "all";
>> }
>>
>> body classes always(x)
>> {
>>   promise_repaired => { "$(x)" };
>>   promise_kept => { "$(x)" };
>>   repair_failed => { "$(x)" };
>>   repair_denied => { "$(x)" };
>>   repair_timeout => { "$(x)" };
>> }
>>
>>
>> On Tue, Jan 26, 2010 at 4:06 PM, Diego Zamboni <di...@zzamboni.org> wrote:
>>> I am sorry, I didn't realize that at some point we switched off the
>>> list. I'm sending to the list now - thanks for the help.
>>>
>>> --Diego
>>>
>>>
>>> On Tue, Jan 26, 2010 at 2:43 PM, Mark <m...@iu.hio.no> wrote:
>>>> I don't have time to guide you through this, send it to the list
>>>>
>>>>
>>>> Mark
>>>>
>>>>
>>>> On 26 Jan 2010, at 19:50, Diego Zamboni <di...@zzamboni.org> wrote:
>>>>
>>>>> Mark,
>>>>>
>>>>> Thanks again for the nudge in the right direction. Here's my latest
>>>>> attempt, which unfortunately still does not work:
>>>>>
>>>>>
>>>>> bundle edit_line replace_or_add(pattern,line)
>>>>> {
>>>>> replace_patterns:
>>>>>  "^${pattern}$"
>>>>>  replace_with => value("${line}"),
>>>>>  classes => always("replace_done");
>>>>>
>>>>> insert_lines:
>>>>>  replace_done::
>>>>>  "${line}";
>>>>>
>>>>> }
>>>>>
>>>>> body classes always(x)
>>>>> {
>>>>>  promise_repaired => { "$(x)" };
>>>>>  promise_kept => { "$(x)" };
>>>>>  repair_failed   => { "$(x)" };
>>>>>  repair_denied   => { "$(x)" };
>>>>>  repair_timeout  => { "$(x)" };
>>>>> }
>>>>>
>>>>> If the line exists, whether commented out or not, then the correct
>>>>> thing happens. But if the line does not exist, the class
>>>>> "replace_done" does not get defined anyway, so the insert_lines does
>>>>> not run, even on the second pass. Below is the relevant verbose
>>>>> output.
>>>>>
>>>>> Did I miss some clause in the definition of always()? Or am I missing
>>>>> something else?
>>>>>
>>>>> Thanks again,
>>>>> --Diego
>>>>>
>>>>>
>>>>> cf3       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>>>>> *
>>>>> cf3       BUNDLE replace_or_add( {'# *Protocol 2,1.*','Protocol 2'} )
>>>>> cf3       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>>>>> *
>>>>> cf3
>>>>> cf3     ? Augment scope replace_or_add with pattern
>>>>> cf3     ? Augment scope replace_or_add with line
>>>>> cf3      ??  Private class context
>>>>> cf3
>>>>> cf3
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3       insert_lines in bundle replace_or_add
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3
>>>>> cf3
>>>>> cf3    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
>>>>> cf3    Skipping whole next edit promise, as context replace_done is not
>>>>> relevant
>>>>> cf3    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
>>>>> cf3
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3       replace_patterns in bundle replace_or_add
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3
>>>>> cf3
>>>>> cf3     .........................................................
>>>>> cf3     Promise handle:
>>>>> cf3     Promise made by: ^# *Protocol 2,1.*$
>>>>> cf3     .........................................................
>>>>> cf3
>>>>> cf3  -> Looking at pattern ^# *Protocol 2,1.*$
>>>>> cf3      ??  Private class context
>>>>> cf3
>>>>> cf3
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3       insert_lines in bundle replace_or_add
>>>>> cf3       = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>>> cf3
>>>>> cf3
>>>>> cf3    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
>>>>> cf3    Skipping whole next edit promise, as context replace_done is not
>>>>> relevant
>>>>> cf3    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
>>>>>
>>>>>
>>>>> On Tue, Jan 26, 2010 at 8:35 AM, Mark Burgess <mark.burg...@iu.hio.no>
>>>>> wrote:
>>>>>> IN this case, you need to define a class regardless if what happens when
>>>>>> the pattern
>>>>>> replace is made.
>>>>>>
>>>>>>  replace_patterns:
>>>>>>
>>>>>>  "${p}"
>>>>>>    replace_with => value("${l}"),
>>>>>>    classes => always("done");
>>>>>>
>>>>>>  insert_lines:
>>>>>>
>>>>>>  done::
>>>>>>
>>>>>>   "${l}"; # add only if it doesn't exist
>>>>>>
>>>>>> This should work as long as the $(l) is always a complete line, otherwise
>>>>>> your promise is
>>>>>> ambiguous. What happens if the pattern matches a partial line? cfengine
>>>>>> inserts the line
>>>>>> because there is no complete line matching this expression. Perhaps your
>>>>>> pattern should be
>>>>>> "^$(p)$" ?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Diego Zamboni wrote:
>>>>>>> Hi Mark,
>>>>>>>
>>>>>>> Thanks. In fact, my very first attempt was something very similar to
>>>>>>> set_variable_values(), only with a replace_patterns section instead of
>>>>>>> field_edits. The problem I found was that according to normal
>>>>>>> ordering, insert_lines is run before replace_patterns (whereas
>>>>>>> field_edits occurs before insert_lines), which defeats the test with
>>>>>>> the classes. The line is always inserted, regardless of whether the
>>>>>>> replacement works or not, because the negation of a non-existing class
>>>>>>> is true.
>>>>>>>
>>>>>>> Here's that very first version, for reference:
>>>>>>>
>>>>>>> bundle edit_line replace_or_add(p,l)
>>>>>>> {
>>>>>>> replace_patterns:
>>>>>>>  "${p}"
>>>>>>>  replace_with => value("${l}"),
>>>>>>>  classes => if_ok("line_exists");
>>>>>>>
>>>>>>> insert_lines:
>>>>>>>  "${l}"
>>>>>>>  ifvarclass => "!line_exists";
>>>>>>> }
>>>>>>>
>>>>>>> What am I missing?
>>>>>>>
>>>>>>> Thanks again,
>>>>>>> --Diego
>>>>>>>
>>>>>>>
>>>>>>> On Mon, Jan 25, 2010 at 12:29 PM, Mark Burgess <mark.burg...@iu.hio.no>
>>>>>>> wrote:
>>>>>>>> Try looking at the set-variable bundle in the standard library
>>>>>>>>
>>>>>>>> M
>>>>>>>>
>>>>>>>> Diego Zamboni wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I've been working on putting together an edit_line bundle that does
>>>>>>>>> the following:
>>>>>>>>>
>>>>>>>>> - If a certain pattern exists, replace it with a given string
>>>>>>>>> - If the pattern does not exist, add the line to the file.
>>>>>>>>>
>>>>>>>>> Below is what I came up with, which works, but somehow feels inelegant
>>>>>>>>> because I have to pass it the filename for the check using regline. I
>>>>>>>>> tried doing it by setting different classes in the replace_patterns:
>>>>>>>>> and insert_lines: sections, but could not get it to work.
>>>>>>>>>
>>>>>>>>> I would appreciate any ideas! I am just learning cfengine, so this is
>>>>>>>>> as much an intellectual exercise as something I need (and maybe could
>>>>>>>>> be a useful addition to the stdlib?)
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> --Diego
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> bundle edit_line replace_or_add(file,pattern,line)
>>>>>>>>> {
>>>>>>>>> classes:
>>>>>>>>>  "lineexists" expression => regline("$(pattern)","$(file)");
>>>>>>>>>
>>>>>>>>> replace_patterns:
>>>>>>>>>  lineexists::
>>>>>>>>>  "${pattern}"
>>>>>>>>>  replace_with => value("${line}");
>>>>>>>>>
>>>>>>>>> insert_lines:
>>>>>>>>>  !lineexists::
>>>>>>>>>  "${line}";
>>>>>>>>>
>>>>>>>>> }
>>>>>>>>> _______________________________________________
>>>>>>>>> Help-cfengine mailing list
>>>>>>>>> Help-cfengine@cfengine.org
>>>>>>>>> https://cfengine.org/mailman/listinfo/help-cfengine
>>>>>>>> --
>>>>>>>> Mark Burgess
>>>>>>>>
>>>>>>>> -------------------------------------------------
>>>>>>>> Professor of Network and System Administration
>>>>>>>> Oslo University College, Norway
>>>>>>>>
>>>>>>>> Personal Web: http://www.iu.hio.no/~mark
>>>>>>>> Office Telf : +47 22453272
>>>>>>>> -------------------------------------------------
>>>>>>>>
>>>>>> --
>>>>>> Mark Burgess
>>>>>>
>>>>>> -------------------------------------------------
>>>>>> Professor of Network and System Administration
>>>>>> Oslo University College, Norway
>>>>>>
>>>>>> Personal Web: http://www.iu.hio.no/~mark
>>>>>> Office Telf : +47 22453272
>>>>>> -------------------------------------------------
>>>>>>
>> _______________________________________________
>> Help-cfengine mailing list
>> Help-cfengine@cfengine.org
>> https://cfengine.org/mailman/listinfo/help-cfengine
>
> --
> Mark Burgess
>
> -------------------------------------------------
> Professor of Network and System Administration
> Oslo University College, Norway
>
> Personal Web: http://www.iu.hio.no/~mark
> Office Telf : +47 22453272
> -------------------------------------------------
>
_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to