#!/usr/bin/env php setenv BOINC_PROJECT_DIR ~/projects/my_project "; exit(1); } } function usage() { echo "Usage: boinc_job [options] program --platform p Run the program on platform p --infile f The program will use f as an input file --outfile f The program will use f as an output file --stdin f Direct f to the program's stdin --stdout f Direct the program's stdout to f "; exit(1); } function error($msg) { echo "$msg\n"; exit(1); } function download_path($filename) { global $project_dir; return dir_hier_path($filename, "$project_dir/download", 1024); } function upload_path($filename) { global $project_dir; return dir_hier_path($filename, "$project_dir/upload", 1024); } function do_includes() { global $project_dir; chdir("$project_dir/html/ops"); require_once("../inc/boinc_db.inc"); require_once("../inc/dir_hier.inc"); BoincDb::get(); } function check_app_version() { global $platform, $app_name; $app_name = "single_job_$platform"; $app = BoincApp::lookup("name='$app_name'"); if (!$app) { error("This project isn't configured to run single jobs."); } } // make the job.xml file used by the wrapper // function make_wrapper_job_file() { global $program, $stdin_file, $stdout_file, $cmdline_args, $wuid; global $project_dir; chdir($project_dir); $filename = "sj_$wuid.xml"; $path = download_path($filename); $f = fopen($path, "w"); if (!$f) { error("Can't open $path"); } fwrite($f, " $program "); if ($stdin_file) { fwrite($f, " $stdin_file\n"); } if ($stdout_file) { fwrite($f, " $stdout_file\n"); } if ($cmdline_args) { fwrite($f, " $cmdline_args\n"); } fwrite($f, " \n\n"); fclose($f); } function make_wu_template() { global $wuid, $infiles, $stdin_file, $program, $wu_template_filename; global $project_dir; chdir($project_dir); $wu_template_filename = "templates/sj_wu_template_$wuid"; $f = fopen($wu_template_filename, "w"); if (!$f) { error("Can't open $wu_template_filename"); } for ($i=0; $i $i "); } fwrite($f, "\n"); $i = 0; foreach($infiles as $infile) { fwrite($f, " $i $infile "); $i++; } if ($stdin_file) { fwrite($f, " $i stdin "); $i++; } fwrite($f, " $i $program "); fwrite($f, " 1e18 1e15 "); fclose($f); } function make_result_template() { global $wuid, $outfiles, $stdout_file, $project_dir; global $result_template_filename; chdir($project_dir); $result_template_filename = "templates/sj_result_template_$wuid"; $f = fopen($result_template_filename, "w"); if (!$f) { error("Can't open $result_template_filename"); } $i = 0; foreach($outfiles as $outfile) { fwrite($f, " 1e12 "); } fwrite($f, "\n"); $i = 0; foreach($outfiles as $outfile) { fwrite($f, " $outfile "); $i++; } if ($stdout_file) { fwrite($f, " stdout "); } fwrite($f, "\n"); fclose($f); } // make the sj_WUID file // function make_job_file() { global $wuid, $job_dir, $project_dir; chdir($project_dir); $filename = "sj_$wuid"; $path = upload_path($filename); $f = fopen($path, "w"); if (!$f) { error("Can't open $path"); } fwrite($f, "$job_dir "); fclose($f); } function create_wu() { global $wuid; $name = md5(uniqid(rand(), true)); $wuid = BoincWorkunit::insert("(name, transition_time) values ('$name', ".PHP_INT_MAX.")"); } function create_job() { global $wuid, $app_name, $infiles, $program, $project_dir; global $result_template_filename, $wu_template_filename; chdir($project_dir); $cmd = "bin/create_work --appname $app_name --wu_name sj_$wuid --wu_id $wuid --wu_template $wu_template_filename --result_template $result_template_filename"; foreach ($infiles as $infile) { $cmd .= " $infile"; } $cmd .= " sj_$wuid.xml"; $cmd .= " $program"; echo "Executing command: $cmd\n"; system($cmd); } // copy input files and program file to the download hierarchy // function copy_files() { global $infiles, $wuid, $job_dir, $program; chdir($job_dir); foreach ($infiles as $infile) { $filename = "$infile_$wuid"; $path = download_path($filename); echo "copying $infile to $path\n"; copy($infile, $path); } $path = download_path($program); echo "copying $program to $path\n"; copy($program, $path); } function parse_args($argc, $argv) { global $platform, $infiles, $outfiles, $stdin_file, $stdout_file; global $program, $cmdline_args; for ($i=1; $i<$argc; $i++) { switch ($argv[$i]) { case '--platform': $platform = $argv[++$i]; break; case '--infile': $infiles[] = $argv[++$i]; break; case '--outfile': $outfiles[] = $argv[++$i]; break; case '--stdin': $stdin_file = $argv[++$i]; break; case '--stdout': $stdout_file = $argv[++$i]; break; default: if ($program) { $cmdline_args .= ''.$argv[$i]; } else { $program = $argv[$i]; } break; } } if (!$program) usage(); } get_project_dir(); parse_args($argc, $argv); do_includes(); check_app_version(); create_wu(); make_wrapper_job_file(); make_job_file(); make_wu_template(); make_result_template(); copy_files(); create_job(); ?>