- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
#! /usr/bin/env php
|
|
|
|
<?php
|
|
|
|
// This file is part of BOINC.
|
|
|
|
// http://boinc.berkeley.edu
|
|
|
|
// Copyright (C) 2012 University of California
|
|
|
|
//
|
|
|
|
// BOINC is free software; you can redistribute it and/or modify it
|
|
|
|
// under the terms of the GNU Lesser General Public License
|
|
|
|
// as published by the Free Software Foundation,
|
|
|
|
// either version 3 of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// BOINC is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
// See the GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
// 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):
|
|
|
|
//
|
2015-03-11 19:26:24 +00:00
|
|
|
// bin/stage_file [--gzip] [--copy] path
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
//
|
|
|
|
// --gzip Make a gzipped version of the file.
|
|
|
|
// Use this if you specify <gzip> in the <file_info>
|
|
|
|
// --copy Copy the file (default is to move it)
|
2015-03-11 19:26:24 +00:00
|
|
|
//
|
|
|
|
// path The file to be staged.
|
|
|
|
// If it's a directory, stage all the files in that dir
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
|
2012-10-23 16:23:35 +00:00
|
|
|
function error_exit($msg) {
|
|
|
|
echo $msg;
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
if (!file_exists("html/inc/dir_hier.inc")
|
|
|
|
|| !file_exists("config.xml")
|
|
|
|
) {
|
2012-10-23 16:23:35 +00:00
|
|
|
error_exit("This script must be run in the project directory.\n");
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
require_once("html/inc/dir_hier.inc");
|
|
|
|
require_once("html/inc/util_basic.inc");
|
|
|
|
|
|
|
|
function usage() {
|
2015-03-11 19:26:24 +00:00
|
|
|
error_exit("usage: stage_file [--gzip] [--copy] path
|
2012-10-23 16:23:35 +00:00
|
|
|
--gzip make a gzipped version of file for compressed download
|
|
|
|
(use with <gzip/> in the input template)
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
--copy copy the file (default is to move it)
|
2015-03-16 20:58:08 +00:00
|
|
|
--verbose verbose output
|
2015-03-11 19:26:24 +00:00
|
|
|
path The file to stage; if directory, stage all files in that dir
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
");
|
|
|
|
}
|
|
|
|
|
2015-03-11 19:26:24 +00:00
|
|
|
function stage_file($path) {
|
2015-03-16 20:58:08 +00:00
|
|
|
global $download_dir, $fanout, $copy, $gzip, $verbose;
|
2015-03-11 19:26:24 +00:00
|
|
|
|
|
|
|
if (!file_exists($path)) error_exit("no such file: $path\n");
|
|
|
|
$file = basename($path);
|
|
|
|
$dl_path = dir_hier_path($file, $download_dir, $fanout);
|
|
|
|
$dl_md5_path = "$dl_path.md5";
|
|
|
|
|
2015-03-16 20:58:08 +00:00
|
|
|
if ($verbose) {
|
|
|
|
echo "staging $file to $dl_path\n";
|
|
|
|
}
|
|
|
|
|
2015-03-11 19:26:24 +00:00
|
|
|
// compute the file's MD5
|
|
|
|
//
|
|
|
|
$md5 = md5_file($path);
|
|
|
|
$file_size = filesize($path);
|
|
|
|
|
|
|
|
// if file is already in download dir, make sure it's the same file
|
|
|
|
//
|
|
|
|
if (file_exists($dl_path)) {
|
|
|
|
if (file_exists($dl_md5_path)) {
|
|
|
|
$x = file_get_contents($dl_md5_path);
|
|
|
|
$x = explode(" ", $x);
|
|
|
|
$dl_md5 = $x[0];
|
|
|
|
} else {
|
|
|
|
$dl_md5 = md5_file($dl_path);
|
|
|
|
}
|
|
|
|
if ($md5 != $dl_md5) {
|
2015-03-16 20:58:08 +00:00
|
|
|
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.
|
|
|
|
");
|
|
|
|
}
|
|
|
|
if ($verbose) {
|
|
|
|
echo " file already exists as $dl_path\n";
|
2015-03-11 19:26:24 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// move or copy the file
|
|
|
|
//
|
|
|
|
if ($copy) {
|
2015-03-16 20:58:08 +00:00
|
|
|
$ret = copy($path, $dl_path);
|
|
|
|
if (!$ret) error_exit(" copy failed\n");
|
|
|
|
if ($verbose) echo " copied file\n";
|
2015-03-11 19:26:24 +00:00
|
|
|
} else {
|
2015-03-16 20:58:08 +00:00
|
|
|
$ret = rename($path, $dl_path);
|
|
|
|
if (!$ret) error_exit(" copy failed\n");
|
|
|
|
if ($verbose) echo " moved file\n";
|
2015-03-11 19:26:24 +00:00
|
|
|
}
|
|
|
|
@unlink($dl_md5_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
// make MD5 file if needed
|
|
|
|
//
|
|
|
|
if (!file_exists($dl_md5_path)) {
|
|
|
|
$x = $md5." ".$file_size."\n";
|
2015-03-16 20:58:08 +00:00
|
|
|
$ret = file_put_contents($dl_md5_path, $x);
|
|
|
|
if (!$ret) error_exit("failed to create MD5 file $dl_md5_path\n");
|
|
|
|
if ($verbose) echo " created MD5 file $dl_md5_path\n";
|
2015-03-11 19:26:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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");
|
|
|
|
}
|
2015-03-16 20:58:08 +00:00
|
|
|
if ($verbose) echo " created .gzip file $dl_gzip_path\n";
|
2015-03-11 19:26:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$fanout = parse_config(get_config(), "<uldl_dir_fanout>");
|
|
|
|
if (!$fanout) error_exit("can't find <uldl_dir_fanout> in config.xml");
|
|
|
|
$download_dir = parse_config(get_config(), "<download_dir>");
|
|
|
|
if (!$download_dir) error_exit("can't find <download_dir> in config.xml");
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
if ($argc < 2) usage();
|
|
|
|
|
|
|
|
$gzip = false;
|
|
|
|
$copy = false;
|
2015-03-16 20:58:08 +00:00
|
|
|
$verbose = false;
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
|
|
|
|
for ($i=1; $i<$argc-1; $i++) {
|
|
|
|
switch($argv[$i]) {
|
|
|
|
case "--gzip":
|
|
|
|
$gzip = true;
|
|
|
|
break;
|
|
|
|
case "--copy":
|
|
|
|
$copy = true;
|
|
|
|
break;
|
2015-03-16 20:58:08 +00:00
|
|
|
case "--verbose":
|
|
|
|
$verbose = true;
|
|
|
|
break;
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$path = $argv[$argc-1];
|
2015-03-11 19:26:24 +00:00
|
|
|
if (is_dir($path)) {
|
|
|
|
$d = opendir($path);
|
|
|
|
while ($f = readdir($d)) {
|
|
|
|
$p = "$path/$f";
|
|
|
|
if (!is_file($p)) continue;
|
|
|
|
stage_file($p);
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
}
|
|
|
|
} else {
|
2015-03-11 19:26:24 +00:00
|
|
|
stage_file($path);
|
- scheduler: when adding a new HOST_APP_VERSION, check if there's already one for that (host, app, platform, plan class). If there is, use it and update the app version ID. This way, when a new app version is released, it will use the runtime and reliability statistics of the previous one, instead of starting from scratch. - add a script "stage_file" for staging an input file. This checks for immutability violations, moves or copies the file to the download hierarchy, computes and stores its MD5, and makes a gzipped version if needed. - add some files missing from git repo
2012-10-17 01:41:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
?>
|