#! /usr/bin/env php . // Stage an input file: namely, // - move or copy it to the download hierarchy // - compute its md5 // - make a gzipped version if needed // // Usage (from project dir): // // bin/stage_file [options] path // // options: // --gzip Make a gzipped version of the file. // Use this if you specify in the // --copy Copy the file (default is to move it) // // -- verbose // // path The file to be staged. // If it's a directory, stage all the files in that dir function error_exit($msg) { echo $msg; exit(1); } if (!file_exists("html/inc/dir_hier.inc") || !file_exists("config.xml") ) { error_exit("This script must be run in the project directory.\n"); } $dir = getcwd(); chdir("html/inc"); require_once("dir_hier.inc"); require_once("util_basic.inc"); chdir($dir); function usage() { error_exit("usage: stage_file [--gzip] [--copy] path --gzip make a gzipped version of file for compressed download (use with in the input template) --copy copy the file (default is to move it) --verbose verbose output path The file to stage; if directory, stage all files in that dir "); } function stage_file($path) { global $download_dir, $fanout, $copy, $gzip, $verbose; if (!file_exists($path)) error_exit("no such file: $path\n"); $file = basename($path); $dl_path = dir_hier_path($file, $download_dir, $fanout); if ($verbose) { echo "staging $file to $dl_path\n"; } switch (check_download_file($path, $dl_path)) { case 0: // file is already there; no need to copy if ($verbose) { echo " file already exists as $dl_path\n"; } break; case 1: // need to copy or move if ($copy) { $ret = copy($path, $dl_path); if (!$ret) error_exit(" copy failed\n"); if ($verbose) echo " copied file\n"; } else { $ret = rename($path, $dl_path); if (!$ret) error_exit(" copy failed\n"); if ($verbose) echo " moved file\n"; } touch("$dl_path.md5"); break; case -1: error_exit(" There is already a file in your project's download directory with that name, but with different contents. This is not allowed by BOINC, which requires that files be immutable. Please use a different file name. "); break; } // make gzipped version if needed // if ($gzip) { $dl_gzip_path = "$dl_path.gz"; if (!file_exists($dl_gzip_path)) { $output = system("gzip -c $dl_path > $dl_gzip_path", $retval); if ($retval) { error_exit("failed to gzip file: $output\n"); } if ($verbose) echo " created .gzip file $dl_gzip_path\n"; } } } $fanout = parse_config(get_config(), ""); if (!$fanout) error_exit("can't find in config.xml"); $download_dir = parse_config(get_config(), ""); if (!$download_dir) error_exit("can't find in config.xml"); if ($argc < 2) usage(); $gzip = false; $copy = false; $verbose = false; for ($i=1; $i<$argc-1; $i++) { switch($argv[$i]) { case "--gzip": $gzip = true; break; case "--copy": $copy = true; break; case "--verbose": $verbose = true; break; default: usage(); } } $path = $argv[$argc-1]; if (is_dir($path)) { $d = opendir($path); while ($f = readdir($d)) { $p = "$path/$f"; if (!is_file($p)) continue; stage_file($p); } } else { stage_file($path); } ?>