Skip to content

Commit 6d935c4

Browse files
committed
Added os_version_minor sys variable
Ticket: ENT-8118 Signed-off-by: Victor Moene <[email protected]>
1 parent c770e08 commit 6d935c4

File tree

2 files changed

+201
-2
lines changed

2 files changed

+201
-2
lines changed

libenv/sysinfo.c

Lines changed: 159 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ void CalculateDomainName(const char *nodename, const char *dnsname,
161161
char *uqname, size_t uqname_size,
162162
char *domain, size_t domain_size);
163163

164+
static void SysOSVersionMinorPut(EvalContext *ctx, char *strminor, char *tags);
165+
static void SysOSVersionMinorPutInt(EvalContext *ctx, int minor, char *tags);
166+
static void SysOsVersionMinorSetDefault(EvalContext *ctx);
167+
164168
#ifdef __APPLE__
165169
static void Apple_Version(EvalContext *ctx);
166170
#endif
@@ -1157,6 +1161,30 @@ static void DefineVersionedHardClasses(
11571161
free(class);
11581162
}
11591163

1164+
static void SysOSVersionMinorPutFromVersion(EvalContext *ctx, char *name, char *version_id, char *tags)
1165+
{
1166+
assert(version_id != NULL);
1167+
Item *version_tuple = SplitString(version_id, '_');
1168+
1169+
if (version_tuple == NULL)
1170+
{
1171+
return;
1172+
}
1173+
if (name != NULL && (StringStartsWith(name, "solaris") || StringStartsWith(name, "sunos")))
1174+
{
1175+
SysOSVersionMinorPut(ctx, version_tuple->name, tags);
1176+
DeleteItemList(version_tuple);
1177+
return;
1178+
}
1179+
if (version_tuple->next == NULL)
1180+
{
1181+
DeleteItemList(version_tuple);
1182+
return;
1183+
}
1184+
SysOSVersionMinorPut(ctx, version_tuple->next->name, tags);
1185+
DeleteItemList(version_tuple);
1186+
}
1187+
11601188
static void OSReleaseParse(EvalContext *ctx, const char *file_path)
11611189
{
11621190
JsonElement *os_release_json = JsonReadDataFile("system info discovery",
@@ -1213,6 +1241,12 @@ static void OSReleaseParse(EvalContext *ctx, const char *file_path)
12131241
*first_underscore = '\0';
12141242
SetFlavor2(ctx, os_release_id, os_release_version_id);
12151243
*first_underscore = '_';
1244+
1245+
// set os version minor
1246+
const char *const_os_release_name = JsonObjectGetAsString(os_release_json, "NAME");
1247+
char *os_release_name = SafeStringDuplicate(const_os_release_name);
1248+
SysOSVersionMinorPutFromVersion(ctx, os_release_name, os_release_version_id, tags);
1249+
free(os_release_name);
12161250
}
12171251
else
12181252
{
@@ -1430,6 +1464,11 @@ static void OSClasses(EvalContext *ctx)
14301464

14311465
#ifdef _AIX
14321466
strlcpy(vbuff, VSYSNAME.version, CF_MAXVARSIZE);
1467+
1468+
char strminor[CF_MAXVARSIZE];
1469+
strlcpy(strminor, VSYSNAME.release, CF_MAXVARSIZE);
1470+
1471+
SysOSVersionMinorPut(ctx, strminor, "source=agent");
14331472
#else
14341473
strlcpy(vbuff, VSYSNAME.release, CF_MAXVARSIZE);
14351474
#endif
@@ -1461,12 +1500,29 @@ static void OSClasses(EvalContext *ctx)
14611500

14621501
// Extract major version number
14631502
char *major = NULL;
1464-
for (char *sp = vbuff; *sp != '\0'; sp++)
1503+
char *minor = NULL;
1504+
char *sp = vbuff;
1505+
for (sp; *sp != '\0'; sp++)
14651506
{
14661507
if (major == NULL && isdigit(*sp))
14671508
{
14681509
major = sp;
14691510
}
1511+
if (major == NULL && !isdigit(*sp))
1512+
{
1513+
*sp = '\0';
1514+
}
1515+
if (major != NULL && !isdigit(*sp))
1516+
{
1517+
break;
1518+
}
1519+
}
1520+
for (sp; *sp != '\0'; sp++)
1521+
{
1522+
if (minor == NULL && isdigit(*sp))
1523+
{
1524+
minor = sp;
1525+
}
14701526
else if (!isdigit(*sp))
14711527
{
14721528
*sp = '\0';
@@ -1478,6 +1534,10 @@ static void OSClasses(EvalContext *ctx)
14781534
snprintf(context, CF_BUFSIZE, "hpux_%s", major);
14791535
EvalContextClassPutHard(ctx, context, "source=agent,derived-from=sys.flavor");
14801536
}
1537+
if (minor != NULL)
1538+
{
1539+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1540+
}
14811541
#endif
14821542

14831543
#ifdef __FreeBSD__
@@ -1487,17 +1547,24 @@ static void OSClasses(EvalContext *ctx)
14871547
* For example, when being run on either FreeBSD 10.0 or 10.1 a class
14881548
* called freebsd_10 will be defined
14891549
*/
1490-
for (char *sp = vbuff; *sp != '\0'; sp++)
1550+
char *sp = NULL;
1551+
for (sp = vbuff; *sp != '\0'; sp++)
14911552
{
14921553
if (*sp == '.')
14931554
{
14941555
*sp = '\0';
14951556
break;
14961557
}
14971558
}
1559+
sp++;
1560+
char *minor = sp;
14981561

14991562
snprintf(context, CF_BUFSIZE, "%s_%s", VSYSNAME.sysname, vbuff);
15001563
EvalContextClassPutHard(ctx, context, "source=agent,derived-from=sys.flavor");
1564+
if (minor != NULL)
1565+
{
1566+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1567+
}
15011568
#endif
15021569

15031570
#endif
@@ -1524,30 +1591,35 @@ static void OSClasses(EvalContext *ctx)
15241591
{
15251592
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows 2000");
15261593
EvalContextClassPutHard(ctx, "Win2000", "inventory,attribute_name=none,source=agent");
1594+
SysOSVersionMinorPut(ctx, "5.0", "source=agent");
15271595
}
15281596

15291597
if (strncmp(sp, "5.1", 3) == 0)
15301598
{
15311599
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows XP");
15321600
EvalContextClassPutHard(ctx, "WinXP", "inventory,attribute_name=none,source=agent");
1601+
SysOSVersionMinorPut(ctx, "5.1", "source=agent");
15331602
}
15341603

15351604
if (strncmp(sp, "5.2", 3) == 0)
15361605
{
15371606
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Server 2003");
15381607
EvalContextClassPutHard(ctx, "WinServer2003", "inventory,attribute_name=none,source=agent");
1608+
SysOSVersionMinorPut(ctx, "5.2", "source=agent");
15391609
}
15401610

15411611
if (strncmp(sp, "6.1", 3) == 0)
15421612
{
15431613
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Vista");
15441614
EvalContextClassPutHard(ctx, "WinVista", "inventory,attribute_name=none,source=agent");
1615+
SysOSVersionMinorPut(ctx, "56.1", "source=agent");
15451616
}
15461617

15471618
if (strncmp(sp, "6.3", 3) == 0)
15481619
{
15491620
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Server 2008");
15501621
EvalContextClassPutHard(ctx, "WinServer2008", "inventory,attribute_name=none,source=agent");
1622+
SysOSVersionMinorPut(ctx, "6.3", "source=agent");
15511623
}
15521624
}
15531625
}
@@ -1588,6 +1660,27 @@ static void OSClasses(EvalContext *ctx)
15881660
else
15891661
{
15901662
SetFlavor2(ctx, "windows", major);
1663+
1664+
// minor version
1665+
char *minor = NULL;
1666+
int idx = (major - release) + strlen(major) + 1;
1667+
char *sp = &release[idx];
1668+
1669+
for (sp; *sp != '\0'; sp++)
1670+
{
1671+
if (minor == NULL && isdigit(*sp))
1672+
{
1673+
minor = sp;
1674+
}
1675+
if ((*sp != '.' || *sp != '_') && !isdigit(*sp))
1676+
{
1677+
*sp = '\0';
1678+
}
1679+
}
1680+
if (minor != NULL)
1681+
{
1682+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1683+
}
15911684
}
15921685
free(release);
15931686

@@ -1733,6 +1826,7 @@ static void Apple_Version(EvalContext *ctx)
17331826
assert(ret >= 0 && (size_t) ret < sizeof(buf));
17341827
Log(LOG_LEVEL_VERBOSE, "This appears to be a %s %u.%u system.", product_name, major, minor);
17351828
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1829+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
17361830
}
17371831

17381832
if (revcomps > 2)
@@ -1798,6 +1892,7 @@ static void Linux_Oracle_VM_Server_Version(EvalContext *ctx)
17981892

17991893
snprintf(buf, CF_BUFSIZE, "oraclevmserver_%d_%d", major, minor);
18001894
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1895+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
18011896
}
18021897

18031898
if (revcomps > 2)
@@ -1849,6 +1944,7 @@ static void Linux_Oracle_Version(EvalContext *ctx)
18491944

18501945
snprintf(buf, CF_BUFSIZE, "oracle_%d_%d", major, minor);
18511946
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1947+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
18521948
}
18531949
}
18541950

@@ -2164,6 +2260,11 @@ static int Linux_Redhat_Version(EvalContext *ctx)
21642260
}
21652261
}
21662262

2263+
if (minor >= 0)
2264+
{
2265+
SysOSVersionMinorPutInt(ctx, minor, "source=agent,derived-from-file="RH_REL_FILENAME);
2266+
}
2267+
21672268
return 0;
21682269
}
21692270

@@ -2382,6 +2483,11 @@ static int Linux_Suse_Version(EvalContext *ctx)
23822483
}
23832484
}
23842485

2486+
if (minor >= 0)
2487+
{
2488+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
2489+
}
2490+
23852491
Log(LOG_LEVEL_VERBOSE, "Could not find a numeric OS release in %s", SUSE_REL_FILENAME);
23862492

23872493
return 0;
@@ -2417,6 +2523,7 @@ static int Linux_Slackware_Version(EvalContext *ctx, char *filename)
24172523
Log(LOG_LEVEL_VERBOSE, "This appears to be a Slackware %u.%u system.", major, minor);
24182524
snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u", major, minor);
24192525
EvalContextClassPutHard(ctx, classname, "inventory,attribute_name=none,source=agent");
2526+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
24202527
/* Fall-through */
24212528
case 1:
24222529
Log(LOG_LEVEL_VERBOSE, "This appears to be a Slackware %u system.", major);
@@ -2506,6 +2613,7 @@ static int Linux_Misc_Version(EvalContext *ctx)
25062613
nt_static_assert((sizeof(version)) > 255);
25072614
sscanf(sp + strlen("DISTRIB_RELEASE="), "%255[^\n]", version);
25082615
CanonifyNameInPlace(version);
2616+
SysOSVersionMinorPutFromVersion(ctx, "", version, "source=agent, derived-from-file=/etc/lsb_release");
25092617
}
25102618
}
25112619
fclose(fp);
@@ -2624,6 +2732,10 @@ static int Linux_Debian_Version(EvalContext *ctx)
26242732
"inventory,attribute_name=none,source=agent,derived-from-file="DEBIAN_ISSUE_FILENAME);
26252733
}
26262734
}
2735+
if (release >= 0)
2736+
{
2737+
SysOSVersionMinorPutInt(ctx, release, "source=agent,derived-from-file="DEBIAN_ISSUE_FILENAME);
2738+
}
26272739

26282740
return 0;
26292741
}
@@ -2755,6 +2867,8 @@ static int Linux_Mandriva_Version_Real(EvalContext *ctx, char *filename, char *r
27552867
strcat(classbuf, "_");
27562868
strcat(classbuf, strminor);
27572869
EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
2870+
2871+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
27582872
}
27592873
}
27602874

@@ -2820,6 +2934,7 @@ static void Linux_Alpine_Version(EvalContext *ctx)
28202934
{
28212935
char class[CF_MAXVARSIZE];
28222936
CanonifyNameInPlace(version);
2937+
SysOSVersionMinorPutFromVersion(ctx, "alpine_linux", version, "source=agent,derived-from-file=/etc/alpine-release");
28232938
snprintf(class, sizeof(class), "alpine_linux_%s", version);
28242939
EvalContextClassPutHard(ctx, class,
28252940
"inventory,attribute_name=none,source=agent"
@@ -2848,6 +2963,7 @@ static int EOS_Version(EvalContext *ctx)
28482963
version[0] = '\0';
28492964
sscanf(buffer, "%*s %*s %*s %255s", version);
28502965
CanonifyNameInPlace(version);
2966+
SysOSVersionMinorPutFromVersion(ctx, "eos", version, "source=agent");
28512967
snprintf(class, CF_MAXVARSIZE, "eos_%s", version);
28522968
EvalContextClassPutHard(ctx, class, "inventory,attribute_name=none,source=agent");
28532969
}
@@ -2872,6 +2988,7 @@ static int MiscOS(EvalContext *ctx)
28722988
EvalContextClassPutHard(ctx, "big_ip", "inventory,attribute_name=none,source=agent");
28732989
sscanf(buffer, "%*s %255s %*s %255s", version, build);
28742990
CanonifyNameInPlace(version);
2991+
SysOSVersionMinorPutFromVersion(ctx, "", version, "source=agent");
28752992
CanonifyNameInPlace(build);
28762993
snprintf(class, CF_MAXVARSIZE, "big_ip_%s", version);
28772994
EvalContextClassPutHard(ctx, class, "inventory,attribute_name=none,source=agent");
@@ -2907,6 +3024,7 @@ static int VM_Version(EvalContext *ctx)
29073024
snprintf(classbuf, CF_BUFSIZE, "VMware ESX Server %d.%d.%d", major, minor, bug);
29083025
EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
29093026
sufficient = 1;
3027+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
29103028
}
29113029
else if (sscanf(buffer, "VMware ESX Server %255s", version) > 0)
29123030
{
@@ -3784,6 +3902,44 @@ static void SysOsVersionMajor(EvalContext *ctx)
37843902

37853903
/*****************************************************************************/
37863904

3905+
static void SysOSVersionMinorPutInt(EvalContext *ctx, int minor, char *tags)
3906+
{
3907+
char strminor[PRINTSIZE(minor)];
3908+
xsnprintf(strminor, sizeof(strminor), "%d", minor);
3909+
3910+
SysOSVersionMinorPut(ctx, strminor, tags);
3911+
}
3912+
3913+
static void SysOSVersionMinorPut(EvalContext *ctx, char *strminor, char *tags)
3914+
{
3915+
EvalContextVariablePutSpecial(ctx,
3916+
SPECIAL_SCOPE_SYS,
3917+
"os_version_minor",
3918+
strminor,
3919+
CF_DATA_TYPE_STRING,
3920+
tags
3921+
);
3922+
}
3923+
3924+
static void SysOsVersionMinorSetDefault(EvalContext *ctx)
3925+
{
3926+
DataType type_out;
3927+
const char *value = (const char *) EvalContextVariableGetSpecial(
3928+
ctx, SPECIAL_SCOPE_SYS, "os_version_minor", &type_out);
3929+
if (value == NULL)
3930+
{
3931+
EvalContextVariablePutSpecial(ctx,
3932+
SPECIAL_SCOPE_SYS,
3933+
"os_version_minor",
3934+
"Unknown",
3935+
CF_DATA_TYPE_STRING,
3936+
"source=agent"
3937+
);
3938+
}
3939+
}
3940+
3941+
/*****************************************************************************/
3942+
37873943
void DetectEnvironment(EvalContext *ctx)
37883944
{
37893945
GetNameInfo3(ctx);
@@ -3796,4 +3952,5 @@ void DetectEnvironment(EvalContext *ctx)
37963952
GetDefVars(ctx);
37973953
SysOSNameHuman(ctx);
37983954
SysOsVersionMajor(ctx);
3955+
SysOsVersionMinorSetDefault(ctx);
37993956
}

0 commit comments

Comments
 (0)