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

Annotation of /FortyEight/Mantis.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3