Forum: Cfengine Help
Subject: Re: Setting a variable conditionally, depending on a class?
Author: zzamboni
Link to topic: https://cfengine.com/forum/read.php?3,16796,16801#msg-16801
Neil,
I need the interface name in a variable because I need to insert that name into
a configuration file. My specific use case is this: I need to run a
configuration command on one of the NICs in the systems, the one which is on a
certain subnet. Since the specific assignments of NICs to subnets may vary, I
need to determine it dynamically and use the corresponding interface name. This
is why I cannot use hard classes, I actually need the name of the interface as
a string.
It might be useful to have an index-grep command, that does a grep but returns
the INDICES of the matching elements, instead of the values. Then what I want
could be done with a single statement:
"matchednics" slist => grepindex("${ipregex}", "sys.ipv4");
In my mind, this would return the slist containing the indices of the elements
that match the regex (e.g. { "eth1" }), which would suit my needs perfectly.
I can cheat and do this with an execresult. This example works:
body common control
{ bundlesequence => { "test" }; }
bundle agent test
{
vars:
"ipregex" string => "192.168.";
"matchednic" string => execresult("/sbin/ifconfig | /usr/bin/awk '/^eth/ {
iface =$1 } /addr:${ipregex}/ { result=iface } END {print result }'",
"useshell");
reports: # this is a promise type
linux::
"Matched NIC: ${matchednic}";
}
But I'd really like to do it natively if possible, to avoid external
dependencies.
As I write this, I realize I could make the command that modifies the
configuration file dependent on the ifmatched_* class I defined in my first
example, thus only run it for the NICs that match. I'll experiment with that
and report to the list. I still think the grepindex() function could be useful
:-)
Thanks,
--Diego
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine