From a7796bec1be01b51f400e9a3a698535b12b636aa Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Thu, 11 Feb 2016 13:44:27 -0500
Subject: [PATCH] Merge branch 'stable-3.1'

---
 server/mods-available/web_module.inc.php |  309 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 208 insertions(+), 101 deletions(-)

diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php
index 086b601..36e1391 100644
--- a/server/mods-available/web_module.inc.php
+++ b/server/mods-available/web_module.inc.php
@@ -29,163 +29,270 @@
 */
 
 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',
-									'web_backup_insert',
-									'web_backup_update',
-									'web_backup_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_folder','web_module','process');
-		$app->modules->registerTableHook('web_folder_user','web_module','process');
-		$app->modules->registerTableHook('web_backup','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);
+		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)) {
+						$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