public function work() { $t = new Timer('libvirt extension'); if (!extension_loaded('libvirt')) { Errors::add('libvirt extension', 'Libvirt PHP extension not installed'); $this->res = false; return; } if (!$this->connect()) { Errors::add('libvirt extension', 'Failed connecting'); return; } if (!($doms = libvirt_list_domains($this->connection))) { Errors::add('libvirt extension', 'Failed getting domain list'); $this->res = false; return; } foreach ($doms as $name) { if (!($domain = libvirt_domain_lookup_by_name($this->connection, $name))) { continue; } if (!($info = libvirt_domain_get_info($domain)) || !is_array($info)) { continue; } $info['autostart'] = libvirt_domain_get_autostart($domain); if ($info['autostart'] == 1) { $info['autostart'] = 'Yes'; } elseif ($info['autostart'] == 0) { $info['autostart'] = 'No'; } else { $info['autostart'] = 'N/A'; } $info['nets'] = array(); $nets = @libvirt_domain_get_interface_devices($domain); foreach ($nets as $key => $net) { if (!is_numeric($key)) { continue; } $info['nets'][] = $net; } $info['storage'] = array(); foreach ((array) @libvirt_domain_get_disk_devices($domain) as $blockName) { if (!is_string($blockName)) { continue; } // Sometime device exists but libvirt fails to get more docs. just settle for device name if (!($blockInfo = @libvirt_domain_get_block_info($domain, $blockName)) || !is_array($blockInfo)) { $info['storage'][] = array('device' => $blockName); continue; } if (isset($blockInfo['partition']) && !isset($blockInfo['file'])) { $blockInfo['file'] = $blockInfo['partition']; } $info['storage'][] = $blockInfo; } $this->VMs[$name] = $info; } $this->res = true; }
private function _call() { // Time this $t = new Timer('Samba Status extension'); // Deal with calling it try { $result = $this->_CallExt->exec('smbstatus'); } catch (Exception $e) { // messed up somehow Errors::add('Samba Status Extension', $e->getMessage()); $this->_res = false; // Don't bother going any further return false; } // Split it into lines $lines = explode("\n", $result); // Store temp stuff here $connections = array(); $services = array(); $files = array(); $current_location = false; // Parse for ($i = 0, $num = count($lines); $i < $num; ++$i) { // Deal with pointlessness appropriately $lines[$i] = trim($lines[$i]); // Is this pointless? if ($lines[$i] == '' || preg_match('/^\\-+$/', $lines[$i])) { continue; } elseif (preg_match('/^PID\\s+Username\\s+Group\\s+Machine$/', $lines[$i])) { $current_location = 'c'; } elseif ($current_location == 'c' && preg_match('/^(\\d+)\\s+(\\w+)\\s+(\\w+)\\s+(\\S+)\\s+\\(([^)]+)\\)$/', $lines[$i], $connection_match)) { $connections[] = array('pid' => $connection_match[1], 'username' => $connection_match[2], 'group' => $connection_match[3], 'hostname' => $connection_match[4], 'ip' => $connection_match[5]); } elseif (preg_match('/^Service\\s+pid\\s+machine\\s+Connected at$/', $lines[$i])) { $current_location = 's'; } elseif ($current_location == 's' && preg_match('/^(\\w+)\\s+(\\d+)\\s+(\\S+)\\s+([a-zA-z]+ [a-zA-Z]+ \\d+ \\d+:\\d+:\\d+ \\d+)$/', $lines[$i], $service_match)) { $services[] = array('service' => $service_match[1], 'pid' => $service_match[2], 'machine' => $service_match[3], 'date' => strtotime($service_match[4])); } elseif (preg_match('/^Pid\\s+Uid\\s+DenyMode\\s+Access\\s+R\\/W\\s+Oplock\\s+SharePath\\s+Name\\s+Time$/', $lines[$i])) { $current_location = 'f'; } elseif ($current_location == 'f' && preg_match('/^(\\d+)\\s+(\\d+)\\s+(\\S+)\\s+(\\S+)\\s+([A-Z]+)\\s+([A-Z+]+)\\s+(\\S+)\\s+(.+)\\s+([a-zA-Z]+ [a-zA-Z]+ \\d+ \\d+:\\d+:\\d+ \\d+)$/', $lines[$i], $file_match)) { $files[] = array('pid' => $file_match[1], 'uid' => $file_match[2], 'deny_mode' => $file_match[3], 'access' => $file_match[4], 'rw' => $file_match[5], 'oplock' => $file_match[6], 'share' => $file_match[7], 'filename' => $file_match[8], 'date' => strtotime($file_match[9])); } } // Give result $this->_res = array('connections' => $connections, 'services' => $services, 'files' => $files); // Success return true; }
private function _call() { // Time this $t = new Timer('CUPS extension'); // Deal with calling it try { $result = $this->_CallExt->exec('lpstat', '-p -o -l'); } catch (Exception $e) { // messed up somehow Errors::add('CUPS Extension', $e->getMessage()); $this->_res = false; // Don't bother going any further return false; } // Split it into lines $lines = explode("\n", $result); // Hold temporarily values here $printers = array(); $queue = array(); $begin_queue_list = false; // Go through it line by line for ($i = 0, $num = count($lines); $i < $num; ++$i) { // So regexes don't break on endlines $lines[$i] = trim($lines[$i]); // If there are no entries, don't waste time and end here if ($lines[$i] == 'no entries') { break; } elseif (preg_match('/^printer (.+) is idle\\. (.+)$/', $lines[$i], $printers_match) == 1) { $printers[] = array('name' => str_replace('_', ' ', $printers_match[1]), 'status' => $printers_match[2]); } elseif (preg_match('/^(.+)+ is (ready|ready and printing|not ready)$/', $lines[$i], $printers_match) == 1) { $printers[] = array('name' => str_replace('_', ' ', $printers_match[1]), 'status' => $printers_match[2]); } elseif (preg_match('/^Rank\\s+Owner\\s+Job\\s+File\\(s\\)\\s+Total Size$/', $lines[$i])) { $begin_queue_list = true; } elseif ($begin_queue_list && preg_match('/^([a-z0-9]+)\\s+(\\S+)\\s+(\\d+)\\s+(.+)\\s+(\\d+) bytes$/', $lines[$i], $queue_match)) { $queue[] = array('rank' => $queue_match[1], 'owner' => $queue_match[2], 'job' => $queue_match[3], 'files' => $queue_match[4], 'size' => Common::byteConvert($queue_match[5])); } } // Save result lset $this->_res = array('printers' => $printers, 'queue' => $queue); // Apparent success return true; }
public function work() { $info =& $this->linfo->getInfo(); // Make sure this is an array $info['Temps'] = (array) $info['Temps']; // Time this $t = new Timer(self::EXTENSION_NAME . ' Extension'); // Deal with calling it try { $result = $this->_CallExt->exec('ipmitool', ' sdr'); } catch (Exception $e) { // messed up somehow Errors::add(self::EXTENSION_NAME . ' Extension', $e->getMessage()); return; } // Match it up if (!preg_match_all('/^([^|]+)\\| ([\\d\\.]+ (?:Volts|degrees [CF]))\\s+\\| ok$/m', $result, $matches, PREG_SET_ORDER)) { return; } // Go through with it foreach ($matches as $m) { // Separate them by normal spaces $v_parts = explode(' ', trim($m[2])); // Deal with the type of it switch ($v_parts[1]) { case 'Volts': $unit = 'v'; break; case 'degrees': $unit = $v_parts[2]; break; default: $unit = ''; break; } // Save this one $info['Temps'][] = array('path' => 'N/A', 'name' => trim($m[1]), 'temp' => $v_parts[0], 'unit' => $unit); } }
public function getProcessStats() { // Time? if (!empty($this->settings['timer'])) { $t = new Timer('Process Stats'); } // We'll return this after stuffing it with useful info $result = array('exists' => true, 'totals' => array('running' => 0, 'zombie' => 0, 'sleeping' => 0, 'stopped' => 0), 'proc_total' => 0, 'threads' => false); // Use ps try { // Get it $ps = $this->exec->exec('ps', 'ax'); // Match them preg_match_all('/^\\s*\\d+\\s+[\\w?]+\\s+([A-Z])\\S*\\s+.+$/m', $ps, $processes, PREG_SET_ORDER); // Get total $result['proc_total'] = count($processes); // Go through foreach ($processes as $process) { switch ($process[1]) { case 'S': case 'I': $result['totals']['sleeping']++; break; case 'Z': $result['totals']['zombie']++; break; case 'R': case 'D': case 'O': $result['totals']['running']++; break; case 'T': $result['totals']['stopped']++; break; } } } catch (Exception $e) { Errors::add('Linfo Core', 'Error using `ps` to get process info'); } // Give return $result; }
private function _call() { // Time this $t = new Timer('Truecrypt Extension'); // Deal with calling it try { $result = $this->_CallExt->exec('truecrypt', '-l -v'); } catch (Exception $e) { // messed up somehow Errors::add('Truecrypt Extension', $e->getMessage()); $this->_res = false; // Don't bother going any further return false; } // Store them here $this->_res = array(); // Current one $curr = false; // Lines of output $lines = explode("\n", $result); // Go through each line for ($i = 0, $num = count($lines); $i < $num; ++$i) { // Extract juicy info if (!preg_match('/^([^:]+): ([^$]+)$/', $lines[$i], $line_match)) { continue; } // Decide what to do with that switch ($line_match[1]) { // It starts here case 'Slot': if ($curr === false) { $curr = array('slot' => $line_match[2]); } elseif (is_array($curr)) { $this->_res[] = $curr; $curr = false; } break; // Volume. // Volume. case 'Volume': if (is_array($curr)) { $curr['volume'] = $line_match[2]; } break; // Virtual device // Virtual device case 'Virtual Device': if (is_array($curr)) { $curr['virtual_device'] = $line_match[2]; } break; // Where it might be mounted // Where it might be mounted case 'Mount Directory': if (is_array($curr)) { $curr['mount_directory'] = $line_match[2]; } break; // Size of it // Size of it case 'Size': if (is_array($curr)) { $curr['size'] = $line_match[2]; } break; // Is it read only? // Is it read only? case 'Read-Only': if (is_array($curr)) { $curr['read_only'] = $line_match[2]; } break; // We deliberately ignore most keys for security reasons // We deliberately ignore most keys for security reasons default: continue; break; } } // Save a remaining one if (is_array($curr) && count($curr) > 0) { $this->_res[] = $curr; } // Apparent success return true; }
protected function runExtensions() { $this->info['extensions'] = array(); if (!array_key_exists('extensions', $this->settings) || count($this->settings['extensions']) == 0) { return; } // Go through each enabled extension foreach ((array) $this->settings['extensions'] as $ext => $enabled) { // Is it really enabled? if (empty($enabled)) { continue; } // Anti hack if (!preg_match('/^[a-z0-9-_]+$/i', $ext)) { Errors::add('Extension Loader', 'Not going to load "' . $ext . '" extension as only characters allowed in name are letters/numbers/-_'); continue; } // Support older config files with lowercase if (preg_match('/^[a-z]/', $ext)) { $ext = ucfirst($ext); } // Try loading our class.. try { $reflector = new ReflectionClass('\\Linfo\\Extension\\' . $ext); $ext_class = $reflector->newInstance($this); } catch (ReflectionException $e) { Errors::add('Extension Loader', 'Cannot instantiate class for "' . $ext . '" extension: ' . $e->getMessage()); continue; } // Deal with it $ext_class->work(); // Does this edit the $info directly, instead of creating a separate output table type thing? if (!$reflector->hasConstant('LINFO_INTEGRATE')) { // Result $result = $ext_class->result(); // Save result if it's good if ($result != false) { $this->info['extensions'][$ext] = $result; } } } }
/** * @test */ public function add() { Errors::add('testing', 'testing 123'); Errors::add('testing', 'testing 456'); $this->assertCount(2, Errors::show()); }
/** * Deal with it. */ private function _call() { // Time this $t = new Timer('Transmission extension'); // Deal with stats, if possible if ($this->_folder && ($stats_contents = Common::getContents($this->_folder . 'stats.json', false)) && $stats_contents != false) { $stats_vals = @json_decode($stats_contents, true); if (is_array($stats_vals)) { $this->_stats = $stats_vals; } } // Deal with calling it try { // Start up args $args = ''; // Specifc host/port? if (array_key_exists('server', $this->_host) && array_key_exists('port', $this->_host) && is_numeric($this->_host['port'])) { $args .= ' \'' . $this->_host['server'] . '\':' . $this->_host['port']; } // We need some auth? if (array_key_exists('user', $this->_auth) && array_key_exists('pass', $this->_auth)) { $args .= ' --auth=\'' . $this->_auth['user'] . '\':\'' . $this->_auth['pass'] . '\''; } // Rest of it, including result $result = $this->_CallExt->exec('transmission-remote', $args . ' -l'); } catch (Exception $e) { // messed up somehow Errors::add('Transmission extension: ', $e->getMessage()); $this->_res = false; // Don't bother going any further return; } $this->_res = true; // Get first line $first_line = reset(explode("\n", $result, 1)); // Invalid host? if (strpos($first_line, 'Couldn\'t resolve host name') !== false) { Errors::add('Transmission extension: Invalid Host'); $this->_res = false; return; } // Invalid auth? if (strpos($first_line, '401: Unauthorized') !== false) { Errors::add('Transmission extension: Invalid Authentication'); $this->_res = false; return; } // Match teh torrents! if (preg_match_all('/^\\s+(\\d+)\\*?\\s+(\\d+)\\%\\s+(\\d+\\.\\d+ \\w+|None)\\s+((?:\\d+ )?\\w+)\\s+(\\d+\\.\\d+)\\s+(\\d+\\.\\d+)\\s+(\\d+\\.\\d+|None)\\s+(Up & Down|Seeding|Idle|Stopped)\\s+(.+)$/m', $result, $matches, PREG_SET_ORDER) > 0) { // Use this to sort them $sort_done = array(); $sort_ratio = array(); $sort_name = array(); // Save the matches for ($i = 0, $num = count($matches); $i < $num; ++$i) { // Save this one $this->_torrents[$i] = array('id' => $matches[$i][1], 'done' => $matches[$i][2], 'have' => $matches[$i][3], 'eta' => $matches[$i][4], 'up' => $matches[$i][5] * 1024, 'down' => $matches[$i][6] * 1024, 'ratio' => $matches[$i][7], 'state' => $matches[$i][8], 'torrent' => $matches[$i][9]); // Use this for sorting $sort_done[$i] = (int) $matches[$i][2]; $sort_ratio[$i] = (double) $matches[$i][7]; $sort_name[$i] = $matches[$i][9]; } // Sort array_multisort($sort_done, SORT_DESC, $sort_ratio, SORT_DESC, $sort_name, SORT_ASC, $this->_torrents); } }
private function _call() { // Time this $t = new Timer('apcaccess Extension'); // Deal with calling it try { $result = $this->_CallExt->exec('apcaccess'); } catch (Exception $e) { // messed up somehow Errors::add('apcaccess Extension', $e->getMessage()); $this->_res = false; // Don't bother going any further return false; } // Store them here $this->_res = array(); // Get name if (preg_match('/^UPSNAME\\s+:\\s+(.+)$/m', $result, $m)) { $this->_res['name'] = $m[1]; } // Get model if (preg_match('/^MODEL\\s+:\\s+(.+)$/m', $result, $m)) { $this->_res['model'] = $m[1]; } // Get battery voltage if (preg_match('/^BATTV\\s+:\\s+(\\d+\\.\\d+)/m', $result, $m)) { $this->_res['volts'] = $m[1]; } // Get charge percentage, and get it cool if (preg_match('/^BCHARGE\\s+:\\s+(\\d+(?:\\.\\d+)?)/m', $result, $m)) { $charge = (int) $m[1]; $this->_res['charge'] = ' <div class="bar_chart"> <div class="bar_inner" style="width: ' . (int) $charge . '%;"> <div class="bar_text"> ' . ($charge ? $charge . '%' : '?') . ' </div> </div> </div> '; } // Get time remaning if (preg_match('/^TIMELEFT\\s+:\\s+([\\d\\.]+)/m', $result, $m)) { $this->_res['time_left'] = Common::secondsConvert($m[1] * 60); } // Get status if (preg_match('/^STATUS\\s+:\\s+([A-Z]+)/m', $result, $m)) { $this->_res['status'] = $m[1] == 'ONBATT' ? 'On Battery' : ucfirst(strtolower($m[1])); } // Load percentage looking cool if (preg_match('/^LOADPCT\\s+:\\s+(\\d+\\.\\d+)/m', $result, $m)) { $load = (int) $m[1]; $this->_res['load'] = ' <div class="bar_chart"> <div class="bar_inner" style="width: ' . (int) $load . '%;"> <div class="bar_text"> ' . ($load ? $load . '%' : '?') . ' </div> </div> </div> '; } // Attempt getting wattage if (isset($load) && preg_match('/^NOMPOWER\\s+:\\s+(\\d+)/m', $result, $m)) { $watts = (int) $m['1']; $this->_res['watts_used'] = $load * round($watts / 100); } else { $this->_res['watts_used'] = false; } // Apparent success return true; }
public function getNet() { $nets = array(); // ifconfig for nics/statuses try { $ifconfig = $this->exec->exec('ifconfig', '-a'); } catch (Exception $e) { Errors::add('Solaris Core', 'Failed running ifconfig -a.'); return array(); } foreach (explode("\n", $ifconfig) as $line) { if (!preg_match('/^([^:]+):[^<]+<([^>]+)>/', trim($line), $m)) { continue; } $nic = $m[1]; $flags = explode(',', strtolower($m[2])); if (isset($nets[$nic])) { continue; } $type = null; if (in_array('loopback', $flags)) { $type = 'Loopback'; } $nets[$nic] = array('recieved' => array('bytes' => null, 'packets' => null, 'errors' => null), 'sent' => array('bytes' => null, 'bytes' => null, 'errors' => null), 'state' => in_array('up', $flags) ? 'up' : 'Unknown', 'type' => $type); } // kstat for more stats foreach (explode("\n", $this->kstat['link:0:']) as $line) { if (!preg_match('/^([^:]+):(\\S+)\\s+(\\S+)/', trim($line), $m)) { continue; } list(, $nic, $key, $value) = $m; if (!isset($nets[$nic])) { continue; } $cur_nic =& $nets[$nic]; switch ($key) { case 'ipackets64': $cur_nic['recieved']['packets'] = $value; break; case 'opackets64': $cur_nic['sent']['packets'] = $value; break; case 'rbytes64': $cur_nic['recieved']['bytes'] = $value; break; case 'obytes64': $cur_nic['sent']['bytes'] = $value; break; } } // dladm for more stats... try { $dladm = $this->exec->exec('dladm', 'show-link'); foreach (explode("\n", $dladm) as $line) { if (!preg_match('/^(\\S+)\\s+(\\S+)\\s+\\d+\\s+(\\S+)/', $line, $m)) { continue; } if (!isset($nets[$m[1]])) { continue; } if (!$nets[$m[1]]['type'] && $m[2] == 'phys') { $nets[$m[1]]['type'] = 'Physical'; } if (!$nets[$m[1]]['state'] || $nets[$m[1]]['state'] == 'unknown') { $nets[$m[1]]['state'] = $m[3]; } } } catch (Exception $e) { Errors::add('Solaris Core', 'Failed running dladm show-link.'); return array(); } return $nets; }
/** * Deal with it. */ private function _call() { // Time this $t = new Timer('dhcpd3 leases extension'); // We couldn't find leases file? if ($this->_leases_file === false) { Errors::add('dhcpd3 leases extension', 'couldn\'t find leases file'); $this->_res = false; return; } // Get contents $contents = Common::getContents($this->_leases_file, false); // Couldn't? if ($contents === false) { Errors::add('dhcpd3 leases extension', 'Error getting contents of leases file'); $this->_res = false; return; } // All dates in the file are in UTC format. Attempt finding out local time zone to convert UTC to local. // This prevents confusing the hell out of people. $do_date_conversion = false; $local_timezone = false; // Make sure we have what we need. Stuff this requires doesn't exist on certain php installations if (function_exists('date_default_timezone_get') && class_exists('DateTime') && class_exists('DateTimeZone')) { // I only want this called once, hence value stored here. It also might fail $local_timezone = @date_default_timezone_get(); // Make sure it didn't fail if ($local_timezone !== false && is_string($local_timezone)) { $do_date_conversion = true; } // Say we'll allow conversion later on } // Get it into lines $lines = explode("\n", $contents); // Store temp entries here $curr = false; // Parse each line, while ignoring certain useless'ish values // I'd do a single preg_match_all() using multiline regex, but the values in each lease block are inconsistent. :-/ for ($i = 0, $num_lines = count($lines); $i < $num_lines; ++$i) { // Kill padding whitespace $lines[$i] = trim($lines[$i]); // Last line in entry if ($lines[$i] == '}') { // Have we a current entry to save? if (is_array($curr)) { $this->_leases[] = $curr; } // Make it empty for next time $curr = false; } elseif (preg_match('/^lease (\\d+\\.\\d+\\.\\d+\\.\\d+) \\{$/', $lines[$i], $m)) { $curr = array('ip' => $m[1]); } elseif ($curr && preg_match('/^starts \\d+ (\\d+\\/\\d+\\/\\d+ \\d+:\\d+:\\d+);$/', $lines[$i], $m)) { // Get it in unix time stamp for prettier formatting later and easier tz offset conversion $curr['lease_start'] = strtotime($m[1]); // Handle offset conversion if ($do_date_conversion) { // This handy class helps out with timezone offsets. Pass it original date, not unix timestamp $d = new DateTime($m[1], new DateTimeZone($local_timezone)); $offset = $d->getOffset(); // If ofset looks good, deal with it if (is_numeric($offset) && $offset != 0) { $curr['lease_start'] += $offset; } } } elseif ($curr && preg_match('/^ends \\d+ (\\d+\\/\\d+\\/\\d+ \\d+:\\d+:\\d+);$/', $lines[$i], $m)) { // Get it in unix time stamp for prettier formatting later and easier tz offset conversion $curr['lease_end'] = strtotime($m[1]); // Handle offset conversion if ($do_date_conversion) { // This handy class helps out with timezone offsets. Pass it original date, not unix timestamp $d = new DateTime($m[1], new DateTimeZone($local_timezone)); $offset = $d->getOffset(); // If ofset looks good, deal with it if (is_numeric($offset) && $offset != 0) { $curr['lease_end'] += $offset; } } // Is this old? // The file seems to contain all leases since the dhcpd server was started for the first time if (time() > $curr['lease_end']) { // Kill current entry and ignore any following parts of this lease $curr = false; // Jump out right now continue; } } elseif (!$this->_hide_mac && $curr && preg_match('/^hardware ethernet (\\w+:\\w+:\\w+:\\w+:\\w+:\\w+);$/', $lines[$i], $m)) { $curr['mac'] = $m[1]; } elseif ($curr && preg_match('/^client\\-hostname "([^"]+)";$/', $lines[$i], $m)) { $curr['hostname'] = $m[1]; } } }
/** * getSoundCards. * * @return array of soundcards */ public function getSoundCards() { // Time? if (!empty($this->settings['timer'])) { $t = new Timer('Sound cards'); } // This should be it $file = '/proc/asound/cards'; // eh? if (!is_file($file)) { Errors::add('Linux sound card detector', '/proc/asound/cards does not exist'); } // Get contents and parse $contents = Common::getContents($file); // Parse if (preg_match_all('/^\\s*(\\d+)\\s\\[[\\s\\w]+\\]:\\s(.+)$/m', $contents, $matches, PREG_SET_ORDER) == 0) { return array(); } // eh? $cards = array(); // Deal with results foreach ($matches as $card) { $cards[] = array('number' => $card[1], 'card' => $card[2]); } // Give cards return $cards; }
private function _fetchPciIdsPciConf() { try { $pciconf = $this->exec->exec('pciconf', '-l'); } catch (Exception $e) { Errors::add('Linfo Core', 'Error using `pciconf -l` to get hardware info'); return; } if (preg_match_all('/^.+chip=0x([a-z0-9]{4})([a-z0-9]{4})/m', $pciconf, $devs, PREG_SET_ORDER) == 0) { return; } foreach ($devs as $dev) { $this->_pci_entries[$dev[2]][$dev[1]] = 1; } }
public function getHD() { // Time? if (!empty($this->settings['timer'])) { $t = new Timer('Drives'); } // Use system profiler to get info try { $res = $this->exec->exec('diskutil', ' list'); } catch (Exception $e) { Errors::add('Linfo drives', 'Error using `diskutil list` to get drives'); return array(); } // Get it into lines $lines = explode("\n", $res); // Keep drives here $drives = array(); // Work on tmp drive here $tmp = false; for ($i = 0, $num_lines = count($lines); $i < $num_lines; ++$i) { // A drive or partition entry if (preg_match('/^\\s+(\\d+):\\s+([a-zA-Z0-9\\_]+)\\s+([\\s\\w]*) \\*?(\\d+(?:\\.\\d+)? [A-Z])B\\s+([a-z0-9]+)/', $lines[$i], $m)) { // Get size sorted out $size_parts = explode(' ', $m[4]); switch ($size_parts[1]) { case 'K': $size = $size_parts[0] * 1000; break; case 'M': $size = $size_parts[0] * 1000000; break; case 'G': $size = $size_parts[0] * 1000000000; break; case 'T': $size = $size_parts[0] * 1000000000000; break; case 'P': $size = $size_parts[0] * 1000000000000000; break; default: $size = false; break; } // A drive? if ($m[1] == 0) { // Finish prior drive if (is_array($tmp)) { $drives[] = $tmp; } // Try getting the name $drive_name = false; // I'm pessimistic try { $drive_res = $this->exec->exec('diskutil', ' info /dev/' . $m[5]); if (preg_match('/^\\s+Device \\/ Media Name:\\s+(.+)/m', $drive_res, $drive_m)) { $drive_name = $drive_m[1]; } } catch (Exception $e) { } // Start this one off $tmp = array('name' => $drive_name, 'vendor' => 'Unknown', 'device' => '/dev/' . $m[5], 'reads' => false, 'writes' => false, 'size' => $size, 'partitions' => array()); } elseif ($m[1] > 0) { // Save it $tmp['partitions'][] = array('size' => $size, 'name' => '/dev/' . $m[5]); } } } // Save a drive if (is_array($tmp)) { $drives[] = $tmp; } // Give return $drives; }
public function work() { $t = new Timer('utorrent extension'); $this->res = false; if (!extension_loaded('curl')) { Errors::add('utorrent extension', 'Curl PHP extension not installed'); return; } if (!isset($this->connectionSettings['host']) || !isset($this->connectionSettings['port']) || !isset($this->connectionSettings['user'])) { Errors::add('utorrent extension', 'Missing $setting[\'utorrent_connection\'] details in config..'); return; } $token_url = sprintf(self::TOKEN_URL, $this->connectionSettings['host'], $this->connectionSettings['port']); // Start up our curl session to be used for both requests. It is going to store the cookies utorrent // uses $curl = curl_init(); // For curl to actually process cokies we need to give it a filename. This should be filed as a // bug to curl, especially since something like /dev/null works $this->cookiefile = tempnam('/tmp', 'linfo_utorrent'); curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => true, CURLOPT_USERPWD => $this->connectionSettings['user'] . ':', CURLOPT_COOKIEJAR => $this->cookiefile ?: '/dev/null')); // Get token curl_setopt($curl, CURLOPT_URL, $token_url); $result = curl_exec($curl); if (preg_match('/\\>([^<]+)\\</', $result, $m)) { $token = $m[1]; } else { Errors::add('utorrent extension', 'Failed parsing token'); $this->cleanup(); return; } // Get list of torrents? Do our best to forge this (ajax) request curl_setopt_array($curl, array(CURLOPT_HTTPHEADER => array('X-Requested-With: XMLHttpRequest', 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:28.0) Gecko/20100101 Firefox/28.0', 'Host: ' . $this->connectionSettings['host'] . ($this->connectionSettings['port'] != 80 ? ':' . $this->connectionSettings['port'] : ''), 'Referer: http://' . $this->connectionSettings['host'] . ($this->connectionSettings['port'] != 80 ? ':' . $this->connectionSettings['port'] : '') . '/gui/web/index.html'))); $list_url = sprintf(self::LIST_URL, $this->connectionSettings['host'], $this->connectionSettings['port'], $token, '1'); curl_setopt($curl, CURLOPT_URL, $list_url); $result = curl_exec($curl); if (!($response = @json_decode($result, true))) { Errors::add('utorrent extension', 'Failed parsing json object'); $this->cleanup(); return; } // Not going to be needing curl again curl_close($curl); if (!isset($response['torrents']) || !is_array($response['torrents'])) { Errors::add('utorrent extension', 'torrents array key not found in json response object'); $this->cleanup(); return; } $torrent_names = array(); $torrent_states = array(); foreach ($response['torrents'] as $torrent_src) { $torrent = array(); foreach (self::$torrent_keys as $key => $index) { $torrent[$key] = $torrent_src[$index]; } foreach ($this->regexFilters as $regex) { if (preg_match($regex, $torrent['TORRENT_NAME'])) { continue 2; } } $this->torrents[] = $torrent; $torrent_names[] = $torrent['TORRENT_NAME']; $torrent_states[] = $torrent['TORRENT_STATUS_MESSAGE']; $this->stats['downloaded'] += $torrent['TORRENT_DOWNLOADED']; $this->stats['uploaded'] += $torrent['TORRENT_UPLOADED']; } // Sort by state and then name ascending (show downloading/etc first) array_multisort($torrent_states, SORT_ASC, $torrent_names, SORT_ASC, $this->torrents); $this->res = true; $this->cleanup(); }