#!/usr/bin/perl -w use strict; use YAML qw(LoadFile DumpFile); use Template; use DateTime; use Email::Sender::Simple qw(try_to_sendmail); use Email::Simple; use Email::Simple::Creator; #use Data::Dump qw(dd); my $config_file = '/usr/share/mga-advisories/config'; my $config = LoadFile($ENV{MGAADV_CONF} || $config_file); my $etc_config_file = '/etc/mga-advisories.conf'; my $etc_config = LoadFile($etc_config_file); my @report_logs; sub report_log { push @report_logs, @_; } sub report_exit { report_log($_[0]); send_report_mail({ error => $_[0] }); exit 1; } foreach my $k (keys %$etc_config) { $config->{$k} = $etc_config->{$k}; } sub status_file { $config->{status_dir} . '/' . $_[0]; } sub save_status { my ($advdb, $adv) = @_; my $statusfile = status_file($adv); DumpFile($statusfile, $advdb->{advisories}{$adv}{status}); } sub get_advisories { my %advisories; foreach my $advfile (glob "$config->{advisories_dir}/*.adv") { my $adv = LoadFile($advfile); next unless $adv->{ID}; report_exit("Duplicate advisory $adv->{ID}") if $advisories{$adv->{ID}}; $advisories{$adv->{ID}} = $adv; my $statusfile = status_file($adv->{ID}); $adv->{status} = -f $statusfile ? LoadFile($statusfile) : {}; } return \%advisories; } sub process_template { my ($template, $src, $vars, $dest, $ext) = @_; foreach my $extension ($ext ? $ext : @{$config->{output_format}}) { next unless -f "$config->{tmpl_dir}/$src.$extension"; $template->process("$src.$extension", $vars, ref $dest ? $dest : "$dest.$extension") || die $template->error, "\n"; } } sub output_pages { my ($advdb) = @_; my $template = Template->new( INCLUDE_PATH => $config->{tmpl_dir}, OUTPUT_PATH => $config->{out_dir}, ); foreach my $adv (keys %{$advdb->{advisories}}) { my $vars = { config => $config, advisory => $adv, advdb => $advdb, }; process_template($template, 'advisory', $vars, $adv); } my $vars = { config => $config, advdb => $advdb, }; process_template($template, 'index', $vars, 'index'); } sub send_adv_mail { my ($advdb) = @_; return unless $config->{send_adv_mail} eq 'yes'; my $template = Template->new( INCLUDE_PATH => $config->{tmpl_dir}, ); foreach my $adv (keys %{$advdb->{advisories}}) { next if $advdb->{advisories}{$adv}{status}{mail_sent}; my $mailcontent; my $vars = { config => $config, advisory => $adv, advdb => $advdb, }; process_template($template, 'advisory', $vars, \$mailcontent, 'txt'); my $email = Email::Simple->create( header => [ To => $config->{adv_mail_to}, From => $config->{adv_mail_from}, Subject => "$adv: " . $advdb->{advisories}{$adv}{subject}, ], body => $mailcontent ); if (try_to_sendmail($email)) { report_log("Advisory mail for $adv sent"); $advdb->{advisories}{$adv}{status}{mail_sent} = time(); save_status($advdb, $adv); } else { report_log("Error sending advisory mail $adv"); } } } sub send_report_mail { my ($advdb) = @_; return unless $config->{send_report_mail} eq 'yes'; return unless @report_logs; my $template = Template->new( INCLUDE_PATH => $config->{tmpl_dir}, ); my $mailcontent; my $vars = { config => $config, advdb => $advdb, report_logs => \@report_logs, }; process_template($template, 'report', $vars, \$mailcontent, 'txt'); my $email = Email::Simple->create( header => [ To => $config->{report_mail_to}, From => $config->{report_mail_from}, Subject => $advdb->{error} ? 'Advisories Error' : 'Advisories Update', ], body => $mailcontent ); try_to_sendmail($email); } sub dumpdb { my ($advdb) = @_; DumpFile($config->{out_dir} . '/advisories.yaml', $advdb->{advisories}); } my %advdb; $advdb{advisories} = get_advisories(); output_pages(\%advdb); dumpdb(\%advdb); send_adv_mail(\%advdb); send_report_mail(\%advdb);