X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2FDebian.pl;h=d4f1576e9876f5f8cdcb5bc277048b618783e0a5;hb=5eb4ddbe665438386c4d106e91cd07aca764df9a;hp=2dfea69ac4b4cc918a2f2738292a764736e2d933;hpb=b6accd0ec31c9e167c396b7d6db73ce9d47815ad;p=infobot.git diff --git a/src/Modules/Debian.pl b/src/Modules/Debian.pl index 2dfea69..d4f1576 100644 --- a/src/Modules/Debian.pl +++ b/src/Modules/Debian.pl @@ -15,6 +15,7 @@ my $defaultdist = "sid"; my $refresh = &::getChanConfDefault("debianRefreshInterval",7) * 60 * 60 * 24; my $debug = 0; +my $debian_dir = "$::bot_state_dir/debian"; ### ... old #my %dists = ( @@ -33,32 +34,32 @@ my %dists = ( ); my %urlcontents = ( - "debian/Contents-##DIST-i386.gz" => + "Contents-##DIST-i386.gz" => "ftp://ftp.us.debian.org". "/debian/dists/##DIST/Contents-i386.gz", - "debian/Contents-##DIST-i386-non-US.gz" => + "Contents-##DIST-i386-non-US.gz" => "ftp://non-us.debian.org". "/debian-non-US/dists/##DIST/non-US/Contents-i386.gz", ); my %urlpackages = ( - "debian/Packages-##DIST-main-i386.gz" => + "Packages-##DIST-main-i386.gz" => "ftp://ftp.us.debian.org". "/debian/dists/##DIST/main/binary-i386/Packages.gz", - "debian/Packages-##DIST-contrib-i386.gz" => + "Packages-##DIST-contrib-i386.gz" => "ftp://ftp.us.debian.org". "/debian/dists/##DIST/contrib/binary-i386/Packages.gz", - "debian/Packages-##DIST-non-free-i386.gz" => + "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-main-i386.gz" => + "Packages-##DIST-non-US-main-i386.gz" => "ftp://non-us.debian.org". "/debian-non-US/dists/##DIST/non-US/main/binary-i386/Packages.gz", - "debian/Packages-##DIST-non-US-contrib-i386.gz" => + "Packages-##DIST-non-US-contrib-i386.gz" => "ftp://non-us.debian.org". "/debian-non-US/dists/##DIST/non-US/contrib/binary-i386/Packages.gz", - "debian/Packages-##DIST-non-US-non-free-i386.gz" => + "Packages-##DIST-non-US-non-free-i386.gz" => "ftp://non-us.debian.org". "/debian-non-US/dists/##DIST/non-US/non-free/binary-i386/Packages.gz", ); @@ -68,15 +69,15 @@ my %urlpackages = ( ####################### #### -# Usage: &DebianDownload(%hash); +# Usage: &DebianDownload($dist, %hash); sub DebianDownload { my ($dist, %urls) = @_; my $bad = 0; my $good = 0; - if (! -d "debian/") { + if (! -d $debian_dir) { &::status("Debian: creating debian dir."); - mkdir("debian/",0755); + mkdir($debian_dir, 0755); } # fe dists. @@ -88,7 +89,7 @@ sub DebianDownload { $file =~ s/##DIST/$dist/g; my $update = 0; - if ( -f $file) { + if ( -f $file ) { my $last_refresh = (stat $file)[9]; $update++ if (time() - $last_refresh > $refresh); } else { @@ -139,6 +140,13 @@ sub DebianDownload { # system("cp debian/Contents-potato-i386-non-US.gz debian/Contents-woody-i386-non-US.gz"); # } + my $exit = CORE::system("/bin/gzip -t $file >/dev/null 2>&1"); + if ($exit) { + &::WARN("deb: $file is corrupted :/"); + unlink $file; + next; + } + &::DEBUG("deb: download: good.") if ($debug); $good++; } else { @@ -148,6 +156,9 @@ sub DebianDownload { } } + # ok... lets just run this. + &::miscCheck() if (&::whatInterface() =~ /IRC/); + if ($good) { &generateIndex($dist); return 1; @@ -200,10 +211,10 @@ sub searchContents { my $grepRE; ### TODO: search properly if /usr/bin/blah is done. if ($query =~ s/\$$//) { - &::DEBUG("deb: search-regex found."); + &::DEBUG("deb: search-regex found.") if ($debug); $grepRE = "$query\[ \t]"; } elsif ($query =~ s/^\^//) { - &::DEBUG("deb: front marker regex found."); + &::DEBUG("deb: front marker regex found.") if ($debug); $front = 1; $grepRE = $query; } else { @@ -217,8 +228,8 @@ sub searchContents { foreach (keys %urlcontents) { s/##DIST/$dist/g; - next unless ( -f $_); - push(@files,$_); + next unless ( -f "$debian_dir/$_" ); + push(@files, "$debian_dir/$_"); } if (!scalar @files) { @@ -235,26 +246,27 @@ sub searchContents { $regex =~ s/\?/./g; open(IN,"zegrep -h '$grepRE' $files |"); + # wonderful abuse of last and next and unless ;) while () { - if (/^\.?\/?(.*?)[\t\s]+(\S+)\n$/) { - my ($file,$package) = ("/".$1,$2); - if ($query =~ /[\/\*\\]/) { - next unless (eval { $file =~ /$regex/ }); - return unless &checkEval($@); - } else { - my ($basename) = $file =~ /^.*\/(.*)$/; - next unless (eval { $basename =~ /$regex/ }); - return unless &checkEval($@); - } - next if ($query !~ /\.\d\.gz/ and $file =~ /\/man\//); - next if ($front and eval { $file !~ /^\/$query/ }); - return unless &checkEval($@); + last if ($found > 100); + + next unless (/^\.?\/?(.*?)[\t\s]+(\S+)\n$/); + my ($file,$package) = ("/".$1,$2); - $contents{$package}{$file} = 1; - $found++; + if ($query =~ /[\/\*\\]/) { + next unless (eval { $file =~ /$regex/ }); + return unless &checkEval($@); + } else { + my ($basename) = $file =~ /^.*\/(.*)$/; + next unless (eval { $basename =~ /$regex/ }); + return unless &checkEval($@); } + next if ($query !~ /\.\d\.gz/ and $file =~ /\/man\//); + next if ($front and eval { $file !~ /^\/$query/ }); + return unless &checkEval($@); - last if ($found > 100); + $contents{$package}{$file} = 1; + $found++; } close IN; @@ -273,7 +285,7 @@ sub searchContents { } my $file = "$::param{tempDir}/$::who.txt"; - if (!open(OUT,">$file")) { + if (!open OUT, ">$file") { &::ERROR("Debian: cannot write file for dcc send."); return; } @@ -351,7 +363,7 @@ sub searchAuthor { foreach (keys %urlpackages) { s/##DIST/$dist/g; - if (! -f $_) { + if (! -f "$debian_dir/$_" ) { $bad++; next; } @@ -360,7 +372,7 @@ sub searchAuthor { $files .= " ".$_; } - &::DEBUG("deb: good = $good, bad = $bad..."); + &::DEBUG("deb: good = $good, bad = $bad...") if ($debug); if ($good == 0 and $bad != 0) { my %urls = &fixDist($dist, %urlpackages); @@ -389,7 +401,8 @@ sub searchAuthor { $package = ""; } else { - &::WARN("invalid line: '$_'."); + chop; + &::WARN("debian: invalid line: '$_' (1)."); } } close IN; @@ -422,7 +435,7 @@ sub searchAuthor { return 1; } - &::DEBUG("deb: showing all packages by '$list[0]'..."); + &::DEBUG("deb: showing all packages by '$list[0]'...") if ($debug); my @pkg = sort keys %{ $pkg{$list[0]} }; @@ -453,13 +466,13 @@ sub searchDesc { foreach (keys %urlpackages) { s/##DIST/$dist/g; - if (! -f $_) { + if (! -f "$debian_dir/$_" ) { $bad++; next; } $good++; - $files .= " ".$_; + $files .= " $debian_dir/$_"; } &::DEBUG("deb(2): good = $good, bad = $bad...") if ($debug); @@ -493,10 +506,13 @@ sub searchDesc { &::WARN("sD: package == NULL?"); next; } + $desc{$package} = $desc; $package = ""; + } else { - &::WARN("invalid line: '$_'."); + chop; + &::WARN("debian: invalid line: '$_'. (2)"); } } close IN; @@ -511,7 +527,7 @@ sub searchDesc { #### # Usage: &generateIncoming(); sub generateIncoming { - my $pkgfile = "debian/Packages-incoming"; + my $pkgfile = $debian_dir."/Packages-incoming"; my $idxfile = $pkgfile.".idx"; my $stale = 0; $stale++ if (&::isStale($pkgfile.".gz", $refresh)); @@ -522,11 +538,11 @@ sub generateIncoming { ### STATIC URL. my %ftp = &::ftpList("llug.sep.bnl.gov", "/pub/debian/Incoming/"); - if (!open(PKG,">$pkgfile")) { + if (!open PKG, ">$pkgfile") { &::ERROR("cannot write to pkg $pkgfile."); return 0; } - if (!open(IDX,">$idxfile")) { + if (!open IDX, ">$idxfile") { &::ERROR("cannot write to idx $idxfile."); return 0; } @@ -582,7 +598,7 @@ sub getPackageInfo { # package line. if (/^Package: (.*)\n$/) { $pkg = $1; - if ($pkg =~ /^$package$/i) { + if ($pkg =~ /^\Q$package\E$/i) { $found++; # we can use pkg{'package'} instead. $pkg{'package'} = $pkg; } @@ -715,7 +731,7 @@ sub infoPackages { if ($incoming) { &::status("iP: info requested and pkg is in incoming, too."); - my %incpkg = &getPackageInfo($query, "debian/Packages-incoming"); + my %incpkg = &getPackageInfo($query, $debian_dir ."/Packages-incoming"); if (scalar keys %incpkg) { $pkg{'info'} .= ". Is in incoming ($incpkg{'file'})."; @@ -784,7 +800,7 @@ sub infoStats { next; } - open(IN,"zcat $file 2>&1 |"); + open(IN, "zcat $file 2>&1 |"); if (! -e $file) { &::DEBUG("deb: iS: $file does not exist."); @@ -842,7 +858,7 @@ sub infoStats { # Usage: &generateIndex(); sub generateIndex { my (@dists) = @_; - &::status("Debian: !!! generateIndex($dists[0]) called !!!"); + &::DEBUG("D: generateIndex($dists[0]) called!"); if (!scalar @dists or $dists[0] eq '') { &::ERROR("gI: no dists to generate index."); return 1; @@ -850,7 +866,7 @@ sub generateIndex { foreach (@dists) { my $dist = &getDistro($_); # incase the alias is returned, possible? - my $idx = "debian/Packages-$dist.idx"; + my $idx = $debian_dir."/Packages-$dist.idx"; # TODO: check if any of the Packages file have been updated then # regenerate it, even if it's not stale. @@ -869,11 +885,11 @@ sub generateIndex { system("cp $idx $idx-old"); } - &::DEBUG("deb: gIndex: calling DebianDownload($dist, ...)."); - &DebianDownload($dist, %urlpackages); + &::DEBUG("deb: gIndex: calling DebianDownload($dist, ...).") if ($debug); + &DebianDownload($dist, &fixDist($dist, %urlpackages) ); &::status("Debian: generating index for '$dist'."); - if (!open(OUT,">$idx")) { + if (!open OUT, ">$idx") { &::ERROR("cannot write to $idx."); return 0; } @@ -881,6 +897,7 @@ sub generateIndex { my $packages; foreach $packages (keys %urlpackages) { $packages =~ s/##DIST/$dist/; + $packages = "$debian_dir/$packages"; if (! -e $packages) { &::ERROR("gIndex: '$packages' does not exist?"); @@ -916,7 +933,7 @@ sub validPackage { &::DEBUG("deb: validPackage($package, $dist) called.") if ($debug); my $error = 0; - while (!open(IN, "debian/Packages-$dist.idx")) { + while (!open IN, $debian_dir."/Packages-$dist.idx") { if ($error) { &::ERROR("Packages-$dist.idx does not exist (#1)."); return; @@ -948,26 +965,22 @@ sub validPackage { sub searchPackage { my ($dist, $query) = &getDistroFromStr($_[0]); - my $file = "debian/Packages-$dist.idx"; + my $file = $debian_dir."/Packages-$dist.idx"; my @files; my $error = 0; - my $warn = 0; - - if ($query =~ tr/A-Z/a-z/) { - $warn++; - } + my $warn = ($query =~ tr/A-Z/a-z/) ? 1 : 0; &::status("Debian: Search package matching '$query' in '$dist'."); - unlink $file if ( -z $file); + unlink $file if ( -z $file ); - while (!open(IN, $file)) { + while (!open IN, $file) { if ($dist eq "incoming") { &::DEBUG("deb: sP: dist == incoming; calling gI()."); &generateIncoming(); } if ($error) { - &::ERROR("could not generate index ($file)!!!"); + &::ERROR("could not generate index ($file)!"); return; } @@ -983,10 +996,10 @@ sub searchPackage { $file = $1; if (&::isStale($file, $refresh)) { - &::DEBUG("deb: STALE $file! regen."); + &::DEBUG("deb: STALE $file! regen.") if ($debug); &generateIndex(($dist)); ### @files = searchPackage("$query $dist"); - &::DEBUG("deb: EVIL HACK HACK HACK."); + &::DEBUG("deb: EVIL HACK HACK HACK.") if ($debug); last; } @@ -1058,13 +1071,14 @@ sub fixDist { $key =~ s/##DIST/$dist/; $val =~ s/##DIST/$dist/; ### TODO: what should we do if the sar wasn't done. - $new{$key} = $val; + $new{$debian_dir."/".$key} = $val; } + return %new; } sub DebianFind { - ### H-H-H-HACK HACK HACK :) + # HACK! HACK! HACK! my ($str) = @_; my ($dist, $query) = &getDistroFromStr($str); my @results = sort &searchPackage($str); @@ -1081,19 +1095,20 @@ sub DebianFind { } sub debianCheck { - my $dir = "debian/"; my $error = 0; &::status("debianCheck() called."); ### TODO: remove the following loop (check if dir exists before) while (1) { - last if (opendir(DEBIAN, $dir)); + last if (opendir(DEBIAN, $debian_dir)); + if ($error) { &::ERROR("dC: cannot opendir debian."); return; } - mkdir $dir, 0755; + + mkdir $debian_dir, 0755; $error++; } @@ -1102,14 +1117,14 @@ sub debianCheck { while (defined($file = readdir DEBIAN)) { next unless ($file =~ /(gz|bz2)$/); - my $exit = system("gzip -t '$dir/$file'"); + my $exit = system("gzip -t '$debian_dir/$file'"); next unless ($exit); &::DEBUG("deb: hmr... => ".(time() - (stat($file))[8])."'."); next unless (time() - (stat($file))[8] > 3600); &::DEBUG("deb: dC: exit => '$exit'."); - &::WARN("dC: '$dir/$file' corrupted? deleting!"); - unlink $dir."/".$file; + &::WARN("dC: '$debian_dir/$file' corrupted? deleting!"); + unlink $debian_dir."/".$file; $retval++; } @@ -1128,7 +1143,7 @@ sub checkEval { } sub searchDescFE { - &::DEBUG("deb: FE called for searchDesc"); +# &::DEBUG("deb: FE called for searchDesc"); my ($query) = @_; my @list = &searchDesc($query);