From f0ef328db5fc34db87070dc83e3af9d382a74eed Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 13 Apr 2022 12:49:41 +0200 Subject: [statistics] Add PCI device filter option --- .../statistics/inc/statisticsfilter.inc.php | 40 ++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'modules-available/statistics/inc/statisticsfilter.inc.php') 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 -- cgit v1.2.3-55-g7522