diff --git a/PVE/Makefile b/PVE/Makefile index 98ae341d..5472580d 100644 --- a/PVE/Makefile +++ b/PVE/Makefile @@ -15,6 +15,7 @@ PERLSOURCE = \ APLInfo.pm \ AutoBalloon.pm \ CephTools.pm \ + Report.pm \ VZDump.pm all: pvecfg.pm ${SUBDIRS} diff --git a/PVE/Report.pm b/PVE/Report.pm new file mode 100644 index 00000000..4d15ef51 --- /dev/null +++ b/PVE/Report.pm @@ -0,0 +1,105 @@ +package PVE::Report; + +use strict; +use warnings; +use PVE::pvecfg; +use PVE::Tools; + +my $report; + +my @general = ('hostname', 'pveversion --verbose', 'cat /etc/hosts', 'top -b -n 1 | head -n 15', + 'pvesubscription get', 'lscpu'); + +my @storage = ('cat /etc/pve/storage.cfg', 'pvesm status', 'cat /etc/fstab', 'mount', 'df --human'); + +my @volumes = ('lvdisplay', 'vgdisplay', 'zpool status', 'zfs list'); + +my @machines = ('qm list', sub { dir2text('/etc/pve/qemu-server/', '\d.*conf') }); + +my @net = ('ifconfig', 'cat /etc/network/interfaces', sub { dir2text('/etc/pve/firewall/', '.*fw') }, + 'iptables-save'); + +my @cluster = ('pvecm nodes', 'pvecm status'); + +my @bios = ('dmidecode -t bios'); + +if (PVE::pvecfg::version() >= 4.0) { + push @cluster, 'cat /etc/pve/corosync.conf 2> /dev/null' ; + push @machines, sub { dir2text('/etc/pve/lxc/', '\d.*conf') }; +} else { + push @general, 'grep --max-count=1 "model name" /proc/cpuinfo'; + push @machines, sub { dir2text('/etc/pve/openvz/', '\d.*conf') }; + push @cluster, 'clustat', 'cat /etc/cluster.conf 2> /dev/null'; +} + +my $general_report = { + title => 'general system info', + commands => \@general, +}; + +my $storage_report = { + title => 'info about storage (lvm and zfs)', + commands => \@storage, +}; + +my $volume_report = { + title => 'info about virtual machines', + commands => \@machines, +}; + +my $net_report = { + title => 'info about network and firewall', + commands => \@net, +}; + +my $cluster_report = { + title => 'info about clustering', + commands => \@cluster, +}; + +my $bios_report = { + title => 'info about bios', + commands => \@bios, +}; + +my @global_report = ($general_report, $storage_report, $volume_report, $net_report, $cluster_report, $bios_report); + +# output the content of all the files of a directory +sub dir2text { + my ($target_dir, $regexp) = @_; + + PVE::Tools::dir_glob_foreach($target_dir, $regexp, sub { + my ($file) = @_; + $report .= "# cat $target_dir$file\n"; + $report .= PVE::Tools::file_get_contents($target_dir.$file)."\n"; + }); +} + +# execute commands and display their output as if they've been done on a interactive shell +# so the local sysadmin can reproduce what we're doing +sub do_execute { + my ($command) = @_; + $report .= "# $command \n"; + open (COMMAND, "$command 2>&1 |"); + while () { + $report .= $_; + } +} + +sub generate { + foreach my $subreport (@global_report) { + my $title = $subreport->{'title'}; + my @commands = @{$subreport->{'commands'}}; + + $report .= "\n==== $title ====\n"; + foreach my $command (@commands) { + if (ref $command eq 'CODE') { + &$command; + } else { + do_execute($command); + next; + } + } + } +return $report; +} diff --git a/bin/pvereport b/bin/pvereport index 0e2fb3db..e7e7f839 100755 --- a/bin/pvereport +++ b/bin/pvereport @@ -2,102 +2,11 @@ use strict; use warnings; -use PVE::pvecfg; -use PVE::Tools; +use PVE::Report; ($> == 0 ) || die "please run as root\n"; -# output the content of all the files of a directory -sub dir2text { - my ($target_dir, $regexp) = @_; - - PVE::Tools::dir_glob_foreach($target_dir, $regexp, sub { - my ($file) = @_; - print "# cat $target_dir$file\n"; - print PVE::Tools::file_get_contents($target_dir.$file)."\n"; - }); -} - -my @general = ('hostname', 'pveversion --verbose', 'cat /etc/hosts', 'top -b -n 1 | head -n 15', - 'pvesubscription get', 'lscpu'); - -my @storage = ('cat /etc/pve/storage.cfg', 'pvesm status', 'cat /etc/fstab', 'mount', 'df --human'); - -my @volumes = ('lvdisplay', 'vgdisplay', 'zpool status', 'zfs list'); - -my @machines = ('qm list', sub { dir2text('/etc/pve/qemu-server/', '\d.*conf') }); - -my @net = ('ifconfig', 'cat /etc/network/interfaces', sub { dir2text('/etc/pve/firewall/', '.*fw') }, - 'iptables-save'); - -my @cluster = ('pvecm nodes', 'pvecm status'); - -my @bios = ('dmidecode -t bios'); - -if (PVE::pvecfg::version() >= 4.0) { - push @cluster, 'cat /etc/pve/corosync.conf 2> /dev/null' ; - push @machines, sub { dir2text('/etc/pve/lxc/', '\d.*conf') }; -} else { - push @general, 'grep --max-count=1 "model name" /proc/cpuinfo'; - push @machines, sub { dir2text('/etc/pve/openvz/', '\d.*conf') }; - push @cluster, 'clustat', 'cat /etc/cluster.conf 2> /dev/null'; -} - -my $general_report = { - title => 'general system info', - commands => \@general, -}; - -my $storage_report = { - title => 'info about storage (lvm and zfs)', - commands => \@storage, -}; - -my $volume_report = { - title => 'info about virtual machines', - commands => \@machines, -}; - -my $net_report = { - title => 'info about network and firewall', - commands => \@net, -}; - -my $cluster_report = { - title => 'info about clustering', - commands => \@cluster, -}; - -my $bios_report = { - title => 'info about bios', - commands => \@bios, -}; - -my @global_report = ($general_report, $storage_report, $volume_report, $net_report, $cluster_report, $bios_report); - -# execute commands and display their output as if they've been done on a interactive shell -# so the local sysadmin can reproduce what we're doing -sub do_execute { - my ($command) = @_; - print "# $command \n"; - system $command; - print "\n"; -} - -foreach my $subreport (@global_report) { - my $title = $subreport->{'title'}; - my @commands = @{$subreport->{'commands'}}; - - print "==== ".$title." ====\n"; - foreach my $command (@commands) { - if (ref $command eq 'CODE') { - &$command; - } else { - do_execute($command); - next; - } - } -} +print PVE::Report::generate(); __END__