diff --git a/LibreNMS/Device/YamlDiscovery.php b/LibreNMS/Device/YamlDiscovery.php index e2f6024e40..c853368641 100644 --- a/LibreNMS/Device/YamlDiscovery.php +++ b/LibreNMS/Device/YamlDiscovery.php @@ -97,14 +97,10 @@ class YamlDiscovery } foreach ($data as $name => $value) { - if (in_array($name, ['oid', 'skip_values', 'snmp_flags', 'rrd_type'])) { - $current_data[$name] = $value; - } elseif (Str::contains($value, '{{')) { - // replace embedded values - $current_data[$name] = static::replaceValues($name, $index, $count, $data, $pre_cache); + if (! in_array($name, ['oid', 'skip_values', 'snmp_flags', 'rrd_type'])) { + $current_data[$name] = self::fillValues($name, $index, $data, $count, $pre_cache, $value); } else { - // replace references to data - $current_data[$name] = static::getValueFromData($name, $index, $data, $pre_cache, $value); + $current_data[$name] = $value; } } @@ -124,6 +120,28 @@ class YamlDiscovery return $items; } + /** + * @param string $name The oid of the value we are searching for + * @param int|string $index The index of the current entity we are searching from + * @param array $discovery_data The yaml discovery data + * @param int $count The count of where we are in the discovery data + * @param array $pre_cache Data that has been previously fetched (should contain all snmp data) + * @param int|string $value The current value of the data that we might need to transform (or return as is) + * @return mixed + */ + public static function fillValues($name, $index, $discovery_data, $count, $pre_cache, $value): mixed + { + if (str_contains($value, '{{')) { + // replace embedded values + return static::replaceValues($name, $index, $count, $discovery_data, $pre_cache); + } elseif (! str_contains($value, ' ')) { + // replace references to data + return static::getValueFromData($name, $index, $discovery_data, $pre_cache, $value); + } + + return $value; + } + /** * @param \LibreNMS\OS $os OS/device we areworking on * @param array $data Array derived from YAML @@ -217,17 +235,21 @@ class YamlDiscovery return $pre_cache[$index][$name]; } - //create the sub-index values in order to try to match them with precache - $sub_indexes = explode('.', $index); // parse sub_index options name with trailing colon and index - $sub_index = 0; - $sub_index_end = null; if (preg_match('/^(.+):(\d+)(?:-(\d+))?$/', $name, $matches)) { - $name = $matches[1] ?? null; - $sub_index = $matches[2] ?? null; - $sub_index_end = $matches[3] ?? null; + // subindex found + $name = $matches[1]; + + //create the sub-index values in order to try to match them with precache + $sub_indexes = explode('.', $index); + + // if subindex is a range, get them all, otherwise just get the first + $index = isset($matches[3]) + ? implode('.', array_slice($sub_indexes, (int) $matches[2], (int) $matches[3])) + : $sub_indexes[(int) $matches[2]]; } + // look for the data in pre_cache if (isset($pre_cache[$name]) && ! is_numeric($name)) { if (is_array($pre_cache[$name])) { if (isset($pre_cache[$name][$index][$name])) { @@ -236,23 +258,21 @@ class YamlDiscovery return $pre_cache[$name][$index]; } elseif (count($pre_cache[$name]) === 1 && ! is_array(current($pre_cache[$name]))) { return current($pre_cache[$name]); - } elseif (isset($sub_indexes[$sub_index])) { - if ($sub_index_end) { - $multi_sub_index = implode('.', array_slice($sub_indexes, (int) $sub_index, (int) $sub_index_end)); - if (isset($pre_cache[$name][$multi_sub_index][$name])) { - return $pre_cache[$name][$multi_sub_index][$name]; - } - } - - if (isset($pre_cache[$name][$sub_indexes[$sub_index]][$name])) { - return $pre_cache[$name][$sub_indexes[$sub_index]][$name]; - } } } else { return $pre_cache[$name]; } } + // search for name inside walked tables if oid is fully qualified + if (str_contains($name, '::')) { + foreach ($pre_cache as $table_name => $table) { + if (is_array($table) && isset($table[$index][$name])) { + return $table[$index][$name]; + } + } + } + return $default; } @@ -294,7 +314,7 @@ class YamlDiscovery if (! array_key_exists($oid, $pre_cache)) { if (isset($data['snmp_flags'])) { $snmp_flag = Arr::wrap($data['snmp_flags']); - } elseif (Str::contains($oid, '::')) { + } elseif (str_contains($oid, '::')) { $snmp_flag = ['-OteQUSa']; } else { $snmp_flag = ['-OteQUsa']; @@ -346,7 +366,7 @@ class YamlDiscovery } else { // oid previously fetched from the device $tmp_value = static::getValueFromData($skip_value['oid'], $index, $yaml_item_data, $pre_cache); - if (Str::contains($skip_value['oid'], '.')) { + if (str_contains($skip_value['oid'], '.')) { [$skip_value['oid'], $targeted_index] = explode('.', $skip_value['oid'], 2); $tmp_value = static::getValueFromData($skip_value['oid'], $targeted_index, $yaml_item_data, $pre_cache); } diff --git a/includes/definitions/discovery/aos7.yaml b/includes/definitions/discovery/aos7.yaml index 5f7a2f1aab..97687c36eb 100755 --- a/includes/definitions/discovery/aos7.yaml +++ b/includes/definitions/discovery/aos7.yaml @@ -34,7 +34,7 @@ modules: oid: ddmPortInfoTable value: ddmPortTxBiasCurrent num_oid: '.1.3.6.1.4.1.6486.801.1.2.1.5.1.1.2.6.1.12.{{ $index }}' - descr: '{{ $ifName }} TX Bias' + descr: '{{ $ifName:0 }} TX Bias' divisor: 1000 low_limit: ddmPortTxBiasCurrentLowAlarm low_warn_limit: ddmPortTxBiasCurrentLowWarning @@ -49,7 +49,7 @@ modules: oid: ddmPortInfoTable value: ddmPortRxOpticalPower num_oid: '.1.3.6.1.4.1.6486.801.1.2.1.5.1.1.2.6.1.22.{{ $index }}' - descr: '{{ $ifName }} RX Power' + descr: '{{ $ifName:0 }} RX Power' divisor: 1000 index: 'rx-{{ $index }}' low_limit: ddmPortRxOpticalPowerLowAlarm @@ -72,7 +72,7 @@ modules: oid: ddmPortInfoTable value: ddmPortTxOutputPower num_oid: '.1.3.6.1.4.1.6486.801.1.2.1.5.1.1.2.6.1.17.{{ $index }}' - descr: '{{ $ifName }} TX Power' + descr: '{{ $ifName:0 }} TX Power' divisor: 1000 index: 'tx-{{ $index }}' low_limit: ddmPortTxOutputPowerLowAlarm @@ -96,7 +96,7 @@ modules: oid: alaChasEntPhysFanTable value: alaChasEntPhysFanSpeed num_oid: '.1.3.6.1.4.1.6486.801.1.1.1.3.1.1.11.1.4.{{ $index }}' - descr: 'CHASSIS-{{ $entPhysicalName }} Fan {{ $subindex1 }}' + descr: 'CHASSIS-{{ $entPhysicalName:0 }} Fan {{ $subindex1 }}' low_limit: 1000 high_limit: 18000 skip_values: @@ -160,7 +160,7 @@ modules: oid: alaChasEntPhysFanTable value: alaChasEntPhysFanStatus num_oid: '.1.3.6.1.4.1.6486.801.1.1.1.3.1.1.11.1.2.{{ $index }}' - descr: 'CHASSIS-{{ $entPhysicalName }} Fan {{ $subindex1 }}' + descr: 'CHASSIS-{{ $entPhysicalName:0 }} Fan {{ $subindex1 }}' group: Fans index: 'alaChasEntPhysFanStatus.{{ $index }}' state_name: alaChasEntPhysFanStatus @@ -171,7 +171,7 @@ modules: - oid: chasEntPhysOperStatus num_oid: '.1.3.6.1.4.1.6486.801.1.1.1.1.1.1.1.2.{{ $index }}' - descr: '{{ $entPhysicalName }}' + descr: '{{ $entPhysicalName:0 }}' group: Components index: 'chasEntPhysOperStatus.{{ $index }}' states: @@ -230,7 +230,7 @@ modules: oid: chasChassisEntry value: chasCPMAHardwareBoardTemp num_oid: '.1.3.6.1.4.1.6486.801.1.1.1.3.1.1.3.1.8.{{ $index }}' - descr: '{{ $entPhysicalName }} Temperature' + descr: '{{ $entPhysicalName:0 }} Temperature' group: Chassis index: 'chasCPMAHardwareBoardTemp.{{ $index }}' high_limit: chasDangerTempThreshold @@ -244,7 +244,7 @@ modules: high_limit: ddmPortTempHiAlarm warn_limit: ddmPortTempHiWarning divisor: 1000 - descr: '{{ $ifName }} DDM Temperature' + descr: '{{ $ifName:0 }} DDM Temperature' group: DDM index: 'rx.{{ $index }}' entPhysicalIndex_measured: ports @@ -256,7 +256,7 @@ modules: oid: ddmPortInfoTable value: ddmPortSupplyVoltage num_oid: '.1.3.6.1.4.1.6486.801.1.2.1.5.1.1.2.6.1.7.{{ $index }}' - descr: '{{ $ifName }} TX Voltage' + descr: '{{ $ifName:0 }} TX Voltage' divisor: 1000 low_limit: ddmPortSupplyVoltageLowAlarm low_warn_limit: ddmPortSupplyVoltageLowWarning diff --git a/includes/definitions/discovery/e3meterdc.yaml b/includes/definitions/discovery/e3meterdc.yaml index 36a476e8de..fa7029680f 100644 --- a/includes/definitions/discovery/e3meterdc.yaml +++ b/includes/definitions/discovery/e3meterdc.yaml @@ -42,8 +42,8 @@ modules: oid: e3IpsSensorEntry value: e3IpsSensorTemperatureCelsius num_oid: '.1.3.6.1.4.1.21695.1.10.5.1.4.{{ $index }}' - descr: 'Sensor {{ $subindex1 }}, {{ $e3IpsLabel }}' - group: 'Model {{ $e3IpsModel }} rev{{ $e3IpsHWVersion }}, {{ $e3IpsLabel }}' + descr: 'Sensor {{ $subindex1 }}, {{ $e3IpsLabel:0 }}' + group: 'Model {{ $e3IpsModel:0 }} rev{{ $e3IpsHWVersion:0 }}, {{ $e3IpsLabel:0 }}' index: '{{ $index }}' divisor: 10 skip_values: @@ -61,8 +61,8 @@ modules: oid: e3IpsMeterEntry value: e3IpsFrequency num_oid: '.1.3.6.1.4.1.21695.1.10.4.1.11.{{ $index }}' - descr: 'Phase {{ $subindex1 }}, {{ $e3IpsLabel }}' - group: 'Model {{ $e3IpsModel }} rev{{ $e3IpsHWVersion }}, {{ $e3IpsLabel }}' + descr: 'Phase {{ $subindex1 }}, {{ $e3IpsLabel:0 }}' + group: 'Model {{ $e3IpsModel:0 }} rev{{ $e3IpsHWVersion:0 }}, {{ $e3IpsLabel:0 }}' index: '{{ $index }}' divisor: 1000 skip_values: @@ -76,8 +76,8 @@ modules: oid: e3IpsMeterEntry value: e3IpsPAvg num_oid: '.1.3.6.1.4.1.21695.1.10.4.1.18.{{ $index }}' - descr: 'Phase {{ $subindex1 }}, {{ $e3IpsLabel }}' - group: 'Model {{ $e3IpsModel }} rev{{ $e3IpsHWVersion }}, {{ $e3IpsLabel }}' + descr: 'Phase {{ $subindex1 }}, {{ $e3IpsLabel:0 }}' + group: 'Model {{ $e3IpsModel:0 }} rev{{ $e3IpsHWVersion:0 }}, {{ $e3IpsLabel:0 }}' index: '{{ $index }}' skip_values: - diff --git a/includes/definitions/discovery/hpe-mapdu.yaml b/includes/definitions/discovery/hpe-mapdu.yaml index 8df308dc10..073e137766 100644 --- a/includes/definitions/discovery/hpe-mapdu.yaml +++ b/includes/definitions/discovery/hpe-mapdu.yaml @@ -1,7 +1,7 @@ mib: CPQPOWER-MIB modules: os: - serial: + serial: - CPQPOWER-MIB::deviceSerialNumber.0 version: - CPQPOWER-MIB::deviceFirmwareVersion.0 @@ -17,7 +17,7 @@ modules: - pdu2InputPhaseIndex - pdu3OutletName - pdu3OutletControlStatus - - pdu3InputPhaseIndex + - pdu3InputPhaseIndex state: data: - @@ -111,7 +111,7 @@ modules: warn_limit: pdu3InputPhaseVoltageThUpperWarning high_limit: pdu3InputPhaseVoltageThUpperCritical skip_values: 0 - current: + current: data: - oid: pdu2InputPhaseCurrent @@ -181,14 +181,14 @@ modules: descr: 'Input Phase {{ $pdu2InputPhaseIndex }} Power' skip_values: - - oid: 'pdu2InputType' + oid: 'pdu2InputType:0' op: '!=' value: '1' - oid: pdu2OutletWatts value: pdu2OutletWatts index: 'Pdu2OutletIndex.{{ $index }}' - num_oid: '.1.3.6.1.4.1.232.165.7.5.1.1.14.{{ $index }}' + num_oid: '.1.3.6.1.4.1.232.165.7.5.1.1.14.{{ $index }}' descr: '{{ $pdu2OutletName }} Power' group: 'Outlets' skip_values: @@ -211,7 +211,7 @@ modules: descr: 'Input Phase {{ $pdu3InputPhaseIndex }} Power' skip_values: - - oid: 'pdu3InputType' + oid: 'pdu3InputType:0' op: '!=' value: '1' - @@ -239,10 +239,10 @@ modules: index: 'Pdu2InputIndex.{{ $index }}' num_oid: '.1.3.6.1.4.1.232.165.7.2.1.1.8.{{ $index }}' descr: 'Input Phase {{ $pdu2InputPhaseIndex }} Power Factor' - divisor: 1000 + divisor: 1000 skip_values: - - oid: 'pdu2InputType' + oid: 'pdu2InputType:0' op: '!=' value: '1' - diff --git a/includes/definitions/discovery/timos.yaml b/includes/definitions/discovery/timos.yaml index 33f6da8b8b..69520fa206 100644 --- a/includes/definitions/discovery/timos.yaml +++ b/includes/definitions/discovery/timos.yaml @@ -108,7 +108,7 @@ modules: - oid: tmnxCellPortRegistrationStatus num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.1.1.2.{{ $index }}' - descr: 'Registration state {{ $ifName }}' + descr: 'Registration state {{ ifName }}' index: 'tmnxCellPortRegistrationStatus.{{ $index }}' state_name: tmnxCellPortRegistrationStatus states: @@ -127,7 +127,7 @@ modules: - oid: tmnxCellPortWirelessTechnology num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.1.1.3.{{ $index }}' - descr: 'Wireless technology {{ $ifName }}' + descr: 'Wireless technology {{ ifName }}' index: 'tmnxCellPortWirelessTechnology.{{ $index }}' state_name: tmnxCellPortWirelessTechnology states: @@ -139,7 +139,7 @@ modules: - oid: tmnxCellSimCardEquipped num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.3.1.1.{{ $index }}' - descr: 'Simcard {{ $ifName }}' + descr: 'Simcard {{ ifName:0 }}' index: 'tmnxCellSimCardEquipped.{{ $index }}' state_name: tmnxCellSimCardEquipped states: @@ -150,7 +150,7 @@ modules: oid: tmnxCellPdnConnectionState num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.4.1.1.{{ $index }}' - descr: 'Pdn state {{ $ifName }} {{ $tmnxCellPdnApn }}' + descr: 'Pdn state {{ ifName:0 }} {{ $tmnxCellPdnApn }}' index: 'tmnxCellPdnConnectionState.{{ $index }}' state_name: tmnxCellPdnConnectionState states: @@ -219,7 +219,7 @@ modules: oid: tmnxDigitalDiagMonitorEntry value: tmnxDDMTemperature num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.31.1.1.{{ $index }}' - descr: '{{ $ifName:1 }}' + descr: '{{ ifName:1 }}' index: '{{ $index }}' high_limit: tmnxDDMTempHiAlarm warn_limit: tmnxDDMTempHiWarning @@ -241,7 +241,7 @@ modules: oid: tmnxDigitalDiagMonitorEntry value: tmnxDDMTxBiasCurrent num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.31.1.11.{{ $index }}' - descr: '{{ $ifName:1 }} Tx Bias' + descr: '{{ ifName:1 }} Tx Bias' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'tx-bias-{{ $index }}' @@ -263,7 +263,7 @@ modules: oid: tmnxDDMLaneTable value: tmnxDDMLaneTxBiasCurrent num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.66.1.7.{{ $index }}' - descr: '{{ $ifName:1 }} Lane {{ $subindex2 }} Tx Bias' + descr: '{{ ifName:1 }} Lane {{ $subindex2 }} Tx Bias' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'tx-bias-{{ $index }}' @@ -272,7 +272,7 @@ modules: warn_limit: tmnxDDMLaneTxBiasCurrentHiWarning low_limit: tmnxDDMLaneTxBiasCurrentLowAlarm low_warn_limit: tmnxDDMLaneTxBiasCurrentLowWarning - group: '{{ $ifName:1 }}' + group: '{{ ifName:1 }}' skip_values: - oid: tmnxDDMLaneTxBiasCurrent @@ -288,7 +288,7 @@ modules: oid: tmnxDigitalDiagMonitorEntry value: tmnxDDMRxOpticalPower num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.31.1.21.{{ $index }}' - descr: '{{ $ifName:1 }} Rx' + descr: '{{ ifName:1 }} Rx' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'rx-{{ $index }}' @@ -298,7 +298,7 @@ modules: low_limit: tmnxDDMRxOpticalPowerLowAlarm low_warn_limit: tmnxDDMRxOpticalPowerLowWarning user_func: 'uw_to_dbm' - group: '{{ $ifName:1 }}' + group: '{{ ifName:1 }}' skip_values: - oid: tmnxPortAdminStatus @@ -312,7 +312,7 @@ modules: oid: tmnxDigitalDiagMonitorEntry value: tmnxDDMTxOutputPower num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.31.1.16.{{ $index }}' - descr: '{{ $ifName:1 }} Tx' + descr: '{{ ifName:1 }} Tx' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'tx-{{ $index }}' @@ -322,7 +322,7 @@ modules: low_limit: tmnxDDMTxOutputPowerLowAlarm low_warn_limit: tmnxDDMTxOutputPowerLowWarning user_func: 'uw_to_dbm' - group: '{{ $ifName:1 }}' + group: '{{ ifName:1 }}' skip_values: - oid: tmnxPortAdminStatus @@ -336,13 +336,13 @@ modules: oid: tmnxDDMLaneTable value: tmnxDDMLaneRxOpticalPower num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.66.1.17.{{ $index }}' - descr: '{{ $ifName:1 }} Lane {{ $subindex2 }} Rx' + descr: '{{ ifName:1 }} Lane {{ $subindex2 }} Rx' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'lane-rx-{{ $index }}' user_func: 'uw_to_dbm' divisor: 10 - group: '{{ $ifName:1 }}' + group: '{{ ifName:1 }}' high_limit: tmnxDDMLaneRxOpticalPwrHiAlarm warn_limit: tmnxDDMLaneRxOpticalPwrHiWarn low_limit: tmnxDDMLaneRxOpticalPwrLowAlarm @@ -356,13 +356,13 @@ modules: oid: tmnxDDMLaneTable value: tmnxDDMLaneTxOutputPower num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.66.1.12.{{ $index }}' - descr: '{{ $ifName:1 }} Lane {{ $subindex2 }} Tx' + descr: '{{ ifName:1 }} Lane {{ $subindex2 }} Tx' entPhysicalIndex: '{{ $index }}' entPhysicalIndex_measured: ports index: 'lane-tx-{{ $index }}' user_func: 'uw_to_dbm' divisor: 10 - group: '{{ $ifName:1 }}' + group: '{{ ifName:1 }}' high_limit: tmnxDDMLaneTxOutputPowerHiAlarm warn_limit: tmnxDDMLaneTxOutputPowerHiWarn low_limit: tmnxDDMLaneTxOutputPowerLowAlarm @@ -378,7 +378,7 @@ modules: oid: tmnxDigitalDiagMonitorEntry value: tmnxDDMSupplyVoltage num_oid: '.1.3.6.1.4.1.6527.3.1.2.2.4.31.1.6.{{ $index }}' - descr: '{{ $ifName:1 }}' + descr: '{{ ifName:1 }}' index: '{{ $index }}' high_limit: tmnxDDMSupplyVoltageHiAlarm warn_limit: tmnxDDMSupplyVoltageHiWarning @@ -432,14 +432,14 @@ modules: - oid: tmnxCellPortFrequencyBand num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.1.1.4.{{ $index }}' - descr: 'Interface {{ $ifName }}' + descr: 'Interface {{ ifName }}' index: 'tmnxCellPortFrequencyBand.{{ $index }}' group: 'Frequency band' - oid: tmnxCellularPortBearerTable value: tmnxCellPortBearerQci num_oid: '.1.3.6.1.4.1.6527.3.1.2.109.3.1.5.1.3.{{ $index }}' - descr: 'Interface {{ $ifName }}' + descr: 'Interface {{ ifName:0 }}' index: 'tmnxCellularPortBearerTable.{{ $index }}' group: 'QoS Class Identifier' frequency: diff --git a/includes/discovery/functions.inc.php b/includes/discovery/functions.inc.php index c7270ac4ae..7083a60abd 100644 --- a/includes/discovery/functions.inc.php +++ b/includes/discovery/functions.inc.php @@ -969,7 +969,7 @@ function discovery_process(&$valid, $os, $sensor_class, $pre_cache) $value = ($value / $divisor) * $multiplier; } - echo "Cur $value, Low: $low_limit, Low Warn: $low_warn_limit, Warn: $warn_limit, High: $high_limit" . PHP_EOL; + echo "$descr: Cur $value, Low: $low_limit, Low Warn: $low_warn_limit, Warn: $warn_limit, High: $high_limit" . PHP_EOL; $entPhysicalIndex = YamlDiscovery::replaceValues('entPhysicalIndex', $index, null, $data, $pre_cache) ?: null; $entPhysicalIndex_measured = isset($data['entPhysicalIndex_measured']) ? $data['entPhysicalIndex_measured'] : null; @@ -991,7 +991,7 @@ function discovery_process(&$valid, $os, $sensor_class, $pre_cache) } } - discover_sensor($valid['sensor'], $sensor_class, $device, $oid, $uindex, $sensor_name, $descr, $divisor, $multiplier, $low_limit, $low_warn_limit, $warn_limit, $high_limit, $value, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured, $user_function, $group, $data['rrd_type']); + discover_sensor($valid['sensor'], $sensor_class, $device, $oid, $uindex, $sensor_name, $descr, $divisor, $multiplier, $low_limit, $low_warn_limit, $warn_limit, $high_limit, $value, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured, $user_function, $group, $data['rrd_type'] ?? 'GAUGE'); if ($sensor_class === 'state') { create_sensor_to_state_index($device, $sensor_name, $uindex); diff --git a/lang/en/commands.php b/lang/en/commands.php index b6de59e339..92b660e0c3 100644 --- a/lang/en/commands.php +++ b/lang/en/commands.php @@ -44,7 +44,7 @@ return [ 'fail-fast' => 'Stop checks when any failure is encountered', 'full' => 'Run full checks ignoring changed file filtering', 'module' => 'Specific Module to run tests on. Implies unit, --db, --snmpsim', - 'os' => 'Specific OS to run tests on. Implies unit, --db, --snmpsim', + 'os' => 'Specific OS to run tests on. May be a regex or comma seperated list. Implies unit, --db, --snmpsim', 'os-modules-only' => 'Skip os detection test when specifying a specific OS. Speeds up test time when checking non-detection changes.', 'quiet' => 'Hide output unless there is an error', 'snmpsim' => 'Use snmpsim for unit tests',