@@ -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 , char * strminor , char * tags );
165
+ static void SysOSVersionMinorPutInt (EvalContext * ctx , int minor , char * tags );
166
+ static void SysOsVersionMinorSetDefault (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 , 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
+
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,11 @@ 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
+ strlcpy (strminor , VSYSNAME .release , CF_MAXVARSIZE );
1470
+
1471
+ SysOSVersionMinorPut (ctx , strminor , "source=agent" );
1433
1472
#else
1434
1473
strlcpy (vbuff , VSYSNAME .release , CF_MAXVARSIZE );
1435
1474
#endif
@@ -1461,12 +1500,29 @@ static void OSClasses(EvalContext *ctx)
1461
1500
1462
1501
// Extract major version number
1463
1502
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 ++ )
1465
1506
{
1466
1507
if (major == NULL && isdigit (* sp ))
1467
1508
{
1468
1509
major = sp ;
1469
1510
}
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
+ }
1470
1526
else if (!isdigit (* sp ))
1471
1527
{
1472
1528
* sp = '\0' ;
@@ -1478,6 +1534,10 @@ static void OSClasses(EvalContext *ctx)
1478
1534
snprintf (context , CF_BUFSIZE , "hpux_%s" , major );
1479
1535
EvalContextClassPutHard (ctx , context , "source=agent,derived-from=sys.flavor" );
1480
1536
}
1537
+ if (minor != NULL )
1538
+ {
1539
+ SysOSVersionMinorPut (ctx , minor , "source=agent" );
1540
+ }
1481
1541
#endif
1482
1542
1483
1543
#ifdef __FreeBSD__
@@ -1487,17 +1547,24 @@ static void OSClasses(EvalContext *ctx)
1487
1547
* For example, when being run on either FreeBSD 10.0 or 10.1 a class
1488
1548
* called freebsd_10 will be defined
1489
1549
*/
1490
- for (char * sp = vbuff ; * sp != '\0' ; sp ++ )
1550
+ char * sp = NULL ;
1551
+ for (sp = vbuff ; * sp != '\0' ; sp ++ )
1491
1552
{
1492
1553
if (* sp == '.' )
1493
1554
{
1494
1555
* sp = '\0' ;
1495
1556
break ;
1496
1557
}
1497
1558
}
1559
+ sp ++ ;
1560
+ char * minor = sp ;
1498
1561
1499
1562
snprintf (context , CF_BUFSIZE , "%s_%s" , VSYSNAME .sysname , vbuff );
1500
1563
EvalContextClassPutHard (ctx , context , "source=agent,derived-from=sys.flavor" );
1564
+ if (minor != NULL )
1565
+ {
1566
+ SysOSVersionMinorPut (ctx , minor , "source=agent" );
1567
+ }
1501
1568
#endif
1502
1569
1503
1570
#endif
@@ -1524,30 +1591,35 @@ static void OSClasses(EvalContext *ctx)
1524
1591
{
1525
1592
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows 2000" );
1526
1593
EvalContextClassPutHard (ctx , "Win2000" , "inventory,attribute_name=none,source=agent" );
1594
+ SysOSVersionMinorPut (ctx , "5.0" , "source=agent" );
1527
1595
}
1528
1596
1529
1597
if (strncmp (sp , "5.1" , 3 ) == 0 )
1530
1598
{
1531
1599
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows XP" );
1532
1600
EvalContextClassPutHard (ctx , "WinXP" , "inventory,attribute_name=none,source=agent" );
1601
+ SysOSVersionMinorPut (ctx , "5.1" , "source=agent" );
1533
1602
}
1534
1603
1535
1604
if (strncmp (sp , "5.2" , 3 ) == 0 )
1536
1605
{
1537
1606
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Server 2003" );
1538
1607
EvalContextClassPutHard (ctx , "WinServer2003" , "inventory,attribute_name=none,source=agent" );
1608
+ SysOSVersionMinorPut (ctx , "5.2" , "source=agent" );
1539
1609
}
1540
1610
1541
1611
if (strncmp (sp , "6.1" , 3 ) == 0 )
1542
1612
{
1543
1613
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Vista" );
1544
1614
EvalContextClassPutHard (ctx , "WinVista" , "inventory,attribute_name=none,source=agent" );
1615
+ SysOSVersionMinorPut (ctx , "56.1" , "source=agent" );
1545
1616
}
1546
1617
1547
1618
if (strncmp (sp , "6.3" , 3 ) == 0 )
1548
1619
{
1549
1620
Log (LOG_LEVEL_VERBOSE , "This appears to be Windows Server 2008" );
1550
1621
EvalContextClassPutHard (ctx , "WinServer2008" , "inventory,attribute_name=none,source=agent" );
1622
+ SysOSVersionMinorPut (ctx , "6.3" , "source=agent" );
1551
1623
}
1552
1624
}
1553
1625
}
@@ -1588,6 +1660,27 @@ static void OSClasses(EvalContext *ctx)
1588
1660
else
1589
1661
{
1590
1662
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
+ }
1591
1684
}
1592
1685
free (release );
1593
1686
@@ -1733,6 +1826,7 @@ static void Apple_Version(EvalContext *ctx)
1733
1826
assert (ret >= 0 && (size_t ) ret < sizeof (buf ));
1734
1827
Log (LOG_LEVEL_VERBOSE , "This appears to be a %s %u.%u system." , product_name , major , minor );
1735
1828
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1829
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1736
1830
}
1737
1831
1738
1832
if (revcomps > 2 )
@@ -1798,6 +1892,7 @@ static void Linux_Oracle_VM_Server_Version(EvalContext *ctx)
1798
1892
1799
1893
snprintf (buf , CF_BUFSIZE , "oraclevmserver_%d_%d" , major , minor );
1800
1894
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1895
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1801
1896
}
1802
1897
1803
1898
if (revcomps > 2 )
@@ -1849,6 +1944,7 @@ static void Linux_Oracle_Version(EvalContext *ctx)
1849
1944
1850
1945
snprintf (buf , CF_BUFSIZE , "oracle_%d_%d" , major , minor );
1851
1946
EvalContextClassPutHard (ctx , buf , "inventory,attribute_name=none,source=agent" );
1947
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
1852
1948
}
1853
1949
}
1854
1950
@@ -2164,6 +2260,11 @@ static int Linux_Redhat_Version(EvalContext *ctx)
2164
2260
}
2165
2261
}
2166
2262
2263
+ if (minor >= 0 )
2264
+ {
2265
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent,derived-from-file=" RH_REL_FILENAME );
2266
+ }
2267
+
2167
2268
return 0 ;
2168
2269
}
2169
2270
@@ -2382,6 +2483,11 @@ static int Linux_Suse_Version(EvalContext *ctx)
2382
2483
}
2383
2484
}
2384
2485
2486
+ if (minor >= 0 )
2487
+ {
2488
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2489
+ }
2490
+
2385
2491
Log (LOG_LEVEL_VERBOSE , "Could not find a numeric OS release in %s" , SUSE_REL_FILENAME );
2386
2492
2387
2493
return 0 ;
@@ -2417,6 +2523,7 @@ static int Linux_Slackware_Version(EvalContext *ctx, char *filename)
2417
2523
Log (LOG_LEVEL_VERBOSE , "This appears to be a Slackware %u.%u system." , major , minor );
2418
2524
snprintf (classname , CF_MAXVARSIZE , "slackware_%u_%u" , major , minor );
2419
2525
EvalContextClassPutHard (ctx , classname , "inventory,attribute_name=none,source=agent" );
2526
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2420
2527
/* Fall-through */
2421
2528
case 1 :
2422
2529
Log (LOG_LEVEL_VERBOSE , "This appears to be a Slackware %u system." , major );
@@ -2506,6 +2613,7 @@ static int Linux_Misc_Version(EvalContext *ctx)
2506
2613
nt_static_assert ((sizeof (version )) > 255 );
2507
2614
sscanf (sp + strlen ("DISTRIB_RELEASE=" ), "%255[^\n]" , version );
2508
2615
CanonifyNameInPlace (version );
2616
+ SysOSVersionMinorPutFromVersion (ctx , "" , version , "source=agent, derived-from-file=/etc/lsb_release" );
2509
2617
}
2510
2618
}
2511
2619
fclose (fp );
@@ -2624,6 +2732,10 @@ static int Linux_Debian_Version(EvalContext *ctx)
2624
2732
"inventory,attribute_name=none,source=agent,derived-from-file=" DEBIAN_ISSUE_FILENAME );
2625
2733
}
2626
2734
}
2735
+ if (release >= 0 )
2736
+ {
2737
+ SysOSVersionMinorPutInt (ctx , release , "source=agent,derived-from-file=" DEBIAN_ISSUE_FILENAME );
2738
+ }
2627
2739
2628
2740
return 0 ;
2629
2741
}
@@ -2755,6 +2867,8 @@ static int Linux_Mandriva_Version_Real(EvalContext *ctx, char *filename, char *r
2755
2867
strcat (classbuf , "_" );
2756
2868
strcat (classbuf , strminor );
2757
2869
EvalContextClassPutHard (ctx , classbuf , "inventory,attribute_name=none,source=agent" );
2870
+
2871
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2758
2872
}
2759
2873
}
2760
2874
@@ -2820,6 +2934,7 @@ static void Linux_Alpine_Version(EvalContext *ctx)
2820
2934
{
2821
2935
char class [CF_MAXVARSIZE ];
2822
2936
CanonifyNameInPlace (version );
2937
+ SysOSVersionMinorPutFromVersion (ctx , "alpine_linux" , version , "source=agent,derived-from-file=/etc/alpine-release" );
2823
2938
snprintf (class , sizeof (class ), "alpine_linux_%s" , version );
2824
2939
EvalContextClassPutHard (ctx , class ,
2825
2940
"inventory,attribute_name=none,source=agent"
@@ -2848,6 +2963,7 @@ static int EOS_Version(EvalContext *ctx)
2848
2963
version [0 ] = '\0' ;
2849
2964
sscanf (buffer , "%*s %*s %*s %255s" , version );
2850
2965
CanonifyNameInPlace (version );
2966
+ SysOSVersionMinorPutFromVersion (ctx , "eos" , version , "source=agent" );
2851
2967
snprintf (class , CF_MAXVARSIZE , "eos_%s" , version );
2852
2968
EvalContextClassPutHard (ctx , class , "inventory,attribute_name=none,source=agent" );
2853
2969
}
@@ -2872,6 +2988,7 @@ static int MiscOS(EvalContext *ctx)
2872
2988
EvalContextClassPutHard (ctx , "big_ip" , "inventory,attribute_name=none,source=agent" );
2873
2989
sscanf (buffer , "%*s %255s %*s %255s" , version , build );
2874
2990
CanonifyNameInPlace (version );
2991
+ SysOSVersionMinorPutFromVersion (ctx , "" , version , "source=agent" );
2875
2992
CanonifyNameInPlace (build );
2876
2993
snprintf (class , CF_MAXVARSIZE , "big_ip_%s" , version );
2877
2994
EvalContextClassPutHard (ctx , class , "inventory,attribute_name=none,source=agent" );
@@ -2907,6 +3024,7 @@ static int VM_Version(EvalContext *ctx)
2907
3024
snprintf (classbuf , CF_BUFSIZE , "VMware ESX Server %d.%d.%d" , major , minor , bug );
2908
3025
EvalContextClassPutHard (ctx , classbuf , "inventory,attribute_name=none,source=agent" );
2909
3026
sufficient = 1 ;
3027
+ SysOSVersionMinorPutInt (ctx , minor , "source=agent" );
2910
3028
}
2911
3029
else if (sscanf (buffer , "VMware ESX Server %255s" , version ) > 0 )
2912
3030
{
@@ -3784,6 +3902,44 @@ static void SysOsVersionMajor(EvalContext *ctx)
3784
3902
3785
3903
/*****************************************************************************/
3786
3904
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
+
3787
3943
void DetectEnvironment (EvalContext * ctx )
3788
3944
{
3789
3945
GetNameInfo3 (ctx );
@@ -3796,4 +3952,5 @@ void DetectEnvironment(EvalContext *ctx)
3796
3952
GetDefVars (ctx );
3797
3953
SysOSNameHuman (ctx );
3798
3954
SysOsVersionMajor (ctx );
3955
+ SysOsVersionMinorSetDefault (ctx );
3799
3956
}
0 commit comments