public static function download_test_suite($qualified_identifier) { if (is_file(PTS_TEST_SUITE_PATH . $qualified_identifier . '/suite-definition.xml')) { return true; } $file = PTS_OPENBENCHMARKING_SCRATCH_PATH . $qualified_identifier . '.zip'; if (pts_network::internet_support_available()) { $hash_json = pts_openbenchmarking::make_openbenchmarking_request('suite_hash', array('i' => $qualified_identifier)); $hash_json = json_decode($hash_json, true); $hash_check = isset($hash_json['openbenchmarking']['suite']['hash']) ? $hash_json['openbenchmarking']['suite']['hash'] : null; // should also check for ['openbenchmarking']['suite']['error'] problems } if (!is_file($file)) { if (pts_network::internet_support_available()) { $test_suite = pts_openbenchmarking::make_openbenchmarking_request('download_suite', array('i' => $qualified_identifier)); if ($test_suite != null && ($hash_check == null || $hash_check == sha1($test_suite))) { // save it file_put_contents($file, $test_suite); $hash_check = null; } else { if (is_file('/var/cache/phoronix-test-suite/openbenchmarking.org/' . $qualified_identifier . '.zip') && ($hash_check == null || sha1_file('/var/cache/phoronix-test-suite/openbenchmarking.org/' . $qualified_identifier . '.zip') == $hash_check)) { copy('/var/cache/phoronix-test-suite/openbenchmarking.org/' . $qualified_identifier . '.zip', $file); } } } if (!is_file($file) && ($test_suite = self::phoromatic_server_ob_cache_request('suite', substr($qualified_identifier, 0, strpos($qualified_identifier, '/')), substr($qualified_identifier, strpos($qualified_identifier, '/') + 1)))) { if ($b64 = base64_decode($test_suite)) { $test_suite = $b64; } file_put_contents($file, $test_suite); } if (PTS_IS_CLIENT && !is_file($file)) { trigger_error('Network support is needed to obtain ' . $qualified_identifier . ' data.' . PHP_EOL, E_USER_ERROR); return false; } } if (!is_file(PTS_TEST_SUITE_PATH . $qualified_identifier . '/suite-definition.xml') && is_file($file) && ($hash_check == null || is_file($file) && sha1_file($file) == $hash_check)) { // extract it pts_file_io::mkdir(PTS_TEST_SUITE_PATH . dirname($qualified_identifier)); pts_file_io::mkdir(PTS_TEST_SUITE_PATH . $qualified_identifier); pts_compression::zip_archive_extract($file, PTS_TEST_SUITE_PATH . $qualified_identifier); if (is_file(PTS_TEST_SUITE_PATH . $qualified_identifier . '/suite-definition.xml')) { return true; } else { unlink($file); return false; } } return false; }
public function execute_script($pass_arguments = null) { if ($this->script_file == null) { return false; } $script_contents = file_get_contents($this->script_file); $prev_exit_status = 0; $script_pointer = -1; do { $exit_status = 0; if ($prev_exit_status != 0) { $exit_status = $prev_exit_status; $prev_exit_status = 0; } $script_contents = substr($script_contents, $script_pointer + 1); $line = $script_contents; $prev_script_pointer = $script_pointer; if (($script_pointer = strpos($line, "\n")) !== false) { $line = substr($line, 0, $script_pointer); } $line_r = $line != null ? pts_strings::trim_explode(' ', $line) : null; switch (isset($line_r[0]) ? $line_r[0] : null) { case '': break; case 'mv': // TODO: implement folder support better $line_r[1] = $this->get_real_path($line_r[1], $pass_arguments); $line_r[2] = $this->get_real_path($line_r[2], $pass_arguments); //pts_file_io::delete($line_r[2], null, true); //copy($line_r[1], $line_r[2] . (is_dir($line_r[2]) ? basename($line_r[1]) : null)); //pts_file_io::delete($line_r[1], null, true); rename($line_r[1], $line_r[2] . (is_dir($line_r[2]) ? basename($line_r[1]) : null)); break; case 'cp': // TODO: implement folder support better $line_r[1] = $this->get_real_path($line_r[1], $pass_arguments); $line_r[2] = $this->get_real_path($line_r[2], $pass_arguments); copy($line_r[1], $line_r[2] . (is_dir($line_r[2]) ? basename($line_r[1]) : null)); break; case 'cat': // TODO: implement folder support better $line_r[1] = $this->get_real_path($line_r[1], $pass_arguments); $line_r[3] = $this->get_real_path($line_r[3], $pass_arguments); copy($line_r[1], $line_r[3]); break; case 'cd': if ($line_r[1] == '..') { if (substr($this->var_current_directory, -1) == '/') { $this->var_current_directory = substr($this->var_current_directory, 0, -1); } $this->var_current_directory = substr($this->var_current_directory, 0, strrpos($this->var_current_directory, '/') + 1); } else { if ($line_r[1] == '~') { $this->var_current_directory = $this->environmental_variables["HOME"]; } else { if (substr($line_r[1], 0, 1) == '"') { // On Windows some directories are encased in quotes for spaces in the directory names array_shift($line_r); $this->var_current_directory = implode(' ', $line_r); } else { if (is_readable($line_r[1])) { $this->var_current_directory = $line_r[1]; } else { if (is_readable($this->get_real_path($line_r[1], $pass_arguments))) { $this->var_current_directory = $this->get_real_path($line_r[1], $pass_arguments); } } } } } break; case 'touch': if (!is_file($this->var_current_directory . $line_r[1]) && is_writable($this->var_current_directory)) { touch($this->var_current_directory . $line_r[1]); } break; case 'mkdir': pts_file_io::mkdir($this->var_current_directory . $line_r[1]); break; case 'rm': for ($i = 1; $i < count($line_r); $i++) { if (is_file($this->var_current_directory . $line_r[$i])) { unlink($this->var_current_directory . $line_r[$i]); } else { if (is_dir($this->var_current_directory . $line_r[$i])) { pts_file_io::delete($this->var_current_directory . $line_r[$i], null, true); } } } break; case 'chmod': $chmod_file = self::find_file_in_array($line_r); if ($chmod_file) { chmod($chmod_file, 0755); } break; case 'unzip': $zip_file = self::find_file_in_array($line_r); pts_compression::zip_archive_extract($zip_file, $this->var_current_directory); break; case 'tar': // TODO: implement break; case 'echo': if ($line == "echo \$? > ~/install-exit-status") { file_put_contents($this->var_current_directory . "install-exit-status", $exit_status); break; } else { if ($line == "echo \$? > ~/test-exit-status") { file_put_contents($this->var_current_directory . "test-exit-status", $exit_status); break; } } $start_echo = strpos($script_contents, "\"") + 1; $end_echo = $start_echo - 1; do { $end_echo = strpos($script_contents, "\"", $end_echo + 1); } while ($script_contents[$end_echo - 1] == "\\"); $script_pointer = strpos($script_contents, "\n", $end_echo); $line_remainder = substr($script_contents, $end_echo + 1, $script_pointer - $end_echo - 1); $echo_contents = substr($script_contents, $start_echo, $end_echo - $start_echo); $this->parse_variables_in_string($echo_contents, $pass_arguments); $echo_contents = str_replace("\\\$", "\$", $echo_contents); $echo_contents = str_replace("\\\"", "\"", $echo_contents); if (($to_file = strpos($line_remainder, ' > ')) !== false) { $to_file = trim(substr($line_remainder, $to_file + 3)); if (($end_file = strpos($to_file, ' ')) !== false) { $to_file = substr($to_file, 0, $end_file); } // TODO: right now it's expecting the file location pipe to be relative location $echo_dir = pts_strings::add_trailing_slash(str_replace('"', null, $this->var_current_directory)); // needed for phodevi::is_windows() specviewperf10 file_put_contents($echo_dir . $to_file, $echo_contents . "\n"); } else { echo $echo_contents; } break; case '#!/bin/sh': case '#': case null: // IGNORE break; case 'case': //echo "\nUNHANDLED EVENT\n"; return false; // TODO: decide how to handle break; default: $exec_output = array(); if (phodevi::is_windows() && substr($line, 0, 2) == "./") { $line = substr($line, 2); } $this->parse_variables_in_string($line, $pass_arguments); $cd_dir = $this->var_current_directory; if (phodevi::is_windows() && strpos($cd_dir, ':\\') === 1) { $cd_dir = str_replace('/', '\\', $cd_dir); $cd_dir = str_replace('\\\\', '\\', $cd_dir); } exec("cd " . $cd_dir . " && " . $line . " 2>&1", $exec_output, $prev_exit_status); break; } } while ($script_contents != false); }