From 01c8f6fe7d289dca7360e62fec3c4c01995302c3 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Mon, 8 Apr 2019 12:25:57 +0200 Subject: [PATCH] pvereport: only comput report def if we generate a report. it's really not a good idea to start doing exec, file exist checks, ... on every module load of this, this may even hang completely differen parts if something pull us in, and confuse one completely... Signed-off-by: Thomas Lamprecht Reported-by: Wolfgang Link --- PVE/Report.pm | 156 ++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/PVE/Report.pm b/PVE/Report.pm index 77537974..1199a6d5 100644 --- a/PVE/Report.pm +++ b/PVE/Report.pm @@ -9,84 +9,82 @@ $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; my $cmd_timeout = 10; # generous timeout -# NOTE: always add new sections to the report_order array! -my $report_def = { - general => { - title => 'general system info', - cmds => [ - 'hostname', - 'pveversion --verbose', - 'cat /etc/hosts', - 'top -b -n 1 | head -n 15', - 'pvesubscription get', - 'lscpu', - 'pvesh get /cluster/resources --type node --output-format=yaml', +my $init_report_cmds = sub { + # NOTE: always add new sections to the report_order array! + my $report_def = { + general => { + title => 'general system info', + cmds => [ + 'hostname', + 'pveversion --verbose', + 'cat /etc/hosts', + 'top -b -n 1 | head -n 15', + 'pvesubscription get', + 'lscpu', + 'pvesh get /cluster/resources --type node --output-format=yaml', + ], + }, + storage => [ + 'cat /etc/pve/storage.cfg', + 'pvesm status', + 'cat /etc/fstab', + 'findmnt --ascii', + 'df --human', ], - }, - storage => [ - 'cat /etc/pve/storage.cfg', - 'pvesm status', - 'cat /etc/fstab', - 'findmnt --ascii', - 'df --human', - ], - 'virtual guests' => [ - 'qm list', - sub { dir2text('/etc/pve/qemu-server/', '\d.*conf') }, - 'pct list', - sub { dir2text('/etc/pve/lxc/', '\d.*conf') }, - ], - network => [ - 'ip -details -statistics address', - 'ip -details -4 route show', - 'ip -details -6 route show', - 'cat /etc/network/interfaces', - ], - firewall => [ - sub { dir2text('/etc/pve/firewall/', '.*fw') }, - 'cat /etc/pve/local/host.fw', - 'iptables-save', - ], - cluster => [ - 'pvecm nodes', - 'pvecm status', - 'cat /etc/pve/corosync.conf 2>/dev/null' - ], - bios => [ - 'dmidecode -t bios', - ], - pci => [ - 'lspci -nnk', - ], - disks => [ - 'lsblk --ascii', - 'ls -l /dev/disk/by-*/', - 'iscsiadm -m node', - 'iscsiadm -m session', - ], - volumes => [ - 'pvs', - 'lvs', - 'vgs', - ], + 'virtual guests' => [ + 'qm list', + sub { dir2text('/etc/pve/qemu-server/', '\d.*conf') }, + 'pct list', + sub { dir2text('/etc/pve/lxc/', '\d.*conf') }, + ], + network => [ + 'ip -details -statistics address', + 'ip -details -4 route show', + 'ip -details -6 route show', + 'cat /etc/network/interfaces', + ], + firewall => [ + sub { dir2text('/etc/pve/firewall/', '.*fw') }, + 'cat /etc/pve/local/host.fw', + 'iptables-save', + ], + cluster => [ + 'pvecm nodes', + 'pvecm status', + 'cat /etc/pve/corosync.conf 2>/dev/null' + ], + bios => [ + 'dmidecode -t bios', + ], + pci => [ + 'lspci -nnk', + ], + disks => [ + 'lsblk --ascii', + 'ls -l /dev/disk/by-*/', + 'iscsiadm -m node', + 'iscsiadm -m session', + ], + volumes => [ + 'pvs', + 'lvs', + 'vgs', + ], + }; + + push @{$report_def->{volumes}}, 'zpool status', 'zpool list -v', 'zfs list' if cmd_exists('zfs'); + + if (-e '/etc/ceph/ceph.conf') { + my $crbd = eval "`ceph osd pool ls | sed -e 's/^/echo /' | sed 'p;s/echo/rbd ls/g'`"; + push @{$report_def->{volumes}}, 'ceph status', 'ceph osd status', 'ceph df', 'pveceph status', 'pveceph lspools', $crbd; + } + + push @{$report_def->{disk}}, 'multipath -ll', 'multipath -v3' if cmd_exists('multipath'); + + return $report_def; }; -my @report_order = ('general', 'storage', 'virtual guests', 'network', -'firewall', 'cluster', 'bios', 'pci', 'disks', 'volumes'); - -push @{$report_def->{volumes}}, 'zpool status', 'zpool list -v', 'zfs list' if cmd_exists('zfs'); - - -if (-e '/etc/ceph/ceph.conf') { - my $crbd = eval "`ceph osd pool ls | sed -e 's/^/echo /' | sed 'p;s/echo/rbd ls/g'`"; - - push @{$report_def->{volumes}}, 'ceph status', 'ceph osd status', 'ceph df', 'pveceph status', 'pveceph lspools', $crbd; -} - -push @{$report_def->{disk}}, 'multipath -ll', 'multipath -v3' if cmd_exists('multipath'); - -my $report = ''; - +my $report; # output the content of all the files of a directory sub dir2text { my ($target_dir, $regexp) = @_; @@ -103,6 +101,12 @@ sub cmd_exists { system("command -v '$_[0]' > /dev/null 2>&1") == 0 } sub generate { + my $report_def = $init_report_cmds->(); + + my @report_order = ('general', 'storage', 'virtual guests', 'network', + 'firewall', 'cluster', 'bios', 'pci', 'disks', 'volumes'); + + $report = ''; my $record_output = sub { $report .= shift . "\n"; }; @@ -129,11 +133,11 @@ sub generate { $report .= "\n==== $title ====\n"; foreach my $command (@$commands) { - print STDERR "Process ".$command."..."; eval { if (ref $command eq 'CODE') { PVE::Tools::run_with_timeout($cmd_timeout, $command); } else { + print STDERR "Process ".$command."..."; $report .= "\n# $command\n"; PVE::Tools::run_command($command, %$run_cmd_params); }