Skip to content

Commit 03af48e

Browse files
committed
fix: Update getProcesses() API to filter processes on regexp and/or same namespace
Refacto related usage
1 parent 21f9863 commit 03af48e

File tree

6 files changed

+75
-26
lines changed

6 files changed

+75
-26
lines changed

Changes

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ inventory:
3333
* fix #811: Fix network interface inventory on lxc linux container, but also fix
3434
few other cases where more interfaces are found due to interface name aliasing
3535
* Fix --partial option when used with glpi-agent script
36+
* Update getProcesses() API to permit filtering and report processes only in the same
37+
namespace to not list containers processes. Refacto inventory module using this API.
3638

3739
remoteinventory:
3840
* Store remote inventory part checksums in dedicated state files and support maintenance

lib/GLPI/Agent/Task/Inventory/Generic/Databases/Oracle.pm

+5-2
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,11 @@ sub _runSql {
379379
my $env = "";
380380
if ($ENV{ORACLE_SID}) {
381381
# Get instance asm_pmon process
382-
my ($asm_pmon) = grep { $_->{CMD} =~ /^asm_pmon_$ENV{ORACLE_SID}/ }
383-
getProcesses(logger => $params{logger});
382+
my ($asm_pmon) = getProcesses(
383+
namespace => "same",
384+
filter => qr/^asm_pmon_$ENV{ORACLE_SID}/,
385+
logger => $params{logger}
386+
);
384387
$user = $asm_pmon->{USER} if $asm_pmon;
385388
$env = "ORACLE_SID=$ENV{ORACLE_SID}";
386389
}

lib/GLPI/Agent/Task/Inventory/Generic/Drives/ASM.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use GLPI::Agent::Tools::Unix;
1010

1111
sub isEnabled {
1212
return 0 if OSNAME eq 'MSWin32';
13-
return grep { $_->{CMD} =~ /^asm_pmon/ } getProcesses();
13+
return scalar(getProcesses(filter => qr/^asm_pmon/, namespace => "same"));
1414
}
1515

1616
sub doInventory {
@@ -20,7 +20,7 @@ sub doInventory {
2020
my $logger = $params{logger};
2121

2222
# First get asm_pmon process
23-
my ($asm_pmon) = grep { $_->{CMD} =~ /^asm_pmon/ } getProcesses(logger => $logger)
23+
my ($asm_pmon) = getProcesses(filter => qr/^asm_pmon/, namespace => "same", logger => $logger)
2424
or return;
2525

2626
my $user = $asm_pmon->{USER};

lib/GLPI/Agent/Task/Inventory/Linux/Videos.pm

+7-6
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ sub doInventory {
4646
my $xorgData;
4747

4848
my $xorgPid;
49-
foreach my $process (getProcesses(logger => $logger)) {
50-
next unless $process->{CMD} =~ m{
49+
my ($process) = getProcesses(
50+
namespace => "same",
51+
logger => $logger,
52+
filter => qr{
5153
^
5254
(?:
5355
/usr/bin
@@ -59,10 +61,9 @@ sub doInventory {
5961
/usr/libexec
6062
)
6163
/X
62-
}x;
63-
$xorgPid = $process->{PID};
64-
last;
65-
}
64+
}x
65+
);
66+
$xorgPid = $process->{PID} if $process;
6667

6768
if ($xorgPid) {
6869
my $fd = 0;

lib/GLPI/Agent/Task/Inventory/Virtualization/Qemu.pm

+6-4
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@ sub doInventory {
7373
my $inventory = $params{inventory};
7474
my $logger = $params{logger};
7575

76-
foreach my $process (getProcesses(logger => $logger)) {
77-
# match only if an qemu instance
78-
next if $process->{CMD} =~ /^\[/;
79-
next if $process->{CMD} !~ /(qemu|kvm|qemu-kvm|qemu-system\S+) .*\S/x;
76+
# check only qemu instances
77+
foreach my $process (getProcesses(
78+
filter => qr/(qemu|kvm|qemu-kvm|qemu-system\S+) .*\S/x,
79+
namespace => "same",
80+
logger => $logger,
81+
)) {
8082

8183
# Don't inventory qemu guest agent as a virtualmachine
8284
next if $process->{CMD} =~ /qemu-ga/;

lib/GLPI/Agent/Tools/Unix.pm

+53-12
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,29 @@ sub _getProcessesBusybox {
293293
return @processes;
294294
}
295295

296+
my $qrProcessWithNameSpace = qr/^ \s*
297+
(\S+) \s+
298+
(\S+) \s+
299+
(\S+) \s+
300+
(\S+) \s+
301+
(\S+) \s+
302+
(\S+) \s+
303+
(\S+) \s+
304+
(\S+) \s+
305+
(\S.*\S)
306+
/x;
307+
308+
my $qrProcessWithoutNameSpace = qr/^ \s*
309+
(\S+) \s+
310+
(\S+) \s+
311+
(\S+) \s+
312+
(\S+) \s+
313+
(\S+) \s+
314+
(\S+) \s+
315+
(\S+) \s+
316+
(\S.*\S)
317+
/x;
318+
296319
sub _getProcessesOther {
297320
my (%params) = (
298321
command =>
@@ -301,6 +324,29 @@ sub _getProcessesOther {
301324
@_
302325
);
303326

327+
# Support a parameter to only keep processes from the same namespace
328+
# Useful to exclude processes from docker or lxc containers on linux
329+
my $sameNameSpace = delete $params{namespace} // "";
330+
if (OSNAME eq "solaris") {
331+
$sameNameSpace = 0;
332+
} elsif ($sameNameSpace && $sameNameSpace eq "same") {
333+
# Extract namespace number from the system first process
334+
$sameNameSpace = getFirstLine(command => "ps --no-headers -o cgroupns 1", logger => $params{logger});
335+
if ($sameNameSpace && $sameNameSpace =~ /^\d+$/) {
336+
$sameNameSpace = int($sameNameSpace);
337+
$params{command} = "ps -A -o user,pid,pcpu,pmem,vsz,tty,etime,cgroupns,command";
338+
} else {
339+
$sameNameSpace = 0;
340+
}
341+
} else {
342+
$sameNameSpace = 0;
343+
}
344+
345+
my $filter = delete $params{filter};
346+
$filter = 0 unless ref($filter) eq "Regexp";
347+
348+
my $qrLine = $sameNameSpace ? $qrProcessWithNameSpace : $qrProcessWithoutNameSpace;
349+
304350
my @lines = getAllLines(%params)
305351
or return;
306352

@@ -314,17 +360,7 @@ sub _getProcessesOther {
314360

315361
foreach my $line (@lines) {
316362

317-
next unless $line =~
318-
/^ \s*
319-
(\S+) \s+
320-
(\S+) \s+
321-
(\S+) \s+
322-
(\S+) \s+
323-
(\S+) \s+
324-
(\S+) \s+
325-
(\S+) \s+
326-
(\S.*\S)
327-
/x;
363+
next unless $line =~ $qrLine;
328364

329365
my $user = $1;
330366
my $pid = $2;
@@ -333,7 +369,12 @@ sub _getProcessesOther {
333369
my $vsz = $5;
334370
my $tty = $6;
335371
my $etime = $7;
336-
my $cmd = $8;
372+
my $ns = $sameNameSpace ? $8 : 0;
373+
my $cmd = $sameNameSpace ? $9 : $8;
374+
375+
next if $sameNameSpace && $ns && $ns =~ /^\d+$/ && int($ns) != $sameNameSpace;
376+
377+
next if $filter && $cmd !~ $filter;
337378

338379
push @processes, {
339380
USER => $user,

0 commit comments

Comments
 (0)