diff options
Diffstat (limited to 'mkadvisories')
-rwxr-xr-x | mkadvisories | 221 |
1 files changed, 8 insertions, 213 deletions
diff --git a/mkadvisories b/mkadvisories index 1c957cb..7e3ec41 100755 --- a/mkadvisories +++ b/mkadvisories @@ -1,219 +1,14 @@ #!/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); -foreach my $k (keys %$etc_config) { - $config->{$k} = $etc_config->{$k}; -} - -my %basename = ( - CVE => sub { $_[0] }, - ID => sub { $_[0] }, - rel => sub { $_[0] }, - src => sub { 'src_' . $_[0] }, -); - -my %tools = ( - pkgname => sub { $_[0] =~ m/(.+)-[^-]+-[^-]+/; $1; }, -); - -my @report_logs; -sub report_log { - push @report_logs, @_; -} - -sub report_exit { - report_log($_[0]); - send_report_mail({ error => $_[0] }); - exit 1; -} - -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 publish_advisories { - my ($advdb) = @_; - foreach my $adv (keys %{$advdb->{advisories}}) { - next if $advdb->{advisories}{$adv}{status}{published}; - $advdb->{advisories}{$adv}{status}{published} = - $advdb->{advisories}{$adv}{pubtime} || time(); - save_status($advdb, $adv); - } -} - -sub sort_advisories { - my ($advdb) = @_; - foreach my $adv (keys %{$advdb->{advisories}}) { - push @{$advdb->{by_type}{$advdb->{advisories}{$adv}{type}}}, $adv; - foreach my $cve (@{$advdb->{advisories}{$adv}{CVE}}) { - push @{$advdb->{by_cve}{$cve}}, $adv; - } - foreach my $rel (keys %{$advdb->{advisories}{$adv}{src}}) { - push @{$advdb->{by_rel}{$rel}}, $adv; - foreach my $media (keys %{$advdb->{advisories}{$adv}{src}{$rel}}) { - push @{$advdb->{by_media}{$media}}, $adv; - my %pkgs; - foreach my $srpm (@{$advdb->{advisories}{$adv}{src}{$rel}{$media}}) { - my $pkgname = $tools{pkgname}->($srpm); - push @{$advdb->{by_src}{$pkgname}}, $adv - unless grep { $_ eq $adv } @{$advdb->{by_src}{$pkgname}}; - } - } - } - } -} - -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, - basename => \%basename, - tools => \%tools, - }; - process_template($template, 'advisory', $vars, $basename{ID}->($adv)); - } - foreach my $by (['rel', 'by_rel'], ['CVE', 'by_cve'], ['src', 'by_src']) { - foreach my $r (keys %{$advdb->{$by->[1]}}) { - my $vars = { - config => $config, - $by->[0] => $r, - advdb => $advdb, - basename => \%basename, - tools => \%tools, - }; - process_template($template, $by->[1], $vars, $basename{$by->[0]}->($r)); - } - } - my $vars = { - config => $config, - advdb => $advdb, - basename => \%basename, - tools => \%tools, - }; - process_template($template, 'index', $vars, 'index'); - process_template($template, 'advisories', $vars, 'advisories'); - process_template($template, 'CVE', $vars, 'CVE'); -} - -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, - basename => \%basename, - tools => \%tools, - }; - 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}); -} +use MGA::Advisories; my %advdb; -$advdb{advisories} = get_advisories(); -publish_advisories(\%advdb); -sort_advisories(\%advdb); -output_pages(\%advdb); -dumpdb(\%advdb); -send_adv_mail(\%advdb); -send_report_mail(\%advdb); +$advdb{advisories} = MGA::Advisories::get_advisories(); +MGA::Advisories::publish_advisories(\%advdb); +MGA::Advisories::sort_advisories(\%advdb); +MGA::Advisories::output_pages(\%advdb); +MGA::Advisories::dumpdb(\%advdb); +MGA::Advisories::send_adv_mail(\%advdb); +MGA::Advisories::send_report_mail(\%advdb); |