[enh] diagnostic apache2 working

This commit is contained in:
alban 2014-06-30 00:38:24 +02:00
parent 581162d28f
commit 7c1ce762c1
7 changed files with 207 additions and 35 deletions

View File

@ -3,5 +3,20 @@
/** /**
* Console aware class, encapsulates the Console CommandLine class * 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);
}
}

View File

@ -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 * @return boolean
*/ */
function addData( $name, Alternc_Diagnostic_Data $data){ function addData( $sectionname, Alternc_Diagnostic_Data $data){
$this->index[] = $name; $this->index[] = $sectionname;
$this->data[$name] = $data; $this->data[$sectionname] = $data;
return true; return true;
} }
@ -97,4 +99,20 @@ class Alternc_Diagnostic_Data {
return $this->metadata; 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];
}
} }

View File

@ -22,6 +22,7 @@ class Alternc_Diagnostic_Manager{
* @throws \Exception * @throws \Exception
*/ */
public function __construct($options) { public function __construct($options) {
// Attempts to retrieve formatInstance // Attempts to retrieve formatInstance
if (isset($options["formatInstance"]) && ! is_null($options["formatInstance"])) { if (isset($options["formatInstance"]) && ! is_null($options["formatInstance"])) {
$this->formatInstance = $options["formatInstance"]; $this->formatInstance = $options["formatInstance"];
@ -35,6 +36,7 @@ class Alternc_Diagnostic_Manager{
} else { } else {
throw new \Exception("Missing parameter directoryInstance"); throw new \Exception("Missing parameter directoryInstance");
} }
} }
/** /**

View File

@ -8,7 +8,7 @@ abstract class Alternc_Diagnostic_Service_Abstract{
/** @var Alternc_Diagnostic_Data*/ /** @var Alternc_Diagnostic_Data*/
protected $data; protected $data;
/** @var m_mysql */ /** @var DB_Sql*/
public $db; public $db;
/** @var m_mysql */ /** @var m_mysql */
@ -92,8 +92,14 @@ abstract class Alternc_Diagnostic_Service_Abstract{
return $output; 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(); $returnArray = array();
foreach ($result as $line) { foreach ($result as $line) {
$captures_count = preg_match($pattern, $line, $matches); $captures_count = preg_match($pattern, $line, $matches);
@ -128,7 +134,7 @@ abstract class Alternc_Diagnostic_Service_Abstract{
* @param mixed $content * @param mixed $content
* @return boolean * @return boolean
*/ */
function addDataSection( $name, $content){ function writeSectionData( $name, $content){
$section = new Alternc_Diagnostic_Data(Alternc_Diagnostic_Data::TYPE_SECTION,$content); $section = new Alternc_Diagnostic_Data(Alternc_Diagnostic_Data::TYPE_SECTION,$content);
$this->data->addData($name, $section); $this->data->addData($name, $section);

View File

@ -11,16 +11,131 @@ class Alternc_Diagnostic_Service_Apache2
implements Alternc_Diagnostic_Service_Interface implements Alternc_Diagnostic_Service_Interface
{ {
public $name = "web"; public $name = "apache2";
const SECTION_APACHE2_VHOSTS = "apache2 vhosts"; const SECTION_VHOSTS = "vhosts";
const SECTION_APACHE2_MODULES = "apache2 modules"; const SECTION_MODULES = "modules";
const SECTION_REDIRECTIONS = "redirections";
const SECTION_RESPONSES = "responses";
function run(){ function run(){
$this->addDataSection (self::SECTION_APACHE2_VHOSTS,$this->filterRegexp("/^[\D]*(\d{2,4}).* (.*) \(\/etc.*$/u", $this->execCmd("apache2ctl -S"))); // Writes the modules
$this->addDataSection (self::SECTION_APACHE2_MODULES,$this->filterRegexp("/^[\W]*(\w+).*\(.*$/u", $this->execCmd("apache2ctl -M"))); $this->writeSectionData (self::SECTION_MODULES,$this->filterRegexp ($this->execCmd("apache2ctl -M"), "/^[\W]*(\w+).*\(.*$/u" ));
$this->addDataSection (self::SECTION_APACHE2_REDIRECTION,$this->mysql->query("SELECT domaine, valeur from sub_domaines where type='url';")); // 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; 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);
}
} }

View File

@ -11,7 +11,7 @@ class Alternc_Diagnostic_Service_System
public $name = "system"; public $name = "system";
function run(){ function run(){
$this->addDataSection("ip list", $this->execCmd("ip a")); $this->writeSectionData("ip list", $this->execCmd("ip a"));
return $this->data; return $this->data;
} }
} }

View File

@ -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) function __autoload($class_name)
{ {
// Contains (Namespace) => directory // Contains (Namespace) => directory
@ -95,11 +100,31 @@ function __autoload($class_name)
return true; return true;
} }
} }
// Failed to find file // Failed to find file
return false; 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( $consoleParser = new Alternc_Diagnostic_Console();
'description' => "Handles diagnostics of an alternc server.",
'version' => '0.0.1',
));
$createCommmand = $consoleParser->addCommand('create', array('multiple'=>true,"alias"=>"c","description" => "Creates a new diagnostic")); $createCommmand = $consoleParser->addCommand('create', array('multiple'=>true,"alias"=>"c","description" => "Creates a new diagnostic"));
$createCommmand->addOption('services', array( $createCommmand->addOption('services', array(
'short_name' => '-s', 'short_name' => '-s',
'long_name' => '--services', 'long_name' => '--services',
'action' => 'StoreString', '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 'description' => 'Sets the services to use for diagnostics separated by comma
ex: -d apache2,dns,email', ex: -d apache2,dns,mail',
'help_name' => 'services' 'help_name' => 'services'
)); ));
$createCommmand->addOption('format', array( $createCommmand->addOption('format', array(
'short_name' => '-f', 'short_name' => '-f',
'long_name' => '--format', '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")); $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 { try {
$result = $consoleParser->parse(); $result = $consoleParser->parse();
if ($result->command_name){ if ($result->command_name){