[enh] diagnostic apache2 working
This commit is contained in:
parent
581162d28f
commit
7c1ce762c1
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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){
|
||||||
|
|
Loading…
Reference in New Issue