summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/inc/statisticsfilter.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2022-04-13 12:49:41 +0200
committerSimon Rettberg2022-04-13 12:49:41 +0200
commitf0ef328db5fc34db87070dc83e3af9d382a74eed (patch)
tree659ddf697a91daf947b47f0eeda3627ce6929b9f /modules-available/statistics/inc/statisticsfilter.inc.php
parent[inc/Database] Force more sql_mode options in debug mode (diff)
downloadslx-admin-f0ef328db5fc34db87070dc83e3af9d382a74eed.tar.gz
slx-admin-f0ef328db5fc34db87070dc83e3af9d382a74eed.tar.xz
slx-admin-f0ef328db5fc34db87070dc83e3af9d382a74eed.zip
[statistics] Add PCI device filter option
Diffstat (limited to 'modules-available/statistics/inc/statisticsfilter.inc.php')
-rw-r--r--modules-available/statistics/inc/statisticsfilter.inc.php40
1 files changed, 38 insertions, 2 deletions
diff --git a/modules-available/statistics/inc/statisticsfilter.inc.php b/modules-available/statistics/inc/statisticsfilter.inc.php
index a4e96294..1c3df9af 100644
--- a/modules-available/statistics/inc/statisticsfilter.inc.php
+++ b/modules-available/statistics/inc/statisticsfilter.inc.php
@@ -253,6 +253,7 @@ abstract class StatisticsFilter
'live_memfree' => new SimpleStatisticsFilter('live_memfree', self::OP_ORDINAL, 'MiB'),
'live_tmpfree' => new SimpleStatisticsFilter('live_tmpfree', self::OP_ORDINAL, 'MiB'),
'standbycrash' => new StandbyCrashStatisticsFilter(),
+ 'pcidev' => new PciDeviceStatisticsFilter(),
];
if (Module::isAvailable('locations')) {
self::$columns['location'] = new LocationStatisticsFilter();
@@ -617,15 +618,50 @@ class IsClientStatisticsFilter extends StatisticsFilter
public function whereClause(string $operator, $argument, array &$args, array &$joins): string
{
if ($argument) {
- $joins[] = ' LEFT JOIN runmode USING (machineuuid)';
+ $joins[] = ' LEFT JOIN runmode ON (m.machineuuid = runmode.machineuuid)';
return "(runmode.isclient <> 0 OR runmode.isclient IS NULL)";
}
- $joins[] = ' INNER JOIN runmode USING (machineuuid)';
+ $joins[] = ' INNER JOIN runmode ON (m.machineuuid = runmode.machineuuid)';
return "runmode.isclient = 0";
}
}
+class PciDeviceStatisticsFilter extends StatisticsFilter
+{
+
+ public function __construct()
+ {
+ parent::__construct(null, ['=']);
+ }
+
+ public function whereClause(string $operator, $argument, array &$args, array &$joins): string
+ {
+ if (!preg_match('/^([0-9a-f]{4})(?::([0-9a-f]{4}))?$/i', $argument, $out)) {
+ Message::addError('invalid-pciid', $argument);
+ return '0';
+ }
+ $vendor = $out[1];
+ $device = $out[2] ?? '';
+ // basic join for hw_x_machine
+ $joins[] = ' INNER JOIN machine_x_hw mxhw ON (mxhw.disconnecttime = 0 AND mxhw.machineuuid = m.machineuuid)';
+ $key = $key = self::getNewKey('foo');
+ $joins[] = " INNER JOIN statistic_hw shw ON (mxhw.hwid = shw.hwid AND shw.hwtype = :$key)";
+ $args[$key] = HardwareInfo::PCI_DEVICE;
+ $_ = [];
+ $c = new HardwareQueryColumn(true, 'vendor');
+ $c->addCondition($operator, $vendor);
+ $c->generate($joins, $_, $args);
+ if (!empty($device)) {
+ $c = new HardwareQueryColumn(true, 'device');
+ $c->addCondition($operator, $device);
+ $c->generate($joins, $_, $args);
+ }
+ return '1';
+ }
+
+}
+
class DatabaseFilter
{
/** @var StatisticsFilter