Forum: Cfengine Help
Subject: Cfengine 3.0.5 segmentation fault with a bundle
Author: Seva Gluschenko
Link to topic: https://cfengine.com/forum/read.php?3,17578,17578#msg-17578
Hello folks,
tryin' to enforce certain package version for CentOS, I wrote a method to
achieve that, but unfortunately it produces segmentation fault. I was ready to
file a bug report, but I've found it useful to request an advice first.
Perhaps, somebody could explain me what's wrong with this example?
body common control
{
bundlesequence => { "test" };
}
########################################################
bundle agent test
{
reports:
centos::
"Hello World";
}
bundle agent force_package(pkg, ver, arch)
{
vars:
centos::
"installed" string => execresult("/bin/rpm -q $(pkg)", "noshell");
classes:
"exists" not => strcmp("$(installed)", "package $(pkg) is not
installed");
exists::
"ok" expression => strcmp("$(installed)", "$(ver)-$(arch)");
files:
!ok::
"$(g.pkg_localpath)"
copy_from => my_scp("$(g.pkg_path)"),
file_select => by_name("$(pkg)-$(ver)"),
classes => if_repaired(canonify("$(pkg)_received")),
comment => "Download $(pkg) when needed";
packages:
!ok.centos::
"$(pkg)"
package_method => yum,
package_policy => "delete",
comment => "Remove wrong version ($(installed)) of
$(pkg) (need $(ver))";
commands:
centos::
"/bin/rpm -i $(pkg)-$(ver).$(arch).rpm"
ifvarclass => canonify("$(pkg)_received"),
comment => "Install the package received";
reports:
!ok::
"$(pkg): forced version: $(ver) (was: $(installed))"
ifvarclass => canonify("$(pkg)_received");
}
############################################
body classes if_repaired(x)
{
promise_repaired => { "$(x)" };
}
########################################################
body file_select by_name(x)
{
leaf_name => { "$(x).*" };
file_result => "leaf_name";
}
body copy_from my_scp(from)
{
source => "$(from)";
compare => "digest";
#trustkey => "true";
!policy_host::
servers => { "$(g.policy_server)" };
}
########################################################
body package_method yum
{
package_changes => "bulk";
package_list_command => "/usr/bin/yum list installed";
# Remember to escape special characters like |
package_list_name_regex => "([^.]+).*";
package_list_version_regex => "[^\s]\s+([^\s]+).*";
package_list_arch_regex => "[^.]+\.([^\s]+).*";
package_installed_regex => ".*installed.*";
package_name_convention => "$(name)";
package_add_command => "/usr/bin/yum -y install";
package_delete_command => "/bin/rpm -e";
package_verify_command => "/bin/rpm -V";
package_update_command => "/usr/bin/yum -y update";
}
The most insane thing about this is that it segfaults even not being called, at
the verification stage. The debug output was as follows:
Found scope reference body
GetVariable(body,x): using scope 'body' for variable 'x'
return final variable type=string, value={
$(pkg)-$(ver)}
Aggregate result |$(pkg)-$(ver).*|, scanning at "" (current delta .*)
Returning complete scalar expansion ($(x).* => $(pkg)-$(ver).*)
Appending scalar to rval-list [$(pkg)-$(ver).*]
CopyRvalItem(s)
Appending a list to rhs
Doing arg-mapped sublval = file_result (promises.c)
ExpandPrivateRval(scope=body,type=s)
ExpandPrivateScalar(body,leaf_name)
Aggregate result |leaf_name|, scanning at "" (current delta leaf_name)
Returning complete scalar expansion (leaf_name => leaf_name)
Appending Constraint: file_result => leaf_name
Deleting scope body
Object body exists
----> Delete variable association x
DeleteRvalItem(s)$(pkg)-$(ver)
Appending Constraint: classes => true
Handling body-lval "classes"
Adding scope data body
MapBodyArgs(begin)
StringDataType((<9E>T <9D>T ^A)
StringDataType(x)
Segmentation fault
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine