Marius Cramer
2015-01-05 551989a9bd9b134858f6709a2756ca9dcec82fd4
Merge branch 'aps_remote' into 'master'

Remote API functions for APS-Installer (FS#2464)

Added new functions and docs to remote api for APS-Installer. Some minor changes done to APS-Installer for this (and removed deprecated warnings of installer).
Removed APS-functions and textes for instance-reinstallation because of existing problems with this feature (discussed with Till via mail).

See merge request !147
10 files added
31 files modified
896 ■■■■ changed files
interface/lib/classes/aps_guicontroller.inc.php 220 ●●●● patch | view | raw | blame | history
interface/lib/classes/remote.d/aps.inc.php 318 ●●●●● patch | view | raw | blame | history
interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/aps_do_operation.php 25 ●●●●● patch | view | raw | blame | history
interface/web/sites/aps_installedpackages_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/ar_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/bg_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/br_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/cz_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/de_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/el_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/en_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/es_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/fi_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/fr_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/hr_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/hu_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/id_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/it_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/ja_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/nl_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/pl_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/pt_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/ro_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/ru_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/se_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/sk_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/tr_aps_instances_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/remote.conf.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/templates/aps_instances_list.htm 5 ●●●● patch | view | raw | blame | history
remoting_client/API-docs/navigation.html 11 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_available_packages_list.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_get_package_details.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_get_package_file.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_get_package_settings.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_install_package.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_instance_delete.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_instance_get.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_instance_settings_get.html 29 ●●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_aps_update_package_list.html 29 ●●●●● patch | view | raw | blame | history
server/lib/classes/aps_installer.inc.php 2 ●●● patch | view | raw | blame | history
interface/lib/classes/aps_guicontroller.inc.php
@@ -211,8 +211,93 @@
        return true;
    }
    public function createDatabaseForPackageInstance(&$settings, $websrv) {
        global $app;
        $app->uses('tools_sites');
        $global_config = $app->getconf->get_global_config('sites');
        $tmp = array();
        $tmp['parent_domain_id'] = $websrv['domain_id'];
        $tmp['sys_groupid'] = $websrv['sys_groupid'];
        $dbname_prefix = $app->tools_sites->replacePrefix($global_config['dbname_prefix'], $tmp);
        $dbuser_prefix = $app->tools_sites->replacePrefix($global_config['dbuser_prefix'], $tmp);
        unset($tmp);
        // get information if the webserver is a db server, too
        $web_server = $app->db->queryOneRecord("SELECT server_id,server_name,db_server FROM server WHERE server_id  = ".$app->functions->intval($websrv['server_id']));
        if($web_server['db_server'] == 1) {
            // create database on "localhost" (webserver)
            $mysql_db_server_id = $app->functions->intval($websrv['server_id']);
            $settings['main_database_host'] = 'localhost';
            $mysql_db_remote_access = 'n';
            $mysql_db_remote_ips = '';
        } else {
            //* get the default database server of the client
            $client = $app->db->queryOneRecord("SELECT default_dbserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".$app->functions->intval($websrv['sys_groupid']));
            if(is_array($client) && $client['default_dbserver'] > 0 && $client['default_dbserver'] != $websrv['server_id']) {
                $mysql_db_server_id =  $app->functions->intval($client['default_dbserver']);
                $dbserver_config = $web_config = $app->getconf->get_server_config($app->functions->intval($mysql_db_server_id), 'server');
                $settings['main_database_host'] = $dbserver_config['ip_address'];
                $mysql_db_remote_access = 'y';
                $webserver_config = $app->getconf->get_server_config($app->functions->intval($websrv['server_id']), 'server');
                $mysql_db_remote_ips = $webserver_config['ip_address'];
            } else {
                /* I left this in place for a fallback that should NEVER! happen.
                 * if we reach this point it means that there is NO default db server for the client
                * AND the webserver has NO db service enabled.
                * We have to abort the aps installation here... so I added a return false
                * although this does not present any error message to the user.
                */
                return false;
                /*$mysql_db_server_id = $websrv['server_id'];
                 $settings['main_database_host'] = 'localhost';
                $mysql_db_remote_access = 'n';
                $mysql_db_remote_ips = '';*/
            }
        }
        if (empty($settings['main_database_name'])) {
            //* Find a free db name for the app
            for($n = 1; $n <= 1000; $n++) {
                $mysql_db_name = $app->db->quote(($dbname_prefix != '' ? $dbname_prefix.'aps'.$n : uniqid('aps')));
                $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE database_name = '".$app->db->quote($mysql_db_name)."'");
                if($tmp['number'] == 0) break;
            }
            $settings['main_database_name'] = $mysql_db_name;
        }
        if (empty($settings['main_database_login'])) {
            //* Find a free db username for the app
            for($n = 1; $n <= 1000; $n++) {
                $mysql_db_user = $app->db->quote(($dbuser_prefix != '' ? $dbuser_prefix.'aps'.$n : uniqid('aps')));
                $tmp = $app->db->queryOneRecord("SELECT count(database_user_id) as number FROM web_database_user WHERE database_user = '".$app->db->quote($mysql_db_user)."'");
                if($tmp['number'] == 0) break;
            }
            $settings['main_database_login'] = $mysql_db_user;
        }
        //* Create the mysql database user if not existing
        $tmp = $app->db->queryOneRecord("SELECT database_user_id FROM web_database_user WHERE database_user = '".$app->db->quote($settings['main_database_login'])."'");
        if(!$tmp) {
            $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `database_user`, `database_user_prefix`, `database_password`)
                                          VALUES( ".$app->functions->intval($websrv['sys_userid']).", ".$app->functions->intval($websrv['sys_groupid']).", 'riud', '".$app->functions->intval($websrv['sys_perm_group'])."', '', 0, '".$settings['main_database_login']."', '".$app->db->quote($dbuser_prefix) . "', PASSWORD('".$settings['main_database_password']."'))";
            $mysql_db_user_id = $app->db->datalogInsert('web_database_user', $insert_data, 'database_user_id');
        }
        else $mysql_db_user_id = $tmp['database_user_id'];
        //* Create the mysql database if not existing
        $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE database_name = '".$app->db->quote($settings['main_database_name'])."'");
        if($tmp['number'] == 0) {
            $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `parent_domain_id`, `type`, `database_name`, `database_name_prefix`, `database_user_id`, `database_ro_user_id`, `database_charset`, `remote_access`, `remote_ips`, `backup_copies`, `active`, `backup_interval`)
                                          VALUES( ".$app->functions->intval($websrv['sys_userid']).", ".$app->functions->intval($websrv['sys_groupid']).", 'riud', '".$app->functions->intval($websrv['sys_perm_group'])."', '', $mysql_db_server_id, ".$app->functions->intval($websrv['domain_id']).", 'mysql', '".$settings['main_database_name']."', '" . $app->db->quote($dbname_prefix) . "', '$mysql_db_user_id', 0, '', '$mysql_db_remote_access', '$mysql_db_remote_ips', ".$app->functions->intval($websrv['backup_copies']).", 'y', '".$app->functions->intval($websrv['backup_interval'])."')";
            $app->db->datalogInsert('web_database', $insert_data, 'database_id');
        }
        return true;
    }
    /**
     * Creates a new database record for the package instance and
     * an install task
@@ -250,86 +335,15 @@
        }
        //* Create the MySQL database for the application
        //* Create the MySQL database for the application if necessary
        $pkg = $app->db->queryOneRecord('SELECT * FROM aps_packages WHERE id = '.$app->db->quote($packageid).';');
        $metafile = $this->interface_pkg_dir.'/'.$pkg['path'].'/APP-META.xml';
        $sxe = $this->readInMetaFile($metafile);
        $db_id = parent::getXPathValue($sxe, '//db:id');
        if (!empty($db_id)) {
            $global_config = $app->getconf->get_global_config('sites');
            $tmp = array();
            $tmp['parent_domain_id'] = $websrv['domain_id'];
            $tmp['sys_groupid'] = $websrv['sys_groupid'];
            $dbname_prefix = $app->tools_sites->replacePrefix($global_config['dbname_prefix'], $tmp);
            $dbuser_prefix = $app->tools_sites->replacePrefix($global_config['dbuser_prefix'], $tmp);
            unset($tmp);
            // get information if the webserver is a db server, too
            $web_server = $app->db->queryOneRecord("SELECT server_id,server_name,db_server FROM server WHERE server_id  = ".$app->functions->intval($websrv['server_id']));
            if($web_server['db_server'] == 1) {
                // create database on "localhost" (webserver)
                $mysql_db_server_id = $app->functions->intval($websrv['server_id']);
                $mysql_db_host = 'localhost';
                $mysql_db_remote_access = 'n';
                $mysql_db_remote_ips = '';
            } else {
                //* get the default database server of the client
                $client = $app->db->queryOneRecord("SELECT default_dbserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".$app->functions->intval($websrv['sys_groupid']));
                if(is_array($client) && $client['default_dbserver'] > 0 && $client['default_dbserver'] != $websrv['server_id']) {
                    $mysql_db_server_id =  $app->functions->intval($client['default_dbserver']);
                    $dbserver_config = $web_config = $app->getconf->get_server_config($app->functions->intval($mysql_db_server_id), 'server');
                    $mysql_db_host = $dbserver_config['ip_address'];
                    $mysql_db_remote_access = 'y';
                    $webserver_config = $app->getconf->get_server_config($app->functions->intval($websrv['server_id']), 'server');
                    $mysql_db_remote_ips = $webserver_config['ip_address'];
                } else {
                    /* I left this in place for a fallback that should NEVER! happen.
                     * if we reach this point it means that there is NO default db server for the client
                     * AND the webserver has NO db service enabled.
                     * We have to abort the aps installation here... so I added a return false
                     * although this does not present any error message to the user.
                     */
                    return false;
                    /*$mysql_db_server_id = $websrv['server_id'];
                    $mysql_db_host = 'localhost';
                    $mysql_db_remote_access = 'n';
                    $mysql_db_remote_ips = '';*/
                }
            }
            //* Find a free db name for the app
            for($n = 1; $n <= 1000; $n++) {
                $mysql_db_name = $app->db->quote(($dbname_prefix != '' ? $dbname_prefix.'aps'.$n : uniqid('aps')));
                $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE database_name = '".$app->db->quote($mysql_db_name)."'");
                if($tmp['number'] == 0) break;
            }
            //* Find a free db username for the app
            for($n = 1; $n <= 1000; $n++) {
                $mysql_db_user = $app->db->quote(($dbuser_prefix != '' ? $dbuser_prefix.'aps'.$n : uniqid('aps')));
                $tmp = $app->db->queryOneRecord("SELECT count(database_user_id) as number FROM web_database_user WHERE database_user = '".$app->db->quote($mysql_db_user)."'");
                if($tmp['number'] == 0) break;
            }
            $mysql_db_password = $settings['main_database_password'];
            //* Create the mysql database user
            $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `database_user`, `database_user_prefix`, `database_password`)
                      VALUES( ".$app->functions->intval($websrv['sys_userid']).", ".$app->functions->intval($websrv['sys_groupid']).", 'riud', '".$app->functions->intval($websrv['sys_perm_group'])."', '', 0, '$mysql_db_user', '".$app->db->quote($dbuser_prefix) . "', PASSWORD('$mysql_db_password'))";
            $mysql_db_user_id = $app->db->datalogInsert('web_database_user', $insert_data, 'database_user_id');
            //* Create the mysql database
            $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `parent_domain_id`, `type`, `database_name`, `database_name_prefix`, `database_user_id`, `database_ro_user_id`, `database_charset`, `remote_access`, `remote_ips`, `backup_copies`, `active`, `backup_interval`)
                      VALUES( ".$app->functions->intval($websrv['sys_userid']).", ".$app->functions->intval($websrv['sys_groupid']).", 'riud', '".$app->functions->intval($websrv['sys_perm_group'])."', '', $mysql_db_server_id, ".$app->functions->intval($websrv['domain_id']).", 'mysql', '$mysql_db_name', '" . $app->db->quote($dbname_prefix) . "', '$mysql_db_user_id', 0, '', '$mysql_db_remote_access', '$mysql_db_remote_ips', ".$app->functions->intval($websrv['backup_copies']).", 'y', '".$app->functions->intval($websrv['backup_interval'])."')";
            $app->db->datalogInsert('web_database', $insert_data, 'database_id');
            //* Add db details to package settings
            $settings['main_database_host'] = $mysql_db_host;
            $settings['main_database_name'] = $mysql_db_name;
            $settings['main_database_login'] = $mysql_db_user;
            // mysql-database-name is updated inside if not set already
            if (!$this->createDatabaseForPackageInstance($settings, $websrv)) return false;
        }
        //* Insert new package instance
@@ -348,15 +362,13 @@
        $app->db->datalogUpdate('aps_instances', "instance_status = ".INSTANCE_INSTALL, 'id', $InstanceID);
    }
    /**
     * Sets the status of an instance to "should be removed" and creates a
     * datalog entry to give the ISPConfig server a real removal advice
     *
     * @param $instanceid the instance to delete
     */
    public function deleteInstance($instanceid)
    public function deleteInstance($instanceid, $keepdatabase = false)
    {
        global $app;
        /*
@@ -370,46 +382,18 @@
        $app->db->datalogSave('aps', 'DELETE', 'id', $instanceid, array(), $datalog);
        */
        $sql = "SELECT web_database.database_id as database_id, web_database.database_user_id as `database_user_id` FROM aps_instances_settings, web_database WHERE aps_instances_settings.value = web_database.database_name AND aps_instances_settings.name = 'main_database_name' AND aps_instances_settings.instance_id = ".$instanceid." LIMIT 0,1";
        $tmp = $app->db->queryOneRecord($sql);
        if($tmp['database_id'] > 0) $app->db->datalogDelete('web_database', 'database_id', $tmp['database_id']);
        $database_user = $tmp['database_user_id'];
        $tmp = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `database_user_id` = '" . $app->functions->intval($database_user) . "' OR `database_ro_user_id` = '" . $app->functions->intval($database_user) . "'");
        if($tmp['cnt'] < 1) $app->db->datalogDelete('web_database_user', 'database_user_id', $database_user);
        if (!$keepdatabase) {
            $sql = "SELECT web_database.database_id as database_id, web_database.database_user_id as `database_user_id` FROM aps_instances_settings, web_database WHERE aps_instances_settings.value = web_database.database_name AND aps_instances_settings.name = 'main_database_name' AND aps_instances_settings.instance_id = ".$instanceid." LIMIT 0,1";
            $tmp = $app->db->queryOneRecord($sql);
            if($tmp['database_id'] > 0) $app->db->datalogDelete('web_database', 'database_id', $tmp['database_id']);
            $database_user = $tmp['database_user_id'];
            $tmp = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `database_user_id` = '" . $app->functions->intval($database_user) . "' OR `database_ro_user_id` = '" . $app->functions->intval($database_user) . "'");
            if($tmp['cnt'] < 1) $app->db->datalogDelete('web_database_user', 'database_user_id', $database_user);
        }
        $app->db->datalogUpdate('aps_instances', "instance_status = ".INSTANCE_REMOVE, 'id', $instanceid);
    }
    /**
     * Sets the status of an instance to "installation planned" and creates a
     * datalog entry to re-install the package. The existing package is simply overwritten.
     *
     * @param $instanceid the instance to delete
     */
    public function reinstallInstance($instanceid)
    {
        global $app;
        /*
        $app->db->query("UPDATE aps_instances SET instance_status = ".INSTANCE_INSTALL." WHERE id = ".$instanceid.";");
        $webserver_id = $this->getInstanceDataForDatalog($instanceid);
        if($webserver_id == '') return;
        // Create a sys_datalog entry for re-installation
        $datalog = array('instance_id' => $instanceid, 'server_id' => $webserver_id);
        $app->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 = ".$app->db->quote($instanceid)." LIMIT 0,1";
        $tmp = $app->db->queryOneRecord($sql);
        if($tmp['database_id'] > 0) $app->db->datalogDelete('web_database', 'database_id', $tmp['database_id']);
        $app->db->datalogUpdate('aps_instances', "instance_status = ".INSTANCE_INSTALL, 'id', $instanceid);
    }
    /**
@@ -608,6 +592,10 @@
        if(isset($pkg_details['Requirements Database'])
            && $pkg_details['Requirements Database'] != '')
        {
            if (isset($postinput['main_database_host'])) $input['main_database_host'] = $postinput['main_database_host'];
            if (isset($postinput['main_database_name'])) $input['main_database_name'] = $postinput['main_database_name'];
            if (isset($postinput['main_database_login'])) $input['main_database_login'] = $postinput['main_database_login'];
            if(isset($postinput['main_database_password']))
            {
                if($postinput['main_database_password'] == '') $error[] = $app->lng('error_no_database_pw');
interface/lib/classes/remote.d/aps.inc.php
New file
@@ -0,0 +1,318 @@
<?php
/*
Copyright (c) 2007 - 2013, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--UPDATED 01.2015--
Created by Dominik Müller <info@profi-webdesign.net>
Copyright (c) Profi Webdesign Dominik Müller
*/
class remoting_aps extends remoting {
    //* Functions for APS
    public function sites_aps_update_package_list($session_id)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_update_package')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_crawler');
        $aps = new ApsCrawler($app, false); // true = Interface mode, false = Server mode
        $aps->startCrawler();
        $aps->parseFolderToDB();
        $aps->fixURLs();
        return true;
    }
    public function sites_aps_available_packages_list($session_id, $params)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_available_packages_list')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_base');
        if (isset($params['all_packages']) && ($params['all_packages'] == true)) {
            $where = '(aps_packages.package_status = '.PACKAGE_ENABLED.' OR aps_packages.package_status = '.PACKAGE_LOCKED.')';
        }
        else {
            $where = 'aps_packages.package_status = '.PACKAGE_ENABLED;
        }
        $sql  = 'SELECT * FROM aps_packages WHERE '.$where.' ORDER BY aps_packages.name, aps_packages.version';
        return $app->db->queryAllRecords($sql);
    }
    public function sites_aps_get_package_details($session_id, $primary_id)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_get_package_details')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_guicontroller');
        $gui = new ApsGUIController($app);
        // Package-ID Check
        if (isset($primary_id))
        {
            $newest_pkg_id = $gui->getNewestPackageID($pkg_id);
            if($newest_pkg_id != 0) $primary_id = $newest_pkg_id;
        }
        // Make sure an integer ID is given
        if (!isset($primary_id) || !$gui->isValidPackageID($primary_id, true)) {// always adminflag
            $this->server->fault('package_error', 'The given Package ID is not valid.');
            return false;
        }
        // Get package details
        $details = $gui->getPackageDetails($primary_id);
        if (isset($details['error'])) {
            $this->server->fault('package_error', $details['error']);
            return false;
        }
        // encode all parts to ensure SOAP-XML-format
        array_walk_recursive($details, function(&$item, &$key) { $item = utf8_encode($item); } );
        // Special handling for license-text because of too much problems with soap-transport
        $details['License content'] = base64_encode($details['License content']);
        return $details;
    }
    public function sites_aps_get_package_file($session_id, $primary_id, $filename) {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_get_package_file')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_guicontroller');
        $gui = new ApsGUIController($app);
        // Package-ID Check
        if (isset($primary_id))
        {
            $newest_pkg_id = $gui->getNewestPackageID($pkg_id);
            if($newest_pkg_id != 0) $primary_id = $newest_pkg_id;
        }
        // Make sure an integer ID is given
        if (!isset($primary_id) || !$gui->isValidPackageID($primary_id, true)) {// always adminflag
            $this->server->fault('package_error', 'The given Package ID is not valid.');
            return false;
        }
        // Get package details
        $details = $gui->getPackageDetails($primary_id);
        if (isset($details['error'])) {
            $this->server->fault('package_error', $details['error']);
            return false;
        }
        // find file in details
        $found = false;
        if (basename($details['Icon']) == $filename) $found = true;
        if (!$found && isset($details['Screenshots']) && is_array($details['Screenshots']))
        foreach ($details['Screenshots'] as $screen) { if (basename($screen['ScreenPath']) == $filename) { $found = true; break; } }
        if (!$found) {
            $this->server->fault('package_error', 'File not found in package.');
            return false;
        }
        return base64_encode(file_get_contents(ISPC_ROOT_PATH.'/web/sites/aps_meta_packages/'.$details['path'].'/'.$filename));
    }
    public function sites_aps_get_package_settings($session_id, $primary_id)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_get_package_details')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_guicontroller');
        $gui = new ApsGUIController($app);
        // Package-ID Check
        if (isset($primary_id))
        {
            $newest_pkg_id = $gui->getNewestPackageID($pkg_id);
            if($newest_pkg_id != 0) $primary_id = $newest_pkg_id;
        }
        // Make sure an integer ID is given
        if (!isset($primary_id) || !$gui->isValidPackageID($primary_id, true)) {// always adminflag
            $this->server->fault('package_error', 'The given Package ID is not valid.');
            return false;
        }
        // Get package settings
        $settings = $gui->getPackageSettings($primary_id);
        if (isset($settings['error'])) {
            $this->server->fault('package_error', $settings['error']);
            return false;
        }
        // encode all parts to ensure SOAP-XML-format
        array_walk_recursive($settings, function(&$item, &$key) { $item = utf8_encode($item); } );
        return $settings;
    }
    public function sites_aps_install_package($session_id, $primary_id, $params)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_install_package')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_guicontroller');
        $gui = new ApsGUIController($app);
        // Package-ID Check
        if (isset($primary_id))
        {
            $newest_pkg_id = $gui->getNewestPackageID($primary_id);
            if($newest_pkg_id != 0) $primary_id = $newest_pkg_id;
        }
        // Make sure an integer ID is given
        if (!isset($primary_id) || !$gui->isValidPackageID($primary_id, true)) {// always adminflag
            $this->server->fault('package_error', 'The given Package ID is not valid.');
            return false;
        }
        // Get package details
        $details = $gui->getPackageDetails($primary_id);
        if (isset($details['error'])) {
            $this->server->fault('package_error', $details['error']);
            return false;
        }
        $settings = $gui->getPackageSettings($primary_id);
        if (isset($settings['error'])) {
            $this->server->fault('package_error', $settings['error']);
            return false;
        }
        // Check given Site/VHostDomain
        if (!isset($params['main_domain'])) {
            $this->server->fault('invalid parameters', 'No valid domain given.');
            return false;
        }
        $sql = "SELECT * FROM web_domain WHERE domain = '".$app->db->quote($params['main_domain'])."'";
        $domain = $app->db->queryOneRecord($sql);
        if (!$domain) {
            $this->server->fault('invalid parameters', 'No valid domain given.');
            return false;
        }
        $domains = array($domain['domain']); // Simulate correct Domain-List
        $result = $gui->validateInstallerInput($params, $details, $domains, $settings);
        if(empty($result['error']))
        {
            return $gui->createPackageInstance($result['input'], $primary_id);
        }
        $this->server->fault('invalid parameters', implode('<br />', $result['error']));
        return false;
    }
    public function sites_aps_instance_get($session_id, $primary_id)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_instance_get')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $sql  = "SELECT * FROM aps_instances WHERE id = ".$app->functions->intval($primary_id);
        $result = $app->db->queryOneRecord($sql);
        return $result;
    }
    public function sites_aps_instance_settings_get($session_id, $primary_id)
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_instance_get')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $sql  = "SELECT * FROM aps_instances_settings WHERE instance_id = ".$app->functions->intval($primary_id);
        $result = $app->db->queryAllRecords($sql);
        return $result;
    }
    public function sites_aps_instance_delete($session_id, $primary_id, $params = array())
    {
        global $app;
        if(!$this->checkPerm($session_id, 'sites_aps_instance_delete')) {
            $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
            return false;
        }
        $app->load('aps_guicontroller');
        $gui = new ApsGUIController($app);
        // Check if Instance exists
        $sql  = "SELECT * FROM aps_instances WHERE id = ".$app->functions->intval($primary_id);
        $result = $app->db->queryOneRecord($sql);
        if (!$result) {
            $this->server->fault('instance_error', 'No valid instance id given.');
            return false;
        }
        $gui->deleteInstance($primary_id, (isset($params['keep_database']) && ($params['keep_database'] === true)));
        return true;
    }
}
?>
interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php
@@ -212,8 +212,6 @@
                    if(is_array($records) && !empty($records)){
                        foreach($records as $rec){
                            $app->db->datalogUpdate('aps_instances_settings', "value = '".$app->db->quote($page_form->dataRecord["domain"])."'", 'id', $rec['id']);
                            // Reinstall of package needed?
                            //$app->db->datalogUpdate('aps_instances', "instance_status = '1'", 'id', $rec['instance_id']);
                        }
                    }
                    unset($records);
interface/web/sites/aps_do_operation.php
@@ -84,29 +84,4 @@
        //echo $app->lng('Installation_remove');
        @header('Location:aps_installedpackages_list.php');
    }
else if($_GET['action'] == 'reinstall_instance')
    {
        // Make sure a valid package ID is given (also corresponding to the calling user)
        $client_id = 0;
        $is_admin = ($_SESSION['s']['user']['typ'] == 'admin') ? true : false;
        if(!$is_admin)
        {
            $cid = $app->db->queryOneRecord("SELECT client_id FROM client WHERE username = '".$app->db->quote($_SESSION['s']['user']['username'])."';");
            $client_id = $cid['client_id'];
        }
        // 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 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');
        @header('Location:aps_installedpackages_list.php');
    }
?>
interface/web/sites/aps_installedpackages_list.php
@@ -125,10 +125,6 @@
        else $ils = $rec['install_location'];
        $rec['install_location_short'] = $ils;
        // Also set a boolean-like variable for the reinstall button (vlibTemplate doesn't allow variable comparisons)
        // For a reinstall, the package must be already installed successfully and (still be) enabled
        if($rec['instance_status'] == INSTANCE_SUCCESS && $rec['package_status'] == PACKAGE_ENABLED)
            $rec['reinstall_possible'] = 'true';
        // Of course an instance can only then be removed when it's not already tagged for removal
        if($rec['instance_status'] != INSTANCE_REMOVE && $rec['instance_status'] != INSTANCE_INSTALL)
            $rec['delete_possible'] = 'true';
interface/web/sites/lib/lang/ar_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/bg_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/br_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/cz_aps_instances_list.lng
@@ -6,9 +6,7 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Umístění instalace';
$wb['pkg_delete_confirmation'] = 'Opravdu chcete smazat tuto instalaci ?';
$wb['pkg_reinstall_confirmation'] = 'Opravdu chcete přeinstalovat tento balíček se stejným nastavením ?';
$wb['filter_txt'] = 'Hledat';
$wb['delete_txt'] = 'Smazat';
$wb['reinstall_txt'] = 'Přeinstalovat';
?>
interface/web/sites/lib/lang/de_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Installationsort';
$wb['pkg_delete_confirmation'] = 'Soll diese Installation wirklich gelöscht werden?';
$wb['pkg_reinstall_confirmation'] = 'Soll das Paket wirklich mit den gleichen Einstellungen erneut installiert werden?';
$wb['filter_txt'] = 'Suche';
$wb['delete_txt'] = 'Löschen';
$wb['reinstall_txt'] = 'Neuinstallieren';
?>
interface/web/sites/lib/lang/el_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/en_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/es_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Estado';
$wb['install_location_txt'] = 'Localización de instalación';
$wb['pkg_delete_confirmation'] = '¿Realmente quieres eliminar esta instalación?';
$wb['pkg_reinstall_confirmation'] = '¿Realmente quieres reinstalar este paquete con la misma configuración?';
$wb['filter_txt'] = 'Buscar';
$wb['delete_txt'] = 'Eliminar';
$wb['reinstall_txt'] = 'Reinstalar';
?>
interface/web/sites/lib/lang/fi_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/fr_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Statut';
$wb['install_location_txt'] = 'Chemin d\'installation';
$wb['pkg_delete_confirmation'] = 'Etes-vous sûr de vouloir supprimer cette installation ?';
$wb['pkg_reinstall_confirmation'] = 'Etes-vous sûr de vouloir réinstaller ce package avec la même configuration ?';
$wb['filter_txt'] = 'Chercher';
$wb['delete_txt'] = 'Supprimer';
$wb['reinstall_txt'] = 'Réinstaller';
?>
interface/web/sites/lib/lang/hr_aps_instances_list.lng
@@ -6,10 +6,8 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Lokacija instalacije';
$wb['pkg_delete_confirmation'] = 'Da li stvarno želite obrisati ovu instalaciju?';
$wb['pkg_reinstall_confirmation'] = 'Da li stvarno želite reinstalirati ovaj paket sa istim postavkama?';
$wb['filter_txt'] = 'Traži';
$wb['delete_txt'] = 'Obriši';
$wb['reinstall_txt'] = 'Reinstaliraj';
?>
interface/web/sites/lib/lang/hu_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/id_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/it_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/ja_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/nl_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/pl_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Lokalizacja instalacji';
$wb['pkg_delete_confirmation'] = 'Na pewno chcesz usunąć tę instalację?';
$wb['pkg_reinstall_confirmation'] = 'Na pewno chcesz przeinstalować ten pakiet z tymi samymi ustawieniami?';
$wb['filter_txt'] = 'Szukaj';
$wb['delete_txt'] = 'Usuń';
$wb['reinstall_txt'] = 'Przeinstaluj';
?>
interface/web/sites/lib/lang/pt_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/ro_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/ru_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/se_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Installationsplats';
$wb['pkg_delete_confirmation'] = 'Vill du verkligen radera denna installation?';
$wb['pkg_reinstall_confirmation'] = 'Vill du verkligen installera om det här paketet med samma inställningar?';
$wb['filter_txt'] = 'Sök';
$wb['delete_txt'] = 'Radera';
$wb['reinstall_txt'] = 'Ominstallera';
?>
interface/web/sites/lib/lang/sk_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/lang/tr_aps_instances_list.lng
@@ -6,8 +6,6 @@
$wb['status_txt'] = 'Status';
$wb['install_location_txt'] = 'Install location';
$wb['pkg_delete_confirmation'] = 'Do you really want to delete this installation?';
$wb['pkg_reinstall_confirmation'] = 'Do you really want to reinstall this package with the same settings?';
$wb['filter_txt'] = 'Search';
$wb['delete_txt'] = 'Delete';
$wb['reinstall_txt'] = 'Reinstall';
?>
interface/web/sites/lib/remote.conf.php
@@ -8,6 +8,6 @@
$function_list['sites_web_domain_backup'] = 'Sites Backup functions';
$function_list['sites_web_aliasdomain_get,sites_web_aliasdomain_add,sites_web_aliasdomain_update,sites_web_aliasdomain_delete'] = 'Sites Aliasdomain functions';
$function_list['sites_web_subdomain_get,sites_web_subdomain_add,sites_web_subdomain_update,sites_web_subdomain_delete'] = 'Sites Subdomain functions';
$function_list['sites_aps_update_package_list,sites_aps_available_packages_list,sites_aps_install_package,sites_aps_get_package_details,sites_aps_get_package_file,sites_aps_get_package_settings,sites_aps_instance_get,sites_aps_instance_delete''] = 'Sites APS functions';
?>
interface/web/sites/templates/aps_instances_list.htm
@@ -43,10 +43,7 @@
                                <tmpl_if name='delete_possible'>
                                    <a class="button icons16 icoDelete" href="javascript: del_record('sites/aps_do_operation.php?action=delete_instance&id={tmpl_var name='id'}','{tmpl_var name='pkg_delete_confirmation'}')"><span>{tmpl_var name='delete_txt'}</span></a>
                                </tmpl_if>
                                <tmpl_if name='reinstall_possible'>
                                    <a class="button icons16 icoEdit" href="javascript: del_record('sites/aps_do_operation.php?action=reinstall_instance&id={tmpl_var name='id'}','{tmpl_var name='pkg_reinstall_confirmation'}')"><span>{tmpl_var name='reinstall_txt'}</span></a>
                                </tmpl_if>
                            </td>
                            </td>
                        </tr>
                    </tmpl_loop>
                </tbody>
remoting_client/API-docs/navigation.html
@@ -196,6 +196,15 @@
<h3>S</h3>
<p><a href="server_get.html" target="content">server_get</a></p>
<p><a href="server_get_serverid_by_ip.html" target="content">server_get_serverid_by_ip</a></p>
<p><a href="sites_aps_available_packages_list.html" target="content">sites_aps_available_packages_list</a></p>
<p><a href="sites_aps_get_package_details.html" target="content">sites_aps_get_package_details</a></p>
<p><a href="sites_aps_get_package_file.html" target="content">sites_aps_get_package_file</a></p>
<p><a href="sites_aps_get_package_settings.html" target="content">sites_aps_get_package_settings</a></p>
<p><a href="sites_aps_install_package.html" target="content">sites_aps_install_package</a></p>
<p><a href="sites_aps_instance_get.html" target="content">sites_aps_instance_get</a></p>
<p><a href="sites_aps_instance_delete.html" target="content">sites_aps_instance_delete</a></p>
<p><a href="sites_aps_instance_settings_get.html" target="content">sites_aps_instance_settings_get</a></p>
<p><a href="sites_aps_update_package_list.html" target="content">sites_aps_update_package_list</a></p>
<p><a href="sites_cron_add.html" target="content">sites_cron_add</a></p>
<p><a href="sites_cron_delete.html" target="content">sites_cron_delete</a></p>
<p><a href="sites_cron_get.html" target="content">sites_cron_get</a></p>
@@ -226,7 +235,7 @@
<p><a href="sites_web_domain_get.html" target="content">sites_web_domain_get</a></p>
<p><a href="sites_web_domain_set_status.html" target="content">sites_web_domain_set_status</a></p>
<p><a href="sites_web_domain_update.html" target="content">sites_web_domain_update</a></p>
 p><a href="sites_web_domain_backup_list.html" target="content">sites_web_domain_backup_list</a></p>
<p><a href="sites_web_domain_backup_list.html" target="content">sites_web_domain_backup_list</a></p>
<p><a href="sites_web_domain_backup.html" target="content">sites_web_domain_backup</a></p>
<p><a href="sites_web_subdomain_add.html" target="content">sites_web_subdomain_add</a></p>
<p><a href="sites_web_subdomain_delete.html" target="content">sites_web_subdomain_delete</a></p>
remoting_client/API-docs/sites_aps_available_packages_list.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_available_packages_list(<span class="var">$session_id</span>, <span class="var">$params</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Reads all available packages with state PACKAGE_ENABLED. If set param all_packages to true, also includes PACKAGE_LOCKED.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$params</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> all_packages&nbsp;&nbsp;(<span class="paratype">boolean</span>) </p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns array with all selected package records.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_get_package_details.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_get_package_details(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Gets all possible details for selected package.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns array with all details of selected package.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_get_package_file.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_get_package_file(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$filename</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Gets the file with given name (like screenshots or icon) of the selected package. Use sites_aps_get_package_details to get all available files of this package.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$filename</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns base64_encoded file content of selected file.<br />Use the followoing example code to save file content over remote api:<br /><span class="var">file_put_contents($file, base64_decode(sites_aps_get_package_file($session_id, $primary_id, $filename)));</span></p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_get_package_settings.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_get_package_settings(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Gets all possible settings for selected package.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns array with all settings of selected package.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_install_package.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_install_package(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Starts installation of the selected package in given main_domains webfolder.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> main_domain&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>) </p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns new instance id or false.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_instance_delete.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_instance_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Starts deletion of the selected APS instance. If param keep_database is set true, database will not be deleted.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> keep_database&nbsp;&nbsp;(<span class="paratype">boolean</span>) </p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns true if deletion is started.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_instance_get.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_instance_get(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Gets record of given instance id.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns record of APS instance.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_instance_settings_get.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_instance_settings_get(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Gets record of given instance ids settings.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> Returns record of APS instance settings.</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
remoting_client/API-docs/sites_aps_update_package_list.html
New file
@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>ISPCOnfig 3 remote API documentation</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link rel="stylesheet" type="text/css" href="definitionen.css">
  <style type="text/css">
  </style></head>
<body>
<div style="padding:40px">
<h1>sites_aps_update_package_list(<span class="var">$session_id</span>);</h1>
<br>
<p class="headgrp">Description: </p>
<p class="margin"> Update available package list. Starts the ApsCrawler in server mode. May take a while.</p><br>
<p class="headgrp">Input Variables: </p>
<p class="margin"> <span class="var">$session_id</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> None</p>
<p class="headgrp">Output: </p>
<p class="margin"> always true</p>
<!--<b>Output:</b>
<p style="margin-left:100px">Gives a record of </p> -->
</div>
</body></html>
server/lib/classes/aps_installer.inc.php
@@ -376,7 +376,7 @@
           setups get enough time to create the database */
        if($this->handle_type == 'install') {
            for($n = 1; $n < 15; $n++) {
                $link = mysql_connect($newdb_host, $newdb_login, $newdb_pw);
                $link = mysqli_connect($newdb_host, $newdb_login, $newdb_pw);
                if (!$link) {
                    unset($link);
                    sleep(5);