You've got a problem with the classes attribute in you vars promises 
type. I guess it should read

"next_iface"
         string     =>  "${virtuals}",
         classes    =>  if_repaired("has_next_interface"),

         # the ifavarclass is the problem, I only get the error message as in 
the subject.
         ifvarclass =>  not(classify("has_${base_iface}_${virtuals}"));


The "utf8" problem seems to be indeed linked to the use of slist in a 
ifvarclass with function. Usually, it's a pointer problem within the 
code of CFEngine, but I can't be of much more help with this

Regards
Nicolas

On 06/10/2011 09:00, no-re...@cfengine.com wrote:
> Forum: CFEngine Help
> Subject: ifvarclass and "Unable to parse class expression"
> Author: svenXY
> Link to topic: https://cfengine.com/forum/read.php?3,23678,23678#msg-23678
>
> Hi,
>
> I'm currently trying to develop a bundle that will allow me to create 
> secondary (virtual) IP4-Interfaces, but I'm already stuck when trying to find 
> out which is the next "free" number.
>
> Here's the code:
>
>
> body common control
> {
>          version =>  "1.0.0";
>          bundlesequence =>  { "nw_setup" };
> }
>
> bundle agent nw_setup {
>
>    methods:
>      "ok"  usebundle =>  network_iface("eth0", "192.168.1.1");
>
> }
>
> bundle agent network_iface (base_iface, addr4)
> {
>
>   # run execresult of "ip a s "
>   # parse the result with regextract and find virtual interfaces (:0, :1, 
> ...) that are already there
>   # try to find the next "free" number"
>
>    vars:
>      "ipdata"  string =>  execresult("/sbin/ip address show ${base_iface}", 
> "noshell");
>      "ip4"     string =>  canonify("${addr4}");
>      "virtuals" slist =>  {"0", "1", "2", "3", "4", "5", "6" };
>
>    classes:
>
>     "ok" expression =>  regextract(
>                                  "inet .* scope global secondary 
> ${base_iface}:(\d+)",
>                                  "${ipdata}",
>                                  "virtual_ifaces"
>                                  ),
>        comment =>  "Extract interface last numbers like eth0:1 should be 1";
>
>
>      # set the class if a secondary interface of this name already exists:
>      "has_${base_iface}_${virtuals}" expression =>  regarray( 
> "virtual_ifaces", "^${virtuals}$");
>
>    vars:
>
>      # the idea here is to find the number for the first virtual interface 
> that does not yet
>      # exist and then set the class "has_next_interface" to prevent this from 
> continuing the loop.
>
>      !has_next_iface::
>        "next_iface"
>          string     =>  "${virtuals}",
>          classes    =>  "has_next_interface",
>
>          # the ifavarclass is the problem, I only get the error message as in 
> the subject.
>          ifvarclass =>  not(classify("has_${base_iface}_${virtuals}"));
>
>    reports:
>      linux::
>        "the next virtual interface for ${base_iface} will be 
> ${base_iface}:$(next_iface}";
>
>
> }
>
> body classes if_repaired(x)
> {
>      promise_repaired =>  { "$(x)" };
> }
>
>
>
> The error message looks like broken utf-8 encoduings or so, maybe this helps.
>
> Ideas? Hints?
>
> Cheers,
> Sven
>
> _______________________________________________
> Help-cfengine mailing list
> Help-cfengine@cfengine.org
> https://cfengine.org/mailman/listinfo/help-cfengine
_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to