From e1ceb050e19c7574bca146a8da7047ee4ff456b5 Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Sun, 10 Jul 2016 05:02:35 -0400
Subject: [PATCH] Merge branch 'stable-3.1'
---
server/mods-available/web_module.inc.php | 304 +++++++++++++++++++++++++++++++++++---------------
1 files changed, 213 insertions(+), 91 deletions(-)
diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php
index 659cbca..6d3e8c1 100644
--- a/server/mods-available/web_module.inc.php
+++ b/server/mods-available/web_module.inc.php
@@ -29,152 +29,274 @@
*/
class web_module {
-
+
var $module_name = 'web_module';
var $class_name = 'web_module';
- var $actions_available = array( 'web_domain_insert',
- 'web_domain_update',
- 'web_domain_delete',
- 'ftp_user_insert',
- 'ftp_user_update',
- 'ftp_user_delete',
- 'shell_user_insert',
- 'shell_user_update',
- 'shell_user_delete',
- 'webdav_user_insert',
- 'webdav_user_update',
- 'webdav_user_delete',
- 'web_folder_insert',
- 'web_folder_update',
- 'web_folder_delete',
- 'web_folder_user_insert',
- 'web_folder_user_update',
- 'web_folder_user_delete');
-
+ var $actions_available = array( 'web_domain_insert',
+ 'web_domain_update',
+ 'web_domain_delete',
+ 'ftp_user_insert',
+ 'ftp_user_update',
+ 'ftp_user_delete',
+ 'shell_user_insert',
+ 'shell_user_update',
+ 'shell_user_delete',
+ 'webdav_user_insert',
+ 'webdav_user_update',
+ 'webdav_user_delete',
+ 'web_folder_insert',
+ 'web_folder_update',
+ 'web_folder_delete',
+ 'web_folder_user_insert',
+ 'web_folder_user_update',
+ 'web_folder_user_delete',
+ 'web_backup_insert',
+ 'web_backup_update',
+ 'web_backup_delete',
+ 'aps_instance_insert',
+ 'aps_instance_update',
+ 'aps_instance_delete',
+ 'aps_instance_setting_insert',
+ 'aps_instance_setting_update',
+ 'aps_instance_setting_delete',
+ 'aps_package_insert',
+ 'aps_package_update',
+ 'aps_package_delete',
+ 'aps_setting_insert',
+ 'aps_setting_update',
+ 'aps_setting_delete');
+
//* This function is called during ispconfig installation to determine
// if a symlink shall be created for this plugin.
function onInstall() {
global $conf;
-
+
if($conf['services']['web'] == true) {
return true;
} else {
return false;
}
-
+
}
-
+
/*
This function is called when the module is loaded
*/
-
+
function onLoad() {
global $app;
-
+
/*
- Annonce the actions that where provided by this module, so plugins
+ Annonce the actions that where provided by this module, so plugins
can register on them.
*/
-
- $app->plugins->announceEvents($this->module_name,$this->actions_available);
-
+
+ $app->plugins->announceEvents($this->module_name, $this->actions_available);
+
/*
As we want to get notified of any changes on several database tables,
we register for them.
-
+
The following function registers the function "functionname"
- to be executed when a record for the table "dbtable" is
+ to be executed when a record for the table "dbtable" is
processed in the sys_datalog. "classname" is the name of the
class that contains the function functionname.
*/
-
- $app->modules->registerTableHook('web_domain','web_module','process');
- $app->modules->registerTableHook('ftp_user','web_module','process');
- $app->modules->registerTableHook('shell_user','web_module','process');
- $app->modules->registerTableHook('webdav_user','web_module','process');
-
+
+ $app->modules->registerTableHook('web_domain', 'web_module', 'process');
+ $app->modules->registerTableHook('ftp_user', 'web_module', 'process');
+ $app->modules->registerTableHook('shell_user', 'web_module', 'process');
+ $app->modules->registerTableHook('webdav_user', 'web_module', 'process');
+ $app->modules->registerTableHook('web_folder', 'web_module', 'process');
+ $app->modules->registerTableHook('web_folder_user', 'web_module', 'process');
+ $app->modules->registerTableHook('web_backup', 'web_module', 'process');
+ $app->modules->registerTableHook('aps_instances', 'web_module', 'process');
+ $app->modules->registerTableHook('aps_instances_settings', 'web_module', 'process');
+ $app->modules->registerTableHook('aps_packages', 'web_module', 'process');
+ $app->modules->registerTableHook('aps_settings', 'web_module', 'process');
+
// Register service
- $app->services->registerService('httpd','web_module','restartHttpd');
-
+ $app->services->registerService('httpd', 'web_module', 'restartHttpd');
+ $app->services->registerService('php-fpm', 'web_module', 'restartPHP_FPM');
+
}
-
+
/*
This function is called when a change in one of the registered tables is detected.
The function then raises the events for the plugins.
*/
- function process($tablename,$action,$data) {
+ function process($tablename, $action, $data) {
global $app;
-
+
switch ($tablename) {
- case 'web_domain':
- if($action == 'i') $app->plugins->raiseEvent('web_domain_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('web_domain_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('web_domain_delete',$data);
+ case 'web_domain':
+ if($action == 'i') $app->plugins->raiseEvent('web_domain_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('web_domain_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('web_domain_delete', $data);
break;
- case 'ftp_user':
- if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('ftp_user_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete',$data);
+ case 'ftp_user':
+ if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('ftp_user_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete', $data);
break;
- case 'shell_user':
- if($action == 'i') $app->plugins->raiseEvent('shell_user_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('shell_user_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('shell_user_delete',$data);
+ case 'shell_user':
+ if($action == 'i') $app->plugins->raiseEvent('shell_user_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('shell_user_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('shell_user_delete', $data);
break;
- case 'webdav_user':
- if($action == 'i') $app->plugins->raiseEvent('webdav_user_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('webdav_user_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('webdav_user_delete',$data);
+ case 'webdav_user':
+ if($action == 'i') $app->plugins->raiseEvent('webdav_user_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('webdav_user_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('webdav_user_delete', $data);
break;
- case 'web_folder':
- if($action == 'i') $app->plugins->raiseEvent('web_folder_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('web_folder_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('web_folder_delete',$data);
+ case 'web_folder':
+ if($action == 'i') $app->plugins->raiseEvent('web_folder_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('web_folder_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('web_folder_delete', $data);
break;
- case 'web_folder_user':
- if($action == 'i') $app->plugins->raiseEvent('web_folder_user_insert',$data);
- if($action == 'u') $app->plugins->raiseEvent('web_folder_user_update',$data);
- if($action == 'd') $app->plugins->raiseEvent('web_folder_user_delete',$data);
+ case 'web_folder_user':
+ if($action == 'i') $app->plugins->raiseEvent('web_folder_user_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('web_folder_user_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('web_folder_user_delete', $data);
+ break;
+ case 'web_backup':
+ if($action == 'i') $app->plugins->raiseEvent('web_backup_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('web_backup_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('web_backup_delete', $data);
+ break;
+ case 'aps_instances':
+ if($action == 'i') $app->plugins->raiseEvent('aps_instance_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('aps_instance_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('aps_instance_delete', $data);
+ break;
+ case 'aps_instances_settings':
+ if($action == 'i') $app->plugins->raiseEvent('aps_instance_setting_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('aps_instance_setting_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('aps_instance_setting_delete', $data);
+ break;
+ case 'aps_packages':
+ if($action == 'i') $app->plugins->raiseEvent('aps_package_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('aps_package_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('aps_package_delete', $data);
+ break;
+ case 'aps_settings':
+ if($action == 'i') $app->plugins->raiseEvent('aps_setting_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('aps_setting_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('aps_setting_delete', $data);
break;
} // end switch
} // end function
-
-
+
+
// This function is used
function restartHttpd($action = 'restart') {
- global $app,$conf;
-
+ global $app, $conf;
+
// load the server configuration options
- $app->uses('getconf');
+ $app->uses('getconf,system');
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
-
+
$daemon = '';
switch ($web_config['server_type']) {
- case 'nginx':
- $daemon = $web_config['server_type'];
- // Reload PHP-FPM as well
- $restart_second_service['daemon'] = $web_config['php_fpm_init_script'];
- $restart_second_service['action'] = 'reload';
- break;
- default:
- if(is_file($conf['init_scripts'] . '/' . 'httpd')) {
- $daemon = 'httpd';
- } else {
- $daemon = 'apache2';
- }
+ case 'nginx':
+ $daemon = $web_config['server_type'];
+ break;
+ default:
+ if(is_file($conf['init_scripts'] . '/' . 'httpd') || is_dir('/etc/httpd')) {
+ $daemon = 'httpd';
+ } else {
+ $daemon = 'apache2';
+ }
}
-
- if($restart_second_service['daemon'] != '' && $restart_second_service['action'] != ''){
- exec($conf['init_scripts'] . '/' . $restart_second_service['daemon'] . ' ' . $restart_second_service['action']);
- }
-
+
+ $retval = array('output' => '', 'retval' => 0);
if($action == 'restart') {
- exec($conf['init_scripts'] . '/' . $daemon . ' restart');
+ $cmd = $app->system->getinitcommand($daemon, 'restart');
} else {
- exec($conf['init_scripts'] . '/' . $daemon . ' reload');
+ $cmd = $app->system->getinitcommand($daemon, 'reload');
}
+ if($web_config['server_type'] == 'nginx'){
+ $app->log("Checking nginx configuration...", LOGLEVEL_DEBUG);
+ exec('nginx -t 2>&1', $retval['output'], $retval['retval']);
+ if($retval['retval'] == 0){
+ $app->log("nginx configuration ok!", LOGLEVEL_DEBUG);
+ } else {
+ $app->log("nginx config test failed!", LOGLEVEL_DEBUG);
+ return $retval;
+ }
+ }
+
+ exec($cmd.' 2>&1', $retval['output'], $retval['retval']);
+
+ // if restart failed despite successful syntax check => try again
+ if($web_config['server_type'] == 'nginx' && $retval['retval'] > 0){
+ sleep(2);
+ exec($cmd.' 2>&1', $retval['output'], $retval['retval']);
+ }
+ $app->log("Restarting httpd: $cmd", LOGLEVEL_DEBUG);
+
+ // nginx: do a syntax check because on some distributions, the init script always returns 0 - even if the syntax is not ok (how stupid is that?)
+ //if($web_config['server_type'] == 'nginx' && $retval['retval'] == 0){
+ //exec('nginx -t 2>&1', $retval['output'], $retval['retval']);
+ //}
+ return $retval;
+ }
+
+ function restartPHP_FPM($action = 'restart') {
+ global $app, $conf;
+
+ // load the server configuration options
+ $app->uses('getconf,system');
+ $web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+
+ list($action, $init_script) = explode(':', $action);
+
+ if(!$init_script){
+ //$init_script = $conf['init_scripts'].'/'.$web_config['php_fpm_init_script'];
+ $initcommand = $app->system->getinitcommand($web_config['php_fpm_init_script'], $action);
+ } else {
+ $path_parts = pathinfo($init_script);
+ $initcommand = $app->system->getinitcommand($path_parts['basename'], $action, $path_parts['dirname']);
+
+ if($action == 'reload' && $init_script == $conf['init_scripts'].'/'.$web_config['php_fpm_init_script']) {
+ // we have to do a workaround because of buggy ubuntu fpm reload handling
+ // @see: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1242376
+ if(file_exists('/etc/os-release')) {
+ $tmp = file_get_contents('/etc/os-release');
+ //if(preg_match('/^ID=ubuntu/m', $tmp) && preg_match('/^VERSION_ID="14\.04"/m', $tmp)) {
+ if(preg_match('/^ID=ubuntu/m', $tmp) && preg_match('/^VERSION_ID="14\.04"/m', $tmp) && stristr(phpversion(), 'deb.sury.org') === false) {
+ $initcommand = '/sbin/start-stop-daemon --stop --signal USR2 --quiet --pidfile /var/run/php5-fpm.pid --name php5-fpm';
+ }
+ // And the next workaround, php-fpm reloads in centos 7 downt work as well.
+ /*
+ if(preg_match('/^ID=centos/m', $tmp) && preg_match('/^VERSION_ID="7"/m', $tmp)) {
+ $initcommand = 'systemctl restart php-fpm.service';
+ }
+ */
+ unset($tmp);
+ }
+ }
+ /*
+ if($action == 'reload') {
+ // And the next workaround, php-fpm reloads in centos 7 downt work as well.
+ if(file_exists('/etc/os-release')) {
+ $tmp = file_get_contents('/etc/os-release');
+ // And the next workaround, php-fpm reloads in centos 7 downt work as well.
+ if(preg_match('/^ID="centos"/m', $tmp) && preg_match('/^VERSION_ID="7"/m', $tmp)) {
+ $initcommand = 'systemctl restart php-fpm.service';
+ }
+ unset($tmp);
+ }
+ }
+ */
+ }
+
+ $retval = array('output' => '', 'retval' => 0);
+ exec($initcommand.' 2>&1', $retval['output'], $retval['retval']);
+ $app->log("Restarting php-fpm: $initcommand", LOGLEVEL_DEBUG);
+ return $retval;
}
} // end class
--
Gitblit v1.9.1