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

Annotation of /FortyEight/Mantis.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3