From 84b8c17c925953d968d89787d10b05f9b54fbf22 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Thu, 07 Jun 2012 10:54:34 -0400
Subject: [PATCH] Implemented: FS#2061 - App installer Implemented: FS#560 - Add support for APS (Application Packaging Standard)

---
 interface/web/sites/aps_installedpackages_list.php |   16 +++++++
 server/plugins-available/aps_plugin.inc.php        |    8 +++
 interface/lib/classes/aps_guicontroller.inc.php    |   14 ++++++-
 interface/web/sites/aps_do_operation.php           |   36 +++++++++---------
 interface/web/sites/aps_cron_apscrawler_if.php     |    4 +-
 server/lib/classes/aps_installer.inc.php           |    5 ++
 6 files changed, 59 insertions(+), 24 deletions(-)

diff --git a/interface/lib/classes/aps_guicontroller.inc.php b/interface/lib/classes/aps_guicontroller.inc.php
index 55d6db0..8e86437 100644
--- a/interface/lib/classes/aps_guicontroller.inc.php
+++ b/interface/lib/classes/aps_guicontroller.inc.php
@@ -87,7 +87,7 @@
      */
     private function getCustomerIDFromDomain($domain)
     {
-        $customerid = '';
+        $customerid = 0;
         
         $customerdata = $this->db->queryOneRecord("SELECT client_id FROM sys_group, web_domain
             WHERE web_domain.sys_groupid = sys_group.groupid 
@@ -206,7 +206,7 @@
         if(!empty($websrv)) $webserver_id = $websrv['server_id'];
         $customerid = $this->getCustomerIDFromDomain($settings['main_domain']);
         
-        if(empty($settings) || empty($customerid) || empty($webserver_id)) return false;
+        if(empty($settings) || empty($webserver_id)) return false;
 		
 		//* Get server config of the web server
 		$this->app->uses("getconf");
@@ -306,6 +306,11 @@
         $datalog = array('Instance_id' => $instanceid, 'server_id' => $webserver_id);
         $this->db->datalogSave('aps', 'DELETE', 'id', $instanceid, array(), $datalog);
 		*/
+		
+		$sql = "SELECT web_database.database_id as database_id FROM aps_instances_settings, web_database WHERE aps_instances_settings.value = web_database.database_name AND aps_instances_settings.value =  aps_instances_settings.name = 'main_database_name' AND aps_instances_settings.instance_id = ".$instanceid." LIMIT 0,1";
+		$tmp = $this->db->queryOneRecord($sql);
+		if($tmp['database_id'] > 0) $this->db->datalogDelete('web_database', 'database_id', $tmp['database_id']);
+		
 		$this->db->datalogUpdate('aps_instances', "instance_status = ".INSTANCE_REMOVE, 'id', $instanceid);
     }
     
@@ -327,6 +332,11 @@
         $datalog = array('instance_id' => $instanceid, 'server_id' => $webserver_id);
         $this->db->datalogSave('aps', 'INSERT', 'id', $instanceid, array(), $datalog);
 		*/
+		
+		$sql = "SELECT web_database.database_id as database_id FROM aps_instances_settings, web_database WHERE aps_instances_settings.value = web_database.database_name AND aps_instances_settings.value =  aps_instances_settings.name = 'main_database_name' AND aps_instances_settings.instance_id = ".$instanceid." LIMIT 0,1";
+		$tmp = $this->db->queryOneRecord($sql);
+		if($tmp['database_id'] > 0) $this->db->datalogDelete('web_database', 'database_id', $tmp['database_id']);
+		
 		$this->db->datalogUpdate('aps_instances', "instance_status = ".INSTANCE_INSTALL, 'id', $instanceid);
     }
 
diff --git a/interface/web/sites/aps_cron_apscrawler_if.php b/interface/web/sites/aps_cron_apscrawler_if.php
index 6bfa89d..b34b836 100644
--- a/interface/web/sites/aps_cron_apscrawler_if.php
+++ b/interface/web/sites/aps_cron_apscrawler_if.php
@@ -32,8 +32,8 @@
 //require_once('classes/class.crawler.php');
 $app->load('aps_crawler');
 
-if(!@ini_get('allow_url_fopen')) $app->error('allow_url_fopen is not enabled');
-if(!function_exists('curl_version')) $app->error('cURL is not available');
+if(!@ini_get('allow_url_fopen')) $app->error('allow_url_fopen is not enabled.');
+if(!function_exists('curl_version')) $app->error('The PHP CURL extension is not available.');
 
 $log_prefix = 'APS crawler cron: ';
 
diff --git a/interface/web/sites/aps_do_operation.php b/interface/web/sites/aps_do_operation.php
index 493cde4..0f1da3d 100644
--- a/interface/web/sites/aps_do_operation.php
+++ b/interface/web/sites/aps_do_operation.php
@@ -30,35 +30,35 @@
  
 require_once('../../lib/config.inc.php');
 require_once('../../lib/app.inc.php');
-require_once('classes/class.guicontroller.php');
+$app->load('aps_guicontroller');
 
 // Check the module permissions
-$app->auth->check_module_permissions('aps');
+$app->auth->check_module_permissions('sites');
 
 $gui = new ApsGUIController($app);
 
 // An action and ID are required in any case
-if(!isset($_GET['action'])) die;
+if(!isset($_GET['action'])) die('No action');
 
 // List of operations which can be performed
 if($_GET['action'] == 'change_status')
 {
     // Only admins can perform this operation
-    if($_SESSION['s']['user']['typ'] != 'admin') die;
+    if($_SESSION['s']['user']['typ'] != 'admin') die('For admin use only.');
     
     // Make sure a valid package ID is given
     if(!$gui->isValidPackageID($_GET['id'], true)) die($app->lng('Invalid ID'));
     
     // Change the existing status to the opposite
-    $get_status = $app->db->queryOneRecord("SELECT PackageStatus FROM aps_packages WHERE ID = '".intval($_GET['id'])."';");
-    if($get_status['PackageStatus'] == strval(PACKAGE_LOCKED))
+    $get_status = $app->db->queryOneRecord("SELECT package_status FROM aps_packages WHERE id = '".intval($_GET['id'])."';");
+    if($get_status['package_status'] == strval(PACKAGE_LOCKED))
     {
-        $app->db->query("UPDATE aps_packages SET PackageStatus = ".PACKAGE_ENABLED." WHERE ID = '".intval($_GET['id'])."';");
+        $app->db->query("UPDATE aps_packages SET package_status = ".PACKAGE_ENABLED." WHERE id = '".intval($_GET['id'])."';");
         echo '<div class="swap" id="ir-Yes"><span>'.$app->lng('Yes').'</span></div>';
     }
     else
     {
-        $app->db->query("UPDATE aps_packages SET PackageStatus = ".PACKAGE_LOCKED." WHERE ID = '".intval($_GET['id'])."';");
+        $app->db->query("UPDATE aps_packages SET Package_status = ".PACKAGE_LOCKED." WHERE id = '".intval($_GET['id'])."';");
         echo '<div class="swap" id="ir-No"><span>'.$app->lng('No').'</span></div>';
     }
 }
@@ -76,9 +76,9 @@
     if(!$gui->isValidInstanceID($_GET['id'], $client_id, $is_admin)) die($app->lng('Invalid ID'));
     
     // Only delete the instance if the status is "installed" or "flawed"
-    $check = $app->db->queryOneRecord("SELECT ID FROM aps_instances 
-        WHERE ID = ".$app->db->quote($_GET['id'])." AND 
-        (InstanceStatus = ".INSTANCE_SUCCESS." OR InstanceStatus = ".INSTANCE_ERROR.");");
+    $check = $app->db->queryOneRecord("SELECT id FROM aps_instances 
+        WHERE id = ".$app->db->quote($_GET['id'])." AND 
+        (instance_status = ".INSTANCE_SUCCESS." OR instance_status = ".INSTANCE_ERROR.");");
     if(!empty($check)) $gui->deleteInstance($_GET['id']);
     
     echo $app->lng('Installation_remove');
@@ -96,13 +96,13 @@
     // Assume that the given instance belongs to the currently calling client_id. Unimportant if status is admin
     if(!$gui->isValidInstanceID($_GET['id'], $client_id, $is_admin)) die($app->lng('Invalid ID'));
     
-    // We've an InstanceID, so make sure the package is no enabled and InstanceStatus is still "installed"
-    $check = $app->db->queryOneRecord("SELECT aps_instances.ID FROM aps_instances, aps_packages 
-        WHERE aps_instances.PackageID = aps_packages.ID 
-        AND aps_instances.InstanceStatus = ".INSTANCE_SUCCESS." 
-        AND aps_packages.PackageStatus = ".PACKAGE_ENABLED." 
-        AND aps_instances.ID = ".$app->db->quote($_GET['id']).";");
-    if(!$check) die; // normally this might not happen at all, so just die
+    // We've an InstanceID, so make sure the package is not enabled and InstanceStatus is still "installed"
+    $check = $app->db->queryOneRecord("SELECT aps_instances.id FROM aps_instances, aps_packages 
+        WHERE aps_instances.package_id = aps_packages.id 
+        AND aps_instances.instance_status = ".INSTANCE_SUCCESS." 
+        AND aps_packages.package_status = ".PACKAGE_ENABLED." 
+        AND aps_instances.id = ".$app->db->quote($_GET['id']).";");
+    if(!$check) die('Check failed'); // normally this might not happen at all, so just die
     
     $gui->reinstallInstance($_GET['id']);
     echo $app->lng('Installation_task');
diff --git a/interface/web/sites/aps_installedpackages_list.php b/interface/web/sites/aps_installedpackages_list.php
index 43b6053..26e1898 100644
--- a/interface/web/sites/aps_installedpackages_list.php
+++ b/interface/web/sites/aps_installedpackages_list.php
@@ -82,6 +82,7 @@
 $limit_sql = $app->listform->getPagingSQL($sql_where);
 $app->tpl->setVar('paging', $app->listform->pagingHTML);
 
+if(!$is_admin) {
 // Our query over multiple tables
 $query = "SELECT aps_instances.id AS id, aps_instances.package_id AS package_id, 
                  aps_instances.customer_id AS customer_id, client.username AS customer_name, 
@@ -92,7 +93,20 @@
                  '/', (SELECT value FROM aps_instances_settings WHERE name='main_location' AND instance_id = aps_instances.id)) 
                   AS install_location  
           FROM aps_instances, aps_packages, client 
-          WHERE client.client_id = aps_instances.Customer_id AND ".$sql_where." ".$app->listform_actions->SQLOrderBy." ".$limit_sql;
+          WHERE client.client_id = aps_instances.customer_id AND ".$sql_where." ".$app->listform_actions->SQLOrderBy." ".$limit_sql;
+} else {
+$query = "SELECT aps_instances.id AS id, aps_instances.package_id AS package_id,  
+                 aps_instances.customer_id AS customer_id, sys_group.name AS customer_name,
+				 aps_instances.instance_status AS instance_status, aps_packages.name AS package_name, 
+                 aps_packages.version AS package_version, aps_packages.release AS package_release, 
+                 aps_packages.package_status AS package_status, 
+              CONCAT ((SELECT value FROM aps_instances_settings WHERE name='main_domain' AND instance_id = aps_instances.id), 
+                 '/', (SELECT value FROM aps_instances_settings WHERE name='main_location' AND instance_id = aps_instances.id)) 
+                  AS install_location  
+          FROM aps_instances, aps_packages, sys_group 
+          WHERE sys_group.client_id = aps_instances.customer_id AND ".$sql_where." ".$app->listform_actions->SQLOrderBy." ".$limit_sql;
+
+}	  
 
 $records = $app->db->queryAllRecords($query);
 $app->listform_actions->DataRowColor = '#FFFFFF';
diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php
index b567c81..9c091b1 100644
--- a/server/lib/classes/aps_installer.inc.php
+++ b/server/lib/classes/aps_installer.inc.php
@@ -586,10 +586,15 @@
         else return false;
         
         // Get all instance metadata
+		/*
         $task = $this->app->db->queryOneRecord("SELECT * FROM aps_instances AS i 
             INNER JOIN aps_packages AS p ON i.package_id = p.id 
             INNER JOIN client AS c ON i.customer_id = c.client_id
             WHERE i.id = ".$instanceid.";");
+		*/
+		$task = $this->app->db->queryOneRecord("SELECT * FROM aps_instances AS i 
+            INNER JOIN aps_packages AS p ON i.package_id = p.id
+            WHERE i.id = ".$instanceid.";");
         if(!$task) return false;  // formerly: throw new Exception('The InstanceID doesn\'t exist.');
         if(!isset($task['instance_id'])) $task['instance_id'] = $instanceid;
 		
diff --git a/server/plugins-available/aps_plugin.inc.php b/server/plugins-available/aps_plugin.inc.php
index 26ae9be..f16ddac 100644
--- a/server/plugins-available/aps_plugin.inc.php
+++ b/server/plugins-available/aps_plugin.inc.php
@@ -57,7 +57,7 @@
         global $app;
         
         // Register the available events
-        $app->plugins->registerEvent('aps_instance_install', $this->plugin_name, 'install');
+        $app->plugins->registerEvent('aps_instance_insert', $this->plugin_name, 'install');
         $app->plugins->registerEvent('aps_instance_update', $this->plugin_name, 'install');
         $app->plugins->registerEvent('aps_instance_delete', $this->plugin_name, 'delete');
     }
@@ -78,6 +78,12 @@
 			$app->log("Running installHandler",LOGLEVEL_DEBUG);
 			$aps->installHandler($instanceid, 'install');
 		}
+		
+		if($data['new']['instance_status'] == INSTANCE_REMOVE) {
+			$aps = new ApsInstaller($app);
+			$app->log("Running installHandler",LOGLEVEL_DEBUG);
+			$aps->installHandler($instanceid, 'delete');
+		}
     }
     
     /**

--
Gitblit v1.9.1