diff options
Diffstat (limited to 'mkadvisories')
-rwxr-xr-x | mkadvisories | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/mkadvisories b/mkadvisories new file mode 100755 index 0000000..ac229a2 --- /dev/null +++ b/mkadvisories @@ -0,0 +1,144 @@ +#!/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); + } +} + +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); +} + +my %advdb; +$advdb{advisories} = get_advisories(); +output_pages(\%advdb); +send_adv_mail(\%advdb); +send_report_mail(\%advdb); + |