public static function partially_installed_tests() { $cleaned_tests = array(); $repo = '*'; $install_root_path = pts_client::test_install_root_path(); $install_root_path_length = strlen($install_root_path); foreach (pts_file_io::glob($install_root_path . $repo . '/*') as $identifier_path) { array_push($cleaned_tests, substr($identifier_path, $install_root_path_length)); } return $cleaned_tests; }
public static function standard_install($items_to_install, $force_install = false, $no_prompts = false, $skip_tests_with_missing_dependencies = false) { // Refresh the pts_client::$display in case we need to run in debug mode if (pts_client::$display == false || !pts_client::$display instanceof pts_websocket_display_mode) { pts_client::init_display_mode(); } // Create a lock $lock_path = pts_client::temporary_directory() . '/phoronix-test-suite.active'; pts_client::create_lock($lock_path); // Get the test profiles $unknown_tests = array(); $test_profiles = pts_types::identifiers_to_test_profile_objects($items_to_install, true, true, $unknown_tests); // Any external dependencies? pts_external_dependencies::install_dependencies($test_profiles, $no_prompts, $skip_tests_with_missing_dependencies); // Install tests if (!is_writable(pts_client::test_install_root_path())) { trigger_error('The test installation directory is not writable.' . PHP_EOL . 'Location: ' . pts_client::test_install_root_path(), E_USER_ERROR); return false; } pts_test_installer::start_install($test_profiles, $unknown_tests, $force_install, $no_prompts); pts_client::release_lock($lock_path); return $test_profiles; }
public static function file_lookaside_test_installations(&$test_file_download) { // Check to see if the same package name with the same package check-sum is already present in another test installation $package_match = false; foreach (pts_file_io::glob(pts_client::test_install_root_path() . '*/*/' . $test_file_download->get_filename()) as $possible_package_match) { // Check to see if the same package name with the same package check-sum is already present in another test installation if ($test_file_download->check_file_hash($possible_package_match)) { $package_match = $possible_package_match; break; } } return $package_match; }
public function get_install_dir() { return pts_client::test_install_root_path() . $this->identifier . '/'; }
public function initial_checks(&$to_run, $override_display_mode = false) { // Refresh the pts_client::$display in case we need to run in debug mode if (pts_client::$display == false || !pts_client::$display instanceof pts_websocket_display_mode) { pts_client::init_display_mode($override_display_mode); } $to_run = pts_types::identifiers_to_objects($to_run); if ($this->batch_mode && $this->batch_mode['Configured'] == false && !$this->auto_mode) { trigger_error('The batch mode must first be configured.' . PHP_EOL . 'To configure, run phoronix-test-suite batch-setup', E_USER_ERROR); return false; } if (!is_writable(pts_client::test_install_root_path())) { trigger_error('The test installation directory is not writable.' . PHP_EOL . 'Location: ' . pts_client::test_install_root_path(), E_USER_ERROR); return false; } // Cleanup tests to run if (pts_test_run_manager::cleanup_tests_to_run($to_run) == false) { return false; } else { if (count($to_run) == 0) { trigger_error('You must enter at least one test, suite, or result identifier to run.', E_USER_ERROR); return false; } } return true; }
public static function sw_filesystem() { // Determine file-system type $fs = null; if (phodevi::is_macosx()) { $fs = phodevi_osx_parser::read_osx_system_profiler('SPSerialATADataType', 'FileSystem'); if ($fs == null && pts_client::executable_in_path('mount')) { $mount = shell_exec('mount 2>&1'); if (stripos($mount, ' on / (hfs, local, journaled)') !== false) { $fs = 'Journaled HFS+'; } else { if (stripos($mount, ' on / (hfs') !== false) { $fs = 'HFS+'; } } } } else { if (phodevi::is_bsd()) { if (pts_client::executable_in_path('mount')) { $mount = shell_exec('mount 2>&1'); if (($start = strpos($mount, 'on / (')) != false) { // FreeBSD, DragonflyBSD mount formatting /* -bash-4.0$ mount ROOT on / (hammer, local) /dev/da0s1a on /boot (ufs, local) /pfs/@@-1:00001 on /var (null, local) /pfs/@@-1:00002 on /tmp (null, local) /pfs/@@-1:00003 on /usr (null, local) /pfs/@@-1:00004 on /home (null, local) /pfs/@@-1:00005 on /usr/obj (null, local) /pfs/@@-1:00006 on /var/crash (null, local) /pfs/@@-1:00007 on /var/tmp (null, local) procfs on /proc (procfs, local) */ // TODO: improve this in case there are other partitions, etc $fs = substr($mount, $start + 6); $fs = substr($fs, 0, strpos($fs, ',')); } else { if (($start = strpos($mount, 'on / type')) != false) { // OpenBSD 5.0 formatting is slightly different from above FreeBSD example // TODO: improve this in case there are other partitions, etc $fs = substr($mount, $start + 10); $fs = substr($fs, 0, strpos($fs, ' ')); } } } } else { if (phodevi::is_hurd()) { // Very rudimentary Hurd filesystem detection support but works for at least a clean Debian GNU/Hurd EXT2 install if (pts_client::executable_in_path('mount')) { $mount = shell_exec('mount 2>&1'); if (($start = strpos($mount, 'on / type')) != false) { $fs = substr($mount, $start + 10); $fs = substr($fs, 0, strpos($fs, ' ')); if (substr($fs, -2) == 'fs') { $fs = substr($fs, 0, -2); } } } } else { if (phodevi::is_linux() || phodevi::is_solaris()) { $fs = trim(shell_exec('stat ' . pts_client::test_install_root_path() . ' -L -f -c %T 2> /dev/null')); switch ($fs) { case 'ext2/ext3': if (isset(phodevi::$vfs->mounts)) { $fstab = phodevi::$vfs->mounts; $fstab = str_replace('/boot ', 'IGNORE', $fstab); $using_ext2 = strpos($fstab, ' ext2') !== false; $using_ext3 = strpos($fstab, ' ext3') !== false; $using_ext4 = strpos($fstab, ' ext4') !== false; if (!$using_ext2 && !$using_ext3 && $using_ext4) { $fs = 'ext4'; } else { if (!$using_ext2 && !$using_ext4 && $using_ext3) { $fs = 'ext3'; } else { if (!$using_ext3 && !$using_ext4 && $using_ext2) { $fs = 'ext2'; } else { if (is_dir('/proc/fs/ext4/')) { $fs = 'ext4'; } else { if (is_dir('/proc/fs/ext3/')) { $fs = 'ext3'; } } } } } } break; case 'Case-sensitive Journaled HFS+': $fs = 'HFS+'; break; case 'MS-DOS FAT32': $fs = 'FAT32'; break; case 'UFSD_NTFS_COMPR': $fs = 'NTFS'; break; case 'ecryptfs': if (isset(phodevi::$vfs->mounts)) { // An easy attempt to determine what file-system is underneath ecryptfs if being compared // For now just attempt to figure out the root file-system. if (($s = strrpos(phodevi::$vfs->mounts, ' / ')) !== false) { $s = substr(phodevi::$vfs->mounts, $s + 3); $s = substr($s, 0, strpos($s, ' ')); if ($s != null && !isset($s[18]) && $s != 'rootfs' && pts_strings::string_only_contains($s, pts_strings::CHAR_LETTER | pts_strings::CHAR_NUMERIC)) { $fs = $s . ' (ecryptfs)'; } } } break; default: if (substr($fs, 0, 9) == 'UNKNOWN (') { $magic_block = substr($fs, 9, -1); $known_magic_blocks = array('0x9123683e' => 'Btrfs', '0x2fc12fc1' => 'zfs', '0x482b' => 'HFS+', '0x65735546' => 'FUSE', '0x565a4653' => 'ReiserFS', '0x52345362' => 'Reiser4', '0x3434' => 'NILFS2', '0x5346414f' => 'OpenAFS', '0x47504653' => 'GPFS', '0x5941ff53' => 'YAFFS', '0xff534d42' => 'CIFS', '0x24051905' => 'UBIFS', '0x1021994' => 'TMPFS', '0x73717368' => 'SquashFS', '0xc97e8168' => 'LogFS', '0x5346544E' => 'NTFS', '0xf15f' => 'eCryptfs', '0x61756673' => 'AuFS', '0xbd00bd0' => 'Lustre', '0xaad7aaea' => 'PanFS', '0xf2f52010' => 'F2FS', '0xc36400' => 'CephFS'); foreach ($known_magic_blocks as $hex => $name) { if ($magic_block == $hex) { $fs = $name; break; } } } break; } if (strpos($fs, 'UNKNOWN') !== false && isset(phodevi::$vfs->mounts)) { $mounts = phodevi::$vfs->mounts; $fs_r = array(); $fs_checks = array('squashfs' => 'SquashFS', 'aufs' => 'AuFS', 'unionfs' => 'UnionFS'); foreach ($fs_checks as $fs_module => $fs_name) { if (strpos($mounts, $fs_module) != false) { array_push($fs_r, $fs_name); } } if (count($fs_r) > 0) { $fs = implode(' + ', $fs_r); } } } else { if (phodevi::is_windows()) { return null; } } } } } if (empty($fs)) { $fs = 'Unknown'; } return $fs; }
public static function evaluate_string_to_qualifier($supplied, $bind_version = true, $check_only_type = false) { $qualified = false; $c_repo = null; $repos = self::linked_repositories(); if (($c = strpos($supplied, '/')) !== false) { // A repository was explicitly defined $c_repo = substr($supplied, 0, $c); $test = substr($supplied, $c + 1); // If it's in the linked repo list it should have refreshed when starting client if (!in_array($c_repo, $repos)) { // Pull in this repository's index pts_openbenchmarking::refresh_repository_lists($repos); } $repos = array($c_repo); } else { // If it's in the linked repo list it should have refreshed when starting client $test = $supplied; } if (($c = strrpos($test, '-')) !== false) { $version = substr($test, $c + 1); // TODO: functionalize this and read against types.xsd if (isset($version[2]) && !isset($version[8]) && pts_strings::string_only_contains($version, pts_strings::CHAR_NUMERIC | pts_strings::CHAR_DECIMAL)) { $test = substr($test, 0, $c); } else { $version = null; } } else { $version = null; } if ($test == null) { return false; } foreach ($repos as $repo) { if ($repo == 'local') { if (self::check_only_type_compare($check_only_type, 'test')) { if (is_file(PTS_TEST_PROFILE_PATH . $repo . '/' . $test . '/test-definition.xml')) { return $repo . '/' . $test; // ($bind_version ? '-' . $version : null) } else { if (is_file(PTS_TEST_PROFILE_PATH . $repo . '/' . $test . '-' . $version . '/test-definition.xml')) { return $repo . '/' . $test . '-' . $version; // ($bind_version ? '-' . $version : null) } } } if (self::check_only_type_compare($check_only_type, 'suite')) { if (is_file(PTS_TEST_SUITE_PATH . $repo . '/' . $test . '/suite-definition.xml')) { return $repo . '/' . $test; // ($bind_version ? '-' . $version : null) } else { if (is_file(PTS_TEST_SUITE_PATH . $repo . '/' . $test . '-' . $version . '/suite-definition.xml')) { return $repo . '/' . $test . '-' . $version; // ($bind_version ? '-' . $version : null) } } } } $repo_index = pts_openbenchmarking::read_repository_index($repo); if (is_array($repo_index) && isset($repo_index['tests'][$test]) && self::check_only_type_compare($check_only_type, 'test')) { // The test profile at least exists // Looking for a particular test profile version? if ($version != null) { if (!in_array($version, $repo_index['tests'][$test]['versions'])) { // Grep to see if the version passed was e.g. 1.3 instead of 1.3.3 $versions = $repo_index['tests'][$test]['versions']; sort($versions); foreach (array_reverse($versions) as $check_version) { if (strstr($check_version, $version) != false) { $version = $check_version; break; } } } if (in_array($version, $repo_index['tests'][$test]['versions'])) { pts_openbenchmarking::download_test_profile($repo . '/' . $test . '-' . $version); return $repo . '/' . $test . ($bind_version ? '-' . $version : null); } } else { // Assume to use the latest version unless something else is installed $available_versions = $repo_index['tests'][$test]['versions']; $version = $available_versions[0]; // the latest version available if (pts_c::$test_flags & pts_c::is_run_process) { // Check to see if an older version of the test profile is currently installed foreach ($available_versions as $i => $v) { if (is_file(pts_client::test_install_root_path() . $repo . '/' . $test . '-' . $v . '/pts-install.xml')) { $version = $v; if ($i > 0 && pts_c::$test_flags ^ pts_c::batch_mode) { // It's not the latest test profile version available trigger_error($repo . '/' . $test . ': The latest test profile version available for upgrade is ' . $available_versions[0] . ' but version ' . $version . ' is the latest currently installed.', E_USER_WARNING); } break; } } } pts_openbenchmarking::download_test_profile($repo . '/' . $test . '-' . $version); return $repo . '/' . $test . ($bind_version ? '-' . $version : null); } } if (is_array($repo_index) && isset($repo_index['suites'][$test]) && self::check_only_type_compare($check_only_type, 'suite')) { // The test profile at least exists // Looking for a particular test profile version? if ($version != null) { if (!in_array($version, $repo_index['suites'][$test]['versions'])) { // Grep to see if the version passed was e.g. 1.3 instead of 1.3.3 $versions = $repo_index['suites'][$test]['versions']; sort($versions); foreach (array_reverse($versions) as $check_version) { if (strstr($check_version, $version) != false) { $version = $check_version; break; } } } if (in_array($version, $repo_index['suites'][$test]['versions'])) { pts_openbenchmarking::download_test_suite($repo . '/' . $test . '-' . $version); return $repo . '/' . $test . ($bind_version ? '-' . $version : null); } } else { // Assume to use the latest version $version = array_shift($repo_index['suites'][$test]['versions']); pts_openbenchmarking::download_test_suite($repo . '/' . $test . '-' . $version); return $repo . '/' . $test . ($bind_version ? '-' . $version : null); } } } return false; }
public static function hdd_string() { $disks = array(); if (phodevi::is_macosx()) { // TODO: Support reading non-SATA drives and more than one drive $capacity = phodevi_osx_parser::read_osx_system_profiler('SPSerialATADataType', 'Capacity'); $model = phodevi_osx_parser::read_osx_system_profiler('SPSerialATADataType', 'Model'); if (($cut = strpos($capacity, ' (')) !== false) { $capacity = substr($capacity, 0, $cut); } if (($cut = strpos($capacity, ' ')) !== false) { if (is_numeric(substr($capacity, 0, $cut))) { $capacity = floor(substr($capacity, 0, $cut)) . substr($capacity, $cut); } } $capacity = str_replace(' GB', 'GB', $capacity); if (!empty($capacity) && !empty($model)) { $disks = array($capacity . ' ' . $model); } } else { if (phodevi::is_bsd()) { $i = 0; do { $disk = phodevi_bsd_parser::read_sysctl('dev.ad.' . $i . '.%desc'); if ($disk != false && strpos($disk, 'DVD') === false && strpos($disk, 'ATAPI') === false) { array_push($disks, $disk); } $i++; } while (($disk != false || $i < 9) && $i < 128); // On some systems, the first drive seems to be at dev.ad.8 rather than starting at dev.ad.0 if (empty($disks) && pts_client::executable_in_path('camcontrol')) { $camcontrol = trim(shell_exec('camcontrol devlist 2>&1')); foreach (explode(PHP_EOL, $camcontrol) as $line) { if (substr($line, 0, 1) == '<' && ($model_end = strpos($line, '>')) !== false && strpos($line, 'DVD') === false && strpos($line, 'ATAPI') === false) { $disk = self::prepend_disk_vendor(substr($line, 1, $model_end - 1)); array_push($disks, $disk); } } } } else { if (phodevi::is_solaris()) { if (is_executable('/usr/ddu/bin/i386/hd_detect')) { $hd_detect = explode(PHP_EOL, trim(shell_exec('/usr/ddu/bin/i386/hd_detect -l 2>&1'))); foreach ($hd_detect as $hd_line) { if (isset($hd_line) && ($hd_pos = strpos($hd_line, ':/')) != false) { $disk = trim(substr($hd_line, 0, $hd_pos)); $disk = self::prepend_disk_vendor($disk); if ($disk != 'blkdev') { array_push($disks, $disk); } } } } } else { if (phodevi::is_linux()) { $disks_formatted = array(); $disks = array(); foreach (array_merge(pts_file_io::glob('/sys/block/sd*'), pts_file_io::glob('/sys/block/mmcblk*')) as $sdx) { if (strpos($sdx, 'boot') !== false) { // Don't include devices like /sys/block/mmcblk0boot[0,1] as it's repeat of /sys/block/mmcblk0 continue; } if ((is_file($sdx . '/device/name') || is_file($sdx . '/device/model')) && is_file($sdx . '/size')) { $disk_size = pts_file_io::file_get_contents($sdx . '/size'); $disk_model = pts_file_io::file_get_contents($sdx . (is_file($sdx . '/device/model') ? '/device/model' : '/device/name')); $disk_removable = pts_file_io::file_get_contents($sdx . '/removable'); if ($disk_removable == '1') { // Don't count removable disks continue; } $disk_size = round($disk_size * 512 / 1000000000) . 'GB'; $disk_model = self::prepend_disk_vendor($disk_model); if (strpos($disk_model, $disk_size . ' ') === false && strpos($disk_model, ' ' . $disk_size) === false && $disk_size != '1GB') { $disk_model = $disk_size . ' ' . $disk_model; } if ($disk_size > 0) { array_push($disks_formatted, $disk_model); } } } for ($i = 0; $i < count($disks_formatted); $i++) { if (!empty($disks_formatted[$i])) { $times_found = 1; for ($j = $i + 1; $j < count($disks_formatted); $j++) { if ($disks_formatted[$i] == $disks_formatted[$j]) { $times_found++; $disks_formatted[$j] = ''; } } $disk = ($times_found > 1 ? $times_found . ' x ' : null) . $disks_formatted[$i]; array_push($disks, $disk); } } } } } } if (count($disks) == 0) { $root_disk_size = ceil(disk_total_space('/') / 1073741824); $pts_disk_size = ceil(disk_total_space(pts_client::test_install_root_path()) / 1073741824); if ($pts_disk_size > $root_disk_size) { $root_disk_size = $pts_disk_size; } if ($root_disk_size > 1) { $disks = $root_disk_size . 'GB'; } else { $disks = null; } } else { $disks = implode(' + ', $disks); } return $disks; }