Hi All,
I think there is a need for the same sort of flexibility that the
AppendIf... commands within editfiles gives us, but as an insert, so
that they can be specified in an exact place.
I am modifying shorewall config files which require a final line that
says "THIS IS THE LAST LINE". I need to place all my edits above this
line, and ideally what I would do is to use InsertFromFileIfNoSuchLines,
or an InsertIfNoSuchLine "ThisLine" in a ForEachLineIn loop.
I could use the standard append commands, and then locate the "last"
line, delete and then append it, but that isn't exactly tidy or
necessarily reliable, as I would have to run it in a separate loop under
a separate class defined by first loop.
The only other way I can think of doing it is to nest a group and a group:
{
/file-to-be-edited
ForEachLineIn "data-file"
BeginGroupIfNoSuchLine "ThisLine"
EmptyEntireFilePlease
Append "# File Header & Comments"
InsertFile "datafile"
Append "# THIS IS THE LAST LINE"
EndGroup
EndLoop
DefineClasses "restart_shorewall"
}
Since the first none match would cause the whole file to be re-written,
subsequent lines would always find a match, but I would guess there are
two problems with this:
1) ThisLine might not be a valid variable for BeginGroupIfNoSuchLine
2) ForEachLineIn doesn't allow nested loops, so does it allow a nested
group?
If the above code works (by the way does ThisLine need " or '' or ``?
The manual is a little unclear), then all well and good, but if not, I
am going to have to work out another way of doing it. There is an
INCLUDE option within shorewall that may allow me to have a much simpler
file to edit, but having an InsertIf.. set of commands may be a worthy
addition to CFEngine. Just don't ask me to write it, I wouldn't know
where to start. ;)
Regards,
Marco van Beek
_______________________________________________
Help-cfengine mailing list
Help-cfengine@gnu.org
http://lists.gnu.org/mailman/listinfo/help-cfengine