Marius Cramer
2014-04-23 9b3069a1eacd3cbda0bfe565925e80f667f6c96d
server/mods-available/web_module.inc.php
@@ -29,214 +29,226 @@
*/
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',
                           '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');
   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('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');
      $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('php-fpm','web_module','restartPHP_FPM');
      $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);
      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);
      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);
      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);
      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,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'];
            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')) {
            $daemon = 'httpd';
         } else {
            $daemon = 'apache2';
         }
      }
      $retval = array('output' => '', 'retval' => 0);
      if($action == 'restart') {
         exec($app->system->getinitcommand($daemon, 'restart').' 2>&1', $retval['output'], $retval['retval']);
      } else {
         exec($app->system->getinitcommand($daemon, 'reload').' 2>&1', $retval['output'], $retval['retval']);
      }
      return $retval;
   }
   function restartPHP_FPM($action = 'restart') {
      global $app,$conf;
      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';
               }
               unset($tmp);
            }
         }
      }
      $retval = array('output' => '', 'retval' => 0);
      exec($initcommand.' 2>&1', $retval['output'], $retval['retval']);
      return $retval;