[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: some parse-advisory.pl updates (was: DSA listings on http://www.debian.org/ are out of date)



On Sun, Apr 27, 2008 at 12:28:31PM +0200, Joey Schulze wrote:
> Simon Paillard wrote:
> > On Sun, Apr 27, 2008 at 11:28:39AM +0200, Joey Schulze wrote:
> > > > On Friday 11 April 2008 12:40, Simon Paillard wrote:
> > Because it has not reached the archive yet I guess.
> > I will add a warning like "Not available yet on lists.debian.org. Please
> > retry in a few minutes"
> 
> Oh, that's how it works...
> 
> That'll create a chicken-and-egg problem.
> 
> /security/ rebuild is triggered by the distributed mail from the list
> for those who commit to CVS.  That won't work if the commit happens
> after the website has been updated.

I'm not sure to understand: you mean that it is usefull for you to be
able to produce the wml before the mail version has been distributed ?

In any case, I've changed parse-advisory a bit, so that it doesn't stop
in case the DSA is not yet mail-archived, and in that case it will print
a warning and let the user fix the link in the .data file by himself.

Tell me if that meets your needs.

-- 
Simon Paillard
Index: parse-advisory.pl
===================================================================
RCS file: /cvs/webwml/webwml/english/security/parse-advisory.pl,v
retrieving revision 1.68
diff -u -r1.68 parse-advisory.pl
--- parse-advisory.pl	27 Apr 2008 11:20:18 -0000	1.68
+++ parse-advisory.pl	27 Apr 2008 12:22:56 -0000
@@ -171,7 +171,19 @@
 
 my $mech = WWW::Mechanize->new();
 $mech->get( $mlURL );
-$dsaLink = ($mech->find_link( text_regex => qr/$dsa_number-$dsa_revision/ ))->url_abs();
+
+my $link_object = ($mech->find_link( text_regex => qr/$dsa_number-$dsa_revision/ )) ;
+
+if (defined $link_object) {
+    $dsaLink = $link_object->url_abs() ;
+}
+else {
+    $dsaLink = $mlURL ;
+    print "DSA $dsa_number-$dsa_revision has not reached $mlURL yet.\n";
+    print "Please edit the link yourself or try again later.\n" ;
+}
+
+# $dsaLink = ($mech->find_link( text_regex => qr/$dsa_number-$dsa_revision/ ))->url_abs() || $mlURL ;
 
 $files =~ s,^</dl>\n\n,,;
 open DATA, ">$data";
#!/usr/bin/perl
#
# parse-advisory.pl
#
# this script parses files in
# security.debian.org:/org/security.debian.org/advisories/DSA/
# and makes wmls out of them
# 
# Copyright (C) 2001 Josip Rodin
# Copyright (c) 2002,3 Josip Rodin, Martin Schulze
# Licensed under the GNU General Public License version 2.

use WWW::Mechanize;

my $debug = 0;
my $adv = $ARGV[0];
if ($adv eq "-d") {
    $debug = 1;
    $adv = $ARGV[1];
}

$adv || die "you must specify a parameter (original advisory file)!\n";
die "that advisory file either ain't there or doesn't have anything in it!\n" unless -s $adv;

# i'm lame, so shoot me
my %longmoy = (	en => [ 
  'January', 'February', 'March', 'April', 'May', 'June',
  'July', 'August', 'September', 'October', 'November', 'December' ]
);

my $curyear = (localtime())[5] + 1900;
my $mlURL = "http://lists.debian.org/debian-security-announce/debian-security-announce-$curyear/";;

my %arch = (
	    'alpha'   => 'Alpha',
	    'amd64'   => 'AMD64',
	    'hppa'    => 'HP Precision',
	    'i386'    => 'Intel IA-32',
	    'ia64'    => 'Intel IA-64',
	    'm68k'    => 'Motorola 680x0',
	    'mips'    => 'Big-endian MIPS',
	    'mipsel'  => 'Little-endian MIPS',
	    's390'    => 'IBM S/390',
	    'sparc'   => 'Sun Sparc',
	    'powerpc' => 'PowerPC',
	    'arm'     => 'ARM',
	    );

open ADV, $adv;
foreach $l (<ADV>) {
  if ($l =~ /^Debian Security Advisory (DSA[- ]\d+-\d+)/) {
    $dsa = $1;
  }
  if ($l =~ /^(\w+)\s+(\d+)(\D\D)?, (\d+)/) {
    $month = $1; $day = $2; $year = $4;
    while ($i < 12) {
      if ($month eq $longmoy{en}[$i]) {
        $month = $i + 1;
        $date = "$year-$month-$day";
        $i = 12;
      }
      $i++
    }
  }
  if ($l =~ /^Package\s*: (.+)/) {
    $package = $1;
  }
  if ($l =~ /^(Vulnerability)\s*: (.+)/) {
    $desc = $2;
    $desc .= ' vulnerabilities' if $desc =~ /(several|multiple)\s*$/;
  }
  if ($l =~ /^(Debian Bugs?)\s*: (.+)/i) {
      for $id (split (/,? /, $2)) {
	  push @dbids, "Bug#".$id;
      }
  }
  if ($l =~ /^(CVE (names?|id\(?s?\)?|references?)?|CERT advisor(y|ies))\s*: (.+)/i) {
    push @dbids, join (" ", split (/,? /, $4));
  }
  if ($l =~ /^\s+((?:CVE-\d+-\d+[ ]*)+)$/i) {
    push @dbids, join (" ", split (/,? /, $1));
  }
  if ($l =~ /^\s+((?:VU#\d+[ ]*)+)$/i) {
    push @dbids, join (" ", split (/,? /, $1));
  }
  if ($l =~ /^Bugtraq Ids?\s*: (.+)/i) {
      for $id (split (/,? /, $1)) {
	  push @dbids, "BID".$id;
      }
  }
  $mi = 0 if ($l =~ /^(wget url|Obtaining updates|Upgrade Instructions)/i);
  $moreinfo .= "<p>" if ($mi && $nl);
  $nl = 0;
  $nl = 1 if ($mi && ($l eq "\n") && $moreinfo);
  if ($mi) {
    if ($mi > 1) {
      $moreinfo .= $l;
    } else {
      $moreinfo .= "\n<p>".$l;
      $mi++;
    }
  }
  $headersnearingend++ if ($l =~ /^Debian-specific:/);
  if ($headersnearingend && $l !~ /^.{15}:.*$/) {
    $mi++;
    $headersnearingend = 0;
  }

  $f++ if ($l =~ /^Debian (GNU\/Linux.*alias|.*\(.*\)).*/);
  $f = 0 if ($l =~ /^((- )?-- |(  )?These (files|packages) will (probably )?be moved)/);
  $files .= $l if ($f);
}
close ADV;


$moreinfo =~ s/(- )?-+\n//g;
$moreinfo =~ s/\n\n$/\n/s;
$moreinfo =~ s/\n<p>\n$//;
$moreinfo =~ s/\n\n/<\/p>\n\n/sg;
$moreinfo =~ s|\n<p>((CAN\|CVE)-\d+-\d+[^\n]*)</p>\n|\n<li>$1\n|g;
$moreinfo =~ s|((CAN\|CVE)-\d+-\d+)|<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=$1";>$1</a>|g;
$moreinfo =~ s|<p>(\s+)|$1<p>|g;
$moreinfo =~ s|<p><p>|<p>|g;
$moreinfo =~ s|</p>\n\n<li>|</p></li>\n\n<li>|g;
$moreinfo =~ s|</li>\n\n<li>|\n\n<ul>\n\n<li>|;
#$moreinfo =~ s|</p>\n\n<p>(\w* \w* stable)|</p></li>\n\n</ul>\n\n<p>$1|; 
if ($moreinfo =~ /<ul>\n\n<li>/) { $moreinfo =~ s|</p>\n\n<p>(\w+ \w+ \w* ?(stable\|testing))|</p></li>\n\n</ul>\n\n<p>$1|; }
chomp ($moreinfo);
$files =~ s/(- )?-+\n//g;
$files =~ s/\n\n$/\n/s;

$files =~ s/.+ updates are available for .+\n//g;

$files =~ s/(  )?    (Size\/)?MD5 checksum: (\s*\d+ )?\w{32}\n//sg;
$files =~ s/(  )?Source archives:/<dt><source \/>/sg;
$files =~ s/(  )?Architecture.independent \w+:\n/<dt><arch-indep \/>\n/sg;
$files =~ s/HP Precision architecture/HPPA architecture/gi;
$files =~ s/(?:  )?(\w+) architecture \(([\w -()\/]+)\)/<dt>$arch{$1}:/sg;
$files =~ s/(?:  )?([\w -\/]+) architecture:/<dt>$1:/sg;
$files =~ s/(?:  )?  (http:\S+)/  <dd><fileurl $1 \/>/sg;
$files =~ s,[\n]?Debian (GNU/Linux )?(\S+) (alias |\()([a-z]+)\)?,</dl>\n\n<h3>Debian GNU/Linux $2 ($4)</h3>\n\n<dl>,sg;

my @f = ();
my $ign = 0;
foreach $_ (split (/\n/, $files)) {
    if (!$ign && /was released/) {
	$ign = 1;
    } elsif ($ign && /^$/) {
	$ign = 0;
    } elsif (!$ign) {
	push (@f, $_);
    }
}
$files = join ("\n", @f);

if (defined($package) && $dsa =~ /DSA[- ](\d+)-(\d+)/ ) {
    $dsa_number=$1;
    $dsa_revision=$2;
    $wml = "$curyear/dsa-$dsa_number.wml";
    $data = "$curyear/dsa-$dsa_number.data";
    $pagetitle = "DSA-$dsa_number-$dsa_revision $package";
} else {
    die ("Could not parse advisory filename '$adv'. Must contain Package and DSA number information");
}
$data = $wml = "-" if ($debug);

die "directory $curyear does not exist!\n" if (!(-d $curyear));
die "$wml already exists!\n" if (-f $wml);
die "$data already exists!\n" if (-f $data);


my $mech = WWW::Mechanize->new();
$mech->get( $mlURL );

my $link_object = ($mech->find_link( text_regex => qr/$dsa_number-$dsa_revision/ )) ;

if (defined $link_object) {
    $dsaLink = $link_object->url_abs() ;
}
else {
    $dsaLink = $mlURL ;
    print "DSA $dsa_number-$dsa_revision has not reached $mlURL yet.\n";
    print "Please edit the link yourself or try again later.\n" ;
}

# $dsaLink = ($mech->find_link( text_regex => qr/$dsa_number-$dsa_revision/ ))->url_abs() || $mlURL ;

$files =~ s,^</dl>\n\n,,;
open DATA, ">$data";
print DATA "<define-tag pagetitle>$pagetitle</define-tag>\n";
print DATA "<define-tag report_date>$date</define-tag>\n";
print DATA "<define-tag secrefs>@dbids</define-tag>\n" if @dbids;
print DATA "<define-tag packages>$package</define-tag>\n";
print DATA "<define-tag isvulnerable>yes</define-tag>\n";
print DATA "<define-tag fixed>yes</define-tag>\n";
print DATA "\n#use wml::debian::security\n\n";
print DATA "$files\n\n</dl>\n";
print DATA "\n<p><md5sums $dsaLink /></p>\n";
close DATA;

open WML, ">$wml";
print WML "<define-tag description>$desc</define-tag>\n";
print WML "<define-tag moreinfo>$moreinfo</p>\n</define-tag>\n";
print WML "\n# do not modify the following line\n";
print WML "#include \"\$(ENGLISHDIR)/security/$data\"\n";
printf WML "# %sId: \$\n", "\$";
close WML;

print "Now edit $data and remove any English-specific stuff from it.\n";

Reply to: