[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: PrepModule or actionsequence: Hobson's choice
From: |
Cedric Ware |
Subject: |
Re: PrepModule or actionsequence: Hobson's choice |
Date: |
Tue, 30 Aug 2005 14:21:38 +0200 |
User-agent: |
Mutt/1.5.9i |
Hello,
Last month, I reported a problem in cfengine, that CFALLCLASSES
was not set when calling an external module via PrepModule, cf:
http://lists.gnu.org/archive/html/help-cfengine/2005-07/msg00025.html
The problem was that for a module called via PrepModule, the function
CheckForModule (called from functions.c) isn't preceded by a call to
BuildClassEnvironment, as it is for a module in the actionsequence,
where CheckForModule is called from cfagent.c.
A colleague of mine wrote the patch below, against cfengine 2.1.14,
which moves BuildClassEnvironment from cfagent.c to functions.c and
adds the call before CheckForModule in functions.c. I have been
using it for a few weeks, seemingly without problems. I think it
applies cleanly to cfengine 2.1.15.
Shouldn't it be integrated in future versions?
Thank you,
Cedric Ware.
diff -bBur cfengine-2.1.14/src/cfagent.c cfengine/src/cfagent.c
--- cfengine-2.1.14/src/cfagent.c 2005-07-09 15:42:57.000000000 +0200
+++ cfengine/src/cfagent.c 2005-07-09 16:00:19.000000000 +0200
@@ -51,7 +51,10 @@
enum aseq EvaluateAction ARGLIST((char *action, struct Item **classlist, int
pass));
void CheckOpts ARGLIST((int argc, char **argv));
int GetResource ARGLIST((char *var));
-void BuildClassEnvironment ARGLIST((void));
+/* moved to functions.c
+ void BuildClassEnvironment ARGLIST((void));
+*/
+
void Syntax ARGLIST((void));
void EmptyActionSequence ARGLIST((void));
void GetEnvironment ARGLIST((void));
@@ -1880,95 +1883,6 @@
/*******************************************************************/
-void BuildClassEnvironment()
-
-{ struct Item *ip;
- int size = 0;
- char file[CF_BUFSIZE], *sp;
- FILE *fp;
-
-Debug("(BuildClassEnvironment)\n");
-
-snprintf(ALLCLASSBUFFER,CF_BUFSIZE,"%s=",CF_ALLCLASSESVAR);
-
-if (!IsPrivileged())
- {
- Verbose("\n(Non privileged user...)\n\n");
-
- if ((sp = getenv("HOME")) == NULL)
- {
- FatalError("You do not have a HOME variable pointing to your home
directory");
- }
-
- snprintf(file,CF_BUFSIZE,"%s/.cfagent/allclasses",sp);
- }
-else
- {
- snprintf(file,CF_BUFSIZE,"%s/state/allclasses",WORKDIR);
- }
-
-
-if ((fp = fopen(file,"w")) == NULL)
- {
- CfLog(cfinform,"Could not open allclasses cache file","");
- return;
- }
-
-for (ip = VHEAP; ip != NULL; ip=ip->next)
- {
- if (IsDefinedClass(ip->name))
- {
- if ((size += strlen(ip->name)) > CF_ALLCLASSSIZE - CF_BUFFERMARGIN)
- {
- Verbose("Class buffer overflowed, dumping class environment for
modules\n");
- Verbose("This would probably crash the exec interface on most
machines\n");
- }
- else
- {
- size++; /* Allow for : separator */
- strcat(ALLCLASSBUFFER,ip->name);
- strcat(ALLCLASSBUFFER,":");
- }
-
- fprintf(fp,"%s\n",ip->name);
- }
- }
-
- for (ip = VALLADDCLASSES; ip != NULL; ip=ip->next)
- {
- if (IsDefinedClass(ip->name))
- {
- if ((size += strlen(ip->name)) > 4*CF_BUFSIZE - CF_BUFFERMARGIN)
- {
- Verbose("Class buffer overflowed, dumping class environment for
modules\n");
- Verbose("This would probably crash the exec interface on most
machines\n");
- }
- else
- {
- size++; /* Allow for : separator */
- strcat(ALLCLASSBUFFER,ip->name);
- strcat(ALLCLASSBUFFER,":");
- }
-
- fprintf(fp,"%s\n",ip->name);
- }
- }
-
- Debug2("---\nENVIRONMENT: %s\n---\n",ALLCLASSBUFFER);
-
- if (USEENVIRON)
- {
- if (putenv(ALLCLASSBUFFER) == -1)
- {
- perror("putenv");
- }
- }
-
- fclose(fp);
-}
-
-/*******************************************************************/
-
void Syntax()
{ int i;
diff -bBur cfengine-2.1.14/src/functions.c cfengine/src/functions.c
--- cfengine-2.1.14/src/functions.c 2005-07-09 15:42:57.000000000 +0200
+++ cfengine/src/functions.c 2005-07-09 16:00:11.000000000 +0200
@@ -1718,6 +1718,8 @@
Debug("PrepModule(%s,%s)\n",argv[0],argv[1]);
+BuildClassEnvironment();
+
if (CheckForModule(argv[0],argv[1]))
{
strcpy(value,CF_ANYCLASS);
@@ -1825,3 +1827,92 @@
return true;
}
+/*******************************************************************/
+
+void BuildClassEnvironment()
+
+{ struct Item *ip;
+ int size = 0;
+ char file[CF_BUFSIZE], *sp;
+ FILE *fp;
+
+Debug("(BuildClassEnvironment)\n");
+
+snprintf(ALLCLASSBUFFER,CF_BUFSIZE,"%s=",CF_ALLCLASSESVAR);
+
+if (!IsPrivileged())
+ {
+ Verbose("\n(Non privileged user...)\n\n");
+
+ if ((sp = getenv("HOME")) == NULL)
+ {
+ FatalError("You do not have a HOME variable pointing to your home
directory");
+ }
+
+ snprintf(file,CF_BUFSIZE,"%s/.cfagent/allclasses",sp);
+ }
+else
+ {
+ snprintf(file,CF_BUFSIZE,"%s/state/allclasses",WORKDIR);
+ }
+
+
+if ((fp = fopen(file,"w")) == NULL)
+ {
+ CfLog(cfinform,"Could not open allclasses cache file","");
+ return;
+ }
+
+for (ip = VHEAP; ip != NULL; ip=ip->next)
+ {
+ if (IsDefinedClass(ip->name))
+ {
+ if ((size += strlen(ip->name)) > CF_ALLCLASSSIZE - CF_BUFFERMARGIN)
+ {
+ Verbose("Class buffer overflowed, dumping class environment for
modules\n");
+ Verbose("This would probably crash the exec interface on most
machines\n");
+ }
+ else
+ {
+ size++; /* Allow for : separator */
+ strcat(ALLCLASSBUFFER,ip->name);
+ strcat(ALLCLASSBUFFER,":");
+ }
+
+ fprintf(fp,"%s\n",ip->name);
+ }
+ }
+
+ for (ip = VALLADDCLASSES; ip != NULL; ip=ip->next)
+ {
+ if (IsDefinedClass(ip->name))
+ {
+ if ((size += strlen(ip->name)) > 4*CF_BUFSIZE - CF_BUFFERMARGIN)
+ {
+ Verbose("Class buffer overflowed, dumping class environment for
modules\n");
+ Verbose("This would probably crash the exec interface on most
machines\n");
+ }
+ else
+ {
+ size++; /* Allow for : separator */
+ strcat(ALLCLASSBUFFER,ip->name);
+ strcat(ALLCLASSBUFFER,":");
+ }
+
+ fprintf(fp,"%s\n",ip->name);
+ }
+ }
+
+ Debug2("---\nENVIRONMENT: %s\n---\n",ALLCLASSBUFFER);
+
+ if (USEENVIRON)
+ {
+ if (putenv(ALLCLASSBUFFER) == -1)
+ {
+ perror("putenv");
+ }
+ }
+
+ fclose(fp);
+}
+
diff -bBur cfengine-2.1.14/src/prototypes.h cfengine/src/prototypes.h
--- cfengine-2.1.14/src/prototypes.h 2005-07-09 15:42:57.000000000 +0200
+++ cfengine/src/prototypes.h 2005-07-09 16:00:01.000000000 +0200
@@ -156,7 +156,7 @@
int IsTCPType ARGLIST((char *s));
int IsProcessType ARGLIST((char *s));
void HandleFriendStatus ARGLIST((char *args,char *value));
-
+void BuildClassEnvironment ARGLIST((void));
/* granules.c */
- Re: PrepModule or actionsequence: Hobson's choice,
Cedric Ware <=