Exemple #1
0
 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;
 }
Exemple #2
0
 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;
 }
Exemple #3
0
 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;
 }
Exemple #4
0
 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);
     }
 }
Exemple #5
0
 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;
 }
Exemple #6
0
 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;
 }
Exemple #7
0
 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;
             }
         }
     }
 }
Exemple #8
0
 /**
  * @test
  */
 public function add()
 {
     Errors::add('testing', 'testing 123');
     Errors::add('testing', 'testing 456');
     $this->assertCount(2, Errors::show());
 }
Exemple #9
0
 /**
  * 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);
     }
 }
Exemple #10
0
    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;
    }
Exemple #11
0
 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;
 }
Exemple #12
0
 /**
  * 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];
         }
     }
 }
Exemple #13
0
 /**
  * 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;
 }
Exemple #14
0
 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;
     }
 }
Exemple #15
0
 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;
 }
Exemple #16
0
 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();
 }