2 # add_bug_to_estraier adds a log for a bug to the estaier db, and is
3 # released under the terms of the GPL version 2, or any later version,
4 # at your option. See the file README and COPYING for more
6 # Copyright 2006 by Don Armstrong <don@debian.org>.
19 add_bug_to_estraier -- add a bug log to an estraier database
23 add_bug_to_estraier [options] < list_of_bugs_to_add
26 --debug, -d debugging level (Default 0)
27 --help, -h display this help
28 --man, -m display manual
36 Url to the estraier node
40 User to log onto the estraier node
44 Password to log onto the estraier node
48 Spool location; if not set defaults to /etc/debbugs/config
52 Configuration file; a set of key = value pairs separated by newlines;
53 the long name of any option is the name that the configuration file
58 Descend through the spool and add all of the bugs to estraier
62 Use the timestamp file to only add new bugs; will lock the timestamp
63 file to avoid racing with other invocations
67 Debug verbosity. (Default 0)
71 Display brief useage information.
82 test_bts --bug 7 --host donbugs.donarmstrong.com
84 =head1 DATABASE CREATION
86 estcmd create -si -xh3 -attr status str -attr subject str \
87 -attr date num -attr submitter str -attr package str \
88 -attr severity str -attr tags str bts
94 use Debbugs::Config qw(:globals);
95 use Debbugs::Mail qw(send_mail_message);
96 use Debbugs::MIME qw(create_mime_message);
99 use Debbugs::Estraier qw(:add);
103 use vars qw($DEBUG $VERBOSE);
105 # XXX parse config file
107 my %options = (debug => 0,
119 GetOptions(\%options,'url|u=s','user|U=s','passwd|P=s',
120 'spool|s=s','conf|C=s','cron!','timestamp=s',
121 'debug|d+','help|h|?','man|m');
125 if (not defined $options{conf}) {
126 $ERRORS .= "--url must be set\n" if not defined $options{url};
127 $ERRORS .= "--user must be set\n" if not defined $options{user};
128 $ERRORS .= "--passwd must be set\n" if not defined $options{passwd};
132 my $conf_fh = new IO::File $options{conf},'r'
133 or die "Unable to open $options{conf} for reading";
137 my ($key,$value) = split /\s*[:=]\s*/,$_,2;
138 $options{$key} = $value if defined $key and not defined $options{$key};
140 $ERRORS .= "url must be set\n" if not defined $options{url};
141 $ERRORS .= "user must be set\n" if not defined $options{user};
142 $ERRORS .= "passwd must be set\n" if not defined $options{passwd};
144 $ERRORS .= "--spool must be set if --cron is used\n" if
145 not defined $options{spool} and $options{cron};
146 pod2usage($ERRORS) if length $ERRORS;
148 pod2usage() if $options{help};
149 pod2usage({verbose=>2}) if $options{man};
152 $DEBUG = $options{debug};
154 $Debbugs::Estraier::DEBUG = $DEBUG;
157 my $node = new Search::Estraier::Node (url => $options{url},
158 user => $options{user},
159 passwd => $options{passwd},
161 $gSpoolDir = $options{spool} if defined $options{spool};
163 if ($options{cron}) {
165 my $start_time = time;
168 check_pid($options{timestamp});
169 # read timestamp file
170 if (defined $options{timestamp}) {
171 my $timestamp_fh = new IO::File $options{timestamp},'r' or
172 die "Unable to open timestamp $options{timestamp}: $!";
173 while (<$timestamp_fh>) {
175 my ($key,$value) = split /\s+/,$_,2;
176 $timestamps{$key} = $value;
179 for my $hash (map {sprintf '%02d',$_ } 0..99) {
181 print STDERR "Examining $_\n" if $DEBUG > 1;
182 return if not /^(\d+)\.log$/;
184 my $stat = stat $_ or next;
186 return if exists $timestamps{$File::Find::dir} and
187 ($timestamps{$File::Find::dir} > $stat->mtime);
188 $seen_dirs{$File::Find::dir} = $start_time;
189 print STDERR "Adding $bug_num\n" if $DEBUG;
192 $max_message = add_bug_log($node,$bug_num);
195 print STDERR "Adding $bug_num failed with $@\n";
198 map {(-d "$options{spool}/$_/$hash")?
199 "$options{spool}/$_/$hash":()}
202 # write timestamp file
203 if (defined $options{timestamp}) {
204 %timestamps = (%timestamps,%seen_dirs);
205 my $timestamp_fh = new IO::File $options{timestamp},'w' or
206 die "Unable to open timestamp $options{timestamp}: $!";
207 foreach my $key (keys %timestamps) {
208 print {$timestamp_fh} $key,' ',
209 $timestamps{$key}||'',qq(\n);
213 unlink("$options{timestamp}.pid");
216 while (my $bug_num = <STDIN>) {
218 add_bug_log($node,$bug_num);
224 my ($timestamp) = @_;
225 if (-e "${timestamp}.pid") {
226 my $time_fh = new IO::File "${timestamp}.pid", 'r' or die "Unable to read pidfile";
228 my $pid = <$time_fh>;
230 print STDERR "Another cron is running" and exit 0;
233 my $time_fh = new IO::File "${timestamp}.pid", 'w' or
234 die "Unable to read pidfile";