Hello,
So I took a closer look at the output and decided to take a crack at a
solution. Below is a patch - please excuse the ugly code, I'm not a developer
nor have I touched C in years, so it definitely needs to be audited.
Essentially what it does is when a method reads in the values for it's
arguments, it scans the Macro hash table for variable values containing
references to the argument and expands them. It compiled and ran fine for me,
but I'm not sure what sort of criteria you test against. Again, thanks for the
awesome app!
--George
=========================================================================================
--- methods.c.orig 2007-07-24 13:49:50.000000000 -0500
+++ methods.c 2007-07-24 21:06:21.000000000 -0500
@@ -1022,6 +1022,29 @@
{
Verbose("Setting transmitted variable %s = ( %s
)\n",METHODARGV[argnum],argbuf);
AddMacroValue(CONTEXTID,METHODARGV[argnum],argbuf);
+//------------------------------------------------------------------------------
+ int count;
+ struct cfObject *fixme;
+ char **tbl, valstr[CF_EXPANDSIZE], exp[CF_EXPANDSIZE],
wbraces[CF_EXPANDSIZE], wparends[CF_EXPANDSIZE], *varname, *varval;
+
+ fixme = ObjectContext(CONTEXTID);
+ tbl = fixme->hashtable;
+ snprintf(wbraces,CF_BUFSIZE,"${%s}",METHODARGV[argnum]);
+ snprintf(wparends,CF_BUFSIZE,"$(%s)",METHODARGV[argnum]);
+
+ for (count = 0; count < CF_HASHTABLESIZE; count++)
+ {
+ snprintf(valstr,CF_BUFSIZE,"%s",tbl[count]);
+ if ( strstr(valstr, wbraces) || strstr(valstr, wparends) )
+ {
+ ExpandVarstring(valstr,exp,NULL);
+ varname = strtok( exp, "=" );
+ varval = strtok( NULL, "=" );
+ DeleteMacro(CONTEXTID,varname);
+ AddMacroValue(CONTEXTID,varname,varval);
+ }
+ }
+//------------------------------------------------------------------------------
}
else
{
=========================================================================================
-----Original Message-----
From: [EMAIL PROTECTED] on behalf of George Popescu
Sent: Fri 7/20/2007 10:00 PM
To: Mark Burgess
Cc: [email protected]
Subject: RE: Cfengine variable expansion problem.
Hello,
I just wanted to follow up with info that should be a little more useful
than my last reply. Attached are the current versions (I've made a few changes
during my attempts to get it to parse correctly) of the relevant files, and the
"-d2" output of a cfagent run in the file "baby1run.out". The following two
excerpts from the "-d2" output seem most relevant to the issue:
------------------------------------------------------------------------------------------
Scanning variable site_in
GetMacroValue(private-method,site_in)
GetMacroValue(private-method,site_in): using scope 'private-method' for
variable 'site_in'
Currently non existent variable $(site_in)
Returning varstring (${site_in})
AddMacroValue(private-method.long_sname=${site_in})
ExpandVarstring( ${site_in} )
Add || to str, waiting at |${site_in}|
ExtractOuterVarString(${site_in}) - syntax verify
Extracted outer variable |${site_in}|
Returning substring value site_in
Scanning variable site_in
GetMacroValue(private-method,site_in)
GetMacroValue(private-method,site_in): using scope 'private-method' for
variable 'site_in'
Currently non existent variable $(site_in)
Returning varstring (${site_in})
Added Macro at hash address 1018 to object private-method with value
long_sname=${site_in}
------------------------------------------------------------------------------------------
and then later on,
------------------------------------------------------------------------------------------
DEFINED MACRO/VARIABLES (by contexts)
OBJECT: global
1895 : ipv4[eth1]=192.168.95.131
OBJECT: main
OBJECT: private-method
1018 : long_sname=${site_in}
2086 : confname=inc.${site_in}.conf
2245 : site_in=newsite3.family.org
2276 : short_sname=
2323 : cfdir=/var/lib/cfengine2
4514 : docroot=/var/www/${site_in}
------------------------------------------------------------------------------------------
I'm not sure if another pass through the macro table to expand variables would
be the solution, or if I just wrote my method wrong. Thanks for the awesome
program by the way!
--George
-----Original Message-----
From: Mark Burgess [mailto:[EMAIL PROTECTED]
Sent: Friday, July 20, 2007 1:34 AM
To: George Popescu
Cc: [email protected]
Subject: Re: Cfengine variable expansion problem.
Have you tried putting quotes around the variables?
Method("$variable")
I use this all the time....
control:
workfile = ( "/tmp/chain-pattern" )
##########################################################
methods:
#
# Pattern has to be coded in classes (from) and servers (to)
#
node1|node2:: # U(p) | p - binding
Aggregate("$(workfile)")
server=node2
action=method_pattern.cf
returnvars=ret
returnclasses=chain_link
node2|node3::
Aggregate("$(workfile)")
server=node3
action=method_pattern.cf
returnvars=ret
returnclasses=chain_link
George Popescu wrote:
> So I wanted to try out methods and wrote a quick config. These same
> configuration lines below causes glibc free and segmentation fault
> errors when run on the 2.1.20-1 build for Ubuntu 7.04, so I downloaded
> and built 2.2.1, which runs, but doesn't properly expand variables.
>
>
>
> ############# The relevant parts of the cfagent.conf file #################
>
[snip]
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.476 / Virus Database: 269.10.10/908 - Release Date: 7/19/2007 6:10
PM
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.476 / Virus Database: 269.10.10/908 - Release Date: 7/19/2007 6:10
PM
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine