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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3