@@ -161,6 +161,10 @@ void CalculateDomainName(const char *nodename, const char *dnsname,
161
161
char * uqname , size_t uqname_size ,
162
162
char * domain , size_t domain_size );
163
163
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
+
164
168
#ifdef __APPLE__
165
169
static void Apple_Version (EvalContext * ctx );
166
170
#endif
@@ -1157,6 +1161,30 @@ static void DefineVersionedHardClasses(
1157
1161
free (class );
1158
1162
}
1159
1163
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
+
1160
1188
static void OSReleaseParse (EvalContext * ctx , const char * file_path )
1161
1189
{
1162
1190
JsonElement * os_release_json = JsonReadDataFile ("system info discovery" ,
@@ -1213,6 +1241,12 @@ static void OSReleaseParse(EvalContext *ctx, const char *file_path)
1213
1241
* first_underscore = '\0' ;
1214
1242
SetFlavor2 (ctx , os_release_id , os_release_version_id );
1215
1243
* 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 );
1216
1250
}
1217
1251
else
1218
1252
{
@@ -1430,6 +1464,12 @@ static void OSClasses(EvalContext *ctx)
1430
1464
1431
1465
#ifdef _AIX
1432
1466
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" );
1433
1473
#else
1434
1474
strlcpy (vbuff , VSYSNAME .release , CF_MAXVARSIZE );
1435
1475
#endif
@@ -1461,12 +1501,29 @@ static void OSClasses(EvalContext *ctx)
1461
1501
1462
1502
// Extract major version number
1463
1503
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 ++ )
1465
1507
{
1466
1508
if (major == NULL && isdigit (* sp ))
1467
1509
{
1468
1510
major = sp ;
1469
1511
}
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
+ }
1470
1527
else if (!isdigit (* sp ))
1471
1528
{
1472
1529
* sp = '\0' ;
@@ -1478,6 +1535,10 @@ static void OSClasses(EvalContext *ctx)
1478
1535
snprintf (context , CF_BUFSIZE , "hpux_%s" , major );
1479
1536
EvalContextClassPutHard (ctx , context , "source=agent,derived-from=sys.flavor" );
1480
1537
}
1538
+ if (minor != NULL )
1539
+ {
1540
+ SysOSVersionMinorPut (ctx , minor , "source=agent" );
1541
+ }
1481
1542
#endif
1482
1543
1483
1544
#ifdef __FreeBSD__
@@ -1487,17 +1548,24 @@ static void OSClasses(EvalContext *ctx)
1487
1548
* For example, when being run on either FreeBSD 10.0 or 10.1 a class
1488
1549
* called freebsd_10 will be defined
1489
1550
*/
1490
- for (char * sp = vbuff ; * sp != '\0' ; sp ++ )
1551
+ char * sp ;
1552
+ for (sp = vbuff ; * sp != '\0' ; sp ++ )
1491
1553
{
1492
1554
if (* sp == '.' )
1493
1555
{
1494
1556
* sp = '\0' ;
1495
1557
break ;
1496
1558
}
1497
1559
}
1560
+ sp ++ ;
1561
+ const char * minor = sp ;
1498
1562
1499
1563
snprintf (context , CF_BUFSIZE , "%s_%s" , VSYSNAME .sysname , vbuff );
1500
1564
EvalContextClassPutHard (ctx , context , "source=agent,derived-from=sys.flavor" );
1565
+ if (minor != NULL )
1566
+ {
1567
+ SysOSVersionMinorPut (ctx , minor , "source=agent" );
1568
+ }
1501
1569
#endif
1502
1570
1503
1571
#endif
@@ -1524,30 +1592,35 @@ static void OSClasses(EvalContext *ctx)
1524
1592
{
1525
1593
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows 2000" );
1526
1594
EvalContextClassPutHard (ctx , "Win2000" , "inventory,attribute_name=none,source=agent" );
1595
+ SysOSVersionMinorPut (ctx , "5.0" , "source=agent" );
1527
1596
}
1528
1597
1529
1598
if (strncmp (sp , "5.1" , 3 ) == 0 )
1530
1599
{
1531
1600
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows XP" );
1532
1601
EvalContextClassPutHard (ctx , "WinXP" , "inventory,attribute_name=none,source=agent" );
1602
+ SysOSVersionMinorPut (ctx , "5.1" , "source=agent" );
1533
1603
}
1534
1604
1535
1605
if (strncmp (sp , "5.2" , 3 ) == 0 )
1536
1606
{
1537
1607
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Server 2003" );
1538
1608
EvalContextClassPutHard (ctx , "WinServer2003" , "inventory,attribute_name=none,source=agent" );
1609
+ SysOSVersionMinorPut (ctx , "5.2" , "source=agent" );
1539
1610
}
1540
1611
1541
1612
if (strncmp (sp , "6.1" , 3 ) == 0 )
1542
1613
{
1543
1614
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Vista" );
1544
1615
EvalContextClassPutHard (ctx , "WinVista" , "inventory,attribute_name=none,source=agent" );
1616
+ SysOSVersionMinorPut (ctx , "56.1" , "source=agent" );
1545
1617
}
1546
1618
1547
1619
if (strncmp (sp , "6.3" , 3 ) == 0 )
1548
1620
{
1549
1621
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Server 2008" );
1550
1622
EvalContextClassPutHard (ctx , "WinServer2008" , "inventory,attribute_name=none,source=agent" );
1623
+ SysOSVersionMinorPut (ctx , "6.3" , "source=agent" );
1551
1624
}
1552
1625
}
1553
1626
}
@@ -1588,6 +1661,25 @@ static void OSClasses(EvalContext *ctx)
1588
1661
else
1589
1662
{
1590
1663
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
+ }
1591
1683
}
1592
1684
free (release );
1593
1685
@@ -1733,6 +1825,7 @@ static void Apple_Version(EvalContext *ctx)
1733
1825
assert (ret >= 0 && (size_t ) ret < sizeof (buf ));
1734
1826
Log (LOG_LEVEL_VERBOSE , "This appears to be a %s %u.%u system." , product_name , major , minor );
1735
1827
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1828
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1736
1829
}
1737
1830
1738
1831
if (revcomps > 2 )
@@ -1798,6 +1891,7 @@ static void Linux_Oracle_VM_Server_Version(EvalContext *ctx)
1798
1891
1799
1892
snprintf (buf , CF_BUFSIZE , "oraclevmserver_%d_%d" , major , minor );
1800
1893
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1894
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1801
1895
}
1802
1896
1803
1897
if (revcomps > 2 )
@@ -1849,6 +1943,7 @@ static void Linux_Oracle_Version(EvalContext *ctx)
1849
1943
1850
1944
snprintf (buf , CF_BUFSIZE , "oracle_%d_%d" , major , minor );
1851
1945
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1946
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1852
1947
}
1853
1948
}
1854
1949
@@ -2164,6 +2259,11 @@ static int Linux_Redhat_Version(EvalContext *ctx)
2164
2259
}
2165
2260
}
2166
2261
2262
+ if (minor >= 0 )
2263
+ {
2264
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent,derived-from-file=" RH_REL_FILENAME );
2265
+ }
2266
+
2167
2267
return 0 ;
2168
2268
}
2169
2269
@@ -2345,6 +2445,7 @@ static int Linux_Suse_Version(EvalContext *ctx)
2345
2445
strcat (classbuf , strminor );
2346
2446
EvalContextClassPutHard (ctx , classbuf , "inventory,attribute_name=none,source=agent" );
2347
2447
2448
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2348
2449
Log (LOG_LEVEL_VERBOSE , "Discovered SUSE version %s" , classbuf );
2349
2450
return 0 ;
2350
2451
}
@@ -2376,6 +2477,7 @@ static int Linux_Suse_Version(EvalContext *ctx)
2376
2477
snprintf (classbuf , CF_MAXVARSIZE , "SuSE_%d" , major );
2377
2478
EvalContextClassPutHard (ctx , classbuf , "source=agent" );
2378
2479
2480
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2379
2481
Log (LOG_LEVEL_VERBOSE , "Discovered SUSE version %s" , classbuf );
2380
2482
return 0 ;
2381
2483
}
@@ -2417,6 +2519,7 @@ static int Linux_Slackware_Version(EvalContext *ctx, char *filename)
2417
2519
Log (LOG_LEVEL_VERBOSE , "This appears to be a Slackware %u.%u system." , major , minor );
2418
2520
snprintf (classname , CF_MAXVARSIZE , "slackware_%u_%u" , major , minor );
2419
2521
EvalContextClassPutHard (ctx , classname , "inventory,attribute_name=none,source=agent" );
2522
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2420
2523
/* Fall-through */
2421
2524
case 1 :
2422
2525
Log (LOG_LEVEL_VERBOSE , "This appears to be a Slackware %u system." , major );
@@ -2506,6 +2609,7 @@ static int Linux_Misc_Version(EvalContext *ctx)
2506
2609
nt_static_assert ((sizeof (version )) > 255 );
2507
2610
sscanf (sp + strlen ("DISTRIB_RELEASE=" ), "%255[^\n]" , version );
2508
2611
CanonifyNameInPlace (version );
2612
+ SysOSVersionMinorPutFromVersion (ctx , "" , version , "source=agent, derived-from-file=/etc/lsb_release" );
2509
2613
}
2510
2614
}
2511
2615
fclose (fp );
@@ -2624,6 +2728,10 @@ static int Linux_Debian_Version(EvalContext *ctx)
2624
2728
"inventory,attribute_name=none,source=agent,derived-from-file=" DEBIAN_ISSUE_FILENAME );
2625
2729
}
2626
2730
}
2731
+ if (release >= 0 )
2732
+ {
2733
+ SysOSVersionMinorPutInt (ctx , release , "source=agent,derived-from-file=" DEBIAN_ISSUE_FILENAME );
2734
+ }
2627
2735
2628
2736
return 0 ;
2629
2737
}
@@ -2755,6 +2863,8 @@ static int Linux_Mandriva_Version_Real(EvalContext *ctx, char *filename, char *r
2755
2863
strcat (classbuf , "_" );
2756
2864
strcat (classbuf , strminor );
2757
2865
EvalContextClassPutHard (ctx , classbuf , "inventory,attribute_name=none,source=agent" );
2866
+
2867
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2758
2868
}
2759
2869
}
2760
2870
@@ -2820,6 +2930,7 @@ static void Linux_Alpine_Version(EvalContext *ctx)
2820
2930
{
2821
2931
char class [CF_MAXVARSIZE ];
2822
2932
CanonifyNameInPlace (version );
2933
+ SysOSVersionMinorPutFromVersion (ctx , "alpine_linux" , version , "source=agent,derived-from-file=/etc/alpine-release" );
2823
2934
snprintf (class , sizeof (class ), "alpine_linux_%s" , version );
2824
2935
EvalContextClassPutHard (ctx , class ,
2825
2936
"inventory,attribute_name=none,source=agent"
@@ -2848,6 +2959,7 @@ static int EOS_Version(EvalContext *ctx)
2848
2959
version [0 ] = '\0' ;
2849
2960
sscanf (buffer , "%*s %*s %*s %255s" , version );
2850
2961
CanonifyNameInPlace (version );
2962
+ SysOSVersionMinorPutFromVersion (ctx , "eos" , version , "source=agent" );
2851
2963
snprintf (class , CF_MAXVARSIZE , "eos_%s" , version );
2852
2964
EvalContextClassPutHard (ctx , class , "inventory,attribute_name=none,source=agent" );
2853
2965
}
@@ -2872,6 +2984,7 @@ static int MiscOS(EvalContext *ctx)
2872
2984
EvalContextClassPutHard (ctx , "big_ip" , "inventory,attribute_name=none,source=agent" );
2873
2985
sscanf (buffer , "%*s %255s %*s %255s" , version , build );
2874
2986
CanonifyNameInPlace (version );
2987
+ SysOSVersionMinorPutFromVersion (ctx , "" , version , "source=agent" );
2875
2988
CanonifyNameInPlace (build );
2876
2989
snprintf (class , CF_MAXVARSIZE , "big_ip_%s" , version );
2877
2990
EvalContextClassPutHard (ctx , class , "inventory,attribute_name=none,source=agent" );
@@ -2907,6 +3020,7 @@ static int VM_Version(EvalContext *ctx)
2907
3020
snprintf (classbuf , CF_BUFSIZE , "VMware ESX Server %d.%d.%d" , major , minor , bug );
2908
3021
EvalContextClassPutHard (ctx , classbuf , "inventory,attribute_name=none,source=agent" );
2909
3022
sufficient = 1 ;
3023
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2910
3024
}
2911
3025
else if (sscanf (buffer , "VMware ESX Server %255s" , version ) > 0 )
2912
3026
{
@@ -3790,6 +3904,44 @@ static void SysOsVersionMajor(EvalContext *ctx)
3790
3904
3791
3905
/*****************************************************************************/
3792
3906
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
+
3793
3945
void DetectEnvironment (EvalContext * ctx )
3794
3946
{
3795
3947
GetNameInfo3 (ctx );
@@ -3802,4 +3954,5 @@ void DetectEnvironment(EvalContext *ctx)
3802
3954
GetDefVars (ctx );
3803
3955
SysOSNameHuman (ctx );
3804
3956
SysOsVersionMajor (ctx );
3957
+ SysOsVersionMinorSetUnknownIfUnset (ctx );
3805
3958
}
0 commit comments