X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Flocal-debbugs;h=070b5a4b73fc94554fcf8c41c4b049a539710c8d;hb=285eaf73e9bd45eacbab7bffd16d055864df4ccc;hp=b75d55f65d416cd400a6e91ec61ceb0db2a6de1b;hpb=9cd9950343842c95ec12b76d4aaa82908d5e4e81;p=debbugs.git diff --git a/bin/local-debbugs b/bin/local-debbugs index b75d55f..070b5a4 100755 --- a/bin/local-debbugs +++ b/bin/local-debbugs @@ -17,7 +17,7 @@ local-debbugs - use a local mirror of debbugs =head1 SYNOPSIS - [options] + local-debbugs [options] Options: --mirror, -M update local mirror @@ -113,16 +113,15 @@ use vars qw($DEBUG); use User; use Config::Simple; +use File::Basename qw(dirname); use File::Temp qw(tempdir); use Params::Validate qw(validate_with :types); use POSIX 'setsid'; -use Debbugs::Common qw(checkpid lockpid get_hashname); -use Debbugs::Mail qw(get_addresses); use SOAP::Lite; use IPC::Run; use IO::File; use File::Path; - +use File::Spec; my %options = (debug => 0, help => 0, @@ -130,8 +129,7 @@ my %options = (debug => 0, verbose => 0, quiet => 0, detach => 1, - cgi_bin => '/var/lib/debbugs/www/cgi', - css => '/var/lib/debbugs/www/bugs.css', + git_mode => -d (dirname(__FILE__).'/../.git') ? 1 : 0, bug_site => 'bugs.debian.org', bug_mirror => 'bugs-mirror.debian.org', ); @@ -143,7 +141,7 @@ my %option_defaults = (port => 8080, ); GetOptions(\%options, - 'daemon|D','show|s','search|select|S','mirror|M', 'stop', + 'daemon|D','show|s','search|select|S','mirror|M', 'stop|exit|quit', 'detach!', 'css=s','cgi_bin|cgi-bin|cgi=s', 'verbose|v+','quiet|q+', @@ -151,6 +149,22 @@ GetOptions(\%options, 'bug_mirror|bug-mirror=s', 'debug|d+','help|h|?','man|m'); +if ($options{git_mode}) { + my $base_dir = dirname(File::Spec->rel2abs(dirname(__FILE__))); + $options{cgi_bin} = "$base_dir/cgi" unless defined $options{cgi_bin}; + $options{css} = "$base_dir/html/bugs.css" unless defined $options{css}; + $options{template_dir} = "$base_dir/templates"; + $options{base_dir} = $base_dir; + eval "use lib '$options{base_dir}'"; +} else { + $options{cgi_bin} = '/var/lib/debbugs/www/cgi'; + $options{css} = '/var/lib/debbugs/www/bugs.css'; + $options{template_dir} = "/usr/share/debbugs/templates"; +} + +eval "use Debbugs::Common qw(checkpid lockpid get_hashname)"; +eval "use Debbugs::Mail qw(get_addresses)"; + pod2usage() if $options{help}; pod2usage({verbose=>2}) if $options{man}; @@ -158,7 +172,7 @@ $DEBUG = $options{debug}; my @USAGE_ERRORS; if (1 != grep {exists $options{$_}} qw(daemon show search mirror stop)) { - push @USAGE_ERRORS,"You must pass one (and only one) of --daemon --show --search or --mirror"; + push @USAGE_ERRORS,"You must pass one (and only one) of --daemon --show --search --mirror or --stop"; } $options{verbose} = $options{verbose} - $options{quiet}; @@ -183,6 +197,25 @@ if ($options{daemon}) { print STDERR "Unable to determine if daemon is running: $!\n"; exit 1; } + my $conf = IO::File->new($options{mirror_location}.'/debbugs_config_local','w') or + die "Unable to open $options{mirror_location}/debbugs_config_local for writing: $!"; + print {$conf} <<"EOF"; +\$gConfigDir = "$options{mirror_location}"; +\$gSpoolDir = "$options{mirror_location}"; +\$gTemplateDir = "$options{template_dir}"; +\$gWebHost = 'localhost:$options{port}'; +\$gPackageSource = ''; +\$gPseudoDescFile = ''; +\$gPseudoMaintFile = ''; +\$gMaintainerFile = ''; +\$gMaintainerFileOverride = ''; +\$config{source_maintainer_file} = ''; +\$config{source_maintainer_file_override} = ''; +\$gProject = 'Local Debbugs'; +1; +EOF + close $conf; + $ENV{DEBBUGS_CONFIG_FILE} = $options{mirror_location}.'/debbugs_config_local'; # ok, now lets daemonize # XXX make sure that all paths have been turned into absolute @@ -206,7 +239,8 @@ if ($options{daemon}) { package local_debbugs::server; use IO::File; use HTTP::Server::Simple; - use base qw(HTTP::Server::Simple::CGI); + use File::Basename qw(dirname); + use base qw(HTTP::Server::Simple::CGI HTTP::Server::Simple::CGI::Environment); sub net_server { return 'Net::Server::Fork'; @@ -222,6 +256,7 @@ if ($options{daemon}) { sub handle_request { my ($self,$cgi) = @_; + $ENV{DEBBUGS_CONFIG_FILE} = $options{mirror_location}.'/debbugs_config_local'; my $base_uri = 'http://'.$cgi->virtual_host; if ($cgi->virtual_port ne 80) { $base_uri .= ':'.$cgi->virtual_port; @@ -260,11 +295,32 @@ if ($options{daemon}) { redirect($cgi,$base_uri."/cgi-bin/pkgreport.cgi?pkg=$1"); } elsif ($path =~ m{^/?cgi(?:-bin)?/((?:(?:bug|pkg)report|version)\.cgi)}) { - # dispatch to pkgreport.cgi - print "HTTP/1.1 200 OK\n"; - exec("$options{cgi_bin}/$1") or - die "Unable to execute $options{cgi_bin}/$1"; - } + my @exec_options = "$options{cgi_bin}/$1"; + if ($options{git_mode}) { + unshift @exec_options, + 'perl','-I',$options{base_dir},'-T'; + } + open(my $fh,'-|',@exec_options) or + die "Unable to execute $options{cgi_bin}/$1"; + my $status; + my $cache = ''; + while (<$fh>) { + if (/Status: (\d+\s+.+?)\n?$/) { + $status = $1; + print "HTTP/1.1 $status\n"; + print STDERR "'$status'\n"; + last; + } + $cache .= $_; + if (/^$/) { + print "HTTP/1.1 200 OK\n"; + last; + } + } + print $cache; + print <$fh>; + close($fh) or die "Unable to close"; + } elsif ($path =~ m{^/?css/bugs.css}) { my $fh = IO::File->new($options{css},'r') or die "Unable to open $options{css} for reading: $!"; @@ -438,9 +494,8 @@ sub run_rsync{ ); my ($output,$error) = ('',''); my $h = IPC::Run::start(['rsync',@{$param{options}}], - \undef,\$output,\$error); + \undef,$param{log},$param{log}); while ($h->pump) { - print {$param{log}} $output,$error; #print {$param{debug}} $error if defined $param{debug}; } $h->finish(); @@ -512,7 +567,7 @@ sub select_bugs{ elsif (/\s\w+\:/) { push @bug_selections, $_; } - } + } } # Split archive:both into archive:1 and archive:0 @bug_selections = @@ -563,6 +618,10 @@ sub select_bugs{ $bugs{$archived_bugs}{$_} = 1 for @{$bugs}; } } + for my $bug (@bugs) { + $bugs{archived}{$bug} = 1; + $bugs{unarchived}{$bug} = 1; + } return \%bugs; }