diff --git a/lib/Alternc/Diagnostic/Console.php b/lib/Alternc/Diagnostic/Console.php index 2cdb59dc..4aa82664 100644 --- a/lib/Alternc/Diagnostic/Console.php +++ b/lib/Alternc/Diagnostic/Console.php @@ -3,5 +3,20 @@ /** * Console aware class, encapsulates the Console CommandLine class */ -class Alternc_Diagnostic_Console extends Console_CommandLine{} +class Alternc_Diagnostic_Console extends Console_CommandLine{ + + const DESCRIPTION = "Handles diagnostics of an alternc server."; + const VERSION = "0.1"; + + function __construct(array $params = array()) { + $params = array( + 'description' => self::DESCRIPTION, + 'version' => self::VERSION + ); + + parent::__construct($params); + } + + +} diff --git a/lib/Alternc/Diagnostic/Data.php b/lib/Alternc/Diagnostic/Data.php index c416eafb..1ee1e819 100644 --- a/lib/Alternc/Diagnostic/Data.php +++ b/lib/Alternc/Diagnostic/Data.php @@ -27,13 +27,15 @@ class Alternc_Diagnostic_Data { /** + * Sets * - * @param array $options a module name => data + * @param string $sectionname + * @param Alternc_Diagnostic_Data $data * @return boolean */ - function addData( $name, Alternc_Diagnostic_Data $data){ - $this->index[] = $name; - $this->data[$name] = $data; + function addData( $sectionname, Alternc_Diagnostic_Data $data){ + $this->index[] = $sectionname; + $this->data[$sectionname] = $data; return true; } @@ -97,4 +99,20 @@ class Alternc_Diagnostic_Data { return $this->metadata; } + /** + * Retrieves a given section of the data + * + * + * @param string $section_name + * @return boolean + */ + public function getSection( $section_name ){ + + if( !in_array($section_name, $this->index)){ + return FALSE; + } + return $this->data[$section_name]; + + } + } \ No newline at end of file diff --git a/lib/Alternc/Diagnostic/Manager.php b/lib/Alternc/Diagnostic/Manager.php index 16166416..6de15e0c 100644 --- a/lib/Alternc/Diagnostic/Manager.php +++ b/lib/Alternc/Diagnostic/Manager.php @@ -22,6 +22,7 @@ class Alternc_Diagnostic_Manager{ * @throws \Exception */ public function __construct($options) { + // Attempts to retrieve formatInstance if (isset($options["formatInstance"]) && ! is_null($options["formatInstance"])) { $this->formatInstance = $options["formatInstance"]; @@ -35,6 +36,7 @@ class Alternc_Diagnostic_Manager{ } else { throw new \Exception("Missing parameter directoryInstance"); } + } /** diff --git a/lib/Alternc/Diagnostic/Service/Abstract.php b/lib/Alternc/Diagnostic/Service/Abstract.php index 32608e0e..2d5a0562 100644 --- a/lib/Alternc/Diagnostic/Service/Abstract.php +++ b/lib/Alternc/Diagnostic/Service/Abstract.php @@ -8,7 +8,7 @@ abstract class Alternc_Diagnostic_Service_Abstract{ /** @var Alternc_Diagnostic_Data*/ protected $data; - /** @var m_mysql */ + /** @var DB_Sql*/ public $db; /** @var m_mysql */ @@ -92,8 +92,14 @@ abstract class Alternc_Diagnostic_Service_Abstract{ return $output; } - - protected function filterRegexp($pattern,$result){ + /** + * Filters lines of a result to only include the matching lines + * + * @param string $pattern + * @param array $result + * @return type + */ + protected function filterRegexp($result,$pattern){ $returnArray = array(); foreach ($result as $line) { $captures_count = preg_match($pattern, $line, $matches); @@ -128,7 +134,7 @@ abstract class Alternc_Diagnostic_Service_Abstract{ * @param mixed $content * @return boolean */ - function addDataSection( $name, $content){ + function writeSectionData( $name, $content){ $section = new Alternc_Diagnostic_Data(Alternc_Diagnostic_Data::TYPE_SECTION,$content); $this->data->addData($name, $section); diff --git a/lib/Alternc/Diagnostic/Service/Apache2.php b/lib/Alternc/Diagnostic/Service/Apache2.php index 6d428ee8..aebd7fc5 100644 --- a/lib/Alternc/Diagnostic/Service/Apache2.php +++ b/lib/Alternc/Diagnostic/Service/Apache2.php @@ -11,16 +11,131 @@ class Alternc_Diagnostic_Service_Apache2 implements Alternc_Diagnostic_Service_Interface { - public $name = "web"; - const SECTION_APACHE2_VHOSTS = "apache2 vhosts"; - const SECTION_APACHE2_MODULES = "apache2 modules"; + public $name = "apache2"; + const SECTION_VHOSTS = "vhosts"; + const SECTION_MODULES = "modules"; + const SECTION_REDIRECTIONS = "redirections"; + const SECTION_RESPONSES = "responses"; function run(){ - $this->addDataSection (self::SECTION_APACHE2_VHOSTS,$this->filterRegexp("/^[\D]*(\d{2,4}).* (.*) \(\/etc.*$/u", $this->execCmd("apache2ctl -S"))); - $this->addDataSection (self::SECTION_APACHE2_MODULES,$this->filterRegexp("/^[\W]*(\w+).*\(.*$/u", $this->execCmd("apache2ctl -M"))); - $this->addDataSection (self::SECTION_APACHE2_REDIRECTION,$this->mysql->query("SELECT domaine, valeur from sub_domaines where type='url';")); - + // Writes the modules + $this->writeSectionData (self::SECTION_MODULES,$this->filterRegexp ($this->execCmd("apache2ctl -M"), "/^[\W]*(\w+).*\(.*$/u" )); + // Writes the vhosts in the form "port servername" + $this->writeSectionData (self::SECTION_VHOSTS,$this->getVhosts()); + // Writes the redirects + $this->writeSectionData (self::SECTION_REDIRECTIONS, $this->getRedirects()); + // Writes the tests + $this->writeSectionData (self::SECTION_RESPONSES,$this->testServers()); return $this->data; } + function getVhosts(){ + $list = $this->filterRegexp( $this->execCmd("apache2ctl -S"), "/^[\D]*(\d{2,4}).* (.*) \(\/etc.*$/u"); + $returnArray = array(); + foreach( $list as $vhost){ + $returnArray[] = explode(" ",$vhost); + } + return $returnArray; + } + + function getRedirects(){ + $mysqlResource = $this->db->query("SELECT domaine as domain, valeur as url from sub_domaines where type='url';"); + $resultArray = array(); + if ($this->db->num_rows()) { + while(($resultArray[] = mysql_fetch_assoc($mysqlResource)) || array_pop($resultArray)); + } + return $resultArray; + } + + /** + * Reads an array of URL and returns the CURL results + * + * @param array $urlList + * @param array $fieldsList curlInfo array keys + * @param int $sockets_max + * @return array + */ + function curlRequest($urlList,$fieldsList = array("http_code","url"),$sockets_max = 8){ + $returnArray = array(); + + // Attempts to retrive a multi connection curl handle + $multiCurlHandle = curl_multi_init(); + for ($index = 0; $index < $sockets_max; $index++) { + $ch = "ch".$index; + $$ch = curl_init(); + curl_setopt($$ch, CURLOPT_HEADER, 1); + curl_setopt($$ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($$ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($$ch, CURLOPT_TIMEOUT, 3); + curl_setopt($$ch, CURLOPT_NOBODY, 1); + curl_multi_add_handle($multiCurlHandle,$$ch); + } + + $url_count = count($urlList); + $url_pointer = 0; + + while( $url_pointer < $url_count){ + $sockets = $url_count - $url_pointer > $sockets_max ? $sockets_max : $url_count - $url_pointer ; + $loopUrlList = array(); + for ($index2 = 0; $index2 < $sockets; $index2++) { + $ch = "ch".$index2; + $url = $urlList[$url_pointer]; + $loopUrlList[$index2] = $url; + curl_setopt($$ch, CURLOPT_URL, $url); + $url_pointer++; + } + + do { + curl_multi_exec($multiCurlHandle, $running); + curl_multi_select($multiCurlHandle); + } while ($running > 0); + + for ($index3 = 0; $index3 < $sockets; $index3++) { + $ch = "ch".$index3; + $url = $loopUrlList[$index3]; + $curlInfo = curl_getinfo($$ch); + $urlInfo = array(); + foreach ($fieldsList as $field) { + $urlInfo[$field] = $curlInfo[$field]; + } + $returnArray[] = $urlInfo; + } + + } + + //close the handles + curl_multi_close($multiCurlHandle); + for ($index = 0; $index < $sockets_max; $index++) { + $ch = "ch".$index; + curl_close($$ch); + } + + return $returnArray; + + } + + function testServers(){ + + $sockets_max = 8; + $fieldsList = array("http_code","url"); + $vhostUrlList = array(); + + // Retrieves and tests local vhosts + $vhostList = $this->data->getSection(self::SECTION_VHOSTS)->getData(); + foreach( $vhostList as $vhostInfo){ + $protocol = $vhostInfo[0] == 443 ? "https://":"http://"; + $vhostUrlList[] = "{$protocol}{$vhostInfo[1]}"; + } + $vhostResult = $this->curlRequest($vhostUrlList,$fieldsList,$sockets_max); + + // Retrieves and tests local redirs + $redirList = $this->data->getSection(self::SECTION_REDIRECTIONS)->getData(); + foreach( $redirList as $redirInfo){ + $redirUrlList[] = $redirInfo["url"]; + } + $redirResult = $this->curlRequest($redirUrlList,$fieldsList,$sockets_max); + + return array_merge($vhostResult,$redirResult); + + } } \ No newline at end of file diff --git a/lib/Alternc/Diagnostic/Service/System.php b/lib/Alternc/Diagnostic/Service/System.php index 9e2dc82b..685885c9 100644 --- a/lib/Alternc/Diagnostic/Service/System.php +++ b/lib/Alternc/Diagnostic/Service/System.php @@ -11,7 +11,7 @@ class Alternc_Diagnostic_Service_System public $name = "system"; function run(){ - $this->addDataSection("ip list", $this->execCmd("ip a")); + $this->writeSectionData("ip list", $this->execCmd("ip a")); return $this->data; } } \ No newline at end of file diff --git a/src/diagnostic.php b/src/diagnostic.php index f1570036..ac96fcf3 100644 --- a/src/diagnostic.php +++ b/src/diagnostic.php @@ -40,9 +40,14 @@ */ -//include "Console.php"; - - +/** + * Attempts to load a class in multiple path, the PSR-0 or old style way + * + * @staticvar array $srcPathList + * @staticvar boolean $init + * @param string $class_name + * @return boolean + */ function __autoload($class_name) { // Contains (Namespace) => directory @@ -95,11 +100,31 @@ function __autoload($class_name) return true; } } + // Failed to find file return false; } +// ================================================================== +// ================================================================== +// alternc config +// ================================================================== +// ================================================================== + +require_once("/usr/share/alternc/panel/class/config_nochk.php"); + + + +$directoryInstance = new Alternc_Diagnostic_Directory("/tmp/diagnostic"); + + +// instanciation of the diagnosticManager service + +$diagnosticManager = new Alternc_Diagnostic_Manager( array( + "directoryInstance" => $directoryInstance, + "formatInstance" => new Alternc_Diagnostic_Format_Json($directoryInstance) +)); // ================================================================== @@ -108,22 +133,21 @@ function __autoload($class_name) // ================================================================== // ================================================================== -$consoleParser = new Alternc_Diagnostic_Console(array( - 'description' => "Handles diagnostics of an alternc server.", - 'version' => '0.0.1', -)); +$consoleParser = new Alternc_Diagnostic_Console(); $createCommmand = $consoleParser->addCommand('create', array('multiple'=>true,"alias"=>"c","description" => "Creates a new diagnostic")); + $createCommmand->addOption('services', array( 'short_name' => '-s', 'long_name' => '--services', 'action' => 'StoreString', - 'default' => 'apache2,dns,email,system,mailman,mysql,panel,ftp', + 'default' => 'apache2,dns,mail,system,mailman,mysql,panel,ftp', 'description' => 'Sets the services to use for diagnostics separated by comma - ex: -d apache2,dns,email', + ex: -d apache2,dns,mail', 'help_name' => 'services' )); + $createCommmand->addOption('format', array( 'short_name' => '-f', 'long_name' => '--format', @@ -139,16 +163,8 @@ $compareCommmand = $consoleParser->addCommand('show', arr $deleteCommmand = $consoleParser->addCommand('delete', array('multiple'=>false,"alias"=>"d","description" => "Deletes diagnostic files")); -$directoryInstance = new Alternc_Diagnostic_Directory("/tmp/diagnostic"); -$diagnosticManager = new Alternc_Diagnostic_Manager( array( - "directoryInstance" => $directoryInstance, - "formatInstance" => new Alternc_Diagnostic_Format_Json($directoryInstance) -)); - - -//require_once("/usr/share/alternc/panel/class/config_nochk.php"); -require_once("../bureau/class/config_nochk.php"); +// Attempts to parse command line try { $result = $consoleParser->parse(); if ($result->command_name){