Skip to content

Commit 64bec0a

Browse files
committed
Added os_version_minor sys variable
Signed-off-by: Victor Moene <[email protected]>
1 parent 5376ae9 commit 64bec0a

File tree

1 file changed

+155
-2
lines changed

1 file changed

+155
-2
lines changed

libenv/sysinfo.c

Lines changed: 155 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, const char *strminor, const char *tags);
165+
static void SysOSVersionMinorPutInt(EvalContext *ctx, int minor, const char *tags);
166+
static void SysOsVersionMinorSetUnknownIfUnset(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, const char *version_id, const 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,12 @@ static void OSClasses(EvalContext *ctx)
14301464

14311465
#ifdef _AIX
14321466
strlcpy(vbuff, VSYSNAME.version, CF_MAXVARSIZE);
1467+
1468+
char strminor[CF_MAXVARSIZE];
1469+
NDEBUG_UNUSED int ret = snprintf(strminor, CF_MAXVARSIZE, "%s", VSYSNAME.release);
1470+
assert(ret >= 0 && (size_t) ret < sizeof(strminor));
1471+
1472+
SysOSVersionMinorPut(ctx, strminor, "source=agent");
14331473
#else
14341474
strlcpy(vbuff, VSYSNAME.release, CF_MAXVARSIZE);
14351475
#endif
@@ -1461,12 +1501,29 @@ static void OSClasses(EvalContext *ctx)
14611501

14621502
// Extract major version number
14631503
char *major = NULL;
1464-
for (char *sp = vbuff; *sp != '\0'; sp++)
1504+
char *minor = NULL;
1505+
char *sp;
1506+
for (sp = vbuff; *sp != '\0'; sp++)
14651507
{
14661508
if (major == NULL && isdigit(*sp))
14671509
{
14681510
major = sp;
14691511
}
1512+
if (major == NULL && !isdigit(*sp))
1513+
{
1514+
*sp = '\0';
1515+
}
1516+
if (major != NULL && !isdigit(*sp))
1517+
{
1518+
break;
1519+
}
1520+
}
1521+
for (; *sp != '\0'; sp++)
1522+
{
1523+
if (minor == NULL && isdigit(*sp))
1524+
{
1525+
minor = sp;
1526+
}
14701527
else if (!isdigit(*sp))
14711528
{
14721529
*sp = '\0';
@@ -1478,6 +1535,10 @@ static void OSClasses(EvalContext *ctx)
14781535
snprintf(context, CF_BUFSIZE, "hpux_%s", major);
14791536
EvalContextClassPutHard(ctx, context, "source=agent,derived-from=sys.flavor");
14801537
}
1538+
if (minor != NULL)
1539+
{
1540+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1541+
}
14811542
#endif
14821543

14831544
#ifdef __FreeBSD__
@@ -1487,17 +1548,24 @@ static void OSClasses(EvalContext *ctx)
14871548
* For example, when being run on either FreeBSD 10.0 or 10.1 a class
14881549
* called freebsd_10 will be defined
14891550
*/
1490-
for (char *sp = vbuff; *sp != '\0'; sp++)
1551+
char *sp;
1552+
for (sp = vbuff; *sp != '\0'; sp++)
14911553
{
14921554
if (*sp == '.')
14931555
{
14941556
*sp = '\0';
14951557
break;
14961558
}
14971559
}
1560+
sp++;
1561+
const char *minor = sp;
14981562

14991563
snprintf(context, CF_BUFSIZE, "%s_%s", VSYSNAME.sysname, vbuff);
15001564
EvalContextClassPutHard(ctx, context, "source=agent,derived-from=sys.flavor");
1565+
if (minor != NULL)
1566+
{
1567+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1568+
}
15011569
#endif
15021570

15031571
#endif
@@ -1524,30 +1592,35 @@ static void OSClasses(EvalContext *ctx)
15241592
{
15251593
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows 2000");
15261594
EvalContextClassPutHard(ctx, "Win2000", "inventory,attribute_name=none,source=agent");
1595+
SysOSVersionMinorPut(ctx, "5.0", "source=agent");
15271596
}
15281597

15291598
if (strncmp(sp, "5.1", 3) == 0)
15301599
{
15311600
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows XP");
15321601
EvalContextClassPutHard(ctx, "WinXP", "inventory,attribute_name=none,source=agent");
1602+
SysOSVersionMinorPut(ctx, "5.1", "source=agent");
15331603
}
15341604

15351605
if (strncmp(sp, "5.2", 3) == 0)
15361606
{
15371607
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Server 2003");
15381608
EvalContextClassPutHard(ctx, "WinServer2003", "inventory,attribute_name=none,source=agent");
1609+
SysOSVersionMinorPut(ctx, "5.2", "source=agent");
15391610
}
15401611

15411612
if (strncmp(sp, "6.1", 3) == 0)
15421613
{
15431614
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Vista");
15441615
EvalContextClassPutHard(ctx, "WinVista", "inventory,attribute_name=none,source=agent");
1616+
SysOSVersionMinorPut(ctx, "56.1", "source=agent");
15451617
}
15461618

15471619
if (strncmp(sp, "6.3", 3) == 0)
15481620
{
15491621
Log(LOG_LEVEL_VERBOSE, "This appears to be Windows Server 2008");
15501622
EvalContextClassPutHard(ctx, "WinServer2008", "inventory,attribute_name=none,source=agent");
1623+
SysOSVersionMinorPut(ctx, "6.3", "source=agent");
15511624
}
15521625
}
15531626
}
@@ -1588,6 +1661,25 @@ static void OSClasses(EvalContext *ctx)
15881661
else
15891662
{
15901663
SetFlavor2(ctx, "windows", major);
1664+
1665+
// minor version
1666+
char *minor = NULL;
1667+
char *sp;
1668+
for (sp = major + strlen(major) + 1;; *sp != '\0'; sp++)
1669+
{
1670+
if (minor == NULL && isdigit(*sp))
1671+
{
1672+
minor = sp;
1673+
}
1674+
if ((*sp != '.' || *sp != '_') && !isdigit(*sp))
1675+
{
1676+
*sp = '\0';
1677+
}
1678+
}
1679+
if (minor != NULL)
1680+
{
1681+
SysOSVersionMinorPut(ctx, minor, "source=agent");
1682+
}
15911683
}
15921684
free(release);
15931685

@@ -1733,6 +1825,7 @@ static void Apple_Version(EvalContext *ctx)
17331825
assert(ret >= 0 && (size_t) ret < sizeof(buf));
17341826
Log(LOG_LEVEL_VERBOSE, "This appears to be a %s %u.%u system.", product_name, major, minor);
17351827
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1828+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
17361829
}
17371830

17381831
if (revcomps > 2)
@@ -1798,6 +1891,7 @@ static void Linux_Oracle_VM_Server_Version(EvalContext *ctx)
17981891

17991892
snprintf(buf, CF_BUFSIZE, "oraclevmserver_%d_%d", major, minor);
18001893
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1894+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
18011895
}
18021896

18031897
if (revcomps > 2)
@@ -1849,6 +1943,7 @@ static void Linux_Oracle_Version(EvalContext *ctx)
18491943

18501944
snprintf(buf, CF_BUFSIZE, "oracle_%d_%d", major, minor);
18511945
EvalContextClassPutHard(ctx, buf, "inventory,attribute_name=none,source=agent");
1946+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
18521947
}
18531948
}
18541949

@@ -2164,6 +2259,11 @@ static int Linux_Redhat_Version(EvalContext *ctx)
21642259
}
21652260
}
21662261

2262+
if (minor >= 0)
2263+
{
2264+
SysOSVersionMinorPutInt(ctx, minor, "source=agent,derived-from-file="RH_REL_FILENAME);
2265+
}
2266+
21672267
return 0;
21682268
}
21692269

@@ -2345,6 +2445,7 @@ static int Linux_Suse_Version(EvalContext *ctx)
23452445
strcat(classbuf, strminor);
23462446
EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
23472447

2448+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
23482449
Log(LOG_LEVEL_VERBOSE, "Discovered SUSE version %s", classbuf);
23492450
return 0;
23502451
}
@@ -2376,6 +2477,7 @@ static int Linux_Suse_Version(EvalContext *ctx)
23762477
snprintf(classbuf, CF_MAXVARSIZE, "SuSE_%d", major);
23772478
EvalContextClassPutHard(ctx, classbuf, "source=agent");
23782479

2480+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
23792481
Log(LOG_LEVEL_VERBOSE, "Discovered SUSE version %s", classbuf);
23802482
return 0;
23812483
}
@@ -2417,6 +2519,7 @@ static int Linux_Slackware_Version(EvalContext *ctx, char *filename)
24172519
Log(LOG_LEVEL_VERBOSE, "This appears to be a Slackware %u.%u system.", major, minor);
24182520
snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u", major, minor);
24192521
EvalContextClassPutHard(ctx, classname, "inventory,attribute_name=none,source=agent");
2522+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
24202523
/* Fall-through */
24212524
case 1:
24222525
Log(LOG_LEVEL_VERBOSE, "This appears to be a Slackware %u system.", major);
@@ -2506,6 +2609,7 @@ static int Linux_Misc_Version(EvalContext *ctx)
25062609
nt_static_assert((sizeof(version)) > 255);
25072610
sscanf(sp + strlen("DISTRIB_RELEASE="), "%255[^\n]", version);
25082611
CanonifyNameInPlace(version);
2612+
SysOSVersionMinorPutFromVersion(ctx, "", version, "source=agent, derived-from-file=/etc/lsb_release");
25092613
}
25102614
}
25112615
fclose(fp);
@@ -2624,6 +2728,10 @@ static int Linux_Debian_Version(EvalContext *ctx)
26242728
"inventory,attribute_name=none,source=agent,derived-from-file="DEBIAN_ISSUE_FILENAME);
26252729
}
26262730
}
2731+
if (release >= 0)
2732+
{
2733+
SysOSVersionMinorPutInt(ctx, release, "source=agent,derived-from-file="DEBIAN_ISSUE_FILENAME);
2734+
}
26272735

26282736
return 0;
26292737
}
@@ -2755,6 +2863,8 @@ static int Linux_Mandriva_Version_Real(EvalContext *ctx, char *filename, char *r
27552863
strcat(classbuf, "_");
27562864
strcat(classbuf, strminor);
27572865
EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
2866+
2867+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
27582868
}
27592869
}
27602870

@@ -2820,6 +2930,7 @@ static void Linux_Alpine_Version(EvalContext *ctx)
28202930
{
28212931
char class[CF_MAXVARSIZE];
28222932
CanonifyNameInPlace(version);
2933+
SysOSVersionMinorPutFromVersion(ctx, "alpine_linux", version, "source=agent,derived-from-file=/etc/alpine-release");
28232934
snprintf(class, sizeof(class), "alpine_linux_%s", version);
28242935
EvalContextClassPutHard(ctx, class,
28252936
"inventory,attribute_name=none,source=agent"
@@ -2848,6 +2959,7 @@ static int EOS_Version(EvalContext *ctx)
28482959
version[0] = '\0';
28492960
sscanf(buffer, "%*s %*s %*s %255s", version);
28502961
CanonifyNameInPlace(version);
2962+
SysOSVersionMinorPutFromVersion(ctx, "eos", version, "source=agent");
28512963
snprintf(class, CF_MAXVARSIZE, "eos_%s", version);
28522964
EvalContextClassPutHard(ctx, class, "inventory,attribute_name=none,source=agent");
28532965
}
@@ -2872,6 +2984,7 @@ static int MiscOS(EvalContext *ctx)
28722984
EvalContextClassPutHard(ctx, "big_ip", "inventory,attribute_name=none,source=agent");
28732985
sscanf(buffer, "%*s %255s %*s %255s", version, build);
28742986
CanonifyNameInPlace(version);
2987+
SysOSVersionMinorPutFromVersion(ctx, "", version, "source=agent");
28752988
CanonifyNameInPlace(build);
28762989
snprintf(class, CF_MAXVARSIZE, "big_ip_%s", version);
28772990
EvalContextClassPutHard(ctx, class, "inventory,attribute_name=none,source=agent");
@@ -2907,6 +3020,7 @@ static int VM_Version(EvalContext *ctx)
29073020
snprintf(classbuf, CF_BUFSIZE, "VMware ESX Server %d.%d.%d", major, minor, bug);
29083021
EvalContextClassPutHard(ctx, classbuf, "inventory,attribute_name=none,source=agent");
29093022
sufficient = 1;
3023+
SysOSVersionMinorPutInt(ctx, minor, "source=agent");
29103024
}
29113025
else if (sscanf(buffer, "VMware ESX Server %255s", version) > 0)
29123026
{
@@ -3790,6 +3904,44 @@ static void SysOsVersionMajor(EvalContext *ctx)
37903904

37913905
/*****************************************************************************/
37923906

3907+
static void SysOSVersionMinorPutInt(EvalContext *ctx, int minor, const char *tags)
3908+
{
3909+
char strminor[PRINTSIZE(minor)];
3910+
xsnprintf(strminor, sizeof(strminor), "%d", minor);
3911+
3912+
SysOSVersionMinorPut(ctx, strminor, tags);
3913+
}
3914+
3915+
static void SysOSVersionMinorPut(EvalContext *ctx, const char *strminor, const char *tags)
3916+
{
3917+
EvalContextVariablePutSpecial(ctx,
3918+
SPECIAL_SCOPE_SYS,
3919+
"os_version_minor",
3920+
strminor,
3921+
CF_DATA_TYPE_STRING,
3922+
tags
3923+
);
3924+
}
3925+
3926+
static void SysOsVersionMinorSetUnknownIfUnset(EvalContext *ctx)
3927+
{
3928+
DataType type_out;
3929+
const char *value = (const char *) EvalContextVariableGetSpecial(
3930+
ctx, SPECIAL_SCOPE_SYS, "os_version_minor", &type_out);
3931+
if (value == NULL)
3932+
{
3933+
EvalContextVariablePutSpecial(ctx,
3934+
SPECIAL_SCOPE_SYS,
3935+
"os_version_minor",
3936+
"Unknown",
3937+
CF_DATA_TYPE_STRING,
3938+
"source=agent"
3939+
);
3940+
}
3941+
}
3942+
3943+
/*****************************************************************************/
3944+
37933945
void DetectEnvironment(EvalContext *ctx)
37943946
{
37953947
GetNameInfo3(ctx);
@@ -3802,4 +3954,5 @@ void DetectEnvironment(EvalContext *ctx)
38023954
GetDefVars(ctx);
38033955
SysOSNameHuman(ctx);
38043956
SysOsVersionMajor(ctx);
3957+
SysOsVersionMinorSetUnknownIfUnset(ctx);
38053958
}

0 commit comments

Comments
 (0)