]> git.proxmox.com Git - pmg-api.git/blob - PMG/CLI/pmgreport.pm
improve pmgreport (add cluster info)
[pmg-api.git] / PMG / CLI / pmgreport.pm
1 package PMG::CLI::pmgreport;
2
3 use strict;
4 use Data::Dumper;
5 use Template;
6 use POSIX qw(strftime);
7
8 use PVE::INotify;
9 use PVE::CLIHandler;
10
11 use PMG::Utils;
12 use PMG::Config;
13 use PMG::RESTEnvironment;
14
15 use PMG::API2::Nodes;
16 use PMG::ClusterConfig;
17 use PMG::Cluster;
18 use PMG::API2::Cluster;
19
20 use base qw(PVE::CLIHandler);
21
22 my $nodename = PVE::INotify::nodename();
23
24 sub setup_environment {
25 PMG::RESTEnvironment->setup_default_cli_env();
26
27 my $rpcenv = PMG::RESTEnvironment->get();
28 # API /config/cluster/nodes need a ticket to connect to other nodes
29 my $ticket = PMG::Ticket::assemble_ticket('root@pam');
30 $rpcenv->set_ticket($ticket);
31 }
32
33 my $get_system_table_data = sub {
34
35 my $ni = PMG::API2::NodeInfo->status({ node => $nodename });
36
37 my $data = [];
38
39 push @$data, { text => 'Hostname', value => $nodename };
40
41 my $uptime = $ni->{uptime} ? PMG::Utils::format_uptime($ni->{uptime}) : '-';
42
43 push @$data, { text => 'Uptime', value => $uptime };
44
45 push @$data, { text => 'Version', value => $ni->{pmgversion} };
46
47 my $loadavg15 = '-';
48 if (my $d = $ni->{loadavg}) {
49 $loadavg15 = sprintf("%.2f", $d->[2]);
50 }
51 push @$data, { text => 'Load', value => $loadavg15 };
52
53 my $mem = '-';
54 if (my $d = $ni->{memory}) {
55 $mem = sprintf("%.2f%%", $d->{used}*100/$d->{total});
56 }
57 push @$data, { text => 'Memory', value => $mem };
58
59 my $disk = '-';
60 if (my $d = $ni->{rootfs}) {
61 $disk = sprintf("%.2f%%", $d->{used}*100/$d->{total});
62 }
63 push @$data, { text => 'Disk', value => $disk };
64
65 return $data
66 };
67
68 my $get_cluster_table_data = sub {
69
70 my $res = PMG::API2::Cluster->status({});
71 return undef if !scalar(@$res);
72
73 my $data = [];
74
75 foreach my $ni (@$res) {
76 my $state = 'A';
77 $state = 'S' if !$ni->{insync};
78
79 my $loadavg1 = '-';
80 if (my $d = $ni->{loadavg}) {
81 $loadavg1 = sprintf("%.2f", $d->[0]);
82 }
83
84 my $memory = '-';
85 if (my $d = $ni->{memory}) {
86 $memory = sprintf("%.2f%%", $d->{used}*100/$d->{total});
87 }
88
89 my $disk = '-';
90 if (my $d = $ni->{rootfs}) {
91 $disk = sprintf("%.2f%%", $d->{used}*100/$d->{total});
92 }
93
94 push @$data, {
95 hostname => $ni->{name},
96 ip => $ni->{ip},
97 type => $ni->{type},
98 state => $state,
99 loadavg1 => $loadavg1,
100 memory => $memory,
101 disk => $disk,
102 };
103 };
104
105 return $data;
106 };
107
108 __PACKAGE__->register_method ({
109 name => 'pmgreport',
110 path => 'pmgreport',
111 method => 'POST',
112 description => "Generate and send daily system report email.",
113 parameters => {
114 additionalProperties => 0,
115 properties => {
116 debug => {
117 description => "Debug mode. Print raw email to stdout instead of sending them.",
118 type => 'boolean',
119 optional => 1,
120 default => 0,
121 },
122 auto => {
123 description => "Auto mode. Use setting from system configuration (set when invoked fron cron).",
124 type => 'boolean',
125 optional => 1,
126 default => 0,
127 },
128 receiver => {
129 description => "Send report to this email address. Default is the administratior email address.",
130 type => 'string', format => 'email',
131 optional => 1,
132 },
133 },
134 },
135 returns => { type => 'null'},
136 code => sub {
137 my ($param) = @_;
138
139 my $fqdn = PVE::Tools::get_fqdn($nodename);
140
141 my $end = time(); # fixme
142
143 my $vars = {
144 hostname => $nodename,
145 fqdn => $fqdn,
146 date => strftime("%F", localtime($end - 1)),
147 };
148
149 my $cinfo = PMG::ClusterConfig->new();
150 my $role = $cinfo->{local}->{type} // '-';
151
152 if ($role eq '-') {
153 $vars->{system} = $get_system_table_data->();
154 } else {
155 $vars->{cluster} = $get_cluster_table_data->();
156 if ($role eq 'master') {
157 # OK
158 } else {
159 return undef if $param->{auto}; # silent exit - do not send report
160 }
161 }
162
163 my $tt = PMG::Config::get_template_toolkit();
164
165 my $cfg = PMG::Config->new();
166 my $email = $param->{receiver} // $cfg->get ('admin', 'email');
167
168 if (!defined($email)) {
169 return undef if $param->{auto}; # silent exit - do not send report
170 die "no receiver configured\n";
171 }
172
173 my $mailfrom = "Proxmox Mail Gateway <postmaster>";
174 PMG::Utils::finalize_report($tt, 'pmgreport.tt', $vars, $mailfrom, $email, $param->{debug});
175
176 return undef;
177 }});
178
179 our $cmddef = [ __PACKAGE__, 'pmgreport', [], undef ];
180
181 1;