[Bio] / FigWebServices / rast_submit_server.cgi Repository:
ViewVC logotype

Annotation of /FigWebServices/rast_submit_server.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (view) (download)

1 : olson 1.1 use strict;
2 :     use FIG;
3 : olson 1.9 use POSIX;
4 : olson 1.1
5 :     my $have_fcgi;
6 :     eval {
7 :     require CGI::Fast;
8 :     $have_fcgi = 1;
9 :     };
10 :    
11 :     use Data::Dumper;
12 :     use DBMaster;
13 :     use FIG_Config;
14 :     use RAST_submission;
15 :    
16 : olson 1.4 $YAML::CompressSeries = 0;
17 :    
18 : olson 1.1 #
19 :     # This is the list of supported methods.
20 :     #
21 :    
22 : olson 1.2 my @methods = qw(
23 : olson 1.3 get_contig_ids_in_project_from_entrez
24 : olson 1.5 get_contigs_from_entrez
25 : olson 1.2 submit_RAST_job
26 :     status_of_RAST_job
27 : olson 1.6 kill_RAST_job
28 :     delete_RAST_job
29 : olson 1.10 copy_to_RAST_dir
30 : olson 1.8 get_job_metadata
31 : olson 1.2 );
32 :    
33 : olson 1.1 my %methods = map { $_ => 1 } @methods;
34 :    
35 :     use YAML;
36 :    
37 :     $| = 1;
38 :    
39 :     my $header = "Content-type: text/plain\n\n";
40 :    
41 :     my $max_requests = 5000;
42 :    
43 :     #
44 :     # If no CGI vars, assume we are invoked as a fastcgi service.
45 :     #
46 :     my $n_requests = 0;
47 :     if ($have_fcgi && $ENV{REQUEST_METHOD} eq '')
48 :     {
49 :     while ((my $cgi = new CGI::Fast()) &&
50 :     ($max_requests == 0 || $n_requests++ < $max_requests))
51 :     {
52 : olson 1.8 &log("fcgi request received");
53 : olson 1.1 eval {
54 :     &process_request($cgi);
55 :     };
56 : olson 1.8 my $had_error = $@;
57 :     &log("fcgi request completed $had_error");
58 :     if ($had_error)
59 : olson 1.1 {
60 : olson 1.8 if (ref($had_error) ne 'ARRAY')
61 : olson 1.1 {
62 :     warn "code died, cgi=$cgi returning error\n";
63 :     print $cgi->header(-status => '500 error in body of cgi processing');
64 :     print $@;
65 :     }
66 :     }
67 :     endloop:
68 :     }
69 :     }
70 :     else
71 :     {
72 :     my $cgi = new CGI();
73 : olson 1.8 &log("request received");
74 : olson 1.1 &process_request($cgi);
75 : olson 1.8 &log("request completed");
76 : olson 1.1 }
77 :    
78 :     exit;
79 :    
80 : olson 1.8 sub log
81 :     {
82 :     my($msg) = @_;
83 :     print STDERR strftime("%D %T: $msg\n", localtime);
84 :     }
85 :    
86 :    
87 : olson 1.1 sub process_request
88 :     {
89 :     my($cgi) = @_;
90 :    
91 :     my $function = $cgi->param('function');
92 :     # print STDERR "got function=$function\n";
93 : olson 1.8 &log("handle $function");
94 : olson 1.1
95 :     my $arg_str = $cgi->param('args');
96 :     my @args;
97 :     if ($arg_str)
98 :     {
99 :     eval {
100 :     @args = YAML::Load($arg_str);
101 :     };
102 :     if ($@)
103 :     {
104 :     myerror($cgi, "500 bad YAML parse", "YAML parse failed");
105 :     next;
106 :     }
107 :     }
108 :    
109 :     $function or myerror($cgi, "500 missing argument", "missing function argument");
110 :    
111 :     #
112 :     # Pull username & password from the arguments and authenticate.
113 :     #
114 :    
115 :     my $rast_user = $cgi->param('username');
116 :     my $rast_password = $cgi->param('password');
117 :    
118 :     if ($rast_user eq '')
119 :     {
120 :     &myerror($cgi, '500 missing username', 'RAST username is missing');
121 :     }
122 :    
123 :     #
124 :     # Connect to the authentication database.
125 :     #
126 :    
127 :     my $dbmaster;
128 :     eval {
129 :     $dbmaster = DBMaster->new(-database => $FIG_Config::webapplication_db || "WebAppBackend",
130 :     -host => $FIG_Config::webapplication_host || "localhost",
131 :     -user => $FIG_Config::webapplication_user || "root",
132 :     -password => $FIG_Config::webapplication_password || "");
133 :     };
134 :    
135 :     #
136 :     # And evaluate username and password.
137 :     #
138 :    
139 :     my $user_obj = $dbmaster->User->init( { login => $rast_user });
140 :     if (!ref($user_obj) || !$user_obj->active)
141 :     {
142 :     &myerror($cgi, '500 invalid login', 'Invalid RAST login');
143 :     }
144 :    
145 :     if (crypt($rast_password, $user_obj->password) ne $user_obj->password)
146 :     {
147 :     &myerror($cgi, '500 invalid login', 'Invalid RAST login');
148 :     }
149 :     warn "Authenticated $rast_user\n";
150 :    
151 :     # Connect to the RAST job cache
152 :     my $rast_dbmaster = DBMaster->new(-backend => 'MySQL',
153 :     -database => $FIG_Config::rast_jobcache_db,
154 :     -host => $FIG_Config::rast_jobcache_host,
155 :     -user => $FIG_Config::rast_jobcache_user,
156 :     -password => $FIG_Config::rast_jobcache_password );
157 :    
158 :     my $rast_obj = new RAST_submission($rast_dbmaster, $dbmaster, $user_obj);
159 :    
160 : olson 1.10 if ($function eq 'copy_to_RAST_dir')
161 :     {
162 :     #
163 :     # For the copy, we pluck the file upload
164 :     # from the CGI and give it to the handler as well.
165 :     #
166 :     my $file = $cgi->upload('file');
167 : olson 1.11 if (!ref($file))
168 :     {
169 :     $file = $cgi->param("file");
170 :     }
171 : olson 1.10
172 :     my $params = $args[0];
173 :     $params->{-from} = $file if ref($params) eq 'HASH';
174 :     }
175 : olson 1.7
176 :     #
177 :     # We handle retrieve in a different manner.
178 :     #
179 :     if ($function eq 'retrieve_RAST_job')
180 :     {
181 :     my $res;
182 :     eval {
183 :     $res = $rast_obj->retrieve_RAST_job(@args);
184 :     };
185 :    
186 :     if ($@)
187 :     {
188 :     myerror($cgi, '500 error in method invocation', $@);
189 :     }
190 :    
191 :     if ($res->{status} ne 'ok')
192 :     {
193 :     myerror($cgi, "501 retrieve failed: $res->{error_msg}");
194 :     }
195 :    
196 :     if (!open(F, "<", $res->{file}))
197 :     {
198 :     myerror($cgi, "501 could not open output file");
199 :     }
200 :    
201 :     print $cgi->header();
202 :    
203 :     my $buf;
204 :    
205 :     while (read(F, $buf, 4096))
206 :     {
207 :     print $buf;
208 :     }
209 :     close(F);
210 :     }
211 :     elsif ($methods{$function})
212 : olson 1.1 {
213 :    
214 :     my @results;
215 :     eval {
216 :     @results = $rast_obj->$function(@args);
217 :     };
218 :    
219 :     if ($@)
220 :     {
221 : olson 1.11 warn $@;
222 : olson 1.1 myerror($cgi, '500 error in method invocation', $@);
223 :     }
224 :    
225 :     print $cgi->header();
226 : olson 1.4 my $res = YAML::Dump(@results);
227 :     #print STDERR $res;
228 :     print $res;
229 : olson 1.1
230 :     } else {
231 :     myerror($cgi, "500 invalid function", "invalid function $function\n");
232 :     }
233 :     }
234 :    
235 :     exit;
236 :    
237 :     sub get_string_param
238 :     {
239 :     my($cgi, $name) = @_;
240 :    
241 :     my $str = $cgi->param($name);
242 :     if ($str =~ /^(\S+)/)
243 :     {
244 :     return $1;
245 :     }
246 :     else
247 :     {
248 :     return undef;
249 :     }
250 :    
251 :     }
252 :    
253 :    
254 :     sub myerror
255 :     {
256 :     my($cgi, $stat, $msg) = @_;
257 :     print $cgi->header(-status => $stat);
258 :     print "$msg\n";
259 :     goto endloop;
260 :     }
261 :    
262 :    
263 :    
264 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3