source: main/trunk/greenstone2/cgi-bin/talkback-transfer.pl@ 23516

Last change on this file since 23516 was 23516, checked in by davidb, 13 years ago

Additional check added to ensure GLIServer.jar file exists, and issues an error message if not.

  • Property svn:executable set to *
File size: 4.9 KB
Line 
1#!/usr/bin/perl -w
2
3use strict;
4
5use LWP::UserAgent;
6use HTTP::Request::Common;
7
8use CGI::Carp qw(fatalsToBrowser);
9use CGI;
10
11use File::Basename;
12
13BEGIN {
14 eval('require "./gsdlCGI.pm"');
15 if ($@)
16 {
17 print STDOUT "Content-type:text/plain\n\n";
18 print STDOUT "ERROR: $@\n";
19 exit 0;
20 }
21
22 # Line to stop annoying child DOS CMD windows from appearing
23 Win32::SetChildShowWindow(0)
24 if defined &Win32::SetChildShowWindow;
25}
26
27
28
29
30sub get_infodb_type
31{
32 my ($opt_site,$collect_home,$collect) = @_;
33
34 my $out = "STDERR";
35
36 $collect = &colcfg::use_collection($opt_site, $collect, $collect_home);
37
38 if ($collect eq "") {
39 print STDERR "Error: failed to find collection $collect in $collect_home\n";
40 print STDOUT "Content-type:text/plain\n\n";
41 print STDOUT "ERROR: Failed to find collection $collect\n";
42 exit 0;
43
44 }
45
46 # Read in the collection configuration file.
47 my ($config_filename, $gs_mode) = &colcfg::get_collect_cfg_name($out);
48 my $collectcfg = &colcfg::read_collection_cfg ($config_filename, $gs_mode);
49
50 return $collectcfg->{'infodbtype'};
51}
52
53
54sub oid_to_docxml_filename
55{
56 my ($opt_site,$collect_home,$collect,$docid) = @_;
57
58 my $infodb_type = get_infodb_type($opt_site,$collect_home,$collect);
59
60 # Derive the archives dir
61 my $archive_dir = &util::filename_cat($collect_home,$collect,"archives");
62
63 # Obtain the doc.xml path for the specified docID
64 my $arcinfo_doc_filename
65 = &dbutil::get_infodb_file_path($infodb_type, "archiveinf-doc",
66 $archive_dir);
67 my $doc_rec
68 = &dbutil::read_infodb_entry($infodb_type, $arcinfo_doc_filename,
69 $docid);
70
71 my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
72 my $assoc_path = dirname($doc_xml_file);
73
74 # The $doc_xml_file is relative to the archives, so now let's get the
75 # full path
76 my $doc_xml_filename = &util::filename_cat($archive_dir,$doc_xml_file);
77
78 return ($doc_xml_filename,$assoc_path);
79}
80
81sub zip_up_archives_doc
82{
83 my ($gsdl_cgi,$collect_home,$collect,$doc_xml_filename,$assoc_path) = @_;
84
85 my $timestamp = time();
86 my $lang_env = $gsdl_cgi->clean_param("lr") || "";
87
88 my $archive_dir = &util::filename_cat($collect_home,$collect,"archives");
89
90 # Zip up the doc_xml file and all the files associated with it
91 my $java = $gsdl_cgi->get_java_path();
92 my $jar_dir= &util::filename_cat($ENV{'GSDLHOME'}, "bin", "java");
93 my $java_classpath = &util::filename_cat($jar_dir,"GLIServer.jar");
94
95 if (!-f $java_classpath) {
96 $gsdl_cgi->generate_error("Failed to find $java_classpath");
97 }
98
99 my $zip_file = "$collect-$timestamp.zip";
100 my $zip_file_path = &util::filename_cat($archive_dir,$zip_file);
101
102 my $java_args = "\"$zip_file_path\" \"$archive_dir\" \"$assoc_path\"";
103
104 $ENV{'LANG'} = $lang_env;
105 my $java_command = "\"$java\" -classpath \"$java_classpath\" org.greenstone.gatherer.remote.ZipFiles $java_args";
106
107 my $java_output = `$java_command`;
108 my $java_status = $?;
109 if ($java_status > 0) {
110 $gsdl_cgi->generate_error("Java failed: $java_command\n--\n$java_output\nExit status: " . ($java_status / 256) . "\n" . $gsdl_cgi->check_java_home());
111 }
112
113 # Check that the zip file was created successfully
114 if (!-e $zip_file_path || -z $zip_file_path) {
115 $gsdl_cgi->generate_error("Collection zip file $zip_file_path could not be created.");
116 }
117
118 return $zip_file_path;
119
120}
121
122sub main
123{
124 # Setup greenstone Perl include paths so additional packages can be found
125 my $gsdl_cgi = gsdlCGI->new();
126 $gsdl_cgi->setup_gsdl();
127
128 my $gsdl_home = $gsdl_cgi->get_gsdl_home();
129 my $collect_home = &util::filename_cat($gsdl_home,"collect");
130
131 require dbutil;
132 require talkback;
133 require colcfg;
134
135 my $oid = $gsdl_cgi->param('oid');
136 my $collect = $gsdl_cgi->param('fromCollect');
137 my $toCollect = $gsdl_cgi->param('toCollect');
138 my $site = $gsdl_cgi->param('site');
139
140 # sanity check
141 if (!defined $oid || !defined $collect) {
142 print STDOUT "Content-type:text/plain\n\n";
143 print STDOUT "ERROR: Malformed CGI argments. Need to specify 'oid' and 'collect'\n";
144 exit 0;
145 }
146
147 my $uniq_prefix = "$collect-$oid";
148
149 my ($docxml_filename,$assoc_path)
150 = oid_to_docxml_filename($site,$collect_home,$collect,$oid);
151
152 my $zip_filename
153 = zip_up_archives_doc($gsdl_cgi,$collect_home,$collect,
154 $docxml_filename,$assoc_path);
155
156 my $talktoUploadURL = $gsdl_cgi->param('talktoUpload');
157
158 my $browser = LWP::UserAgent->new(agent => 'Perl File Upload');
159
160 my $response = $browser->post(
161 $talktoUploadURL,
162 [ 'yes_upload' => '1',
163 'process' => '1',
164 'oid' => $oid,
165 'toCollect' => $toCollect,
166 'uploadedfile' => [$zip_filename, "$uniq_prefix-doc.zip"]
167 ],
168 'Content_Type' => 'form-data'
169 );
170
171 if ($response->is_success) {
172 print "Content-type:text/html\n\n";
173 print $response->content;
174 }
175 else {
176 print $response->error_as_HTML;
177 }
178
179}
180
181main();
182
Note: See TracBrowser for help on using the repository browser.