[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.8 - (view) (download)

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3