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

Reply via email to