Michael Potter <[email protected]> writes: > I believe the problem is this expression: > > "^(smtp_host)\s+.*$" replace_with => value("$(match.1) $(smtp)"), > > Because you use a .* after the whitespace, the regex will continue to match > after any replacement occurs. > > Try using a negative lookahead assertion: > > "^(smtp_host)\s+(?!$(smtp))$" > > This will ensure the pattern only matches when smtp_host is *not* followed > by $(smtp), so after the first replacement occurs, the regex will no longer > match and will be convergent.
Great, except I have a strange behaviour, when nothing should be change,
there is a change:
#v+
m...@home:~/ $ rm -f /tmp/main.cf
removed `/tmp/main.cf'
m...@home:~/ $ /usr/sbin/cf-agent -K
R: I add the 'smtp_host smtp.example.net' line
m...@home:~/ $ /usr/sbin/cf-agent -K
R: I do not replace any missconfigured smtp_host line
R: I replace some missconfigured smtp_host line
m...@home:~/ $ perl -pi -e 's/\.net/.org/' /tmp/main.cf
m...@home:~/ $ /usr/sbin/cf-agent -K
R: I replace some missconfigured smtp_host line
m...@home:~/ $ /usr/sbin/cf-agent -K
R: I do not replace any missconfigured smtp_host line
R: I replace some missconfigured smtp_host line
#v-
#v+
cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cf3 replace_patterns in bundle fix_smtp_host
cf3 = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cf3
cf3
cf3 .........................................................
cf3 Promise handle:
cf3 Promise made by: ^(smtp_host)\s+(?!smtp.example.net$).*$
cf3
cf3 Comment: Replace missconfigured smtp_host
cf3 .........................................................
cf3
cf3 -> Looking at pattern ^(smtp_host)\s+(?!smtp.example.net$).*$
cf3 -> Replaced pattern "^(smtp_host)\s+(?!smtp.example.net$).*$" in
/tmp/main.cf
cf3 ?> defining promise result class SomeSMTPHostReplaced
cf3 -> << (1)"smtp_host smtp.example.net"
cf3 -> >> (1)"smtp_host smtp.example.net"
cf3 -> No pattern "^(smtp_host)\s+(?!smtp.example.net$).*$" in /tmp/main.cf
cf3 ?> defining promise result class NoSMTPHostReplaced
#v-
With the following configuration:
#v+
body common control
{
bundlesequence => { "filetest" };
version => "0.0.1";
}
bundle agent filetest
{
vars:
"smtp" string => "smtp.example.net";
files:
"/tmp/main.cf"
create => "true",
edit_line => fix_smtp_host2("$(smtp)"),
comment => "smpt_host must be $(smtp)";
reports:
SMTPHostOK::
"The smtp_host line is already configured";
SMTPHostFixed::
"I add the 'smtp_host $(smtp)' line";
NoSMTPHostReplaced::
"I do not replace any missconfigured smtp_host line";
SomeSMTPHostReplaced::
"I replace some missconfigured smtp_host line";
}
bundle edit_line fix_smtp_host2(smtp)
{
classes:
"HasSMTPhost" expression => regline("^smtp_host.*", "$(edit.filename)");
insert_lines:
!HasSMTPhost::
"smtp_host $(smtp)",
classes => if_ok("SMTPHostOK", "SMTPHostFixed"),
comment => "Add smtp_host if none";
replace_patterns:
HasSMTPhost::
"^(smtp_host)\s+(?!$(smtp)$).*$" replace_with => value("$(match.1)
$(smtp)"),
classes => if_ok("NoSMTPHostReplaced", "SomeSMTPHostReplaced"),
comment => "Replace missconfigured smtp_host";
}
body replace_with value(v)
{
replace_value => "$(v)";
occurrences => "all";
}
body classes if_ok(notchanged, changed)
{
promise_kept => { "$(notchanged)" };
promise_repaired => { "$(changed)" };
}
#v-
Regards.
--
Daniel Dehennin
Récupérer ma clef GPG:
gpg --keyserver pgp.mit.edu --recv-keys 0x6A2540D1
pgpYjfH4KlCZO.pgp
Description: PGP signature
_______________________________________________ Help-cfengine mailing list [email protected] https://cfengine.org/mailman/listinfo/help-cfengine
