[Bio] / FortyEight / Mantis.pm Repository:
ViewVC logotype

Annotation of /FortyEight/Mantis.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (view) (download) (as text)

1 : olson 1.1
2 :    
3 :     package Mantis;
4 :    
5 :     use Data::Dumper;
6 : olson 1.4 use FIG_Config;
7 : olson 1.1 use POSIX;
8 :     use LWP::UserAgent;
9 : olson 1.3 use File::Basename;
10 : olson 1.1
11 :     use base 'Class::Accessor';
12 :     use DBI;
13 :     use strict;
14 :    
15 :     __PACKAGE__->mk_accessors(qw(info dbh ua base_url web_user web_pass logged_in));
16 :    
17 :     sub new
18 :     {
19 :     my($class, $info) = @_;
20 :    
21 :     my $db_conn = $info->{db_connect};
22 :     my $db_user = $info->{db_user};
23 :     my $db_pass = $info->{db_pass};
24 :     my $base_url = $info->{base_url};
25 :    
26 :     my $dbh = DBI->connect($db_conn, $db_user, $db_pass);
27 :    
28 :     $dbh or die "cannot connect to db: conn=$db_conn user=$db_user\n";
29 :    
30 :     my $ua = LWP::UserAgent->new();
31 :     my $cookies = {};
32 :     $ua->cookie_jar($cookies);
33 :    
34 :     my $self = {
35 :     dbh => $dbh,
36 :     info => $info,
37 :     ua => $ua,
38 :     base_url => $base_url,
39 :     web_user => $info->{web_user},
40 :     web_pass => $info->{web_pass},
41 :     };
42 :     return bless $self, $class;
43 :     }
44 :    
45 :     #
46 :     # Invoked like:
47 :     #
48 :     # Mantis::report_bug(info => $FIG_Config::mantis_info,
49 :     # stage => $stage,
50 :     # genome => $genome,
51 :     # genome_name => $genome_name,
52 :     # job_id =>$ job_id,
53 :     # job_dir => $job_dir,
54 :     # meta => $meta,
55 :     # user_email => $email,
56 :     # user_name => $name,
57 :     # msg => $msg);
58 :    
59 :     sub report_bug
60 :     {
61 :     my($self, %opts) = @_;
62 :    
63 :     my $reporter = $self->check_for_reporter($opts{user_email});
64 :    
65 :     my $project = $self->info->{project_id} or 0;
66 :    
67 :     #
68 :     # Bug description.
69 :     #
70 : olson 1.2
71 :     my $sys = $self->info->{system};
72 :     my $summary = "$sys error detected in job $opts{job_id} stage $opts{stage}";
73 : olson 1.1
74 :     my $descr = "Error reported in job $opts{job_id} in $opts{job_dir}\n";
75 :     $descr .= $opts{msg};
76 :    
77 :     #
78 :     # Extra info. Include dump of metadata here plus the metadata log.
79 :     #
80 :     my $extra = "";
81 :     my $meta = $opts{meta};
82 :    
83 :     my $dbh = $self->dbh;
84 :     $dbh->do(qq(INSERT INTO mantis_bug_text_table (description, steps_to_reproduce, additional_information)
85 :     VALUES (?, ?, ?)), undef,
86 :     $descr, '', $extra);
87 :    
88 :     my $text_id = $dbh->{mysql_insertid};
89 :     print "inserted: '$text_id'\n";
90 :    
91 : olson 1.2 #
92 :     # Determine if there is an auto-assigned handler for this project & category.
93 :     #
94 :    
95 :     my $res = $dbh->selectall_arrayref(qq(SELECT user_id
96 :     FROM mantis_project_category_table
97 :     WHERE project_id = ? AND category = ?), undef,
98 :     $project, $self->info->{bug_category});
99 :     # print Dumper($res);
100 :     my $handler = 0;
101 :     if (@$res)
102 :     {
103 :     $handler = $res->[0]->[0];
104 :     }
105 :    
106 :     $dbh->do(qq(INSERT INTO mantis_bug_table (project_id, reporter_id, handler_id, date_submitted, last_updated,
107 :     bug_text_id, summary, category)
108 :     VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?, ?, ?)), undef,
109 :     $project, $reporter, $handler, $text_id, $summary, $self->info->{bug_category});
110 : olson 1.1 my $bug_id = $dbh->{mysql_insertid};
111 :    
112 :     {
113 : olson 1.3 my $b = $meta->get_metadata('mantis.bug');
114 :     if (ref($b))
115 :     {
116 :     push(@$b, $bug_id);
117 :     }
118 :     else
119 :     {
120 :     $b = [$bug_id];
121 :     }
122 :     $meta->set_metadata('mantis.bug', $b);
123 : olson 1.1 }
124 :    
125 :     #
126 :     # custom field.
127 :     #
128 :     $dbh->do(qq(INSERT INTO mantis_custom_field_string_table (field_id, bug_id, value)
129 :     VALUES (?, ?, ?)), undef,
130 :     $self->info->{field_job_number}, $bug_id, $opts{job_id});
131 :     $dbh->do(qq(INSERT INTO mantis_custom_field_string_table (field_id, bug_id, value)
132 :     VALUES (?, ?, ?)), undef,
133 :     $self->info->{field_server}, $bug_id, $self->info->{server_value});
134 :    
135 :     if ($meta)
136 :     {
137 :     my $tmp = "/tmp/mantis.$$";
138 :     mkdir $tmp;
139 :     open(T, ">$tmp/metadata_dump");
140 :    
141 :     for my $key (sort $meta->get_metadata_keys())
142 :     {
143 :     my $val = $meta->get_metadata($key);
144 :     if (ref($val))
145 :     {
146 :     $val = Dumper($val);
147 :     }
148 :     print T "$key: $val\n";
149 :     }
150 :     close(T);
151 :    
152 :     $self->upload_file($bug_id, "$tmp/metadata_dump");
153 :     unlink("$tmp/metadata_dump");
154 :    
155 :     open(T, ">$tmp/log_dump");
156 :    
157 :     my $log = $meta->get_log();
158 :     for my $l (@$log)
159 :     {
160 :     my($type, $what, $date, $data) = @$l;
161 :     my $dstr = strftime("%Y-%m-%d %H:%M:%S", localtime $date);
162 :     if (ref($data))
163 :     {
164 :     $data = Dumper($data);
165 :     }
166 :     print T "$type\t$what\t$dstr\t$data\n";
167 :     }
168 :     close(T);
169 :     $self->upload_file($bug_id, "$tmp/log_dump");
170 :     unlink("$tmp/log_dump");
171 :     rmdir($tmp);
172 :     }
173 :    
174 : olson 1.3 #
175 :     # Insert a note for each error file.
176 :     #
177 :    
178 :     my @err_files = <$opts{job_dir}/rp.errors/*>;
179 : olson 1.5 @err_files = grep { -f $_->[0] } map { my @s = stat($_); [$_, @s] } @err_files;
180 : olson 1.3
181 :     my @empty;
182 :     for my $err_file (sort { $b->[10] <=> $a->[10] } @err_files)
183 :     {
184 :     my $path = $err_file->[0];
185 :    
186 :     if ($err_file->[8] == 0)
187 :     {
188 :     push(@empty, $path);
189 :     next;
190 :     }
191 :    
192 :     eval {
193 : olson 1.4 my $url_base = $FIG_Config::fortyeight_home;
194 :     $url_base =~ s,/[^/]+\.cgi,,;
195 :    
196 :     my $size = -s $path;
197 :    
198 :     my $txt;
199 :     my $base = basename($path);
200 :     my $url = "$url_base/rast.cgi?page=ShowErrorFile&job=$opts{job_id}&file=$base";
201 :    
202 :     $txt .= "Error file $base exists ($size bytes)\n";
203 :     $txt .= "$url\n";
204 :     $txt .= "Last ten lines of file:\n\n";
205 : olson 1.3 $txt .= `tail -10 $path`;
206 :    
207 :     insert_note($dbh, $bug_id, $reporter, $txt);
208 :     };
209 :     if ($@)
210 :     {
211 :     warn "Error inserting bug note about $path: $@\n";
212 :     }
213 :     }
214 :    
215 :     if (@empty)
216 :     {
217 :     my $txt = "Empty error files:\n" . join("\n", @empty), "\n";
218 :     insert_note($dbh, $bug_id, $reporter, $txt);
219 :     }
220 :    
221 : olson 1.2 my $bug_url = $self->info->{public_url} . "/view.php?id=$bug_id";
222 :     return($bug_id, $bug_url);
223 : olson 1.1 }
224 :    
225 :    
226 : olson 1.3 sub insert_note
227 :     {
228 :     my($dbh, $bug_id, $reporter, $txt) = @_;
229 :    
230 :     $dbh->do(qq(INSERT INTO mantis_bugnote_text_table(note) VALUES (?)),
231 :     undef, $txt);
232 :     my $tid = $dbh->{mysql_insertid};
233 :     $dbh->do(qq(INSERT INTO mantis_bugnote_table (bug_id, reporter_id, bugnote_text_id, view_state, date_submitted, last_modified)
234 :     VALUES (?, ?, ?, 10, NOW(), NOW())), undef, $bug_id, $reporter, $tid);
235 :     }
236 :    
237 : olson 1.1 sub check_for_reporter
238 :     {
239 :     my($self, $email) = @_;
240 :    
241 :     my $res = $self->dbh->selectall_arrayref(qq(SELECT id
242 :     FROM mantis_user_table
243 :     WHERE email = ? AND enabled = 1
244 :     ORDER BY access_level), undef, $email);
245 :     if (! $res)
246 :     {
247 :     die "check_for_reporter: lookup error: " . DBI->errstr;
248 :     }
249 :     if (@$res)
250 :     {
251 :     return $res->[0]->[0];
252 :     }
253 :     else
254 :     {
255 :     #
256 :     # Look up the rast user.
257 :     #
258 :    
259 :     my $rast_user = $self->info->{default_reporter};
260 :     my $res = $self->dbh->selectall_arrayref(qq(SELECT id
261 :     FROM mantis_user_table
262 :     WHERE username = ? AND enabled = 1
263 :     ORDER BY access_level), undef, $rast_user);
264 :     if (@$res)
265 :     {
266 :     return $res->[0]->[0];
267 :     }
268 :     else
269 :     {
270 :     die "Default mantis reporter not found (rast_user='$rast_user')";
271 :     }
272 :     }
273 :     }
274 :    
275 :     sub login
276 :     {
277 :     my($self) = @_;
278 :    
279 :     my $resp = $self->ua->post($self->base_url . '/login.php',
280 :     [ username => $self->web_user,
281 :     password => $self->web_pass,
282 :     perm_login => '',
283 :     ],
284 :     Content_Type => 'form-data',
285 :     );
286 :     $self->logged_in(1);
287 :     }
288 :    
289 :     sub upload_file
290 :     {
291 :     my($self, $bug_id, $file) = @_;
292 :    
293 :     if (!$self->logged_in)
294 :     {
295 :     $self->login();
296 :     }
297 :    
298 :     my $l = -s $file;
299 :    
300 :     my $resp = $self->ua->post($self->base_url . "/bug_file_add.php",
301 :     [
302 :     bug_id => $bug_id,
303 :     max_file_size => 2000000,
304 :     file => [$file],
305 :     ],
306 :     Content_Length => $l,
307 :     Content_Type => 'form-data'
308 :     );
309 :    
310 :     }
311 :    
312 :    
313 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3