2016-12-29 10:56:49 +01:00
|
|
|
From d261fe140de0ab2a6f5ca553ab964e7a09e890b4 Mon Sep 17 00:00:00 2001
|
2014-04-10 16:31:27 +02:00
|
|
|
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
|
2014-04-11 09:32:56 +02:00
|
|
|
Date: Fri, 11 Apr 2014 09:25:05 +0200
|
- Update to 3.7.0
See https://github.com/cfengine/core/blob/3.7.x/ChangeLog for
full changelog
New features:
- New package promise implementation.
The syntax is much simpler, to try it out, check out the syntax:
packages:
"mypackage"
policy => "absent/present",
# Optional, default taken from common control
package_module => apt_get,
# Optional, will only match exact version. May be
# "latest".
version => "32.0",
# Optional.
architecture => "x86_64";
- Full systemd support for all relevant platforms
- New classes to determine whether certain features are enabled:
* feature_yaml
* feature_xml
For the official CFEngine packages, these are always enabled, but
packages from other sources may be built without the support.
- New readdata() support for generic data input (CSV, YAML, JSON, or auto)
- YAML support: new readyaml() function and in readdata()
- CSV support: new readcsv() function and in readdata()
- New string_mustache() function
- New data_regextract() function
- eval() can now be called with "class" as the "mode" argument, which
will cause it to return true ("any") if the calculated result is
non-zero, and false ("!any") if it is zero.
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement/cfengine?expand=0&rev=131
2015-07-30 12:12:28 +02:00
|
|
|
Subject: [PATCH 2/2] Simplify and fix parsing of /etc/SuSE-release (fixes
|
- Update to 3.6.1
New features:
- Introduced Solaris and AIX support into the 3.6 series, with
many associated build and bug fixes.
Changes:
- Short-circuit evaluation of classes promises if class is already
set (Redmine #5241)
- fix to assume all non-specified return codes are failed in
commands promises (Redmine #5986)
- cf-serverd logs reconfiguration message to NOTICE (was INFO)
so that it's always logged in syslog
Bug fixes:
- File monitoring has been completely rewritten (changes attribute
in files promise), which eliminates many bugs, particularly
regarding files that are deleted. Upgrading will keep all
monitoring data, but downgrading again will reinitialize the DB,
so all files will be reported as if they were new. (Redmine #2917)
- $(this.promiser) expands in files promises for 'transformer',
'edit_template', 'copy_from.source', 'file_select.exec_program',
'classes' and 'action' bodies (Redmine #1554, #1496, #3530, #1563)
- 'body changes' notifies about disappeared files in file monitoring
(Redmine #2917)
- Set not-kept classes when files or commands promise should be
repaired, but is warn-only (Redmine #2359)
- Fixed CFEngine template producing a zero-sized file (Redmine #6088)
- Add 0-9 A-Z _ to allowed context of module protocol (Redmine #6063)
- Extend ps command column width on Solaris and filter on zone
rather than adding it to the ps output.
- Fixed strftime() function on Solaris when called with certain
specifiers.
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement/cfengine?expand=0&rev=101
2014-07-29 11:09:25 +02:00
|
|
|
issue #5423)
|
2014-04-10 16:31:27 +02:00
|
|
|
|
|
|
|
This patch is a simplification of sysinfo.c:Linux_Suse_Version()
|
|
|
|
to achieve the following
|
|
|
|
|
|
|
|
- distinction between "SUSE Linux Enterprise Server" (sles) and "... Desktop" (sled)
|
|
|
|
- distinction between SUSE Linux Enterprise products (suse) and openSUSE (opensuse)
|
|
|
|
- extract version from VERSION and PATCHLEVEL lines instead of
|
|
|
|
first line of /etc/SuSE-release
|
|
|
|
- verified for sles version 9,10,11,12; sled versions 10,11,12, openSUSE 13.1
|
|
|
|
---
|
2014-04-11 09:32:56 +02:00
|
|
|
libenv/sysinfo.c | 187 ++++++++++++++++++-------------------------------------
|
|
|
|
1 file changed, 60 insertions(+), 127 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/libenv/sysinfo.c b/libenv/sysinfo.c
|
2016-12-29 10:56:49 +01:00
|
|
|
index d615f5ed6e1d..07a2e698a1cf 100644
|
2014-04-11 09:32:56 +02:00
|
|
|
--- a/libenv/sysinfo.c
|
|
|
|
+++ b/libenv/sysinfo.c
|
2016-12-29 10:56:49 +01:00
|
|
|
@@ -1753,6 +1753,7 @@ static int Linux_Suse_Version(EvalContext *ctx)
|
2014-04-10 16:31:27 +02:00
|
|
|
#define SUSE_RELEASE_FLAG "linux "
|
|
|
|
|
|
|
|
char classbuf[CF_MAXVARSIZE];
|
|
|
|
+ char *vendor = "suse";
|
|
|
|
|
|
|
|
Log(LOG_LEVEL_VERBOSE, "This appears to be a SUSE system.");
|
|
|
|
EvalContextClassPutHard(ctx, "SUSE", "inventory,attribute_name=none,source=agent");
|
2016-12-29 10:56:49 +01:00
|
|
|
@@ -1772,23 +1773,26 @@ static int Linux_Suse_Version(EvalContext *ctx)
|
2014-04-10 16:31:27 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2014-04-11 09:32:56 +02:00
|
|
|
- char vbuf[CF_BUFSIZE], strversion[CF_MAXVARSIZE], strpatch[CF_MAXVARSIZE];
|
2014-04-10 16:31:27 +02:00
|
|
|
- strversion[0] = '\0';
|
|
|
|
- strpatch[0] = '\0';
|
|
|
|
+ char vbuf[CF_BUFSIZE];
|
|
|
|
|
2014-04-11 09:32:56 +02:00
|
|
|
int major = -1, minor = -1;
|
|
|
|
while (fgets(vbuf, sizeof(vbuf), fp) != NULL)
|
2014-04-10 16:31:27 +02:00
|
|
|
{
|
2014-04-11 09:32:56 +02:00
|
|
|
if (strncmp(vbuf, "VERSION", strlen("version")) == 0)
|
|
|
|
{
|
|
|
|
- strlcpy(strversion, vbuf, sizeof(strversion));
|
|
|
|
- sscanf(vbuf, "VERSION = %d", &major);
|
2014-04-10 16:31:27 +02:00
|
|
|
+ int res;
|
|
|
|
+ res = sscanf(vbuf, "VERSION = %d.%d", &major, &minor);
|
|
|
|
+ Log(LOG_LEVEL_VERBOSE, "VERSION sscanf returned %d.", res);
|
|
|
|
+ if (res < 1)
|
|
|
|
+ major = -1;
|
|
|
|
+ else if (res < 2)
|
|
|
|
+ minor = -1;
|
|
|
|
}
|
2014-04-11 09:32:56 +02:00
|
|
|
|
|
|
|
if (strncmp(vbuf, "PATCH", strlen("PATCH")) == 0)
|
2014-04-10 16:31:27 +02:00
|
|
|
{
|
2014-04-11 09:32:56 +02:00
|
|
|
- strlcpy(strpatch, vbuf, sizeof(strpatch));
|
|
|
|
- sscanf(vbuf, "PATCHLEVEL = %d", &minor);
|
|
|
|
+ if (sscanf(vbuf, "PATCHLEVEL = %d", &minor) != 1)
|
|
|
|
+ minor = -1;
|
2014-04-10 16:31:27 +02:00
|
|
|
}
|
|
|
|
}
|
2014-04-11 09:32:56 +02:00
|
|
|
if (ferror(fp))
|
2016-12-29 10:56:49 +01:00
|
|
|
@@ -1802,28 +1806,38 @@ static int Linux_Suse_Version(EvalContext *ctx)
|
2014-04-10 16:31:27 +02:00
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
- /* Check if it's a SUSE Enterprise version */
|
2014-04-11 09:32:56 +02:00
|
|
|
+ /* Check which SUSE/openSUSE product it is */
|
|
|
|
|
2014-04-10 16:31:27 +02:00
|
|
|
- Log(LOG_LEVEL_VERBOSE, "Looking for SUSE enterprise info in '%s'", relstring);
|
2014-04-11 09:32:56 +02:00
|
|
|
+ Log(LOG_LEVEL_VERBOSE, "Looking for SUSE product info in '%s'", relstring);
|
|
|
|
|
2014-04-10 16:31:27 +02:00
|
|
|
- /* Convert relstring to lowercase to handle rename of SuSE to
|
|
|
|
- * SUSE with SUSE 10.0.
|
|
|
|
- */
|
|
|
|
-
|
2014-04-11 09:32:56 +02:00
|
|
|
- for (int i = 0; i < strlen(relstring); i++)
|
2014-04-10 16:31:27 +02:00
|
|
|
+ if (!strncasecmp(relstring, SUSE_SLES8_ID, strlen(SUSE_SLES8_ID)))
|
|
|
|
{
|
2014-04-11 09:32:56 +02:00
|
|
|
- relstring[i] = tolower(relstring[i]);
|
|
|
|
+ EvalContextClassPutHard(ctx, "SLES8", "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
}
|
|
|
|
-
|
2014-04-11 09:32:56 +02:00
|
|
|
- /* Check if it's a SUSE Enterprise version (all in lowercase) */
|
2014-04-10 16:31:27 +02:00
|
|
|
-
|
2014-04-11 09:32:56 +02:00
|
|
|
- if (!strncmp(relstring, SUSE_SLES8_ID, strlen(SUSE_SLES8_ID)))
|
2014-04-10 16:31:27 +02:00
|
|
|
+ else if (!strncasecmp(relstring, SUSE_SLES_ID, strlen(SUSE_SLES_ID)))
|
|
|
|
{
|
2014-04-11 09:32:56 +02:00
|
|
|
- classbuf[0] = '\0';
|
|
|
|
- strcat(classbuf, "SLES8");
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
+ EvalContextClassPutHard(ctx, "sles", "inventory,attribute_name=none,source=agent");
|
|
|
|
+ if (major != -1)
|
2014-04-11 09:32:56 +02:00
|
|
|
+ {
|
|
|
|
+ snprintf(classbuf, CF_MAXVARSIZE, "SLES%d", major);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (!strncasecmp(relstring, SUSE_SLED_ID, strlen(SUSE_SLED_ID)))
|
|
|
|
+ {
|
|
|
|
+ EvalContextClassPutHard(ctx, "sled", "inventory,attribute_name=none,source=agent");
|
|
|
|
+ if (major != -1)
|
|
|
|
+ {
|
|
|
|
+ snprintf(classbuf, CF_MAXVARSIZE, "SLED%d", major);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (!strncasecmp(relstring, "opensuse", strlen("opensuse")))
|
|
|
|
+ {
|
|
|
|
+ vendor = "opensuse";
|
|
|
|
+ EvalContextClassPutHard(ctx, vendor, "inventory,attribute_name=none,source=agent");
|
|
|
|
}
|
|
|
|
- else if (strncmp(relstring, "sles", 4) == 0)
|
|
|
|
+ else if (strncasecmp(relstring, "sles", 4) == 0)
|
|
|
|
{
|
|
|
|
Item *list, *ip;
|
|
|
|
|
2016-12-29 10:56:49 +01:00
|
|
|
@@ -1841,120 +1855,39 @@ static int Linux_Suse_Version(EvalContext *ctx)
|
2014-04-11 09:32:56 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
- for (int version = 9; version < 13; version++)
|
|
|
|
- {
|
2014-04-10 16:31:27 +02:00
|
|
|
- snprintf(vbuf, CF_BUFSIZE, "%s %d ", SUSE_SLES_ID, version);
|
|
|
|
- Log(LOG_LEVEL_DEBUG, "Checking for SUSE [%s]", vbuf);
|
|
|
|
-
|
|
|
|
- if (!strncmp(relstring, vbuf, strlen(vbuf)))
|
|
|
|
- {
|
|
|
|
- snprintf(classbuf, CF_MAXVARSIZE, "SLES%d", version);
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
- }
|
2014-04-10 16:31:27 +02:00
|
|
|
- else
|
2014-04-11 09:32:56 +02:00
|
|
|
- {
|
2014-04-10 16:31:27 +02:00
|
|
|
- snprintf(vbuf, CF_BUFSIZE, "%s %d ", SUSE_SLED_ID, version);
|
|
|
|
- Log(LOG_LEVEL_DEBUG, "Checking for SUSE [%s]", vbuf);
|
|
|
|
-
|
|
|
|
- if (!strncmp(relstring, vbuf, strlen(vbuf)))
|
2014-04-11 09:32:56 +02:00
|
|
|
- {
|
2014-04-10 16:31:27 +02:00
|
|
|
- snprintf(classbuf, CF_MAXVARSIZE, "SLED%d", version);
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
+ Log(LOG_LEVEL_WARNING, "Unknown product '%s' in /etc/SuSE-release", relstring);
|
|
|
|
}
|
|
|
|
|
2014-04-10 16:31:27 +02:00
|
|
|
- /* Determine release version. We assume that the version follows
|
|
|
|
- * the string "SuSE Linux" or "SUSE LINUX".
|
|
|
|
- */
|
2014-04-11 09:32:56 +02:00
|
|
|
-
|
|
|
|
- char *release = strstr(relstring, SUSE_RELEASE_FLAG);
|
2014-04-10 16:31:27 +02:00
|
|
|
- if (release == NULL)
|
2014-04-11 09:32:56 +02:00
|
|
|
+ if (major != -1)
|
|
|
|
{
|
2014-04-10 16:31:27 +02:00
|
|
|
- release = strstr(relstring, "opensuse");
|
2014-04-11 09:32:56 +02:00
|
|
|
- if (release == NULL)
|
|
|
|
+ strncpy(classbuf, vendor, CF_MAXVARSIZE);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ snprintf(classbuf + strlen(classbuf), CF_MAXVARSIZE - strlen(classbuf), "_%d", major);
|
|
|
|
+ SetFlavour(ctx, classbuf);
|
|
|
|
+ if (minor != -1)
|
|
|
|
{
|
|
|
|
- release = strversion;
|
|
|
|
+ snprintf(classbuf + strlen(classbuf), CF_MAXVARSIZE - strlen(classbuf), "_%d", minor);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
}
|
2014-04-10 16:31:27 +02:00
|
|
|
- }
|
2014-04-11 09:32:56 +02:00
|
|
|
-
|
2014-04-10 16:31:27 +02:00
|
|
|
- if (release == NULL)
|
|
|
|
- {
|
2014-04-11 09:32:56 +02:00
|
|
|
- Log(LOG_LEVEL_VERBOSE,
|
|
|
|
- "Could not find a numeric OS release in %s",
|
|
|
|
- SUSE_REL_FILENAME);
|
2014-04-10 16:31:27 +02:00
|
|
|
- return 2;
|
2014-04-11 09:32:56 +02:00
|
|
|
+ /* The correct spelling for SUSE is "SUSE" but CFEngine used to use "SuSE".
|
|
|
|
+ * Keep this for backwards compatibility until CFEngine 3.7
|
|
|
|
+ */
|
|
|
|
+ strncpy(classbuf, "SuSE", CF_MAXVARSIZE);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ snprintf(classbuf + strlen(classbuf), CF_MAXVARSIZE - strlen(classbuf), "_%d", major);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ if (minor != -1)
|
|
|
|
+ {
|
|
|
|
+ snprintf(classbuf + strlen(classbuf), CF_MAXVARSIZE - strlen(classbuf), "_%d", minor);
|
|
|
|
+ EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
+ }
|
|
|
|
+ Log(LOG_LEVEL_VERBOSE, "Discovered %s version %d.%d", vendor, major, minor);
|
2014-04-10 16:31:27 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-04-11 09:32:56 +02:00
|
|
|
- char strmajor[PRINTSIZE(major)], strminor[PRINTSIZE(minor)];
|
2014-04-10 16:31:27 +02:00
|
|
|
- if (strchr(release, '.'))
|
|
|
|
- {
|
|
|
|
- sscanf(release, "%*s %d.%d", &major, &minor);
|
- Update to 3.6.1
New features:
- Introduced Solaris and AIX support into the 3.6 series, with
many associated build and bug fixes.
Changes:
- Short-circuit evaluation of classes promises if class is already
set (Redmine #5241)
- fix to assume all non-specified return codes are failed in
commands promises (Redmine #5986)
- cf-serverd logs reconfiguration message to NOTICE (was INFO)
so that it's always logged in syslog
Bug fixes:
- File monitoring has been completely rewritten (changes attribute
in files promise), which eliminates many bugs, particularly
regarding files that are deleted. Upgrading will keep all
monitoring data, but downgrading again will reinitialize the DB,
so all files will be reported as if they were new. (Redmine #2917)
- $(this.promiser) expands in files promises for 'transformer',
'edit_template', 'copy_from.source', 'file_select.exec_program',
'classes' and 'action' bodies (Redmine #1554, #1496, #3530, #1563)
- 'body changes' notifies about disappeared files in file monitoring
(Redmine #2917)
- Set not-kept classes when files or commands promise should be
repaired, but is warn-only (Redmine #2359)
- Fixed CFEngine template producing a zero-sized file (Redmine #6088)
- Add 0-9 A-Z _ to allowed context of module protocol (Redmine #6063)
- Extend ps command column width on Solaris and filter on zone
rather than adding it to the ps output.
- Fixed strftime() function on Solaris when called with certain
specifiers.
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement/cfengine?expand=0&rev=101
2014-07-29 11:09:25 +02:00
|
|
|
- xsnprintf(strmajor, sizeof(strmajor), "%d", major);
|
|
|
|
- xsnprintf(strminor, sizeof(strminor), "%d", minor);
|
2014-04-11 09:32:56 +02:00
|
|
|
-
|
2014-04-10 16:31:27 +02:00
|
|
|
- if (major != -1 && minor != -1)
|
2014-04-11 09:32:56 +02:00
|
|
|
- {
|
2014-04-10 16:31:27 +02:00
|
|
|
- strcpy(classbuf, "SUSE");
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strmajor);
|
2014-04-11 09:32:56 +02:00
|
|
|
- SetFlavour(ctx, classbuf);
|
2014-04-10 16:31:27 +02:00
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strminor);
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
-
|
2014-04-11 09:32:56 +02:00
|
|
|
- /* The correct spelling for SUSE is "SUSE" but CFEngine used to use "SuSE".
|
|
|
|
- * Keep this for backwards compatibility until CFEngine 3.7
|
|
|
|
- */
|
|
|
|
- strcpy(classbuf, "SuSE");
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strmajor);
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strminor);
|
2014-04-11 09:32:56 +02:00
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
2014-04-10 16:31:27 +02:00
|
|
|
-
|
|
|
|
- Log(LOG_LEVEL_VERBOSE, "Discovered SUSE version %s", classbuf);
|
|
|
|
- return 0;
|
2014-04-11 09:32:56 +02:00
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
2014-04-10 16:31:27 +02:00
|
|
|
- sscanf(strversion, "VERSION = %s", strmajor);
|
|
|
|
- sscanf(strpatch, "PATCHLEVEL = %s", strminor);
|
|
|
|
-
|
|
|
|
- if (major != -1 && minor != -1)
|
|
|
|
- {
|
|
|
|
- strcpy(classbuf, "SLES");
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strmajor);
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
- strcat(classbuf, "_");
|
|
|
|
- strcat(classbuf, strminor);
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
|
|
|
|
-
|
|
|
|
- snprintf(classbuf, CF_MAXVARSIZE, "SUSE_%d", major);
|
|
|
|
- SetFlavour(ctx, classbuf);
|
|
|
|
-
|
|
|
|
- /* The correct spelling for SUSE is "SUSE" but CFEngine used to use "SuSE".
|
|
|
|
- * Keep this for backwards compatibility until CFEngine 3.7
|
|
|
|
- */
|
|
|
|
- snprintf(classbuf, CF_MAXVARSIZE, "SuSE_%d", major);
|
|
|
|
- EvalContextClassPutHard(ctx, classbuf, "source=agent");
|
|
|
|
-
|
|
|
|
- Log(LOG_LEVEL_VERBOSE, "Discovered SUSE version %s", classbuf);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- }
|
2014-04-11 09:32:56 +02:00
|
|
|
+ Log(LOG_LEVEL_VERBOSE, "Could not find a numeric OS release in %s", SUSE_REL_FILENAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
- Log(LOG_LEVEL_VERBOSE, "Could not find a numeric OS release in %s", SUSE_REL_FILENAME);
|
2014-04-10 16:31:27 +02:00
|
|
|
-
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-04-11 09:32:56 +02:00
|
|
|
--
|
2016-12-29 10:56:49 +01:00
|
|
|
2.11.0
|
2014-04-11 09:32:56 +02:00
|
|
|
|