public static function render_page_process($PATH) { $main = null; $identifier_item = isset($PATH[1]) ? $PATH[0] . '/' . $PATH[1] : false; if ($identifier_item && pts_test_profile::is_test_profile($identifier_item)) { $tp = new pts_test_profile($identifier_item); $tp_identifier = $tp->get_identifier(false); $main .= '<h1>' . $tp->get_title() . '</h1><p>' . $tp->get_description() . '</p>'; $main .= '<p><strong>' . $tp->get_test_hardware_type() . ' - ' . phoromatic_server::test_result_count_for_test_profile($_SESSION['AccountID'], $tp_identifier) . ' Results On This Account - ' . $tp->get_test_software_type() . ' - Maintained By: ' . $tp->get_maintainer() . ' - Supported Platforms: ' . implode(', ', $tp->get_supported_platforms()) . '</strong></p>'; $main .= '<p><a href="http://openbenchmarking.org/test/' . $tp_identifier . '">Find out more about this test profile on OpenBenchmarking.org</a>.</p>'; $main .= '<h2>Recent Results With This Test</h2>'; $stmt = phoromatic_server::$db->prepare('SELECT Title, PPRID FROM phoromatic_results WHERE AccountID = :account_id AND UploadID IN (SELECT DISTINCT UploadID FROM phoromatic_results_results WHERE AccountID = :account_id AND TestProfile LIKE :tp) ORDER BY UploadTime DESC LIMIT 30'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':tp', $tp_identifier . '%'); $result = $stmt->execute(); $recent_result_count = 0; while ($result && ($row = $result->fetchArray())) { $recent_result_count++; $main .= '<h2><a href="/?result/' . $row['PPRID'] . '">' . $row['Title'] . '</a></h2>'; } if ($recent_result_count == 0) { $main .= '<p>No results found on this Phoromatic Server for the ' . $tp->get_title() . ' test profile.</p>'; } else { if ($recent_result_count > 5) { $stmt = phoromatic_server::$db->prepare('SELECT UploadID, SystemID, UploadTime FROM phoromatic_results WHERE AccountID = :account_id AND UploadID IN (SELECT DISTINCT UploadID FROM phoromatic_results_results WHERE AccountID = :account_id AND TestProfile LIKE :tp) ORDER BY UploadTime DESC LIMIT 1000'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':tp', $tp_identifier . '%'); $result = $stmt->execute(); $recent_result_count = 0; $result_file = new pts_result_file(null, true); while ($result && ($row = $result->fetchArray())) { $composite_xml = phoromatic_server::phoromatic_account_result_path($_SESSION['AccountID'], $row['UploadID']) . 'composite.xml'; if (!is_file($composite_xml)) { continue; } // Add to result file $system_name = strtotime($row['UploadTime']) . ': ' . phoromatic_server::system_id_to_name($row['SystemID']); $sub_result_file = new pts_result_file($composite_xml, true); foreach ($sub_result_file->get_result_objects() as $obj) { if ($obj->test_profile->get_identifier(false) == $tp_identifier) { $obj->test_result_buffer->rename(null, $system_name); $result_file->add_result($obj); } } } $table = null; $extra_attributes = array('multi_way_comparison_invert_default' => false); $f = false; foreach ($result_file->get_result_objects() as $obj) { $obj->test_profile->set_display_format('SCATTER_PLOT'); foreach ($obj->test_result_buffer->buffer_items as $i => &$item) { if (!is_numeric(substr($item->get_result_identifier(), 0, strpos($item->get_result_identifier(), ':')))) { unset($obj->test_result_buffer->buffer_items[$i]); } } $result_file = null; $main .= '<p align="center">' . pts_render::render_graph_inline_embed($obj, $result_file, $extra_attributes) . '</p>'; } } } } else { $dc = pts_strings::add_trailing_slash(pts_strings::parse_for_home_directory(pts_config::read_user_config('PhoronixTestSuite/Options/Installation/CacheDirectory', PTS_DOWNLOAD_CACHE_PATH))); $dc_exists = is_file($dc . 'pts-download-cache.json'); if ($dc_exists) { $cache_json = file_get_contents($dc . 'pts-download-cache.json'); $cache_json = json_decode($cache_json, true); } $test_counts_for_account = phoromatic_server::test_result_count_for_test_profiles($_SESSION['AccountID']); foreach (pts_openbenchmarking::available_tests() as $test) { $cache_checked = false; if ($dc_exists) { if ($cache_json && isset($cache_json['phoronix-test-suite']['cached-tests'])) { $cache_checked = true; if (!in_array($test, $cache_json['phoronix-test-suite']['cached-tests'])) { //continue; } } } if (!$cache_checked && phoromatic_server::read_setting('show_local_tests_only') && pts_test_install_request::test_files_in_cache($test, true, true) == false) { continue; } $tp = new pts_test_profile($test); if ($tp->get_title() == null) { continue; } $test_count = 0; $tpid = $tp->get_identifier(false); foreach ($test_counts_for_account as $test => $count) { if (strpos($test, $tpid) !== false) { $test_count += $count; unset($test_counts_for_account[$test]); } } $main .= '<h1 style="margin-bottom: 0;"><a href="/?tests/' . $tp->get_identifier(false) . '">' . $tp->get_title() . '</a></h1>'; $main .= '<p style="font-size: 90%;"><strong>' . $tp->get_test_hardware_type() . '</strong> <em>-</em> ' . $test_count . ' Results On This Account' . ' </p>'; } } echo phoromatic_webui_header_logged_in(); echo '<div id="pts_phoromatic_main_area">' . $main . '</div>'; echo phoromatic_webui_footer(); }
public static function render_page_process($PATH) { $main = null; echo phoromatic_webui_header_logged_in(); if (!empty($PATH[0]) && is_numeric($PATH[0])) { $stmt = phoromatic_server::$db->prepare('SELECT * FROM phoromatic_schedules WHERE AccountID = :account_id AND ScheduleID = :schedule_id'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $result = $stmt->execute(); $row = $result->fetchArray(); if (empty($row)) { $main = '<h1>Test Schedules</h1>'; $main .= '<h3>No Resource Found</h3>'; } else { if (!PHOROMATIC_USER_IS_VIEWER) { if (isset($_POST['add_to_schedule_select_test'])) { $name = $_POST['add_to_schedule_select_test']; $args = array(); $args_name = array(); foreach ($_POST as $i => $v) { if (substr($i, 0, 12) == 'test_option_' && substr($i, -9) != '_selected') { array_push($args, $v); array_push($args_name, $_POST[$i . '_selected']); } } $args_name = implode(' - ', $args_name); $args = implode(' ', $args); if (!empty($name)) { $stmt = phoromatic_server::$db->prepare('INSERT INTO phoromatic_schedules_tests (AccountID, ScheduleID, TestProfile, TestArguments, TestDescription) VALUES (:account_id, :schedule_id, :test_profile, :test_arguments, :test_description)'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':test_profile', $name); $stmt->bindValue(':test_arguments', $args); $stmt->bindValue(':test_description', $args_name); $result = $stmt->execute(); phoromatic_add_activity_stream_event('tests_for_schedule', $PATH[0], 'added'); } } else { if (isset($PATH[1]) && $PATH[1] == 'remove' && !empty($PATH[2])) { // REMOVE TEST $to_remove = explode(PHP_EOL, base64_decode($PATH[2])); $stmt = phoromatic_server::$db->prepare('DELETE FROM phoromatic_schedules_tests WHERE AccountID = :account_id AND ScheduleID = :schedule_id AND TestProfile = :test AND TestArguments = :test_args'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':test', $to_remove[0]); $stmt->bindValue(':test_args', $to_remove[1]); $result = $stmt->execute(); phoromatic_add_activity_stream_event('tests_for_schedule', $to_remove[0] . ' - ' . $to_remove[1], 'removed'); } else { if (isset($PATH[1]) && $PATH[1] == 'delete-trigger' && !empty($PATH[2])) { // REMOVE TRIGGER $trigger = base64_decode($PATH[2]); $stmt = phoromatic_server::$db->prepare('DELETE FROM phoromatic_schedules_triggers WHERE AccountID = :account_id AND Trigger = :trigger AND ScheduleID = :schedule_id'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':trigger', $trigger); $result = $stmt->execute(); if ($result) { $main .= '<h2 style="color: red;">Trigger Removed: ' . $trigger . '</h2>'; } } else { if (isset($PATH[1]) && in_array($PATH[1], array('activate', 'deactivate'))) { switch ($PATH[1]) { case 'deactivate': $new_state = 0; break; case 'activate': default: $new_state = 1; break; } // REMOVE TEST $stmt = phoromatic_server::$db->prepare('UPDATE phoromatic_schedules SET State = :new_state WHERE AccountID = :account_id AND ScheduleID = :schedule_id'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':new_state', $new_state); $result = $stmt->execute(); $row['State'] = $new_state; phoromatic_add_activity_stream_event('schedule', $PATH[0], $PATH[1]); } else { if (isset($_POST['do_manual_test_run'])) { $stmt = phoromatic_server::$db->prepare('INSERT INTO phoromatic_schedules_triggers (AccountID, ScheduleID, Trigger, TriggeredOn) VALUES (:account_id, :schedule_id, :trigger, :triggered_on)'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':trigger', $_SESSION['UserName'] . ' - Manual Test Run - ' . date('H:i j M Y')); $stmt->bindValue(':triggered_on', phoromatic_server::current_time()); $stmt->execute(); $main .= '<h2 style="color: red;">Manual Test Run Triggered</h2>'; } else { if (isset($_POST['skip_current_ticket'])) { $stmt = phoromatic_server::$db->prepare('INSERT INTO phoromatic_schedules_trigger_skips (AccountID, ScheduleID, Trigger) VALUES (:account_id, :schedule_id, :trigger)'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':trigger', date('Y-m-d')); $stmt->execute(); $main .= '<h2 style="color: red;">Current Trigger To Be Ignored</h2>'; } } } } } } } $main .= '<h1>' . $row['Title'] . '</h1>'; $main .= '<h3>' . $row['Description'] . '</h3>'; $main .= '<p>This schedule was last modified on <strong>' . date('j F Y \\a\\t H:i', strtotime($row['LastModifiedOn'])) . '</strong> by <strong>' . $row['LastModifiedBy'] . '</strong>.'; if (!PHOROMATIC_USER_IS_VIEWER) { $main .= '<p><a href="?sched/' . $PATH[0] . '">Edit Schedule</a> | '; if ($row['State'] == 1) { $main .= '<a href="?schedules/' . $PATH[0] . '/deactivate">Deactivate Schedule</a>'; } else { $main .= '<a href="?schedules/' . $PATH[0] . '/activate">Activate Schedule</a>'; } $main .= '</p>'; } $main .= '<hr />'; $main .= '<h2>Schedule</h2>'; if (!empty($row['ActiveOn'])) { $active_days = explode(',', $row['ActiveOn']); $week = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'); foreach ($active_days as $i => &$day) { if (!isset($week[$day])) { unset($active_days[$i]); } else { $day = $week[$day]; } } switch (count($active_days)) { case 2: $day_show = implode(' and ', $active_days); break; default: $day_show = implode(', ', $active_days); break; } $main .= '<p>This test is scheduled to run every <strong>' . $day_show . '</strong> at <strong>' . str_replace('.', ':', $row['RunAt']) . '</strong>.</p>'; } else { $main .= '<p>This test schedule is not currently set to run a pre-defined time-based schedule.</p>'; } if (!PHOROMATIC_USER_IS_VIEWER) { $trigger_url = 'http://' . phoromatic_web_socket_server_ip() . '/event.php?type=trigger&user='******'UserName'] . '&public_key=' . $row['PublicKey'] . '&trigger=XXX'; $main .= '<p>This test schedule can be manually triggered to run at any time by calling <strong>' . $trigger_url . '</strong> where <em>XXX</em> is the trigger value to be used (if relevant, such as a time-stamp, Git/SVN commit number or hash, etc). There\'s also the option of sub-targeting system(s) part of this schedule. One option is appending <em>&sub_target_this_ip</em> if this URL is being called from one of the client test systems to only sub-target the triggered testing on that client, among other options.</p>'; $main .= '<p>If you wish to run this test schedule now, click the following button and the schedule will be run on all intended systems at their next earliest possible convenience.</p>'; $main .= '<p><form action="?schedules/' . $PATH[0] . '" name="manual_run" method="post">'; $main .= '<input type="hidden" name="do_manual_test_run" value="1" /><input type="submit" value="Run Test Schedule Now" onclick="return confirm(\'Run this test schedule now?\');" />'; $main .= '</form></p>'; $main .= '<p><form action="?schedules/' . $PATH[0] . '" name="skip_run" method="post">'; $main .= '<input type="hidden" name="skip_current_ticket" value="1" /><input type="submit" value="Skip Current Test Ticket" onclick="return confirm(\'Skip any currently active test ticket on all systems?\');" />'; $main .= '</form></p>'; } $main .= '<hr />'; $contexts = array('SetContextPreInstall' => 'Pre-Install', 'SetContextPostInstall' => 'Post-Install', 'SetContextPreRun' => 'Pre-Test-Run', 'SetContextPostRun' => 'Post-Test-Run'); $scripts = 0; foreach ($contexts as $context => $v) { if (isset($row[$context]) && !empty($row[$context]) && is_file(phoromatic_server::phoromatic_account_path($_SESSION['AccountID']) . 'context_' . $row[$context])) { $scripts++; $main .= '<h2>' . $v . ' Context Script</h2>'; $main .= '<blockquote>' . str_replace(PHP_EOL, '<br />', htmlentities(file_get_contents(phoromatic_server::phoromatic_account_path($_SESSION['AccountID']) . 'context_' . $row[$context]))) . '</blockquote>'; } } if ($scripts > 0) { $main .= '<hr />'; } $main .= '<h2>Tests To Run</h2>'; $stmt = phoromatic_server::$db->prepare('SELECT * FROM phoromatic_schedules_tests WHERE AccountID = :account_id AND ScheduleID = :schedule_id ORDER BY TestProfile ASC'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $result = $stmt->execute(); $test_count = 0; $main .= '<p>'; while ($row = $result->fetchArray()) { $test_count++; $main .= $row['TestProfile'] . ($row['TestDescription'] != null ? ' - <em>' . $row['TestDescription'] . '</em>' : '') . (!PHOROMATIC_USER_IS_VIEWER ? ' <a href="?schedules/' . $PATH[0] . '/remove/' . base64_encode(implode(PHP_EOL, array($row['TestProfile'], $row['TestArguments']))) . '">Remove Test</a>' : null) . '<br />'; /* if(!PHOROMATIC_USER_IS_VIEWER && isset($_REQUEST['make_version_lock_tests'])) { if(strpos($row['TestProfile'], '.') == false) { $test_profile = new pts_test_profile($row['TestProfile']); $full_identifier = $test_profile->get_identifier(true); $stmt = phoromatic_server::$db->prepare('UPDATE phoromatic_schedules_tests SET TestProfile = :version_locked_tp WHERE AccountID = :account_id AND ScheduleID = :schedule_id AND TestProfile = :test'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $stmt->bindValue(':test', $row['TestProfile']); $stmt->bindValue(':version_locked_tp', $full_identifier); $result2 = $stmt->execute(); } } */ } $main .= '</p>'; if ($test_count == 0) { $main .= '<h3 style="text-transform: uppercase;">No tests have been added yet for this test schedule.</h3>'; } if (!PHOROMATIC_USER_IS_VIEWER) { $main .= '<hr /><h2>Add A Test</h2>'; $main .= '<form action="?schedules/' . $PATH[0] . '" name="add_test" id="add_test" method="post">'; $main .= '<select name="add_to_schedule_select_test" id="add_to_schedule_select_test" onchange="phoromatic_schedule_test_details(\'\');">'; $dc = pts_strings::add_trailing_slash(pts_client::parse_home_directory(pts_config::read_user_config('PhoronixTestSuite/Options/Installation/CacheDirectory', PTS_DOWNLOAD_CACHE_PATH))); $dc_exists = is_file($dc . 'pts-download-cache.json'); foreach (pts_openbenchmarking::available_tests(false, true) as $test) { $cache_checked = false; if ($dc_exists) { $cache_json = file_get_contents($dc . 'pts-download-cache.json'); $cache_json = json_decode($cache_json, true); if ($cache_json && isset($cache_json['phoronix-test-suite']['cached-tests'])) { $cache_checked = true; if (!in_array($test, $cache_json['phoronix-test-suite']['cached-tests'])) { continue; } } } if (!$cache_checked && phoromatic_server::read_setting('show_local_tests_only') && pts_test_install_request::test_files_in_cache($test, true, true) == false) { continue; } $main .= '<option value="' . $test . '">' . $test . '</option>'; } $main .= '</select>'; $main .= '<p><div id="test_details"></div></p>'; $main .= '</form>'; } $systems_in_schedule = phoromatic_server::systems_associated_with_schedule($_SESSION['AccountID'], $PATH[0]); if (!empty($systems_in_schedule)) { $main .= '<hr /><h2>Systems In Schedule</h2>'; if (!PHOROMATIC_USER_IS_VIEWER) { $main .= '<p>To run this schedule on more systems, <a href="?sched/' . $PATH[0] . '">edit the schedule</a>.</p>'; } $main .= '<div class="pts_phoromatic_info_box_area" style="margin: 0 10%;"><ul><li><h1>Systems</h1></li>'; foreach ($systems_in_schedule as $system_id) { $row = phoromatic_server::get_system_details($_SESSION['AccountID'], $system_id); $main .= '<a href="?systems/' . $row['SystemID'] . '"><li>' . $row['Title'] . '<br /><table><tr><td>' . $row['LocalIP'] . '</td><td><strong>' . $row['CurrentTask'] . '</strong></td><td><strong>Last Communication:</strong> ' . date('j F Y H:i', strtotime($row['LastCommunication'])) . '</td></tr></table></li></a>'; } $main .= '</ul></div><hr />'; } $stmt = phoromatic_server::$db->prepare('SELECT Trigger, TriggeredOn FROM phoromatic_schedules_triggers WHERE AccountID = :account_id AND ScheduleID = :schedule_id ORDER BY TriggeredOn DESC LIMIT 10'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $test_result_result = $stmt->execute(); $test_result_row = $test_result_result->fetchArray(); if ($test_result_row) { $main .= '<div class="pts_phoromatic_info_box_area" style="margin: 0 10%;">'; $main .= '<ul><li><h1>Recent Triggers For This Schedule</h1></li>'; do { $main .= '<a onclick=""><li>' . $test_result_row['Trigger'] . '<br /><table><tr><td>' . phoromatic_user_friendly_timedate($test_result_row['TriggeredOn']) . '</td><td><a href="?schedules/' . $PATH[0] . '/delete-trigger/' . base64_encode($test_result_row['Trigger']) . '">Remove Trigger</a></td></tr></table></li></a>'; } while ($test_result_row = $test_result_result->fetchArray()); $main .= '</ul>'; $main .= '</div>'; } $stmt = phoromatic_server::$db->prepare('SELECT Title, SystemID, ScheduleID, PPRID, UploadTime FROM phoromatic_results WHERE AccountID = :account_id AND ScheduleID = :schedule_id ORDER BY UploadTime DESC'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':schedule_id', $PATH[0]); $test_result_result = $stmt->execute(); $test_result_row = $test_result_result->fetchArray(); if ($test_result_row) { $main .= '<div class="pts_phoromatic_info_box_area" style="margin: 0 10%;">'; $main .= '<ul><li><h1>Recent Test Results For This Schedule</h1></li>'; $results = 0; do { $oldest_upload_time = $test_result_row['UploadTime']; if ($results > 100) { continue; } $main .= '<a href="?result/' . $test_result_row['PPRID'] . '"><li>' . $test_result_row['Title'] . '<br /><table><tr><td>' . phoromatic_system_id_to_name($test_result_row['SystemID']) . '</td><td>' . phoromatic_user_friendly_timedate($test_result_row['UploadTime']) . '</td></tr></table></li></a>'; $results++; } while ($test_result_row = $test_result_result->fetchArray()); $main .= '</ul>'; $main .= '</div>'; } $num_results = phoromatic_results_for_schedule($PATH[0]); if ($num_results > 1) { $main .= '<p>Jump to the latest results from the past: '; $main .= '<select name="view_results_from_past" id="view_results_from_past" onchange="phoromatic_jump_to_results_from(\'' . $PATH[0] . '\', \'view_results_from_past\');">'; $oldest_upload_time = strtotime($oldest_upload_time); $opts = array('Week' => 7, 'Three Weeks' => 21, 'Month' => 30, 'Quarter' => 90, 'Six Months' => 180, 'Year' => 365); foreach ($opts as $str_name => $time_offset) { if ($oldest_upload_time > time() - 86400 * $time_offset) { break; } $main .= '<option value="' . $time_offset . '">' . $str_name . '</option>'; } $main .= '<option value="all">All Results</option>'; $main .= '</select>'; $main .= '</p><hr />'; } $main .= '<p><strong>' . $num_results . ' Test Results Available For This Schedule.</strong></p>'; } echo phoromatic_webui_main($main, phoromatic_webui_right_panel_logged_in()); echo phoromatic_webui_footer(); return; } $main = '<h1>Test Schedules</h1> <p>Test schedules are used for tests that are intended to be run on a recurring basis -- either daily or other defined time period -- or whenever a trigger/event occurs, like a new Git commit to a software repository being tracked. Test schedules can be run on any given system(s)/group(s) and can be later edited.</p>'; if (!PHOROMATIC_USER_IS_VIEWER) { $main .= ' <hr /> <h2>Create A Schedule</h2> <p><a href="?sched">Create a schedule</a> followed by adding tests/suites to run for that schedule on the selected systems.</p>'; } $main .= '<hr /><h2>Current Schedules</h2>'; $main .= '<div class="pts_phoromatic_info_box_area"> <ul> <li><h1>Active Test Schedules</h1></li>'; $stmt = phoromatic_server::$db->prepare('SELECT Title, ScheduleID, Description, RunTargetSystems, RunTargetGroups, RunAt, ActiveOn FROM phoromatic_schedules WHERE AccountID = :account_id AND State >= 1 ORDER BY Title ASC'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $result = $stmt->execute(); $row = $result->fetchArray(); if ($row == false) { $main .= '<li class="light" style="text-align: center;">No Schedules Found</li>'; } else { do { $stmt_tests = phoromatic_server::$db->prepare('SELECT COUNT(*) AS TestCount FROM phoromatic_schedules_tests WHERE AccountID = :account_id AND ScheduleID = :schedule_id ORDER BY TestProfile ASC'); $stmt_tests->bindValue(':account_id', $_SESSION['AccountID']); $stmt_tests->bindValue(':schedule_id', $row['ScheduleID']); $result_tests = $stmt_tests->execute(); $row_tests = $result_tests->fetchArray(); $test_count = !empty($row_tests) ? $row_tests['TestCount'] : 0; $group_count = empty($row['RunTargetGroups']) ? 0 : count(explode(',', $row['RunTargetGroups'])); $main .= '<a href="?schedules/' . $row['ScheduleID'] . '"><li>' . $row['Title'] . '<br /><table><tr><td>' . pts_strings::plural_handler(count(phoromatic_server::systems_associated_with_schedule($_SESSION['AccountID'], $row['ScheduleID'])), 'System') . '</td><td>' . pts_strings::plural_handler($group_count, 'Group') . '</td><td>' . pts_strings::plural_handler($test_count, 'Test') . '</td><td>' . pts_strings::plural_handler(phoromatic_results_for_schedule($row['ScheduleID']), 'Result') . ' Total</td><td>' . pts_strings::plural_handler(phoromatic_results_for_schedule($row['ScheduleID'], 'TODAY'), 'Result') . ' Today</td><td><strong>' . phoromatic_schedule_activeon_string($row['ActiveOn'], $row['RunAt']) . '</strong></td></tr></table></li></a>'; } while ($row = $result->fetchArray()); } $main .= '</ul> </div>'; $main .= '<hr /><h2>Schedule Overview</h2>'; $week = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'); foreach ($week as $i => $day) { $stmt = phoromatic_server::$db->prepare('SELECT Title, ScheduleID, RunAt, RunTargetGroups, RunTargetSystems FROM phoromatic_schedules WHERE AccountID = :account_id AND State >= 1 AND ActiveOn LIKE :active_on ORDER BY RunAt,ActiveOn,Title ASC'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $stmt->bindValue(':active_on', '%' . $i . '%'); $result = $stmt->execute(); $has_matched = false; while ($row = $result->fetchArray()) { if (!$has_matched) { $main .= '<h3>' . $day . '</h3>' . PHP_EOL . '<p>'; $has_matched = true; } $main .= '<em>' . $row['RunAt'] . '</em> <a href="?schedules/' . $row['ScheduleID'] . '">' . $row['Title'] . '</a>'; //$main .= $row['RunTargetSystems'] . ' ' . $row['RunTargetGroups']; $main .= '<br />'; } if ($has_matched) { $main .= '</p>' . PHP_EOL; } } $main .= '<div class="pts_phoromatic_info_box_area"> <ul> <li><h1>Deactivated Test Schedules</h1></li>'; $stmt = phoromatic_server::$db->prepare('SELECT Title, ScheduleID, Description, RunTargetSystems, RunTargetGroups, RunAt, ActiveOn FROM phoromatic_schedules WHERE AccountID = :account_id AND State < 1 ORDER BY Title ASC'); $stmt->bindValue(':account_id', $_SESSION['AccountID']); $result = $stmt->execute(); $row = $result->fetchArray(); if ($row == false) { $main .= '<li class="light" style="text-align: center;">No Schedules Found</li>'; } else { do { $stmt_tests = phoromatic_server::$db->prepare('SELECT COUNT(*) AS TestCount FROM phoromatic_schedules_tests WHERE AccountID = :account_id AND ScheduleID = :schedule_id ORDER BY TestProfile ASC'); $stmt_tests->bindValue(':account_id', $_SESSION['AccountID']); $stmt_tests->bindValue(':schedule_id', $row['ScheduleID']); $result_tests = $stmt_tests->execute(); $row_tests = $result_tests->fetchArray(); $test_count = !empty($row_tests) ? $row_tests['TestCount'] : 0; $group_count = empty($row['RunTargetGroups']) ? 0 : count(explode(',', $row['RunTargetGroups'])); $main .= '<a href="?schedules/' . $row['ScheduleID'] . '"><li>' . $row['Title'] . '<br /><table><tr><td>' . pts_strings::plural_handler(count(phoromatic_server::systems_associated_with_schedule($_SESSION['AccountID'], $row['ScheduleID'])), 'System') . '</td><td>' . pts_strings::plural_handler($group_count, 'Group') . '</td><td>' . pts_strings::plural_handler($test_count, 'Test') . '</td><td>' . pts_strings::plural_handler(phoromatic_results_for_schedule($row['ScheduleID']), 'Result') . ' Total</td><td>' . pts_strings::plural_handler(phoromatic_results_for_schedule($row['ScheduleID'], 'TODAY'), 'Result') . ' Today</td><td><strong>' . phoromatic_schedule_activeon_string($row['ActiveOn'], $row['RunAt']) . '</strong></td></tr></table></li></a>'; } while ($row = $result->fetchArray()); } $main .= '</ul> </div>'; echo '<div id="pts_phoromatic_main_area">' . $main . '</div>'; echo phoromatic_webui_footer(); }
public static function render_page_process($PATH) { if (isset($_POST['suite_title'])) { // echo '<pre>'; // var_dump($_POST); // echo '</pre>'; if (strlen($_POST['suite_title']) < 3) { echo '<h2>Suite title must be at least three characters.</h2>'; } //echo 'TEST SUITE: ' . $_POST['suite_title'] . '<br />'; //echo 'TEST SUITE: ' . $_POST['suite_description'] . '<br />'; $tests = array(); foreach ($_POST['test_add'] as $i => $test_identifier) { $test_prefix = $_POST['test_prefix'][$i]; $args = array(); $args_name = array(); foreach ($_POST as $i => $v) { if (strpos($i, $test_prefix) !== false && substr($i, -9) != '_selected') { if (strpos($v, '||') !== false) { $opts = explode('||', $v); $a = array(); $d = array(); foreach ($opts as $opt) { $t = explode('::', $opt); array_push($a, $t[1]); array_push($d, $t[0]); } array_push($args, $a); array_push($args_name, $d); } else { array_push($args, array($v)); array_push($args_name, array($_POST[$i . '_selected'])); } } } $test_args = array(); $test_args_description = array(); pts_test_run_options::compute_all_combinations($test_args, null, $args, 0); pts_test_run_options::compute_all_combinations($test_args_description, null, $args_name, 0, ' - '); foreach (array_keys($test_args) as $i) { array_push($tests, array('test' => $test_identifier, 'description' => $test_args_description[$i], 'args' => $test_args[$i])); } } if (count($tests) < 1) { echo '<h2>You must add at least one test to the suite.</h2>'; } $suite_writer = new pts_test_suite_writer(); $version_bump = 0; do { $suite_version = '1.' . $version_bump . '.0'; $suite_id = $suite_writer->clean_save_name_string($_POST['suite_title']) . '-' . $suite_version; $suite_dir = phoromatic_server::phoromatic_account_suite_path($_SESSION['AccountID'], $suite_id); $version_bump++; } while (is_dir($suite_dir)); pts_file_io::mkdir($suite_dir); $save_to = $suite_dir . '/suite-definition.xml'; $suite_writer->add_suite_information($_POST['suite_title'], $suite_version, $_SESSION['UserName'], 'System', $_POST['suite_description']); foreach ($tests as $m) { $suite_writer->add_to_suite($m['test'], $m['args'], $m['description']); } $suite_writer->save_xml($save_to); echo '<h2>Saved As ' . $suite_id . '</h2>'; } echo phoromatic_webui_header_logged_in(); $main = '<h1>Local Suites</h1><p>Find already created local test suites by your account/group via the <a href="/?local_suites">local suites</a> page.</p>'; if (!PHOROMATIC_USER_IS_VIEWER) { $main .= '<h1>Build Suite</h1><p>A test suite in the realm of the Phoronix Test Suite, OpenBenchmarking.org, and Phoromatic is <strong>a collection of test profiles with predefined settings</strong>. Establishing a test suite makes it easy to run repetitive testing on the same set of test profiles by simply referencing the test suite name.</p>'; $main .= '<form action="' . $_SERVER['REQUEST_URI'] . '" name="build_suite" id="build_suite" method="post" onsubmit="return validate_suite();"> <h3>Title:</h3> <p><input type="text" name="suite_title" /></p> <h3>Description:</h3> <p><textarea name="suite_description" id="suite_description" cols="60" rows="2"></textarea></p> <h3>Tests In Schedule:</h3> <p><div id="test_details"></div></p> <h3>Add Another Test</h3>'; $main .= '<select name="add_to_suite_select_test" id="add_to_suite_select_test" onchange="phoromatic_build_suite_test_details();">'; $dc = pts_strings::add_trailing_slash(pts_client::parse_home_directory(pts_config::read_user_config('PhoronixTestSuite/Options/Installation/CacheDirectory', PTS_DOWNLOAD_CACHE_PATH))); $dc_exists = is_file($dc . 'pts-download-cache.json'); foreach (pts_openbenchmarking::available_tests(false, true) as $test) { $cache_checked = false; if ($dc_exists) { $cache_json = file_get_contents($dc . 'pts-download-cache.json'); $cache_json = json_decode($cache_json, true); if ($cache_json && isset($cache_json['phoronix-test-suite']['cached-tests'])) { $cache_checked = true; if (!in_array($test, $cache_json['phoronix-test-suite']['cached-tests'])) { continue; } } } if (!$cache_checked && phoromatic_server::read_setting('show_local_tests_only') && pts_test_install_request::test_files_in_cache($test, true, true) == false) { continue; } $main .= '<option value="' . $test . '">' . $test . '</option>'; } $main .= '</select>'; $main .= '<p align="right"><input name="submit" value="Create Suite" type="submit" onclick="return pts_rmm_validate_suite();" /></p>'; } echo '<div id="pts_phoromatic_main_area">' . $main . '</div>'; echo phoromatic_webui_footer(); }
public static function run($r) { // Force refresh of OB repository to ensure the latest profiles pts_openbenchmarking::refresh_repository_lists(null, true); // Determine cache location $dc_write_directory = pts_strings::add_trailing_slash(pts_strings::parse_for_home_directory(pts_config::read_user_config('PhoronixTestSuite/Options/Installation/CacheDirectory', PTS_DOWNLOAD_CACHE_PATH))); echo PHP_EOL . 'Download Cache Directory: ' . $dc_write_directory . PHP_EOL; if ($dc_write_directory == null || !is_writable($dc_write_directory)) { echo 'No writable download cache directory was found. A download cache cannot be created.' . PHP_EOL . PHP_EOL; return false; } if (!empty($r)) { $test_profiles = pts_types::identifiers_to_test_profile_objects($r, true, true); if (count($test_profiles) > 0) { echo PHP_EOL . 'Downloading Test Files For: ' . implode(' ', $test_profiles); pts_test_installer::only_download_test_files($test_profiles, $dc_write_directory); } } $json_download_cache = array('phoronix-test-suite' => array('main' => array('generated' => time()), 'download-cache' => array())); foreach (pts_tests::partially_installed_tests() as $test) { $test_profile = new pts_test_profile($test); echo PHP_EOL . 'Checking Downloads For: ' . $test . PHP_EOL; foreach (pts_test_install_request::read_download_object_list($test_profile, false) as $file) { $cached_valid = false; if (is_file($dc_write_directory . $file->get_filename()) && $file->check_file_hash($dc_write_directory . $file->get_filename())) { echo ' Previously Cached: ' . $file->get_filename() . PHP_EOL; $cached_valid = true; } else { if (is_dir($test_profile->get_install_dir())) { if (is_file($test_profile->get_install_dir() . $file->get_filename()) && $file->check_file_hash($test_profile->get_install_dir() . $file->get_filename())) { echo ' Caching: ' . $file->get_filename() . PHP_EOL; if (copy($test_profile->get_install_dir() . $file->get_filename(), $dc_write_directory . $file->get_filename())) { $cached_valid = true; } } } } if ($cached_valid) { if (!isset($json_download_cache['phoronix-test-suite']['download-cache'][$file->get_filename()])) { $json_download_cache['phoronix-test-suite']['download-cache'][$file->get_filename()] = array('file_name' => $file->get_filename(), 'file_size' => $file->get_filesize(), 'associated_tests' => array($test_profile->get_identifier()), 'md5' => $file->get_md5(), 'sha256' => $file->get_sha256()); } else { if ($file->get_md5() == $json_download_cache['phoronix-test-suite']['download-cache'][$file->get_filename()]['md5'] && $file->get_sha256() == $json_download_cache['phoronix-test-suite']['download-cache'][$file->get_filename()]['sha256']) { array_push($json_download_cache['phoronix-test-suite']['download-cache'][$file->get_filename()]['associated_tests'], $test_profile->get_identifier()); } } } } } // Find files in download-cache/ that weren't part of an installed test (but could have just been tossed in there) to cache foreach (glob($dc_write_directory . '/*') as $cached_file) { $file_name = basename($cached_file); if (!isset($json_download_cache['phoronix-test-suite']['download-cache'][$file_name]) && $file_name != 'pts-download-cache.json') { $json_download_cache['phoronix-test-suite']['download-cache'][$file_name] = array('file_name' => $file_name, 'file_size' => filesize($cached_file), 'associated_tests' => array(), 'md5' => md5_file($cached_file), 'sha256' => hash_file('sha256', $cached_file)); } } $cached_tests = array(); foreach (pts_openbenchmarking::available_tests(true, true) as $test) { if (pts_test_install_request::test_files_in_cache($test, true, true) == false) { continue; } array_push($cached_tests, $test); } $json_download_cache['phoronix-test-suite']['cached-tests'] = $cached_tests; file_put_contents($dc_write_directory . 'pts-download-cache.json', json_encode($json_download_cache, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0)); echo PHP_EOL; }