]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/Debian.pl
typo
[infobot.git] / src / Modules / Debian.pl
index f2e50f076ea587a3c3c0b1814f33e6ab1409ca04..d7fbdf0f972c8159d339b172423449c6588c66a6 100644 (file)
@@ -1,7 +1,7 @@
 #
 #   Debian.pl: Frontend to debian contents and packages files
 #      Author: dms
-#     Version: v0.7b (20000527)
+#     Version: v0.8 (20000918)
 #     Created: 20000106
 #
 
@@ -10,21 +10,25 @@ package Debian;
 use strict;
 
 # format: "alias=real".
+my $announce   = 0;
 my $defaultdist        = "woody";
 my %dists      = (
        "unstable"      => "woody",
-       "frozen"        => "potato",
-       "stable"        => "slink",
+       "stable"        => "potato",
        "incoming"      => "incoming",
+       "slink"         => "archive-2.1",
+       "hamm"          => "archive-2.0",
+       "rex"           => "archive-1.?",
+       "bo"            => "archive-1.?",
 );
 
 my %urlcontents = (
        "debian/Contents-##DIST-i386.gz" =>
                "ftp://ftp.us.debian.org".
-               "/debian/dists/##DIST/Contents-i386.gz",
+               "/debian/dists/##DIST/Contents-i386.gz", #woody = BROKEN
 
        "debian/Contents-##DIST-i386-non-US.gz" =>
-               "ftp://non-us.debian.org".
+               "ftp://ftp.ca.debian.org".
                "/debian-non-US/dists/##DIST/non-US/Contents-i386.gz",
 );
 
@@ -38,9 +42,16 @@ my %urlpackages = (
        "debian/Packages-##DIST-non-free-i386.gz" =>
                "ftp://ftp.us.debian.org".
                "/debian/dists/##DIST/non-free/binary-i386/Packages.gz",
-       "debian/Packages-##DIST-non-US-i386.gz" =>
-               "ftp://non-us.debian.org".
-               "/debian-non-US/dists/##DIST/non-US/binary-i386/Packages.gz",
+
+       "debian/Packages-##DIST-non-US-main-i386.gz" =>
+               "ftp://ftp.ca.debian.org".
+               "/debian-non-US/dists/##DIST/non-US/main/binary-i386/Packages.gz",
+       "debian/Packages-##DIST-non-US-contrib-i386.gz" =>
+               "ftp://ftp.ca.debian.org".
+               "/debian-non-US/dists/##DIST/non-US/contrib/binary-i386/Packages.gz",
+       "debian/Packages-##DIST-non-US-non-free-i386.gz" =>
+               "ftp://ftp.ca.debian.org".
+               "/debian-non-US/dists/##DIST/non-US/non-free/binary-i386/Packages.gz",
 );
 
 #####################
@@ -55,18 +66,15 @@ sub DebianDownload {
     my $bad    = 0;
     my $good   = 0;
 
-    &main::status("Debian: Downloading files for '$dist'.");
-
     if (! -d "debian/") {
        &main::status("Debian: creating debian dir.");
        mkdir("debian/",0755);
     }
 
-    %urls = &fixNonUS($dist, %urls);
-
     # fe dists.
     # Download the files.
     my $file;
+##    my %ret;
     foreach $file (keys %urls) {
        my $url = $urls{$file};
        $url  =~ s/##DIST/$dist/g;
@@ -77,14 +85,16 @@ sub DebianDownload {
            my $last_refresh = (stat($file))[9];
            $update++ if (time() - $last_refresh > $refresh);
        } else {
-           &main::DEBUG("Debian: local '$file' does not exist.");
            $update++;
        }
 
        next unless ($update);
 
-       if ($good + $bad == 0) {
+       &main::DEBUG("announce == $announce.");
+       if ($good + $bad == 0 and !$announce) {
+           &main::status("Debian: Downloading files for '$dist'.");
            &main::msg($main::who, "Updating debian files... please wait.");
+           $announce++;
        }
 
        if (exists $main::debian{$url}) {
@@ -98,8 +108,15 @@ sub DebianDownload {
 
            # error internally to ftp.
            # hope it doesn't do anything bad.
+           if ($file =~ /Contents-woody-i386-non-US/) {
+               &main::DEBUG("Skipping Contents-woody-i386-non-US.");
+               $file =~ s/woody/potato/;
+               $path =~ s/woody/potato/;
+###            next;
+           }
+
            if (!&main::ftpGet($host,$path,$thisfile,$file)) {
-               &main::DEBUG("deb: down: ftpGet: bad.");
+               &main::DEBUG("deb: down: ftpGet($host,$path,$thisfile,$file) == BAD.");
                $bad++;
                next;
            }
@@ -110,7 +127,13 @@ sub DebianDownload {
                next;
            }
 
+           if ($file =~ /Contents-potato-i386-non-US/) {
+               &main::DEBUG("hack: using potato's non-US contents for woody.");
+               system("cp debian/Contents-potato-i386-non-US.gz debian/Contents-woody-i386-non-US.gz");
+           }
+
            &main::DEBUG("deb: download: good.");
+##         $ret{$
            $good++;
        } else {
            &main::ERROR("Debian: invalid format of url => ($url).");
@@ -144,7 +167,7 @@ sub searchContents {
     ### larne's regex.
     # $query = $query.'(\.so\.)?([.[[:digit:]]+\.]+)?$';
 
-    $query =~ s/\\([\^\$])/$1/g;
+    $query =~ s/\\([\^\$])/$1/g;       # hrm?
     $query =~ s/^\s+|\s+$//g;
     $query =~ s/\*/\\S*/g;             # does it even work?
 
@@ -161,8 +184,7 @@ sub searchContents {
        # download contents file.
        &main::DEBUG("deb: download 1.");
        if (!&DebianDownload($dist, %urls)) {
-           &main::ERROR("Debian: could not download files.");
-           return;
+           &main::WARN("Debian: could not download files.");
        }
     }
 
@@ -171,10 +193,37 @@ sub searchContents {
 
     my $found = 0;
     my %contents;
-    my $search = "$query.*\[ \t]";
-    my $files = join(' ', keys %urlcontents);
-    $files =~ s/##DIST/$dist/g;
+    my $search;
+    my $front = 0;
+    ### TODO: search properly if /usr/bin/blah is done.
+    if ($query =~ s/\$$//) {
+       &main::DEBUG("search-regex found.");
+       $search = "$query\[ \t]";
+    } elsif ($query =~ s/^\^//) {
+       &main::DEBUG("front marker regex found.");
+       $front = 1;
+       $search = $query;
+    } else {
+       $search = "$query.*\[ \t]";
+    }
+
+    my @files;
+    foreach (keys %urlcontents) {
+       s/##DIST/$dist/g;
+
+       next unless ( -f $_);
+       push(@files,$_);
+    }
+
+    if (!scalar @files) {
+       &main::ERROR("sC: no files?");
+       &main::msg($main::who, "failed.");
+       return;
+    }
+
+    my $files = join(' ', @files);
 
+    &main::status("search regex => '$search'.");
     open(IN,"zegrep -h '$search' $files |");
     while (<IN>) {
        if (/^\.?\/?(.*?)[\t\s]+(\S+)\n$/) {
@@ -186,6 +235,7 @@ sub searchContents {
                next unless ($basename =~ /\Q$query\E/);
            }
            next if ($query !~ /\.\d\.gz/ and $file =~ /\/man\//);
+           next if ($front and $file !~ /^\/\Q$query\E/);
 
            $contents{$package}{$file} = 1;
            $found++;
@@ -230,7 +280,7 @@ sub searchContents {
        return;
     }
 
-    &main::status("Debian: $found results.");
+    &main::status("Debian: $found contents results found.");
 
     my @list;
     foreach $pkg (keys %contents) {
@@ -250,7 +300,12 @@ sub searchContents {
     &main::status(sprintf("Debian: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0);
 
     my $prefix = "Debian Search of '$query' ";
-    &main::performStrictReply( &main::formListReply(0, $prefix, @list) );
+    if (scalar @list) {        # @list.
+       &main::performStrictReply( &main::formListReply(0, $prefix, @list) );
+    } else {           # !@list.
+       &main::DEBUG("ok, !\@list, searching desc for '$query'.");
+       &searchDesc($query);
+    }
 }
 
 ####
@@ -267,10 +322,6 @@ sub searchAuthor {
     my $files;
     my ($bad,$good) = (0,0);
     my %urls = %urlpackages;
-    ### potato now has the "new" non-US tree like woody does.
-    if ($dist =~ /^(woody|potato)$/) {
-       %urls = &fixNonUS($dist, %urlpackages);
-    }
 
     foreach (keys %urlpackages) {
        s/##DIST/$dist/g;
@@ -301,8 +352,14 @@ sub searchAuthor {
        if (/^Package: (\S+)$/) {
            $package = $1;
        } elsif (/^Maintainer: (.*) \<(\S+)\>$/) {
-           $maint{$1}{$2} = 1;
-           $pkg{$1}{$package} = 1;
+           my($name,$email) = ($1,$2);
+           if ($package eq "") {
+               &main::DEBUG("sA: package == NULL.");
+               next;
+           }
+           $maint{$name}{$email} = 1;
+           $pkg{$name}{$package} = 1;
+           $package = "";
        } else {
            &main::WARN("invalid line: '$_'.");
        }
@@ -348,6 +405,81 @@ sub searchAuthor {
     &main::performStrictReply( &main::formListReply(0, $prefix, @pkg) );
 }
 
+####
+# Usage: &searchDesc($query);
+sub searchDesc {
+    my ($dist, $query) = &getDistroFromStr($_[0]);
+    &main::DEBUG("searchDesc: dist => '$dist', query => '$query'.");
+    $query =~ s/^\s+|\s+$//g;
+
+    # start of search.
+    my $start_time = &main::gettimeofday();
+    &main::status("Debian: starting desc search.");
+
+    my $files;
+    my ($bad,$good) = (0,0);
+    my %urls = %urlpackages;
+
+    foreach (keys %urlpackages) {
+       s/##DIST/$dist/g;
+
+       if (! -f $_) {
+           $bad++;
+           next;
+       }
+
+       $good++;
+       $files .= " ".$_;
+    }
+
+    &main::DEBUG("good = $good, bad = $bad...");
+
+    if ($good == 0 and $bad != 0) {
+       my %urls = &fixDist($dist, %urlpackages);
+       &main::DEBUG("deb: download 2c.");
+       if (!&DebianDownload($dist, %urls)) {
+           &main::ERROR("Debian(sD): could not download files.");
+           return;
+       }
+    }
+
+    my (%desc, $package);
+    open(IN,"zegrep -h '^Package|^Description' $files |");
+    while (<IN>) {
+       if (/^Package: (\S+)$/) {
+           $package = $1;
+       } elsif (/^Description: (.*)$/) {
+           my $desc = $1;
+           next unless ($desc =~ /\Q$query\E/i);
+           if ($package eq "") {
+               &main::WARN("sD: package == NULL?");
+               next;
+           }
+           $desc{$package} = $desc;
+           $package = "";
+       } else {
+           &main::WARN("invalid line: '$_'.");
+       }
+    }
+    close IN;
+
+    my @list = keys %desc;
+    if (!scalar @list) {
+       my $prefix = "Debian Desc Search of '$query' ";
+       &main::performStrictReply( &main::formListReply(0, $prefix, ) );
+    } elsif (scalar @list == 1) {      # list = 1.
+       &main::DEBUG("list == 1; showing package info of '$list[0]'.");
+       &infoPackages("info", $list[0]);
+    } else {                           # list > 1.
+       my $prefix = "Debian Desc Search of '$query' ";
+       &main::performStrictReply( &main::formListReply(0, $prefix, @list) );
+    }
+
+    # show how long it took.
+    my $delta_time = &main::gettimeofday() - $start_time;
+    &main::status(sprintf("Debian: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0);
+}
+
 ####
 # Usage: &generateIncoming();
 sub generateIncoming {
@@ -356,7 +488,7 @@ sub generateIncoming {
     my $idxfile  = $pkgfile.".idx";
     my $stale   = 0;
     $stale++ if (&main::isStale($pkgfile.".gz", $interval));
-    $stale++ if (&main::isStale($idxfile.".gz", $interval));
+    $stale++ if (&main::isStale($idxfile, $interval));
     &main::DEBUG("gI: stale => '$stale'.");
     return 0 unless ($stale);
 
@@ -442,7 +574,7 @@ sub getPackageInfo {
                $pkg{'section'}         = $1;
            } elsif (/^Size: (.*)$/) {
                $pkg{'size'}            = $1;
-           } elsif (/^i.*size: (.*)$/) {
+           } elsif (/^Installed-Size: (.*)$/i) {
                $pkg{'installed'}       = $1;
            } elsif (/^Description: (.*)$/) {
                $pkg{'desc'}            = $1;
@@ -646,7 +778,7 @@ sub infoStats {
            } elsif (/^Size: (.*)$/) {          # compressed size.
                $stats{$file}{'csize'}  += $1;
                $total{'csize'}         += $1;
-           } elsif (/^i.*size: (.*)$/) {       # installed size.
+           } elsif (/^i.*size: (.*)$/i) {      # installed size.
                $stats{$file}{'isize'}  += $1;
                $total{'isize'}         += $1;
            }
@@ -683,8 +815,8 @@ sub infoStats {
 # Usage: &generateIndex();
 sub generateIndex {
     my (@dists)        = @_;
-    &main::DEBUG("Debian: generateIndex() called.");
-    if (!scalar @dists) {
+    &main::status("Debian: !!! generateIndex() called !!!");
+    if (!scalar @dists or $dists[0] eq '') {
        &main::ERROR("gI: no dists to generate index.");
        return 1;
     }
@@ -707,7 +839,7 @@ sub generateIndex {
        &main::DEBUG("gIndeX: calling DebianDownload($dist, ...).");
        &DebianDownload($dist, %urlpackages);
 
-       &main::status("Debian: generating index for '$_'.");
+       &main::status("Debian: generating index for '$dist'.");
        if (!open(OUT,">$idx")) {
            &main::ERROR("cannot write to $idx.");
            return 0;
@@ -726,9 +858,8 @@ sub generateIndex {
            open(IN,"zcat $packages |");
 
            while (<IN>) {
-               if (/^Package: (.*)\n$/) {
-                   print OUT $1."\n";
-               }
+               next unless (/^Package: (.*)\n$/);
+               print OUT $1."\n";
            }
            close IN;
        }
@@ -784,13 +915,9 @@ sub searchPackage {
     my $error = 0;
 
     &main::status("Debian: Search package matching '$query' in '$dist'.");
-    if ( -z $file) {
-       &main::DEBUG("sP: $file == NULL; removing, redoing.");
-       unlink $file;
-    }
+    unlink $file if ( -z $file);
 
     while (!open(IN, $file)) {
-       &main::ERROR("$file does not exist (#2).");
        if ($dist eq "incoming") {
            &main::DEBUG("sP: dist == incoming; calling gI().");
            &generateIncoming();
@@ -800,7 +927,9 @@ sub searchPackage {
            &main::ERROR("could not generate index!!!");
            return;
        }
+
        $error++;
+       &main::DEBUG("should we be doing this?");
        &generateIndex(($dist));
     }
 
@@ -808,7 +937,7 @@ sub searchPackage {
        chop;
 
        if (/^\*(.*)$/) {
-           &main::DEBUG("sP: hrm => '$1'.");
+           $file = $1;
 
            if (&main::isStale($file, $main::param{'debianRefreshInterval'})) {
                &main::DEBUG("STALE $file! regen.");
@@ -818,7 +947,6 @@ sub searchPackage {
                last;
            }
 
-           $file = $1;
            next;
        }
 
@@ -839,6 +967,12 @@ sub getDistro {
        $dist = $defaultdist;
     }
 
+    if ($dist =~ /^(slink|hamm|rex|bo)$/i) {
+       &main::DEBUG("Debian: deprecated version ($dist).");
+       &main::msg($main::who, "Debian: deprecated distribution version.");
+       return;
+    }
+
     if (exists $dists{$dist}) {
        return $dists{$dist};
     } else {
@@ -896,34 +1030,6 @@ sub DebianFind {
     }
 }
 
-### TODO: move DWH to &fixDist() or leave it being called by DD?
-sub fixNonUS {
-    my ($dist, %urls) = @_;
-
-    foreach (keys %urls) {
-       last unless ($dist =~ /^(woody|potato)$/);
-       next unless (/non-US/);
-       &main::DEBUG("DD: Enabling hack(??) for $dist non-US.");
-
-       my $file = $_;
-       my $url  = $urls{$_};
-       delete $urls{$file};    # heh.
-
-       foreach ("main","contrib","non-free") {
-           my ($newfile,$newurl) = ($file,$url);
-           # only needed for Packages for now, not Contents; good.
-           $newfile =~ s/non-US/non-US_$_/;
-           $newurl =~ s#non-US/bin#non-US/$_/bin#;
-           $urls{$newfile} = $newurl;
-       }
-
-       &main::DEBUG("DD: Files: ".scalar(keys %urls));
-       last;
-    }
-
-    %urls;
-}
-
 sub debianCheck {
     my $dir    = "debian/";
     my $error  = 0;