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

Annotation of /FortyEight/Mantis.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (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 :    
69 :     my $descr = "Error reported in job $opts{job_id} in $opts{job_dir}\n";
70 :     $descr .= $opts{msg};
71 :    
72 :     #
73 :     # Extra info. Include dump of metadata here plus the metadata log.
74 :     #
75 :     my $extra = "";
76 :     my $meta = $opts{meta};
77 :    
78 :     my $dbh = $self->dbh;
79 :     $dbh->do(qq(INSERT INTO mantis_bug_text_table (description, steps_to_reproduce, additional_information)
80 :     VALUES (?, ?, ?)), undef,
81 :     $descr, '', $extra);
82 :    
83 :     my $text_id = $dbh->{mysql_insertid};
84 :     print "inserted: '$text_id'\n";
85 :    
86 :     $dbh->do(qq(INSERT INTO mantis_bug_table (project_id, reporter_id, date_submitted, last_updated, bug_text_id)
87 :     VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)), undef,
88 :     $project, $reporter, $text_id);
89 :     my $bug_id = $dbh->{mysql_insertid};
90 :    
91 :     my $b = $meta->get_metadata('mantis.bug');
92 :     if (ref($b))
93 :     {
94 :     push(@$b, $bug_id);
95 :     }
96 :     else
97 :     {
98 :     $b = [$bug_id];
99 :     }
100 :     $meta->set_metadata('mantis.bug', $b);
101 :    
102 :     #
103 :     # custom field.
104 :     #
105 :     $dbh->do(qq(INSERT INTO mantis_custom_field_string_table (field_id, bug_id, value)
106 :     VALUES (?, ?, ?)), undef,
107 :     $self->info->{field_job_number}, $bug_id, $opts{job_id});
108 :     $dbh->do(qq(INSERT INTO mantis_custom_field_string_table (field_id, bug_id, value)
109 :     VALUES (?, ?, ?)), undef,
110 :     $self->info->{field_server}, $bug_id, $self->info->{server_value});
111 :    
112 :     if ($meta)
113 :     {
114 :     my $tmp = "/tmp/mantis.$$";
115 :     mkdir $tmp;
116 :     open(T, ">$tmp/metadata_dump");
117 :    
118 :     for my $key (sort $meta->get_metadata_keys())
119 :     {
120 :     my $val = $meta->get_metadata($key);
121 :     if (ref($val))
122 :     {
123 :     $val = Dumper($val);
124 :     }
125 :     print T "$key: $val\n";
126 :     }
127 :     close(T);
128 :    
129 :     $self->upload_file($bug_id, "$tmp/metadata_dump");
130 :     unlink("$tmp/metadata_dump");
131 :    
132 :     open(T, ">$tmp/log_dump");
133 :    
134 :     my $log = $meta->get_log();
135 :     for my $l (@$log)
136 :     {
137 :     my($type, $what, $date, $data) = @$l;
138 :     my $dstr = strftime("%Y-%m-%d %H:%M:%S", localtime $date);
139 :     if (ref($data))
140 :     {
141 :     $data = Dumper($data);
142 :     }
143 :     print T "$type\t$what\t$dstr\t$data\n";
144 :     }
145 :     close(T);
146 :     $self->upload_file($bug_id, "$tmp/log_dump");
147 :     unlink("$tmp/log_dump");
148 :     rmdir($tmp);
149 :     }
150 :    
151 :     }
152 :    
153 :    
154 :     sub check_for_reporter
155 :     {
156 :     my($self, $email) = @_;
157 :    
158 :     my $res = $self->dbh->selectall_arrayref(qq(SELECT id
159 :     FROM mantis_user_table
160 :     WHERE email = ? AND enabled = 1
161 :     ORDER BY access_level), undef, $email);
162 :     if (! $res)
163 :     {
164 :     die "check_for_reporter: lookup error: " . DBI->errstr;
165 :     }
166 :     if (@$res)
167 :     {
168 :     return $res->[0]->[0];
169 :     }
170 :     else
171 :     {
172 :     #
173 :     # Look up the rast user.
174 :     #
175 :    
176 :     my $rast_user = $self->info->{default_reporter};
177 :     my $res = $self->dbh->selectall_arrayref(qq(SELECT id
178 :     FROM mantis_user_table
179 :     WHERE username = ? AND enabled = 1
180 :     ORDER BY access_level), undef, $rast_user);
181 :     if (@$res)
182 :     {
183 :     return $res->[0]->[0];
184 :     }
185 :     else
186 :     {
187 :     die "Default mantis reporter not found (rast_user='$rast_user')";
188 :     }
189 :     }
190 :     }
191 :    
192 :     sub login
193 :     {
194 :     my($self) = @_;
195 :    
196 :     my $resp = $self->ua->post($self->base_url . '/login.php',
197 :     [ username => $self->web_user,
198 :     password => $self->web_pass,
199 :     perm_login => '',
200 :     ],
201 :     Content_Type => 'form-data',
202 :     );
203 :     $self->logged_in(1);
204 :     }
205 :    
206 :     sub upload_file
207 :     {
208 :     my($self, $bug_id, $file) = @_;
209 :    
210 :     if (!$self->logged_in)
211 :     {
212 :     $self->login();
213 :     }
214 :    
215 :     my $l = -s $file;
216 :    
217 :     my $resp = $self->ua->post($self->base_url . "/bug_file_add.php",
218 :     [
219 :     bug_id => $bug_id,
220 :     max_file_size => 2000000,
221 :     file => [$file],
222 :     ],
223 :     Content_Length => $l,
224 :     Content_Type => 'form-data'
225 :     );
226 :    
227 :     }
228 :    
229 :    
230 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3