source: other-projects/nightly-tasks/diffcol/trunk/task.pl@ 27702

Last change on this file since 27702 was 27702, checked in by ak19, 11 years ago

I think the reports get generated and uploaded nightly, but they get deleted on nzdl by a tnightly task that's run. The nightly caveat cleanup that runs on nzdl looks for the date format in caveat filenames to have period separators as opposed to hyphens. The former caveat files get preserved overnight.

  • Property svn:executable set to *
File size: 25.6 KB
Line 
1#!/usr/bin/perl -w
2
3# This program is meant to run the nightly diffcol
4# It is meant to be an equivalent for the existing task bash script
5# But it is intended to be expanded to work for Windows and GS3
6# For windows, need to REMEMBER to set the correct shebangs at the top
7
8
9# TODO:
10# Have a caveat mode and a stable mode (as in snapshot/task.pl)
11#
12#} elsif ( $ENV{'TASK_NAME'} =~ "gs2-diffcol-(caveat|stable)" ) {
13# $major_version = 2;
14# $prefix="2t";
15# $rk="tk2"; # test kit
16#} elsif ( $ENV{'TASK_NAME'} =~ "gs3-diffcol-(caveat|stable)" ) {
17# $major_version = 3;
18# $prefix="3t";
19# $rk="tk3"; # test kit
20
21package diffcoltask;
22
23use Cwd;
24use Switch; # for switch(val) { case: ; ...}
25use File::Path; # for rmdir and mkdir type functions
26use File::Copy; # for recursive copying of folders but skipping .svn
27use File::Basename;
28
29use strict;
30no strict 'subs'; # allow barewords (eg STDERR) as function arguments
31
32my $isWin = ($^O =~ m/mswin/i) ? 1 : 0;
33my $sep = $isWin ? "\\" : "/";
34my $pathsep = $isWin ? ";" : ":";
35#my $script_ext = $isWin ? ".bat" : ".bash";
36my $setup_script = "setup"; # needs to become gs3-setup for GS3
37my $use_blat = 0; # if we ever get blat to send mail/attachments on Windows working, set this to 1
38
39
40# TASK_HOME should be the toplevel diffcol folder
41$ENV{'TASK_HOME'} = getcwd unless defined $ENV{'TASK_HOME'};
42if($isWin) {
43 $ENV{'TASK_HOME'} =~ s@\/@\\@g;
44 # need to convert TASK_HOME path name to resolve very subtle bug when running task.pl via
45 # run-gs2-diffcol.bat which uses environment.pl's TASK_HOME setting via envi
46 # At that point TASK_HOME is already defined but ends up lowercase, so that entries in archiveinf-doc
47 # end up sorted differently when db2txt -sort is applied compared to if TASK_HOME had kept its case.
48 require Win32; # for working out Windows Long Filenames from Win 8.3 short filenames
49 $ENV{'TASK_HOME'} = &Win32::GetLongPathName($ENV{'TASK_HOME'});
50}
51## print STDERR "@@@ TASK_HOME: ".$ENV{'TASK_HOME'}."\n";
52
53
54$ENV{'BIN_DIR'} = &filename_concat($ENV{'TASK_HOME'}, "bin");
55
56# we'll be using BLAT to send mail attachments on Windows
57my $blat = $use_blat ? &filename_concat($ENV{'BIN_DIR'}, "blat", "full", "blat.exe") : 0;
58if($isWin && $use_blat && ! -e $blat) {
59 print STDERR "\n***********************************\n";
60 print STDERR "No blat.exe found in $blat.\n";
61 print STDERR "Blat needed to send mail with attachments on Windows.\n";
62 print STDERR "Extract the blat zip file found in $ENV{'BIN_DIR'}\n";
63 print STDERR "for your bit architecture and name the folder 'blat'\n";
64 print STDERR "***********************************\n\n";
65 $blat = 0;
66}
67
68
69$ENV{'DATA_DIR'} = &filename_concat($ENV{'TASK_HOME'}, "diffcol-data");
70$ENV{'UPLOAD_DIR'} = &filename_concat($ENV{'TASK_HOME'}, "diffcol-reports");
71$ENV{'MONITOR_EMAIL'} = "greenstone_team\@cs.waikato.ac.nz"; # need to escape @ sign
72$ENV{'GSDL_SMTP'} = ""; #"smtp.gmail.com";
73##print STDERR "@@@ email: ".$ENV{'MONITOR_EMAIL'}."\n";
74
75# control if an existing compiled greenstone is used
76# or, if one should be checked out, which revision to checkout from svn
77$ENV{'SVN_OPT_REV'} = "-r head";
78#$ENV{'GSDLHOME'}=
79#$ENV{'GSDL3SRCHOME'}=
80
81
82# if the first arg is a digit, it's the new envi verbosity param. Take it off the array
83my $envi_verbose = shift(@ARGV) if(exists $ARGV[0] && $ARGV[0] =~ m/^\d+$/);
84
85#parse arguments
86my $action = "all";
87if(scalar(@ARGV) > 1) {
88 &printusage();
89 exit 0;
90}
91
92if(scalar(@ARGV) == 0) {
93 $action="all";
94}
95else {
96 switch ($ARGV[0]) {
97 case qr/^(-h|-help|help)$/i { &printusage; exit 0; }
98 case qr/^(setup_greenstone|run_test|summarise|upload|all)$/ { $action=$ARGV[0]; }
99 else {
100 print STDERR "Bad subcommand.\n";
101 &printusage;
102 exit -1;
103 }
104 }
105}
106
107#check key environment vars are set
108if(!defined $ENV{'UPLOAD_DIR'}) {
109 print STDERR "Please set a UPLOAD_DIR for the test in an environment.sh file\n";
110 #return 1;
111}
112if(!defined $ENV{'DATA_DIR'}) {
113 print STDERR "Please set a DATA_DIR for the test in an environment.sh file\n";
114 #return 1;
115}
116if(!defined $ENV{'MONITOR_EMAIL'}) {
117 print STDERR "Please set a MONITOR_EMAIL for the test in an environment.sh file\n";
118 #return 1;
119}
120
121if($ENV{'DATA_DIR'} eq "/") {
122 print STDERR "DATA_DIR should not be the fs root\n";
123 #return 1;
124}
125
126print STDERR "DATA_DIR: ".$ENV{'DATA_DIR'}."\n";
127print STDERR "UPLOAD_DIR: ".$ENV{'UPLOAD_DIR'}."\n";
128
129#create an id for this test
130my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
131$year += 1900;
132$mon += 1;
133$mon = "0$mon" if ($mon < 10);
134$mday = "0$mday" if ($mday < 10);
135my $dateid="$year.$mon.$mday"; #my $dateid=($year+1900)."-".($mon+1)."-$mday";
136
137print STDERR "Starting test '$dateid'\n";
138
139
140# http://stackoverflow.com/questions/2149368/how-can-i-loop-through-files-in-a-directory-in-perl
141$ENV{'CLASSPATH'} = "";
142my $jar_lib_path = $ENV{'TASK_HOME'}.$sep."lib";
143my @files = <$jar_lib_path/*.jar>; # /full/path/to/diffcol/lib/*jar
144foreach my $file (@files) {
145 $file =~ s@\/@\\@g if $isWin;
146 $ENV{'CLASSPATH'}=$file.$pathsep.$ENV{'CLASSPATH'};
147}
148##print STDERR "**** classpath: ".$ENV{'CLASSPATH'}."\n";
149
150
151#set the location of the full report
152my $xmlout=filename_concat($ENV{'DATA_DIR'}, "full-report-$dateid.xml");
153##print STDERR "XML: $xmlout\n";
154
155# the toplevel folder of the greenstone installation being used
156my $greenstone_home="";
157# gsdl is the checkout folder and can be greenstone2 or greenstone3
158my $gsdl="greenstone2";
159
160
161# Check if using existing compiled-up greenstone installation
162# and set the greenstone_home location accordingly
163
164if(defined $ENV{'GSDL3SRCHOME'} || defined $ENV{'GSDLHOME'}) {
165 print STDERR "Found existing Greenstone home, will use that instead\n";
166 $greenstone_home=$ENV{'GSDLHOME'};
167} else {
168 $greenstone_home=filename_concat($ENV{'DATA_DIR'}, $gsdl);
169}
170##print STDERR "GSHOME: $greenstone_home\n";
171
172#do the requested action
173if($action eq "setup_greenstone") {
174 &setup_greenstone;
175}
176elsif ($action eq "run_test") {
177 &run_test;
178}
179elsif ($action eq "summarise") {
180 &summarise;
181}
182elsif ($action eq "upload") {
183 &upload;
184 &mail_with_report_attached;
185}
186elsif ($action eq "all") {
187 &setup_greenstone;
188 &run_test;
189 &summarise;
190 &upload;
191 &mail_with_report_attached;
192}
193
194##********************************
195
196sub printusage
197{
198 print STDERR "Run as: $0 (help|setup_greenstone|run_test|summarise|upload|all)\n";
199}
200
201#http://stackoverflow.com/questions/7427262/read-a-file-and-save-it-in-variable-using-shell-script
202
203sub setup_greenstone
204{
205 #clean up from previous tests
206 print STDERR "about to clean up any old tests (Ctrl-C to cancel)"; # no newline
207 for my $i ( 1..5 ) {
208 sleep 1; # 1 second
209 print STDERR ".";
210 }
211 print STDERR "\n";
212
213 # http://perldoc.perl.org/File/Path.html
214 print STDERR "cleaning up previous tests\n";
215 &File::Path::remove_tree($ENV{'DATA_DIR'});
216
217 print STDERR "creating the data dir\n";
218 &File::Path::make_path($ENV{'DATA_DIR'}); # works like mkdir -p
219
220 chdir($ENV{'DATA_DIR'});
221
222 # use existing compiled-up greenstone installation, if a GSDLHOME set
223 if(defined $ENV{'GSDL3SRCHOME'} || defined $ENV{'GSDLHOME'}) {
224 print STDERR "Found existing Greenstone home, will use that instead";
225 return;
226 }
227
228 # Else checkout a GS from svn into DATA_DIR
229
230 #svn checkout of main gsdl directory
231 print STDERR "checkout $gsdl:\n";
232 my $cmd = "svn co ".$ENV{'SVN_OPT_REV'}." http://svn.greenstone.org/main/trunk/greenstone2 $gsdl";
233 ##print STDERR "Checkout CMD: $cmd\n";
234
235 # # unlike backticks operator, system() will print the output of the command to the screen as it executes
236 # http://stackoverflow.com/questions/758611/how-to-flush-output-in-backticks-in-perl?rq=1
237 my $status = system "$cmd"; #my $status = `$cmd`;
238 if($status != 0) {
239 print STDERR "@@@ SVN checkout of $gsdl failed\n";
240 exit -1;
241 }
242 print STDERR "done\n";
243
244 ##print STDERR "$ENV{'DATA_DIR'}$sep$gsdl\n";
245
246 chdir("$ENV{'DATA_DIR'}$sep$gsdl");
247
248 ##print STDERR "@@@ OS: $^O.|".$Config{'archname64'}."|\n";
249
250
251 if($isWin) {
252 print STDERR "Compiling $gsdl using makegs2.bat running in auto (silent) mode\n";
253
254 # we're now in the GS2 folder, call makegs2 with silent param
255 $cmd = "makegs2.bat silent 2>> $ENV{'DATA_DIR'}/compilation-errors"; # STDERR is sent to compilation-errors file
256 $status = system $cmd;
257
258 } else { # if we're on linux/darwin, need gnome-lib for the correct architecture.
259
260 print STDERR "setting up gnome-lib-minimal for compilation\n";
261
262 # To get gnome-lib, need to determine bit architecture of the linux/darwin
263 # http://stackoverflow.com/questions/8963400/the-correct-way-to-read-a-data-file-into-an-array
264 # $Config{'archname64'} doesn't work on the Ubuntu and the Sys::Info package seems to not be supported
265 # well on ActivePerl.
266 # But since we know we're on a Linux/Darwin machine at this point, wecan just run `uname -m` and other linux cmds
267
268 my $gnome_lib_file = ($^O =~ m/macos/i) ? "darwin-intel" : "linux"; # assuming all darwin is intel, not ppc!!
269
270 my $bit_arch=`uname -m`;
271 $gnome_lib_file .= "-x64" if($bit_arch =~ m/64$/);
272
273 #svn checkout gnome-lib for this linux/darwin
274 chdir("$ENV{'DATA_DIR'}$sep$gsdl$sep"."ext"); #cd $DATA_DIR/$gsdl/ext
275
276 ##print STDERR "**** gnomelib: $gnome_lib_file\n";
277
278 # checkout and unpack gnome-lib-minimal
279
280 #svn export http://svn.greenstone.org/gs2-extensions/gnome-lib/trunk/gnome-lib-minimal-linux-x64.tar.gz gl.tar.gz
281 $cmd = "svn export http://svn.greenstone.org/gs2-extensions/gnome-lib/trunk/gnome-lib-minimal-".$gnome_lib_file.".tar.gz gl.tar.gz";
282 system $cmd;
283 system ("tar -xvzf gl.tar.gz");
284
285 chdir("gnome-lib-minimal");
286 ##print STDERR "*** ARCH: $bit_arch\n";
287
288 # need to run source devel.bash on gnome-lib followed by configure, make, make install
289 # in one go, in order to preserve the compile environment set up by sourcing devel.bash
290
291 # http://stackoverflow.com/questions/7369145/activating-a-virtualenv-using-a-shell-script-doesnt-seem-to-work
292 # http://ubuntuforums.org/showthread.php?t=1932504 linking /bin/sh to bash instead of dash
293
294# $cmd = "bash -c \"source ./devel.bash && cd ../.. && ./configure --enable-apache-httpd && make && make install\"";
295 $cmd = "bash -c \"";
296
297 $cmd .= "source ./devel.bash";
298 $cmd .= " && cd ../..";
299
300 #configure
301 # $cmd .= " && ./configure";
302 $cmd .= " && echo 'configure $gsdl: ' ";
303 $cmd .= " && echo '<configure>' >> $xmlout";
304 $cmd .= " && ./configure 2>> $ENV{'DATA_DIR'}/compilation-errors"; # configure
305 $cmd .= " && echo '</configure>' >> $xmlout";
306 $cmd .= " && echo 'done'";
307
308 #make
309 $cmd .= " && echo 'make $gsdl: '";
310 $cmd .= " && echo '<make>' >> $xmlout";
311 $cmd .= " && make 2>> $ENV{'DATA_DIR'}/compilation-errors"; # make
312 $cmd .= " && echo '</make>' >> $xmlout";
313 $cmd .= " && echo 'done'";
314
315 #make install
316 $cmd .= " && echo 'make install $gsdl: '";
317 $cmd .= " && echo '<make-install>' >> $xmlout";
318 $cmd .= " && make install 2>> $ENV{'DATA_DIR'}/compilation-errors"; # make install
319 $cmd .= " && echo '</make-install>' >> $xmlout";
320 $cmd .= " && echo 'done'";
321
322 $cmd .= "\""; # close off cmd to bash and run it
323 $status = system $cmd;
324 }
325
326 if($status != 0) {
327 print STDERR "@@@ Compile failed\n";
328 exit -1;
329 }
330
331 # set the path to the greenstone_home variable
332 $greenstone_home="$ENV{'DATA_DIR'}$sep$gsdl";
333
334}
335
336# http://stackoverflow.com/questions/3377879/how-do-i-receive-command-output-immediately
337sub run_test
338{
339 open (my $xml_fh, '>'.$xmlout) || die "Could not open xml file $xmlout for appending: $!\n";
340
341 # perform the requested subcommands, outputting xml information
342 print $xml_fh "<test time=\"$dateid\" id=\"$dateid\">\n";
343
344 # make sure that diffcol/model-collect is up to date before copying it over to greenstone-home
345 print $xml_fh "Updating $ENV{'TASK_HOME'}/model-collect:\n";
346 my $cmd = "svn up $ENV{'TASK_HOME'}/model-collect"; #chdir("$ENV{'TASK_HOME'}/model-collect");
347 my $status = system "$cmd";
348
349 # go to whichever greenstone_home we're using
350 chdir($greenstone_home);
351
352 # get svn info
353 print STDERR "getting svn info: $xmlout\n";
354 print $xml_fh "<svn-info>\n";
355 &run_and_print_cmd("svn info", $xml_fh);
356 print $xml_fh "</svn-info>\n";
357 print STDERR "done\n";
358
359 #make two copies of the model-collect directory in gsdl
360 #one to be rebuilt and one as the basis for comparison
361 #strip both of all .svn directories
362
363 #copy the model collections to the collect folder to be rebuilt
364 print STDERR "installing test collections and model collections to new $gsdl installation... ";
365
366 #clean up
367 if(-d "collect") {
368 &File::Path::remove_tree("collect") || die "Error could not delete collect: $!";
369 }
370 &File::Path::remove_tree("model-collect");
371
372 #copy to collect and strip .svn subfolders
373 &File::Path::make_path("collect"); # create the folder and copy contents across
374 &copy_recursively(&filename_concat("$ENV{'TASK_HOME'}","model-collect"), "collect", ".svn");
375
376 #make the model copy
377 &File::Path::make_path("model-collect");
378 &copy_recursively("collect", "model-collect"); # copy contents across
379
380 print STDERR "done\n";
381
382
383 #for each collection, import, build and diff with its model counterpart
384 opendir my($collect_handle), "collect" or die "Could not open dir $greenstone_home/collect: $!";
385 for my $collection (readdir $collect_handle) {
386 next if ($collection eq "." || $collection eq "..");
387 ##next if ($collection ne "Small-HTML"); ## TEMPORARY, FOR TESTING THIS SCRIPT
388
389 #escape the filename (in case of space)
390 $collection =~ s@ @\\ @g;
391 #getting just the basename of the collection would have been necessary had we not cd-ed into $gsdl
392
393 print STDERR "*** Found collection $collection\n";
394 print $xml_fh "<collection-test name=\"$collection\">\n";
395
396 #import
397# Ensure the OIDtype for importing is hash_on_full_filename
398# "to make document identifiers more stable across upgrades of the software,
399# although it means that duplicate documents contained in the collection are
400# no longer detected automatically."
401 print STDERR "$collection - Importing:\n";
402 print $xml_fh "<import>\n";
403 &run_build_script("import.pl -removeold $collection"); #-OIDtype hash_on_full_filename
404 print $xml_fh "</import>\n";
405 print STDERR "done\n";
406
407 #build
408 print STDERR "$collection - Building:\n";
409 print $xml_fh "<build>\n";
410 &run_build_script("buildcol.pl -removeold $collection");
411 print $xml_fh "</build>\n";
412 print STDERR "done\n";
413
414 #rename the intermediate 'building' directory 'index'
415 print STDERR "$collection - Move \"building\" to \"index\"... ";
416 my $index = &filename_concat("collect", $collection, "index");
417 my $building = &filename_concat("collect", $collection, "building");
418 &File::Path::remove_tree($index);
419 # Renaming Directories, http://www.perlmonks.org/?node_id=177421
420 move($building, $index) or die "copy failed: $!"; # File::Copy::move
421 print STDERR "done\n";
422
423 #diffcol
424 print STDERR "$collection - Diffing:\n";
425 my $diffcol_dir = &filename_concat($ENV{'TASK_HOME'},"diffcol");
426 $cmd = "diffcol.pl -output xml -verbosity 10 $collection"; # need to run with ./diffcol.pl if bash script
427 &run_diff_script($cmd, $xml_fh, $diffcol_dir);
428
429 chdir($greenstone_home); # this is actually where we are
430 print STDERR "done\n";
431 print $xml_fh "</collection-test>\n";
432 }
433 closedir $collect_handle; # close handle to collect dir
434
435 print $xml_fh "</test>\n";
436 close($xml_fh);
437
438 print STDERR "done\n";
439}
440
441##***************************************************************
442# runs setup in greenstone_home before running the diff command
443sub run_diff_script {
444 my ($cmd, $fh, $diffcol_dir) = @_;
445
446 # we're in greenstone_home now
447 if(!$isWin) {
448 $cmd = "bash -c \"export GSDLHOME=&& source $setup_script.bash && cd $diffcol_dir && ./$cmd\"";
449
450 } else { # Need to prefix cmd -c/-k as necessary
451 $cmd = "cmd /c \"set GSDLHOME=&& $setup_script.bat && cd $diffcol_dir && perl -S $cmd\"";
452## print STDERR "@@@@ Going to call command: $cmd\n";
453 }
454
455 return &run_and_print_cmd($cmd, $fh);
456}
457
458# runs setup in greenstone_home before running the given build command
459sub run_build_script {
460 my ($cmd, $fh) = @_;
461
462# chdir($greenstone_home);
463 # we are in $greenstone_home already, can directly run the build cmd on the collection
464 if(!$isWin) {
465 $cmd = "bash -c \"export GSDLHOME=&& source $setup_script.bash && $cmd\"";
466
467 } else { # Need to prefix cmd -c/-k as necessary
468 $cmd = "cmd /c \"set GSDLHOME=&& $setup_script.bat && perl -S $cmd\"";
469 }
470## print STDERR "@@@@ Going to call command: $cmd\n";
471
472 return system($cmd);
473 #return &run_and_print_cmd($cmd, $fh); # doesn't work on cmds chained with bash -c
474}
475
476
477# http://stackoverflow.com/questions/758611/how-to-flush-output-in-backticks-in-perl?rq=1activeperl%20sys::info
478# http://stackoverflow.com/questions/1477500/how-do-i-get-the-output-of-an-external-command-in-perl
479sub run_and_print_cmd {
480 my ($cmd, $fh) = @_;
481
482 open my $pin, "$cmd|" or die "unable to run cmd $cmd: $!"; # open(my $fh, '-|', 'powercfg -l') or die $!;
483
484 if(defined $fh) { # print cmd output both to the filehandle and to stdout
485 while (my $line = <$pin>) {
486 print $fh $line;
487# print STDOUT $line; # if also printing cmd output to STDOUT
488 }
489 }
490 else { # no filehandle, so just need to print to stdout
491
492 # unlike backticks operator, system() will print the output of the command to the screen as it executes
493 # http://stackoverflow.com/questions/758611/how-to-flush-output-in-backticks-in-perl?rq=1
494
495 my $status = system $cmd;
496 if($status != 0) {
497 print STDERR "ERROR ($status) running $cmd: $!\n";
498 }
499 }
500 close($pin);
501}
502
503sub filename_concat {
504 my $first_file = shift(@_);
505 my (@filenames) = @_;
506
507 # If first_file is not null or empty, then add it back into the list
508 if (defined $first_file && $first_file =~ /\S/)
509 {
510 unshift(@filenames, $first_file);
511 }
512
513 my $filename = join($sep, @filenames);
514 $filename =~ s/[\\\/]$//; # remove trailing slashes if any
515 return $filename;
516}
517
518
519# The following code is from
520# http://stackoverflow.com/questions/227613/how-can-i-copy-a-directory-recursively-and-filter-filenames-in-perl
521# It also states that "Perl's File::Copy is a bit broken (it doesn't copy permissions on Unix systems, for example)"
522sub copy_recursively {
523 my ($from_dir, $to_dir, $regex) = @_;
524 opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
525
526# if(-d !$to_dir) {
527# mkdir $to_dir or die "mkdir '$to_dir' failed: $!" if not -e $to_dir;
528# }
529
530 for my $entry (readdir $dh) {
531 next if ($entry eq "." || $entry eq "..");
532 next if (defined $regex && $entry =~ /$regex/);
533 my $source = "$from_dir/$entry";
534 my $destination = "$to_dir/$entry";
535 if (-d $source) {
536 mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
537 copy_recursively($source, $destination, $regex);
538 } else {
539 copy($source, $destination) or die "copy failed: $!";
540 }
541 }
542 closedir $dh;
543 return;
544}
545
546sub summarise {
547
548 # make a summarised Xml report
549 print STDERR "Summarizing the xml report... ";
550 my $cmd = "java org.apache.xalan.xslt.Process -IN $xmlout -XSL $ENV{'TASK_HOME'}/xsl/xml-report.xsl -OUT $ENV{'DATA_DIR'}/report-$dateid.xml";
551 my $status = system($cmd);
552 print STDERR "done\n";
553
554 # make a summarised HTMl report
555 print STDERR "Creating an html summary report... ";
556 $cmd = "java org.apache.xalan.xslt.Process -IN $ENV{'DATA_DIR'}/report-$dateid.xml -XSL $ENV{'TASK_HOME'}/xsl/html-report.xsl -OUT $ENV{'DATA_DIR'}/report-$dateid.html";
557 $status = system($cmd);
558 print STDERR "done\n";
559}
560
561sub upload {
562 # if the upload dir already existed, clear it of contents
563 if (-d $ENV{'UPLOAD_DIR'}) { #else rm $UPLOAD_DIR/*
564 # don't want to keep previous days reports
565 # else we will have to manually clear them at some point
566 # just generate the set of reports for this run of task.pl upload
567 # and
568 &File::Path::remove_tree($ENV{'UPLOAD_DIR'});
569 }
570 # recreate the upload directory
571 &File::Path::make_path($ENV{'UPLOAD_DIR'});
572
573 # copy all *.xml and *.html files across to UPLOAD_DIR
574 opendir my($dh), $ENV{'DATA_DIR'} or die "Could not open DATA_DIR: $!";
575 for my $entry (readdir $dh) {
576 next if ($entry !~ m/(\.xml|\.html?)$/);
577
578 # copy the reports across with different names: with OS prefixed to them. And for the HTML file on Win, rename to HTM
579 # html files uploaded from windows to nzdl are empty for no reason. Uploading as htm seems to work
580 my $os_entry = $entry;
581 $os_entry =~ s@\[email protected]@ if $isWin;
582 $os_entry = $^O."-diffcol-$os_entry";
583
584 # get the absolute path to the original files before copying them over
585 $entry = &filename_concat($ENV{'DATA_DIR'}, $entry);
586
587 # copy them over with their new names
588## print STDERR "@@@@ copying across $entry to $ENV{'UPLOAD_DIR'} as $os_entry\n";
589 copy($entry, "$ENV{'UPLOAD_DIR'}$sep$os_entry"); #copy($entry, "$ENV{'UPLOAD_DIR'}");
590 }
591 closedir $dh;
592
593
594 # Upload the html file to puka
595 #default identity dir
596 if ( ! exists $ENV{'IDENTITY_DIR'} ) {
597 $ENV{'IDENTITY_DIR'} = "$ENV{'HOME'}${sep}.ssh";
598 }
599 if (! exists $ENV{'SNAPSHOT_MODE'} ) {
600 $ENV{'SNAPSHOT_MODE'} = "caveat";
601 }
602
603 #use the correct key for uploading
604 $ENV{'IDENTITY_FILE'} = "$ENV{'IDENTITY_DIR'}${sep}upload-" . $ENV{'SNAPSHOT_MODE'} . ($^O eq "MSWin32" ? ".ppk" : "");
605 if(-f $ENV{'IDENTITY_FILE'}) {
606 # if you need to touch the file on windows: http://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command
607
608 # the report we want to upload is actually just os-diffcol-report-$dateid.html
609 my $command = "cd \"$ENV{'UPLOAD_DIR'}\" && tar -c *.htm* | "; #&& cat *.html | "; # && tar -c * |
610 $command .= ($^O eq "MSWin32" ? "plink" : "ssh");
611 $command .= " -T -i \"$ENV{'IDENTITY_FILE'}\" nzdl\@puka.cs.waikato.ac.nz";
612 #print "$command\n";
613 my $status = system("$command");
614 if($status != 0) {
615 print STDERR "*** Failed to upload test report to nzdl $status\n";
616 }
617 } else {
618 print STDERR "*** Cannot upload the test report to nzdl from this machine\n";
619 }
620
621 print STDERR "Finished uploading\n";
622}
623
624# Sending emails with perl: http://learn.perl.org/examples/email.html
625# Sending email attachments with perl: http://www.perlmonks.org/?node_id=19430
626# Sadly none of the packages are installed by default and use of MIME::Lite is discouraged
627sub mail_with_report_attached
628{
629 # email out with report attached, if the tests failed
630 print STDERR "Checking if successful... \n";
631 my $cmd = "java org.apache.xalan.xslt.Process -IN $xmlout -XSL $ENV{'TASK_HOME'}/xsl/passed-or-not.xsl";
632 #my $result = system($cmd);
633 my $result = `$cmd`;
634
635 print STDERR "result: $result\n";
636
637 if($result ne "yes") {
638 my $msg = "$gsdl regression test for $dateid failed";
639 my $subject = "Regression Test Failed"; #"$gsdl regression test for $dateid failed\n";
640 my $attach_file = &filename_concat($ENV{'DATA_DIR'}, "report-$dateid.html");
641
642 if($isWin) {
643 if($use_blat && $blat && $ENV{'GSDL_SMTP'}) {
644 # http://stackoverflow.com/questions/709635/sending-mail-from-batch-file
645 #blat -to [email protected] -server smtp.example.com -f [email protected] -subject "subject" -body "body"
646
647 # need to install blat on windows
648 $cmd = "$blat -to $ENV{'MONITOR_EMAIL'} -server $ENV{'GSDL_SMTP'} -f $ENV{'MONITOR_EMAIL'} -attach $attach_file -subject \"$subject\" -body \"$msg\"";
649 $result = system($cmd);
650 }
651 else {
652 $result = 1; # status from running mail command is 0 if success, 1 if fail
653 print STDERR "********************************************\n";
654 if ($use_blat) {
655 print STDERR "Need blat and SMTP set to send mail attachment\n" ;
656 } else {
657 print STDERR "Not set up to send mail on Windows\n";
658 }
659 print STDERR "Inspect report at: $attach_file\n";
660 print STDERR "********************************************\n";
661 }
662 } else { # linux
663 my $status = system("command -v mutt > /dev/null 2>&1;"); #better way of doing "which mutt"
664
665 if($status != 0) { # mutt doesn't exist, can't send attachments, so send simple email
666 $cmd="echo '$gsdl regression test for $dateid failed.' | mail -s 'Regression Test Failed' $ENV{'MONITOR_EMAIL'}";
667
668 print STDERR "********************************************\n";
669 print STDERR "No mutt installed, unable to mail attachment\n";
670 print STDERR "Inspect report at: $attach_file\n";
671 print STDERR "********************************************\n";
672 } else {
673 #$cmd = "bash -c \"echo '$gsdl regression test for $dateid failed' | mutt -a $attach_file -s 'Regression Test Failed' -- $ENV{'MONITOR_EMAIL'}\"";
674 $cmd = "echo '$gsdl regression test for $dateid failed' | mutt -a $attach_file -s 'Regression Test Failed' -- $ENV{'MONITOR_EMAIL'}";
675 }
676
677 # run the mail command
678 $result = system($cmd); #&run_and_print_cmd($cmd);
679 }
680
681
682 if($result != 0) {
683 print STDERR "*** Unable to send email: $?\n";
684 }
685 else {
686 print STDERR "Sent mail with report attached.\n";
687 }
688 } else {
689 print STDERR "********************************************\n";
690 print STDERR "Tests were successful. Not sending mail.\n";
691 print STDERR "********************************************\n";
692 }
693}
694
695# The old version of this program contained the following, consisting of 1 line of active code:
696
697 # Invoke as: sjmc@br:/research/sjm84/envi/bin$ ./envi diffcol summarise
698 # Doing so will call this pl file and pass in "summarise" in ARGV
699 # This pl file will in turn call the task executable in this folder
700 # passing in "summarise" as a parameter.
701#system("/bin/bash -c \"../etc/tasks/diffcol/task @ARGV\"");
702
703 ##system("/bin/bash -c \"./task @ARGV\"");
704 ##print STDERR "/bin/bash -c ../etc/tasks/diffcol/task @ARGV"
705
Note: See TracBrowser for help on using the repository browser.