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>.
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
88 use Debbugs::Mail qw(send_mail_message);
89 use Debbugs::MIME qw(create_mime_message);
92 use Debbugs::Estraier qw(:add);
95 use vars qw($DEBUG $VERBOSE);
97 # XXX parse config file
99 my %options = (debug => 0,
111 GetOptions(\%options,'url|u=s','user|U=s','passwd|P=s',
112 'spool|s=s','conf|C=s','cron!','timestamp=s',
113 'debug|d+','help|h|?','man|m');
117 if (not defined $options{conf}) {
118 $ERRORS .= "--url must be set\n" if not defined $options{url};
119 $ERRORS .= "--user must be set\n" if not defined $options{user};
120 $ERRORS .= "--passwd must be set\n" if not defined $options{passwd};
124 my $conf_fh = new IO::File $options{conf},'r'
125 or die "Unable to open $options{conf} for reading";
129 my ($key,$value) = split /\s*[:=]\s*/,$_,2;
130 $options{$key} = $value if not defined $options{$key};
132 $ERRORS .= "url must be set\n" if not defined $options{url};
133 $ERRORS .= "user must be set\n" if not defined $options{user};
134 $ERRORS .= "passwd must be set\n" if not defined $options{passwd};
136 $ERRORS .= "--spool must be set if --cron is used\n" if
137 not defined $options{spool} and $options{cron};
138 pod2usage($ERRORS) if length $ERRORS;
140 pod2usage() if $options{help};
141 pod2usage({verbose=>2}) if $options{man};
144 $DEBUG = $options{debug};
148 my $node = new Search::Estraier::Node (url => $options{url},
149 user => $options{user},
150 passwd => $options{passwd},
152 $Debbugs::Config::gSpoolDir = $options{spool} if defined $options{spool};
154 if ($options{cron}) {
156 my $start_time = time;
158 # read timestamp file
159 if (defined $options{timestamp}) {
160 my $timestamp_fh = new IO::File $options{timestamp},'r' or
161 die "Unable to open timestamp $options{timestamp}: $!";
162 while (<$timestamp_fh>) {
164 my ($key,$value) = split /\s+/,$_,2;
165 $timestamps{$key} = $value;
169 print STDERR "Examining $_\n" if $DEBUG;
170 return if not /^(\d+)\.log$/;
172 my $stat = stat $_ or next;
174 return if exists $timestamps{$File::Find::dir} and
175 $timestamps{$File::Find::dir} > $stat->mtime;
176 $seen_dirs{$File::Find::dir} = $start_time;
177 add_bug_log($node,$1);
179 map {(-d "$options{spool}/$_")?"$options{spool}/$_":()}
180 qw(db-h archived db),
182 # write timestamp file
183 if (defined $options{timestamp}) {
184 %timestamps = (%timestamps,%seen_dirs);
185 my $timestamp_fh = new IO::File $options{timestamp},'w' or
186 die "Unable to open timestamp $options{timestamp}: $!";
187 foreach my $key (keys %timestamps) {
188 print {$timestamp_fh} $key,' ',
189 $timestamps{$key}||'',qq(\n);
194 while (my $bug_num = <STDIN>) {
196 add_bug_log($node,$bug_num);