# # Monitorix - A lightweight system monitoring tool. # # Copyright (C) 2005-2022 by Jordi Sanfeliu # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # package emailreports; use strict; use warnings; use Monitorix; use MIME::Lite; use LWP::UserAgent; use Exporter 'import'; our @EXPORT = qw(emailreports_send); sub emailreports_send { my $myself = (caller(0))[3]; my ($config, $report, $when, $debug) = @_; my $emailreports = $config->{emailreports}; my $imgfmt_lc = lc($config->{image_format}); my $base_cgi = $config->{base_cgi}; my $imgs_dir = $config->{imgs_dir}; my $images; my $mime; my $subject; logger("$myself: sending $report reports."); my $uri = URI->new($emailreports->{url_prefix}); my $scheme = $uri->scheme || ""; my $userinfo = $uri->userinfo || ""; $userinfo .= "@" unless !$userinfo; my $hostname = $uri->host || ""; my $port = $uri->port || ""; my $prefix = "$scheme://$userinfo$hostname:$port"; $mime = "image/png"; $mime = "image/svg+xml" if uc($config->{image_format}) eq "SVG"; my $html = <<"EOF";
  Host:    $hostname     $report  

EOF my $html_footer = <
Copyright © 2005-2022 Jordi Sanfeliu EOF foreach (split(',', $emailreports->{$report}->{graphs})) { my $g = trim($_); my $n; my $e; my $ssl = ""; $ssl = "ssl_opts => {verify_hostname => 0}" if lc($config->{accept_selfsigned_certs}) eq "y"; # generate the graphs and get the html source my $url = $prefix . $base_cgi . "/monitorix.cgi?mode=localhost&graph=_$g&when=$when&color=white"; my $ua = LWP::UserAgent->new(timeout => 120, $ssl); $ua->agent($config->{user_agent_id}) if $config->{user_agent_id} || ""; my $response = $ua->request(HTTP::Request->new('GET', $url)); if(!$response->is_success) { logger("$myself: ERROR: Unable to connect to '$url'."); logger("$myself: " . $response->status_line); $html .= "
\n";
			$html .= $response->status_line;
			$html .= "
\n"; } my $data = $response->content; $e = 0; foreach ($data =~ //gi) { $data =~ s/\n/@@@/g; (my $graph) = $data =~ m/@@@(.*?)/; if(!$graph) { logger("$myself: unable to retrieve graphs from '$g'. It's enabled?"); next; } $graph =~ s/@@@/\n/g; $graph =~ s///g; $graph =~ s/><\/a>/>/g; # get the images my @tmp = (); $n = 1; foreach (split('\n', $graph)) { if(/"); ($url) = $_ =~ m/new($url); my $path = $uri->path || ""; $response = $ua->request(HTTP::Request->new('GET', "$prefix$path")); $images->{"image_$g$e$n.$imgfmt_lc"} = $response->content; $n++; } else { push(@tmp, $_); } } $html .= join("\n", @tmp); $html .= "
"; $data =~ s/.*?//; $e++; } } # addendum data included in report if($emailreports->{$report}->{addendum_script}) { $html .= <<"EOF"; \n"; $html .= " \n"; $html .= "
  Addendum data 
EOF

		$html .= `$emailreports->{$report}->{addendum_script}`;
		$html .= "\n";
		$html .= "  
\n"; $html .= "
\n"; } $html .= $html_footer; $subject = $emailreports->{subject_prefix} || "Monitorix:"; # create the multipart container and add attachments foreach (split(',', $emailreports->{$report}->{to})) { my $to = trim($_); my $msg = new MIME::Lite( From => $emailreports->{from_address}, To => $to, Subject => "$subject '$report' Report", Type => "multipart/related", Organization => "Monitorix", ); $msg->attach( Type => 'text/html', Data => $html, ); $msg->attach( Type => 'image/png', Id => 'image_logo', Path => $config->{base_dir} . $config->{logo_bottom}, ); while (my ($key, $val) = each(%{$images})) { $msg->attach( Type => "$mime; name=\"$key\"", Id => $key, Data => $val, ); } if(lc($emailreports->{method} || "") eq "relay") { $msg->send(); } else { $msg->send('smtp', $emailreports->{smtp_hostname}, Timeout => 60); } logger("\t$myself: to: $to") if $debug; } } 1;