2 # Debian.pl: Frontend to debian contents and packages files
4 # Version: v0.8 (20000918)
12 # format: "alias=real".
14 my $defaultdist = "sid";
15 my $refresh = &::getChanConfDefault("debianRefreshInterval",7)
20 # "sid" => "unstable",
21 # "woody" => "testing", # new since 20001219.
22 # "potato" => "stable",
23 # "incoming" => "incoming",
26 ### new... the right way.
29 "testing" => "woody", # new since 20001219.
31 "incoming" => "incoming",
35 "debian/Contents-##DIST-i386.gz" =>
36 "ftp://ftp.us.debian.org".
37 "/debian/dists/##DIST/Contents-i386.gz",
38 "debian/Contents-##DIST-i386-non-US.gz" =>
39 "ftp://non-us.debian.org".
40 "/debian-non-US/dists/##DIST/non-US/Contents-i386.gz",
44 "debian/Packages-##DIST-main-i386.gz" =>
45 "ftp://ftp.us.debian.org".
46 "/debian/dists/##DIST/main/binary-i386/Packages.gz",
47 "debian/Packages-##DIST-contrib-i386.gz" =>
48 "ftp://ftp.us.debian.org".
49 "/debian/dists/##DIST/contrib/binary-i386/Packages.gz",
50 "debian/Packages-##DIST-non-free-i386.gz" =>
51 "ftp://ftp.us.debian.org".
52 "/debian/dists/##DIST/non-free/binary-i386/Packages.gz",
54 "debian/Packages-##DIST-non-US-main-i386.gz" =>
55 "ftp://non-us.debian.org".
56 "/debian-non-US/dists/##DIST/non-US/main/binary-i386/Packages.gz",
57 "debian/Packages-##DIST-non-US-contrib-i386.gz" =>
58 "ftp://non-us.debian.org".
59 "/debian-non-US/dists/##DIST/non-US/contrib/binary-i386/Packages.gz",
60 "debian/Packages-##DIST-non-US-non-free-i386.gz" =>
61 "ftp://non-us.debian.org".
62 "/debian-non-US/dists/##DIST/non-US/non-free/binary-i386/Packages.gz",
66 ### COMMON FUNCTION....
67 #######################
70 # Usage: &DebianDownload(%hash);
72 my ($dist, %urls) = @_;
77 &::status("Debian: creating debian dir.");
78 mkdir("debian/",0755);
84 foreach $file (keys %urls) {
85 my $url = $urls{$file};
86 $url =~ s/##DIST/$dist/g;
87 $file =~ s/##DIST/$dist/g;
91 my $last_refresh = (stat $file)[9];
92 $update++ if (time() - $last_refresh > $refresh);
97 next unless ($update);
99 &::DEBUG("announce == $announce.");
100 if ($good + $bad == 0 and !$announce) {
101 &::status("Debian: Downloading files for '$dist'.");
102 &::msg($::who, "Updating debian files... please wait.");
106 if (exists $::debian{$url}) {
107 &::DEBUG("2: ".(time - $::debian{$url})." <= $refresh");
108 next if (time() - $::debian{$url} <= $refresh);
109 &::DEBUG("stale for url $url; updating!");
112 if ($url =~ /^ftp:\/\/(.*?)\/(\S+)\/(\S+)$/) {
113 my ($host,$path,$thisfile) = ($1,$2,$3);
116 # if ($file =~ /Contents-woody-i386-non-US/) {
117 # &::DEBUG("Skipping Contents-woody-i386-non-US.");
118 # $file =~ s/woody/potato/;
119 # $path =~ s/woody/potato/;
123 if (!&::ftpGet($host,$path,$thisfile,$file)) {
124 &::WARN("deb: down: $file == BAD.");
130 &::DEBUG("deb: down: ftpGet: !file");
136 # if ($file =~ /Contents-potato-i386-non-US/) {
137 # &::DEBUG("hack: using potato's non-US contents for woody.");
138 # system("cp debian/Contents-potato-i386-non-US.gz debian/Contents-woody-i386-non-US.gz");
141 &::DEBUG("deb: download: good.");
144 &::ERROR("Debian: invalid format of url => ($url).");
151 &generateIndex($dist);
154 return -1 unless ($bad); # no download.
155 &::DEBUG("DD: !good and bad($bad). :(");
160 ###########################
161 # DEBIAN CONTENTS SEARCH FUNCTIONS.
165 # Usage: &searchContents($query);
167 my ($dist, $query) = &getDistroFromStr($_[0]);
168 &::status("Debian: Contents search for '$query' on $dist.");
171 $dccsend++ if ($query =~ s/^dcc\s+//i);
173 $query =~ s/\\([\^\$])/$1/g; # hrm?
174 $query =~ s/^\s+|\s+$//g;
176 if (!&::validExec($query)) {
177 &::msg($::who, "search string looks fuzzy.");
181 if ($dist eq "incoming") { # nothing yet.
182 &::DEBUG("sC: dist = 'incoming'. no contents yet.");
185 my %urls = &fixDist($dist, %urlcontents);
186 # download contents file.
187 &::DEBUG("deb: download 1.");
188 if (!&DebianDownload($dist, %urls)) {
189 &::WARN("Debian: could not download files.");
194 my $start_time = &::timeget();
200 ### TODO: search properly if /usr/bin/blah is done.
201 if ($query =~ s/\$$//) {
202 &::DEBUG("search-regex found.");
203 $grepRE = "$query\[ \t]";
204 } elsif ($query =~ s/^\^//) {
205 &::DEBUG("front marker regex found.");
209 $grepRE = "$query*\[ \t]";
212 # fix up grepRE for "*".
213 $grepRE =~ s/\*/.*/g;
216 foreach (keys %urlcontents) {
219 next unless ( -f $_);
223 if (!scalar @files) {
224 &::ERROR("sC: no files?");
225 &::msg($::who, "failed.");
229 my $files = join(' ', @files);
232 $regex =~ s/\./\\./g;
233 $regex =~ s/\*/\\S*/g;
236 open(IN,"zegrep -h '$grepRE' $files |");
238 if (/^\.?\/?(.*?)[\t\s]+(\S+)\n$/) {
239 my ($file,$package) = ("/".$1,$2);
240 if ($query =~ /[\/\*\\]/) {
241 next unless (eval { $file =~ /$regex/ });
242 return unless &checkEval($@);
244 my ($basename) = $file =~ /^.*\/(.*)$/;
245 next unless (eval { $basename =~ /$regex/ });
246 return unless &checkEval($@);
248 next if ($query !~ /\.\d\.gz/ and $file =~ /\/man\//);
249 next if ($front and eval { $file !~ /^\/$query/ });
250 return unless &checkEval($@);
252 $contents{$package}{$file} = 1;
256 last if ($found > 100);
262 ### send results with dcc.
264 if (exists $::dcc{'SEND'}{$::who}) {
265 &::msg($::who, "DCC already active!");
269 if (!scalar %contents) {
270 &::msg($::who,"search returned no results.");
274 my $file = "$::param{tempDir}/$::who.txt";
275 if (!open(OUT,">$file")) {
276 &::ERROR("Debian: cannot write file for dcc send.");
280 foreach $pkg (keys %contents) {
281 foreach (keys %{ $contents{$pkg} }) {
282 # TODO: correct padding.
283 print OUT "$_\t\t\t$pkg\n";
288 &::shmWrite($::shm, "DCC SEND $::who $file");
293 &::status("Debian: $found contents results found.");
296 foreach $pkg (keys %contents) {
297 my @tmplist = &::fixFileList(keys %{ $contents{$pkg} });
298 my @sublist = sort { length $a <=> length $b } @tmplist;
300 pop @sublist while (scalar @sublist > 3);
302 $pkg =~ s/\,/\037\,\037/g; # underline ','.
303 push(@list, "(". join(', ',@sublist) .") in $pkg");
305 &::DEBUG("debian: 0");
306 # sort the total list from shortest to longest...
307 @list = sort { length $a <=> length $b } @list;
309 # show how long it took.
310 &::DEBUG("debian: 1");
311 my $delta_time = &::timedelta($start_time);
312 &::DEBUG("debian: 2");
313 &::status(sprintf("Debian: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0);
314 &::DEBUG("debian: 3");
316 my $prefix = "Debian Search of '$query' ";
317 if (scalar @list) { # @list.
318 &::pSReply( &::formListReply(0, $prefix, @list) );
320 &::DEBUG("ok, !\@list, searching desc for '$query'.");
321 my @list = &searchDesc($query);
324 my $prefix = "Debian Package/File/Desc Search of '$query' ";
325 &::pSReply( &::formListReply(0, $prefix, ) );
326 } elsif (scalar @list == 1) { # list = 1.
327 &::DEBUG("list == 1; showing package info of '$list[0]'.");
328 &infoPackages("info", $list[0]);
330 my $prefix = "Debian Desc Search of '$query' ";
331 &::pSReply( &::formListReply(0, $prefix, @list) );
337 # Usage: &searchAuthor($query);
339 my ($dist, $query) = &getDistroFromStr($_[0]);
340 &::DEBUG("searchAuthor: dist => '$dist', query => '$query'.");
341 $query =~ s/^\s+|\s+$//g;
344 my $start_time = &::timeget();
345 &::status("Debian: starting author search.");
348 my ($bad,$good) = (0,0);
349 my %urls = %urlpackages;
351 foreach (keys %urlpackages) {
363 &::DEBUG("good = $good, bad = $bad...");
365 if ($good == 0 and $bad != 0) {
366 my %urls = &fixDist($dist, %urlpackages);
367 &::DEBUG("deb: download 2.");
368 if (!&DebianDownload($dist, %urls)) {
369 &::ERROR("Debian(sA): could not download files.");
374 my (%maint, %pkg, $package);
375 open(IN,"zegrep -h '^Package|^Maintainer' $files |");
377 if (/^Package: (\S+)$/) {
379 } elsif (/^Maintainer: (.*) \<(\S+)\>$/) {
380 my($name,$email) = ($1,$2);
381 if ($package eq "") {
382 &::DEBUG("sA: package == NULL.");
385 $maint{$name}{$email} = 1;
386 $pkg{$name}{$package} = 1;
389 &::WARN("invalid line: '$_'.");
395 # TODO: can we use 'map' here?
396 foreach (grep /\Q$query\E/i, keys %maint) {
400 # TODO: should we only search email if '@' is used?
401 if (scalar keys %hash < 15) {
403 foreach $name (keys %maint) {
405 foreach $email (keys %{ $maint{$name} }) {
406 next unless ($email =~ /\Q$query\E/i);
407 next if (exists $hash{$name});
413 my @list = keys %hash;
414 if (scalar @list != 1) {
415 my $prefix = "Debian Author Search of '$query' ";
416 &::pSReply( &::formListReply(0, $prefix, @list) );
420 &::DEBUG("showing all packages by '$list[0]'...");
422 my @pkg = sort keys %{ $pkg{$list[0]} };
424 # show how long it took.
425 my $delta_time = &::timedelta($start_time);
426 &::status(sprintf("Debian: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0);
428 my $email = join(', ', keys %{ $maint{$list[0]} });
429 my $prefix = "Debian Packages by $list[0] \002<\002$email\002>\002 ";
430 &::pSReply( &::formListReply(0, $prefix, @pkg) );
434 # Usage: &searchDesc($query);
436 my ($dist, $query) = &getDistroFromStr($_[0]);
437 &::DEBUG("searchDesc: dist => '$dist', query => '$query'.");
438 $query =~ s/^\s+|\s+$//g;
441 my $start_time = &::timeget();
442 &::status("Debian: starting desc search.");
445 my ($bad,$good) = (0,0);
446 my %urls = %urlpackages;
448 foreach (keys %urlpackages) {
460 &::DEBUG("good = $good, bad = $bad...");
462 if ($good == 0 and $bad != 0) {
463 my %urls = &fixDist($dist, %urlpackages);
464 &::DEBUG("deb: download 2c.");
465 if (!&DebianDownload($dist, %urls)) {
466 &::ERROR("Debian(sD): could not download files.");
472 $regex =~ s/\./\\./g;
473 $regex =~ s/\*/\\S*/g;
476 my (%desc, $package);
477 open(IN,"zegrep -h '^Package|^Description' $files |");
479 if (/^Package: (\S+)$/) {
481 } elsif (/^Description: (.*)$/) {
483 next unless (eval { $desc =~ /$regex/i });
484 return unless &checkEval($@);
486 if ($package eq "") {
487 &::WARN("sD: package == NULL?");
490 $desc{$package} = $desc;
493 &::WARN("invalid line: '$_'.");
498 # show how long it took.
499 my $delta_time = &::timedelta($start_time);
500 &::status(sprintf("Debian: %.02f sec to complete query.", $delta_time)) if ($delta_time > 0);
506 # Usage: &generateIncoming();
507 sub generateIncoming {
508 my $pkgfile = "debian/Packages-incoming";
509 my $idxfile = $pkgfile.".idx";
511 $stale++ if (&::isStale($pkgfile.".gz", $refresh));
512 $stale++ if (&::isStale($idxfile, $refresh));
513 &::DEBUG("gI: stale => '$stale'.");
514 return 0 unless ($stale);
517 my %ftp = &::ftpList("llug.sep.bnl.gov", "/pub/debian/Incoming/");
519 if (!open(PKG,">$pkgfile")) {
520 &::ERROR("cannot write to pkg $pkgfile.");
523 if (!open(IDX,">$idxfile")) {
524 &::ERROR("cannot write to idx $idxfile.");
528 print IDX "*$pkgfile.gz\n";
530 foreach $file (sort keys %ftp) {
531 next unless ($file =~ /deb$/);
533 if ($file =~ /^(\S+)\_(\S+)\_(\S+)\.deb$/) {
535 print PKG "Package: $1\n";
536 print PKG "Version: $2\n";
537 print PKG "Architecture: ", (defined $4) ? $4 : "all", "\n";
539 print PKG "Filename: $file\n";
540 print PKG "Size: $ftp{$file}\n";
546 system("gzip -9fv $pkgfile"); # lame fix.
548 &::status("Debian: generateIncoming() complete.");
552 ##############################
553 # DEBIAN PACKAGE INFO FUNCTIONS.
556 # Usage: &getPackageInfo($query,$file);
558 my ($package, $file) = @_;
561 &::status("gPI: file $file does not exist?");
568 open(IN, "zcat $file 2>&1 |");
574 next if (/^ \S+/); # package long description.
577 if (/^Package: (.*)\n$/) {
579 if ($pkg =~ /^$package$/i) {
580 $found++; # we can use pkg{'package'} instead.
581 $pkg{'package'} = $pkg;
590 if (/^Version: (.*)$/) {
591 $pkg{'version'} = $1;
592 } elsif (/^Priority: (.*)$/) {
593 $pkg{'priority'} = $1;
594 } elsif (/^Section: (.*)$/) {
595 $pkg{'section'} = $1;
596 } elsif (/^Size: (.*)$/) {
598 } elsif (/^Installed-Size: (.*)$/i) {
599 $pkg{'installed'} = $1;
600 } elsif (/^Description: (.*)$/) {
602 } elsif (/^Filename: (.*)$/) {
604 } elsif (/^Pre-Depends: (.*)$/) {
605 $pkg{'depends'} = "pre-depends on $1";
606 } elsif (/^Depends: (.*)$/) {
607 if (exists $pkg{'depends'}) {
608 $pkg{'depends'} .= "; depends on $1";
610 $pkg{'depends'} = "depends on $1";
612 } elsif (/^Maintainer: (.*)$/) {
614 } elsif (/^Provides: (.*)$/) {
615 $pkg{'provides'} = $1;
616 } elsif (/^Suggests: (.*)$/) {
617 $pkg{'suggests'} = $1;
618 } elsif (/^Conflicts: (.*)$/) {
619 $pkg{'conflicts'} = $1;
622 ### &::DEBUG("=> '$_'.");
632 next if (defined $pkg);
640 # Usage: &infoPackages($query,$package);
642 my ($query,$dist,$package) = ($_[0], &getDistroFromStr($_[1]));
644 &::status("Debian: Searching for package '$package' in '$dist'.");
646 # download packages file.
648 my %urls = &fixDist($dist, %urlpackages);
649 if ($dist ne "incoming") {
650 &::DEBUG("deb: download 3.");
651 if (!&DebianDownload($dist, %urls)) { # no good download.
652 &::WARN("Debian(iP): could not download ANY files.");
656 # check if the package is valid.
658 my @files = &validPackage($package, $dist);
659 if (!scalar @files) {
660 &::status("Debian: no valid package found; checking incoming.");
661 @files = &validPackage($package, "incoming");
663 &::status("Debian: cool, it exists in incoming.");
666 &::msg($::who, "Package '$package' does not exist.");
671 if (scalar @files > 1) {
672 &::WARN("same package in more than one file; random.");
673 &::DEBUG("THIS SHOULD BE FIXED SOMEHOW!!!");
674 $files[0] = &::getRandom(@files);
677 if (! -f $files[0]) {
678 &::WARN("files[0] ($files[0]) doesn't exist.");
679 &::msg($::who, "WARNING: $files[0] does not exist? FIXME");
683 ### TODO: if specific package is requested, note down that a version
684 ### exists in incoming.
687 my $file = $files[0];
690 ### TODO: use fe, dump to a hash. if only one version of the package
691 ### exists. do as normal otherwise list all versions.
693 &::ERROR("D:iP: file '$file' DOES NOT EXIST!!! should never happen.");
696 my %pkg = &getPackageInfo($package, $file);
699 if ($query eq "info") {
700 if (scalar keys %pkg > 5) {
701 $pkg{'info'} = "\002(\002". $pkg{'desc'} ."\002)\002";
702 $pkg{'info'} .= ", section ".$pkg{'section'};
703 $pkg{'info'} .= ", is ".$pkg{'priority'};
704 # $pkg{'info'} .= ". Version: \002$pkg{'version'}\002";
705 $pkg{'info'} .= ". Version: \002$pkg{'version'}\002 ($dist)";
706 $pkg{'info'} .= ", Packaged size: \002". int($pkg{'size'}/1024) ."\002 kB";
707 $pkg{'info'} .= ", Installed size: \002$pkg{'installed'}\002 kB";
710 &::status("iP: info requested and pkg is in incoming, too.");
711 my %incpkg = &getPackageInfo($query, "debian/Packages-incoming");
713 if (scalar keys %incpkg) {
714 $pkg{'info'} .= ". Is in incoming ($incpkg{'file'}).";
716 &::ERROR("iP: pkg $query is in incoming but we couldn't get any info?");
720 &::DEBUG("running debianCheck() due to problems (".scalar(keys %pkg).").");
722 &::DEBUG("end of debianCheck()");
724 &::msg($::who,"Debian: Package appears to exist but I could not retrieve info about it...");
729 if ($dist eq "incoming") {
730 $pkg{'info'} .= "Version: \002$pkg{'version'}\002";
731 $pkg{'info'} .= ", Packaged size: \002". int($pkg{'size'}/1024) ."\002 kB";
732 $pkg{'info'} .= ", is in incoming!!!";
735 if (!exists $pkg{$query}) {
736 if ($query eq "suggests") {
737 $pkg{$query} = "has no suggestions";
738 } elsif ($query eq "conflicts") {
739 $pkg{$query} = "does not conflict with any other package";
740 } elsif ($query eq "depends") {
741 $pkg{$query} = "does not depend on anything";
742 } elsif ($query eq "maint") {
743 $pkg{$query} = "has no maintainer";
745 $pkg{$query} = "has nothing about $query";
749 &::pSReply("$package: $pkg{$query}");
752 # Usage: &infoStats($dist);
755 $dist = &getDistro($dist);
756 return unless (defined $dist);
758 &::DEBUG("infoS: dist => '$dist'.");
760 # download packages file if needed.
761 my %urls = &fixDist($dist, %urlpackages);
762 &::DEBUG("deb: download 4.");
763 if (!&DebianDownload($dist, %urls)) {
764 &::WARN("Debian(iS): could not download ANY files.");
765 &::msg($::who, "Debian(iS): internal error.");
772 foreach $file (keys %urlpackages) {
773 $file =~ s/##DIST/$dist/g; # won't work for incoming.
774 &::DEBUG("file => '$file'.");
775 if (exists $stats{$file}{'count'}) {
776 &::DEBUG("hrm... duplicate open with $file???");
780 open(IN,"zcat $file 2>&1 |");
783 &::DEBUG("iS: $file does not exist.");
790 next if (/^ \S+/); # package long description.
792 if (/^Package: (.*)\n$/) { # counter.
793 $stats{$file}{'count'}++;
795 } elsif (/^Maintainer: .* <(\S+)>$/) {
796 $stats{$file}{'maint'}{$1}++;
797 $total{'maint'}{$1}++;
798 } elsif (/^Size: (.*)$/) { # compressed size.
799 $stats{$file}{'csize'} += $1;
800 $total{'csize'} += $1;
801 } elsif (/^i.*size: (.*)$/i) { # installed size.
802 $stats{$file}{'isize'} += $1;
803 $total{'isize'} += $1;
806 ### &::DEBUG("=> '$_'.");
811 ### TODO: don't count ppl with multiple email addresses.
814 "Debian Distro Stats on $dist... ".
815 "\002$total{'count'}\002 packages, ".
816 "\002".scalar(keys %{ $total{'maint'} })."\002 maintainers, ".
817 "\002". int($total{'isize'}/1024)."\002 MB installed size, ".
818 "\002". int($total{'csize'}/1024/1024)."\002 MB compressed size."
821 ### TODO: do individual stats? if so, we need _another_ arg.
822 # foreach $file (keys %stats) {
823 # foreach (keys %{ $stats{$file} }) {
824 # &::DEBUG(" '$file' '$_' '$stats{$file}{$_}'.");
834 # HELPER FUNCTIONS FOR INFOPACKAGES...
837 # Usage: &generateIndex();
840 &::status("Debian: !!! generateIndex($dists[0]) called !!!");
841 if (!scalar @dists or $dists[0] eq '') {
842 &::ERROR("gI: no dists to generate index.");
847 my $dist = &getDistro($_); # incase the alias is returned, possible?
848 my $idx = "debian/Packages-$dist.idx";
849 &::DEBUG("gI: dist => $dist.");
850 &::DEBUG("gI: idx => $idx.");
851 &::DEBUG("gI: r => $refresh.");
853 # TODO: check if any of the Packages file have been updated then
854 # regenerate it, even if it's not stale.
855 # TODO: also, regenerate the index if the packages file is newer
857 next unless (&::isStale($idx, $refresh));
860 &::DEBUG("gIndex: calling generateIncoming()!");
866 &::DEBUG("Copying old index of woody to -old");
867 system("cp $idx $idx-old");
870 &::DEBUG("gIndeX: calling DebianDownload($dist, ...).");
871 &DebianDownload($dist, %urlpackages);
873 &::status("Debian: generating index for '$dist'.");
874 if (!open(OUT,">$idx")) {
875 &::ERROR("cannot write to $idx.");
880 foreach $packages (keys %urlpackages) {
881 $packages =~ s/##DIST/$dist/;
883 if (! -e $packages) {
884 &::ERROR("gIndex: '$packages' does not exist?");
888 print OUT "*$packages\n";
889 open(IN,"zcat $packages |");
892 next unless (/^Package: (.*)\n$/);
903 # Usage: &validPackage($package, $dist);
905 my ($package,$dist) = @_;
909 ### this majorly sucks, we need some standard in place.
910 # why is this needed... need to investigate later.
912 $dist = &getDistro($dist);
914 &::DEBUG("D: validPackage($package, $dist) called.");
917 while (!open(IN, "debian/Packages-$dist.idx")) {
919 &::ERROR("Packages-$dist.idx does not exist (#1).");
923 &generateIndex($dist);
935 if (/^\Q$package\E\n$/) {
942 &::VERB("vP: scanned $count items in index.",2);
948 my ($dist, $query) = &getDistroFromStr($_[0]);
949 my $file = "debian/Packages-$dist.idx";
954 if ($query =~ tr/A-Z/a-z/) {
958 &::status("Debian: Search package matching '$query' in '$dist'.");
959 unlink $file if ( -z $file);
961 while (!open(IN, $file)) {
962 if ($dist eq "incoming") {
963 &::DEBUG("sP: dist == incoming; calling gI().");
968 &::ERROR("could not generate index ($file)!!!");
973 &::DEBUG("should we be doing this?");
974 &generateIndex(($dist));
983 if (&::isStale($file, $refresh)) {
984 &::DEBUG("STALE $file! regen.");
985 &generateIndex(($dist));
986 ### @files = searchPackage("$query $dist");
987 &::DEBUG("EVIL HACK HACK HACK.");
1000 if (scalar @files and $warn) {
1001 &::msg($::who, "searching for package name should be fully lowercase!");
1010 if (!defined $dist or $dist eq "") {
1011 &::DEBUG("gD: dist == NULL; dist = defaultdist.");
1012 $dist = $defaultdist;
1015 if ($dist =~ /^(slink|hamm|rex|bo)$/i) {
1016 &::DEBUG("Debian: deprecated version ($dist).");
1017 &::msg($::who, "Debian: deprecated distribution version.");
1021 if (exists $dists{$dist}) {
1022 &::VERB("gD: returning dists{$dist} ($dists{$dist})",2);
1023 return $dists{$dist};
1026 if (!grep /^\Q$dist\E$/i, %dists) {
1027 &::msg($::who, "invalid dist '$dist'.");
1031 &::VERB("gD: returning $dist (no change or conversion)",2);
1036 sub getDistroFromStr {
1038 my $dists = join '|', %dists;
1039 my $dist = $defaultdist;
1041 if ($str =~ s/\s+($dists)$//i) {
1042 $dist = &getDistro(lc $1);
1045 $str =~ s/\\([\$\^])/$1/g;
1051 my ($dist, %urls) = @_;
1055 while (($key,$val) = each %urls) {
1056 $key =~ s/##DIST/$dist/;
1057 $val =~ s/##DIST/$dist/;
1058 ### TODO: what should we do if the sar wasn't done.
1065 ### H-H-H-HACK HACK HACK :)
1067 my ($dist, $query) = &getDistroFromStr($str);
1068 my @results = sort &searchPackage($str);
1070 if (!scalar @results) {
1071 &::Forker("debian", sub { &searchContents($str); } );
1072 } elsif (scalar @results == 1) {
1073 &::status("searchPackage returned one result; getting info of package instead!");
1074 &::Forker("debian", sub { &infoPackages("info", "$results[0] $dist"); } );
1076 my $prefix = "Debian Package Listing of '$query' ";
1077 &::pSReply( &::formListReply(0, $prefix, @results) );
1082 my $dir = "debian/";
1085 &::status("debianCheck() called.");
1087 ### TODO: remove the following loop (check if dir exists before)
1089 last if (opendir(DEBIAN, $dir));
1091 &::ERROR("dC: cannot opendir debian.");
1100 while (defined($file = readdir DEBIAN)) {
1101 next unless ($file =~ /(gz|bz2)$/);
1103 my $exit = system("gzip -t '$dir/$file'");
1104 next unless ($exit);
1105 &::DEBUG("hmr... => ".(time() - (stat($file))[8])."'.");
1106 next unless (time() - (stat($file))[8] > 3600);
1108 &::DEBUG("dC: exit => '$exit'.");
1109 &::WARN("dC: '$dir/$file' corrupted? deleting!");
1110 unlink $dir."/".$file;
1121 &::WARN("cE: $str");
1129 &::DEBUG("FE called for searchDesc");
1131 my @list = &searchDesc($query);
1133 if (!scalar @list) {
1134 my $prefix = "Debian Desc Search of '$query' ";
1135 &::pSReply( &::formListReply(0, $prefix, ) );
1136 } elsif (scalar @list == 1) { # list = 1.
1137 &::DEBUG("list == 1; showing package info of '$list[0]'.");
1138 &infoPackages("info", $list[0]);
1139 } else { # list > 1.
1140 my $prefix = "Debian Desc Search of '$query' ";
1141 &::pSReply( &::formListReply(0, $prefix, @list) );