I was surprised to see that "cfagent -pv" didn't show the slackware
class on my Slackware machine. The code is trying to determine the
version string by reading /etc/slackware-release. Modern Slackware
systems use /etc/slackware-version.
The attached patch changes the behaviour so that the newer file is
consulted first, and sets more classes in the same way as for other
Linux distributions, eg slackware_12_0_0, slackware_12_0,
slackware_12, slackware.
--- cfengine-2.2.3/src/prototypes.h (revision 145)
+++ cfengine-2.2.3/src/prototypes.h (working copy)
@@ -757,6 +757,7 @@
int linux_redhat_version (void);
int linux_mandrake_version (void);
int linux_suse_version (void);
+int linux_slackware_version (char *filename);
int debian_version (void);
int lsb_version (void);
char * UnQuote (char *name);
--- cfengine-2.2.3/src/misc.c (revision 145)
+++ cfengine-2.2.3/src/misc.c (working copy)
@@ -523,12 +523,22 @@
linux_suse_version();
}
-if (stat("/etc/slackware-release",&statbuf) != -1)
+#define SLACKWARE_ANCIENT_VERSION_FILENAME "/etc/slackware-release"
+#define SLACKWARE_VERSION_FILENAME "/etc/slackware-version"
+if (stat(SLACKWARE_VERSION_FILENAME,&statbuf) != -1)
{
Verbose("\nThis appears to be a slackware system.\n");
AddClassToHeap("slackware");
+ linux_slackware_version(SLACKWARE_VERSION_FILENAME);
}
+else if (stat(SLACKWARE_ANCIENT_VERSION_FILENAME,&statbuf) != -1)
+ {
+ Verbose("\nThis appears to be an ancient slackware system.\n");
+ AddClassToHeap("slackware");
+ linux_slackware_version(SLACKWARE_ANCIENT_VERSION_FILENAME);
+ }
+
if (stat("/etc/generic-release",&statbuf) != -1)
{
Verbose("\nThis appears to be a sun cobalt system.\n");
@@ -959,6 +969,46 @@
return 0;
}
+int linux_slackware_version(char *filename)
+{
+int major = -1;
+int minor = -1;
+int release = -1;
+char classname[CF_MAXVARSIZE] = "";
+FILE *fp;
+
+if ((fp = fopen(filename,"r")) == NULL)
+ {
+ return 1;
+ }
+
+Verbose("Looking for Slackware version...\n");
+switch (fscanf(fp, "Slackware %d.%d.%d", &major, &minor, &release))
+ {
+ case 3:
+ Verbose("This appears to be a Slackware %u.%u.%u system.", major, minor, release);
+ snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u_%u", major, minor, release);
+ AddClassToHeap(classname);
+ /* Fall-through */
+ case 2:
+ Verbose("This appears to be a Slackware %u.%u system.", major, minor);
+ snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u", major, minor);
+ AddClassToHeap(classname);
+ /* Fall-through */
+ case 1:
+ Verbose("This appears to be a Slackware %u system.", major);
+ snprintf(classname, CF_MAXVARSIZE, "slackware_%u", major);
+ AddClassToHeap(classname);
+ break;
+ case 0:
+ Verbose("No Slackware version number found.\n");
+ fclose(fp);
+ return 2;
+ }
+fclose(fp);
+return 0;
+}
+
/******************************************************************/
int debian_version(void) /* Andrew Stribblehill */
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine