Marius Burkard
2016-05-26 8c6a4706f8bf375738197ed83d1f91d8a17032ef
Merge branch 'stable-3.1'
3 files added
34 files modified
1022 ■■■■ changed files
install/dist/conf/centos72.conf.php 219 ●●●●● patch | view | raw | blame | history
install/dist/lib/fedora.lib.php 25 ●●●●● patch | view | raw | blame | history
install/dist/lib/gentoo.lib.php 24 ●●●●● patch | view | raw | blame | history
install/dist/lib/opensuse.lib.php 25 ●●●●● patch | view | raw | blame | history
install/install.php 2 ●●● patch | view | raw | blame | history
install/lib/install.lib.php 100 ●●●●● patch | view | raw | blame | history
install/lib/installer_base.lib.php 4 ●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0081.sql 2 ●●● patch | view | raw | blame | history
install/sql/ispconfig3.sql 6 ●●●● patch | view | raw | blame | history
install/tpl/debian6_dovecot-sql.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/debian_dovecot-sql.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/debian_dovecot2.conf.master 1 ●●●● patch | view | raw | blame | history
install/tpl/debian_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/fedora_amavisd_conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/fedora_dovecot-sql.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/fedora_dovecot2.conf.master 1 ●●●● patch | view | raw | blame | history
install/tpl/fedora_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/gentoo_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/opensuse_amavisd_conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/opensuse_dovecot-sql.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/opensuse_dovecot2.conf.master 1 ●●●● patch | view | raw | blame | history
install/tpl/opensuse_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/update.php 2 ●●● patch | view | raw | blame | history
interface/lib/classes/json_handler.inc.php 23 ●●●●● patch | view | raw | blame | history
interface/web/dns/dns_spf_edit.php 6 ●●●● patch | view | raw | blame | history
interface/web/help/list/support_message.list.php 3 ●●●● patch | view | raw | blame | history
interface/web/help/support_message_edit.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_domain_edit.php 2 ●●● patch | view | raw | blame | history
interface/web/themes/default/assets/stylesheets/ispconfig.css 3 ●●●●● patch | view | raw | blame | history
interface/web/themes/default/assets/stylesheets/ispconfig.min.css 2 ●●● patch | view | raw | blame | history
interface/web/themes/default/assets/stylesheets/select2x2.png patch | view | raw | blame | history
remoting_client/examples/rest_example.php 57 ●●●●● patch | view | raw | blame | history
server/conf/vhost.conf.master 6 ●●●● patch | view | raw | blame | history
server/lib/classes/cron.d/900-letsencrypt.inc.php 6 ●●●●● patch | view | raw | blame | history
server/lib/classes/monitor_tools.inc.php 466 ●●●●● patch | view | raw | blame | history
server/plugins-available/apache2_plugin.inc.php 5 ●●●●● patch | view | raw | blame | history
server/plugins-available/nginx_plugin.inc.php 5 ●●●●● patch | view | raw | blame | history
install/dist/conf/centos72.conf.php
New file
@@ -0,0 +1,219 @@
<?php
/*
Copyright (c) 2007, 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.
*/
//***  Fedora 9 default settings
//* Main
$conf['language'] = 'en';
$conf['distname'] = 'centos72';
$conf['hostname'] = 'server1.domain.tld'; // Full hostname
$conf['ispconfig_install_dir'] = '/usr/local/ispconfig';
$conf['ispconfig_config_dir'] = '/usr/local/ispconfig';
$conf['ispconfig_log_priority'] = 2;  // 0 = Debug, 1 = Warning, 2 = Error
$conf['ispconfig_log_dir'] = '/var/log/ispconfig';
$conf['server_id'] = 1;
$conf['init_scripts'] = '/etc/init.d';
$conf['runlevel'] = '/etc';
$conf['shells'] = '/etc/shells';
$conf['pam'] = '/etc/pam.d';
//* Services provided by this server, this selection will be overridden by the expert mode
$conf['services']['mail'] = true;
$conf['services']['web'] = true;
$conf['services']['dns'] = true;
$conf['services']['file'] = true;
$conf['services']['db'] = true;
$conf['services']['vserver'] = true;
//* MySQL
$conf['mysql']['installed'] = false; // will be detected automatically during installation
$conf['mysql']['init_script'] = 'mariadb';
$conf['mysql']['host'] = 'localhost';
$conf['mysql']['ip'] = '127.0.0.1';
$conf['mysql']['port'] = '3306';
$conf['mysql']['database'] = 'dbispconfig';
$conf['mysql']['admin_user'] = 'root';
$conf['mysql']['admin_password'] = '';
$conf['mysql']['charset'] = 'utf8';
$conf['mysql']['ispconfig_user'] = 'ispconfig';
$conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
$conf['mysql']['master_slave_setup'] = 'n';
$conf['mysql']['master_host'] = '';
$conf['mysql']['master_database'] = 'dbispconfig';
$conf['mysql']['master_admin_user'] = 'root';
$conf['mysql']['master_admin_password'] = '';
$conf['mysql']['master_ispconfig_user'] = '';
$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand()));
//* Apache
$conf['apache']['installed'] = false; // will be detected automatically during installation
$conf['apache']['user'] = 'apache';
$conf['apache']['group'] = 'apache';
$conf['apache']['init_script'] = 'httpd';
$conf['apache']['version'] = '2.2';
$conf['apache']['vhost_conf_dir'] = '/etc/httpd/conf/sites-available';
$conf['apache']['vhost_conf_enabled_dir'] = '/etc/httpd/conf/sites-enabled';
$conf['apache']['vhost_port'] = '8080';
$conf['apache']['php_ini_path_apache'] = '/etc/php.ini';
$conf['apache']['php_ini_path_cgi'] = '/etc/php.ini';
//* Website base settings
$conf['web']['website_basedir'] = '/var/www';
$conf['web']['website_path'] = '/var/www/clients/client[client_id]/web[website_id]';
$conf['web']['website_symlinks'] = '/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/';
//* Apps base settings
$conf['web']['apps_vhost_ip'] = '_default_';
$conf['web']['apps_vhost_port'] = '8081';
$conf['web']['apps_vhost_servername'] = '';
$conf['web']['apps_vhost_user'] = 'ispapps';
$conf['web']['apps_vhost_group'] = 'ispapps';
//* Fastcgi
$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/';
$conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/';
$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi';
//* Postfix
$conf['postfix']['installed'] = false; // will be detected automatically during installation
$conf['postfix']['config_dir'] = '/etc/postfix';
$conf['postfix']['init_script'] = 'postfix';
$conf['postfix']['user'] = 'postfix';
$conf['postfix']['group'] = 'postfix';
$conf['postfix']['vmail_userid'] = '5000';
$conf['postfix']['vmail_username'] = 'vmail';
$conf['postfix']['vmail_groupid'] = '5000';
$conf['postfix']['vmail_groupname'] = 'vmail';
$conf['postfix']['vmail_mailbox_base'] = '/var/vmail';
//* Mailman
$conf['mailman']['installed'] = false; // will be detected automatically during installation
$conf['mailman']['config_dir'] = '/etc/mailman';
$conf['mailman']['init_script'] = 'mailman';
//* Getmail
$conf['getmail']['installed'] = false; // will be detected automatically during installation
$conf['getmail']['config_dir'] = '/etc/getmail';
$conf['getmail']['program'] = '/usr/bin/getmail';
//* Courier
$conf['courier']['installed'] = false; // will be detected automatically during installation
$conf['courier']['config_dir'] = '/etc/authlib';
$conf['courier']['courier-authdaemon'] = 'courier-authlib';
$conf['courier']['courier-imap'] = 'courier-imap';
$conf['courier']['courier-imap-ssl'] = '';
$conf['courier']['courier-pop'] = '';
$conf['courier']['courier-pop-ssl'] = '';
//* Dovecot
$conf['dovecot']['installed'] = false; // will be detected automatically during installation
$conf['dovecot']['config_dir'] = '/etc/dovecot';
$conf['dovecot']['init_script'] = 'dovecot';
//* SASL
$conf['saslauthd']['installed'] = false; // will be detected automatically during installation
$conf['saslauthd']['config'] = '/etc/sysconfig/saslauthd';
$conf['saslauthd']['init_script'] = 'saslauthd';
//* Amavisd
$conf['amavis']['installed'] = false; // will be detected automatically during installation
$conf['amavis']['config_dir'] = '/etc/amavisd';
$conf['amavis']['init_script'] = 'amavisd';
//* ClamAV
$conf['clamav']['installed'] = false; // will be detected automatically during installation
$conf['clamav']['init_script'] = 'clamd@amavisd';
//* Pureftpd
$conf['pureftpd']['installed'] = false; // will be detected automatically during installation
$conf['pureftpd']['config_dir'] = '/etc/pure-ftpd';
$conf['pureftpd']['init_script'] = 'pure-ftpd';
//* MyDNS
$conf['mydns']['installed'] = false; // will be detected automatically during installation
$conf['mydns']['config_dir'] = '/etc';
$conf['mydns']['init_script'] = 'mydns';
//* PowerDNS
$conf['powerdns']['installed'] = false; // will be detected automatically during installation
$conf['powerdns']['database'] = 'powerdns';
$conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
$conf['powerdns']['init_script'] = 'pdns';
//* BIND DNS Server
$conf['bind']['installed'] = false; // will be detected automatically during installation
$conf['bind']['bind_user'] = 'named';
$conf['bind']['bind_group'] = 'named';
$conf['bind']['bind_zonefiles_dir'] = '/var/named';
$conf['bind']['named_conf_path'] = '/etc/named.conf';
$conf['bind']['named_conf_local_path'] = '/etc/named.conf.local';
$conf['bind']['init_script'] = 'named';
//* Jailkit
$conf['jailkit']['installed'] = false; // will be detected automatically during installation
$conf['jailkit']['config_dir'] = '/etc/jailkit';
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
//* Squid
$conf['squid']['installed'] = false; // will be detected automatically during installation
$conf['squid']['config_dir'] = '/etc/squid';
$conf['squid']['init_script'] = 'squid';
//* Nginx
$conf['nginx']['installed'] = false; // will be detected automatically during installation
$conf['nginx']['user'] = 'nginx';
$conf['nginx']['group'] = 'nginx';
$conf['nginx']['config_dir'] = '/etc/nginx';
$conf['nginx']['vhost_conf_dir'] = '/etc/nginx/sites-available';
$conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled';
$conf['nginx']['init_script'] = 'nginx';
$conf['nginx']['vhost_port'] = '8080';
$conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket';
$conf['nginx']['php_fpm_init_script'] = 'php-fpm';
$conf['nginx']['php_fpm_ini_path'] = '/etc/php.ini';
$conf['nginx']['php_fpm_pool_dir'] = '/etc/php-fpm.d';
$conf['nginx']['php_fpm_start_port'] = 9010;
$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php5-fpm';
//* vlogger
$conf['vlogger']['config_dir'] = '/etc';
//* cron
$conf['cron']['init_script'] = 'crond';
$conf['cron']['crontab_dir'] = '/etc/cron.d';
$conf['cron']['wget'] = '/usr/bin/wget';
//* OpenVZ
$conf['openvz']['installed'] = false;
?>
install/dist/lib/fedora.lib.php
@@ -185,6 +185,27 @@
        if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
        exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman');
        //* Create auxillary postfix conf files
        $configfile = 'helo_access';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        # todo: look up this server's ip addrs and loop through each
        # todo: look up domains hosted on this server and loop through each
        wf($config_dir.'/'.$configfile, $content);
        $configfile = 'blacklist_helo';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        wf($config_dir.'/'.$configfile, $content);
        //* Make a backup copy of the main.cf file
        copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
@@ -440,6 +461,10 @@
        $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
        $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
        $content = str_replace('{server_id}', $conf['server_id'], $content);
        # enable iterate_query for dovecot2
        if(version_compare($dovecot_version,2, '>=')) {
            $content = str_replace('# iterate_query', 'iterate_query', $content);
        }
        wf("$config_dir/$configfile", $content);
        exec("chmod 600 $config_dir/$configfile");
install/dist/lib/gentoo.lib.php
@@ -135,6 +135,26 @@
        touch($config_dir.'/nested_header_checks');
        touch($config_dir.'/body_checks');
        //* Create auxillary postfix conf files
        $configfile = 'helo_access';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        # todo: look up this server's ip addrs and loop through each
        # todo: look up domains hosted on this server and loop through each
        wf($config_dir.'/'.$configfile, $content);
        $configfile = 'blacklist_helo';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        wf($config_dir.'/'.$configfile, $content);
        //* Make a backup copy of the main.cf file
        copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
@@ -321,6 +341,10 @@
        //* dovecot-sql.conf
        $configfile = $config_dir.'/dovecot-sql.conf';
        $content = $this->get_template_file('debian_dovecot-sql.conf', true, true);
        # enable iterate_query for dovecot2
        if(version_compare($dovecot_version,2, '>=')) {
            $content = str_replace('# iterate_query', 'iterate_query', $content);
        }
        $this->write_config_file($configfile, $content);
    }
install/dist/lib/opensuse.lib.php
@@ -197,6 +197,27 @@
        if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
        exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman');
        //* Create auxillary postfix conf files
        $configfile = 'helo_access';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        # todo: look up this server's ip addrs and loop through each
        # todo: look up domains hosted on this server and loop through each
        wf($config_dir.'/'.$configfile, $content);
        $configfile = 'blacklist_helo';
        if(is_file($config_dir.'/'.$configfile)) {
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = strtr($content, $postconf_placeholders);
        wf($config_dir.'/'.$configfile, $content);
        //* Make a backup copy of the main.cf file
        copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
@@ -450,6 +471,10 @@
        $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
        $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
        $content = str_replace('{server_id}', $conf['server_id'], $content);
        # enable iterate_query for dovecot2
        if(version_compare($dovecot_version,2, '>=')) {
            $content = str_replace('# iterate_query', 'iterate_query', $content);
        }
        wf("$config_dir/$configfile", $content);
        exec("chmod 600 $config_dir/$configfile");
install/install.php
@@ -133,7 +133,7 @@
//** Include the distribution-specific installer class library and configuration
if(is_file('dist/lib/'.$dist['baseid'].'.lib.php')) include_once 'dist/lib/'.$dist['baseid'].'.lib.php';
include_once 'dist/lib/'.$dist['id'].'.lib.php';
include_once 'dist/conf/'.$dist['id'].'.conf.php';
include_once 'dist/conf/'.$dist['confid'].'.conf.php';
//****************************************************************************************************
//** Installer Interface
install/lib/install.lib.php
@@ -27,29 +27,6 @@
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
    This function returns a string that describes the installed
    Linux distribution. e.g. debian40 for Debian GNU/Linux 4.0
*/
/*
Comments to completion forever ;-)
commandline arguments
$argv[1]
<?
echo "Total argument passed are : $argc \n";
for( $i = 0 ; $i <= $argc -1 ;$i++)
{
echo "Argument $i : $argv[$i] \n";
}
?>
*/
error_reporting(E_ALL|E_STRICT);
@@ -59,6 +36,10 @@
//** IMPORTANT!
//   This is the same code as in server/lib/classes/monitor_tools.inc.php
//   So if you change it here, you also have to change it in there!
//
//    This function returns a string that describes the installed
//    Linux distribution. e.g. debian40 for Debian GNU/Linux 4.0
function get_distname() {
    $distname = '';
@@ -68,27 +49,52 @@
    //** Debian or Ubuntu
    if(file_exists('/etc/debian_version')) {
        if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu')) {
            if (strstr(trim(file_get_contents('/etc/issue')), 'LTS')) {
                $lts=" LTS";
            } else {
                $lts="";
            }
        // Check if this is Ubuntu and not Debian
        if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu') || (is_file('/etc/os-release') && stristr(file_get_contents('/etc/os-release'), 'Ubuntu'))) {
            $issue = file_get_contents('/etc/issue');
            // Use content of /etc/issue file
            if(strstr($issue,'Ubuntu')) {
                if (strstr(trim($issue), 'LTS')) {
                    $lts=" LTS";
                } else {
                    $lts="";
                }
            $issue=file_get_contents('/etc/issue');
            $distname = 'Ubuntu';
            $distid = 'debian40';
            $distbaseid = 'debian';
            $ver = explode(' ', $issue);
            $ver = array_filter($ver);
            $ver = next($ver);
            $mainver = explode('.', $ver);
            $mainver = array_filter($mainver);
            $mainver = current($mainver).'.'.next($mainver);
                $distname = 'Ubuntu';
                $distid = 'debian40';
                $distbaseid = 'debian';
                $ver = explode(' ', $issue);
                $ver = array_filter($ver);
                $ver = next($ver);
                $mainver = explode('.', $ver);
                $mainver = array_filter($mainver);
                $mainver = current($mainver).'.'.next($mainver);
            // Use content of /etc/os-release file
            } else {
                $os_release = file_get_contents('/etc/os-release');
                if (strstr(trim($os_release), 'LTS')) {
                    $lts = " LTS";
                } else {
                    $lts = "";
                }
                $distname = 'Ubuntu';
                $distid = 'debian40';
                $distbaseid = 'debian';
                preg_match("/.*VERSION=\"(.*)\".*/ui", $os_release, $ver);
                $ver = str_replace("LTS", "", $ver[1]);
                $ver = explode(" ", $ver, 2);
                $ver = reset($ver);
                $mainver = $ver;
            }
            switch ($mainver){
            case "16.04":
                $relname = "(Xenial Xerus)";
                $distid = 'ubuntu1604';
                $distconfid = 'ubuntu1604';
                break;
            case "15.10":
                $relname = "(Wily Werewolf)";
@@ -163,7 +169,7 @@
                $relname = "UNKNOWN";
            }
            $distver = $ver.$lts." ".$relname;
            swriteln("Operating System: ".$distver."\n");
            swriteln("Operating System: ".$distname.' '.$distver."\n");
        } elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
            $distname = 'Debian';
            $distver = '4.0';
@@ -280,6 +286,13 @@
            $distid = 'centos53';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 6 or compatible\n");
        } elseif(stristr($content, 'CentOS Linux release 7.2')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
            $distid = 'centos70';
            $distconfid = 'centos72';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 7.2\n");
        } elseif(stristr($content, 'CentOS Linux release 7')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
@@ -310,8 +323,11 @@
    } else {
        die('Unrecognized GNU/Linux distribution');
    }
    // Set $distconfid to distid, if no different id for the config is defined
    if(!isset($distconfid)) $distconfid = $distid;
    return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'baseid' => $distbaseid);
    return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'confid' => $distconfid, 'baseid' => $distbaseid);
}
function sread() {
install/lib/installer_base.lib.php
@@ -1277,6 +1277,10 @@
        $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
        $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
        $content = str_replace('{server_id}', $conf['server_id'], $content);
        # enable iterate_query for dovecot2
        if(version_compare($dovecot_version,2, '>=')) {
            $content = str_replace('# iterate_query', 'iterate_query', $content);
        }
        wf($config_dir.'/'.$configfile, $content);
        chmod($config_dir.'/'.$configfile, 0600);
install/sql/incremental/upd_0081.sql
@@ -198,7 +198,7 @@
    `traffic_date` date NOT NULL,
    `in_bytes` bigint(32) unsigned NOT NULL,
    `out_bytes` bigint(32) unsigned NOT NULL, 
    PRIMARY KEY (`hostname`,`traffic_date`)
    UNIQUE KEY (`hostname`,`traffic_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
ALTER TABLE `mail_forwarding` ADD COLUMN `allow_send_as` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `active`;
install/sql/ispconfig3.sql
@@ -657,7 +657,7 @@
  `traffic_date` date NOT NULL,
  `in_bytes` bigint(32) unsigned NOT NULL,
  `out_bytes` bigint(32) unsigned NOT NULL,
  PRIMARY KEY (`hostname`,`traffic_date`)
  UNIQUE KEY (`hostname`,`traffic_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
@@ -1153,7 +1153,7 @@
  `veid` int(11) NOT NULL DEFAULT '0',
  `traffic_date` date NULL DEFAULT NULL,
  `traffic_bytes` bigint(32) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`veid`,`traffic_date`)
  UNIQUE KEY (`veid`,`traffic_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
@@ -2043,7 +2043,7 @@
  `hostname` varchar(255) NOT NULL DEFAULT '',
  `traffic_date` date NULL DEFAULT NULL,
  `traffic_bytes` bigint(32) unsigned NOT NULL default '0',
  PRIMARY KEY  (`hostname`,`traffic_date`)
  UNIQUE KEY  (`hostname`,`traffic_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
-- --------------------------------------------------------
install/tpl/debian6_dovecot-sql.conf.master
@@ -19,4 +19,4 @@
# The iterate_query is required for the doveadm command only and works only on dovecot 2 servers.
# Do not enable it on Dovecot 1.x servers
# iterate_query = SELECT email as user FROM mail_user
# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}'
install/tpl/debian_dovecot-sql.conf.master
@@ -126,5 +126,5 @@
# The iterate_query is required for the doveadm command only and works only on dovecot 2 servers.
# Do not enable it on Dovecot 1.x servers
# iterate_query = SELECT email as user FROM mail_user
# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}'
install/tpl/debian_dovecot2.conf.master
@@ -63,3 +63,4 @@
  postmaster_address = webmaster@localhost
  mail_plugins = quota sieve
}
mail_plugins = $mail_plugins quota
install/tpl/debian_postfix.conf.master
@@ -26,7 +26,7 @@
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, check_helo_access regexp:{config_dir}/blacklist_helo
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
install/tpl/fedora_amavisd_conf.master
@@ -146,8 +146,8 @@
$myhostname = '{hostname}';
$notify_method  = 'smtp:[127.0.0.1]:10027';
$forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!
$notify_method  = 'smtp:*:*';
$forward_method = 'smtp:*:*';  # set to undef with milter!
# $os_fingerprint_method = 'p0f:127.0.0.1:2345';  # to query p0f-analyzer.pl
install/tpl/fedora_dovecot-sql.conf.master
@@ -139,4 +139,4 @@
# The iterate_query is required for the doveadm command only and works only on dovecot 2 servers.
# Do not enable it on Dovecot 1.x servers
# iterate_query = SELECT email as user FROM mail_user
# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}'
install/tpl/fedora_dovecot2.conf.master
@@ -61,3 +61,4 @@
  postmaster_address = webmaster@localhost
  mail_plugins = quota sieve
}
mail_plugins = $mail_plugins quota
install/tpl/fedora_postfix.conf.master
@@ -23,7 +23,7 @@
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, check_helo_access regexp:{config_dir}/blacklist_helo
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
install/tpl/gentoo_postfix.conf.master
@@ -22,7 +22,7 @@
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, check_helo_access regexp:{config_dir}/blacklist_helo
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
install/tpl/opensuse_amavisd_conf.master
@@ -145,8 +145,8 @@
$myhostname = 'linux-jfp8.site';
$notify_method  = 'smtp:[127.0.0.1]:10027';
$forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!
$notify_method  = 'smtp:*:*';
$forward_method = 'smtp:*:*';  # set to undef with milter!
# $final_virus_destiny      = D_DISCARD;
# $final_banned_destiny     = D_BOUNCE;
install/tpl/opensuse_dovecot-sql.conf.master
@@ -139,4 +139,4 @@
# The iterate_query is required for the doveadm command only and works only on dovecot 2 servers.
# Do not enable it on Dovecot 1.x servers
# iterate_query = SELECT email as user FROM mail_user
# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}'
install/tpl/opensuse_dovecot2.conf.master
@@ -60,3 +60,4 @@
  postmaster_address = webmaster@localhost
  mail_plugins = quota sieve
}
mail_plugins = $mail_plugins quota
install/tpl/opensuse_postfix.conf.master
@@ -25,7 +25,7 @@
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, check_helo_access regexp:{config_dir}/blacklist_helo
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
install/update.php
@@ -137,7 +137,7 @@
//** Include the distribution-specific installer class library and configuration
if(is_file('dist/lib/'.$dist['baseid'].'.lib.php')) include_once 'dist/lib/'.$dist['baseid'].'.lib.php';
include_once 'dist/lib/'.$dist['id'].'.lib.php';
include_once 'dist/conf/'.$dist['id'].'.conf.php';
include_once 'dist/conf/'.$dist['confid'].'.conf.php';
//** Get hostname
exec('hostname -f', $tmp_out);
interface/lib/classes/json_handler.inc.php
@@ -88,15 +88,11 @@
        $keys = array_keys($_GET);
        $method = reset($keys);
        $params = array();
        if(is_array($_POST)) {
            foreach($_POST as $key => $val) {
                $tmp = json_decode($val, true);
                if(!$tmp) $params[] = $val;
                else $params[] = (array)$tmp;
            }
        }
        $raw = file_get_contents("php://input");
        $json = json_decode($raw, true);
        if(!is_array($json)) $this->_return_json('invalid_data', 'The JSON data sent to the api is invalid');
        if(array_key_exists($method, $this->methods) == false) {
            $this->_return_json('invalid_method', 'Method ' . $method . ' does not exist');
        }
@@ -109,7 +105,14 @@
        if(method_exists($this->classes[$class_name], $method) == false) {
            $this->_return_json('invalid_method', 'Method ' . $method . ' does not exist in the class it was expected (' . $class_name . ')');
        }
        $methObj = new ReflectionMethod($this->classes[$class_name], $method);
        foreach($methObj->getParameters() as $param) {
            $pname = $param->name;
            if(isset($json[$pname])) $params[] = $json[$pname];
            else $params[] = null;
        }
        try {
            $this->_return_json('ok', '', call_user_func_array(array($this->classes[$class_name], $method), $params));
        } catch(SoapFault $e) {
interface/web/dns/dns_spf_edit.php
@@ -163,7 +163,7 @@
        }
        $spf_ip = trim($this->dataRecord['spf_ip']);
        if (!empty($spf_ip)) {
            $rec = split(' ', $spf_ip);
            $rec = explode(' ', $spf_ip);
            foreach ($rec as $ip) {
                $temp_ip = explode('/', $ip);
                if (filter_var($temp_ip[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
@@ -187,7 +187,7 @@
        }
        $spf_hostname = trim($this->dataRecord['spf_hostname']);
        if (!empty($spf_hostname)) {
            $rec = split(' ', $spf_hostname);
            $rec = explode(' ', $spf_hostname);
            foreach ($rec as $hostname) { 
                if (preg_match('/^[a-zA-Z0-9\\.\\-\\*]{0,64}$/', $hostname)) 
                    $spf_record[] = 'a:' . $hostname;
@@ -200,7 +200,7 @@
        }
        $spf_domain = trim($this->dataRecord['spf_domain']);
        if (!empty($spf_domain)) {
            $rec = split(' ', $spf_domain);
            $rec = explode(' ', $spf_domain);
            foreach ($rec as $domain) {
                if (preg_match('/^[_a-zA-Z0-9\\.\\-\\*]{0,64}$/', $domain))
                    $spf_record[] = 'include:' . $domain;
interface/web/help/list/support_message.list.php
@@ -43,7 +43,8 @@
    'suffix' => '',
    'width'  => '',
    'datasource'=> array (  'type' => 'SQL',
        'querystring'  => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username',
//        'querystring'  => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username',
        'querystring'  => 'SELECT userid,username FROM sys_user ORDER BY username',
        'keyfield'  => 'userid',
        'valuefield' => 'username'
    ),
interface/web/help/support_message_edit.php
@@ -73,7 +73,7 @@
            }
            $confirmation_message .= "\n\n".$app->tform->lng('message_txt').": \"".$this->dataRecord['message']."\"";
            $confirmation_message .= "\n\nISPConfig: ".($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST'];
            $app->functions->mail($sender_email, $subject, $confirmation_message, $recipient_email);
            if ($this->dataRecord['subject'] != '' && $this->dataRecord['message'] != '') $app->functions->mail($sender_email, $subject, $confirmation_message, $recipient_email);
        } else {
            $app->tform->errorMessage .= $app->tform->lng("recipient_or_sender_email_address_not_valid_txt")."<br />";
        }
interface/web/mail/mail_domain_edit.php
@@ -241,7 +241,7 @@
        if($_SESSION["s"]["user"]["typ"] != 'admin') {
            // Get the limits of the client
            $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
            $client = $app->db->queryOneRecord("SELECT limit_maildomain, default_mailserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
            $client = $app->db->queryOneRecord("SELECT client.mail_servers, limit_maildomain, default_mailserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
            // When the record is updated
            if($this->id > 0) {
                // restore the server ID if the user is not admin and record is edited
interface/web/themes/default/assets/stylesheets/ispconfig.css
@@ -231,6 +231,9 @@
    transition: background ease 500ms; }
    .table tbody tr:last-child {
      border-radius: 4px; }
    .table tbody tr td {
      text-overflow: ellipsis;
      overflow-x: hidden; }
.tfooter {
  margin-top: -1px;
interface/web/themes/default/assets/stylesheets/ispconfig.min.css
@@ -1 +1 @@
body{overflow-y:scroll}.left{float:left}.right{float:right}.clear:after{content:"";display:table;clear:both}.marginTop15{margin-top:15px}.paddingX5{padding-left:5px!important;padding-right:5px!important}.width65{width:65px}.form-group input[type='checkbox']{margin-top:10px}.control-label{font-weight:normal}.control-label:after{content:":"}.formbutton-default{padding:6px 30px;border-bottom-style:solid;border-bottom-width:2px;font-size:12px;font-weight:bold;transition:all ease 500ms}.formbutton-success,.formbutton-danger{padding:6px 30px;border-style:solid;border-width:1px;border-bottom-width:solid;font-size:12px;font-weight:bold;transition:all ease 500ms}.formbutton-narrow{padding:6px 8px;margin-left:2px;margin-right:2px}.formbutton-narrower{padding:4px 6px}#main-wrapper{margin:0 auto;width:95%;max-width:1260px}#logo{float:left;width:200px;height:65px;margin-top:10px}#logo a{display:block;width:100%;height:100%}#headerbar{float:right}#searchform{float:right;margin-top:16px}#searchform>div{position:relative;display:table}#searchform>div>div{display:table-cell;padding-right:8px;vertical-align:top}#searchform .icon{padding:0 2px;font-size:16px}#logout-button{float:right;margin-top:16px;margin-left:25px;border-bottom-style:solid;border-bottom-width:2px;transition:all ease 500ms}#main-navigation{margin-top:24px}#main-navigation a{padding:0 12px;height:70px;border-bottom-style:solid;botder-bottom-width:2px;transition:all ease 500ms}#main-navigation .icon{font-size:32px}#main-navigation .title{margin-top:2px;font-weight:bold}.btn-group-justified .btn{border-right-width:0}.btn-group-justified .btn:last-of-type{border-right-width:1px}#content{width:78%}#passBar,#passText{display:inline-block;vertical-align:middle}#passBar{height:11px;padding:0}#passBar>div{height:100%;padding:0}#sidebar{margin-top:27px;width:18%;border-style:solid;border-width:1px;border-radius:4px}#sidebar header{margin:1px;padding:0 10px;height:40px;line-height:40px;font-weight:bold;border-top-left-radius:2px;border-top-right-radius:2px}#sidebar ul{margin:0;padding:0;list-style:none}#sidebar li{padding:10px;border-top-style:solid;border-top-width:1px;font-size:12px}#sidebar a{text-decoration:none;transition:color ease 500ms}.page-header{margin:20px 0;padding:0}.alert-notification a{font-weight:bold;text-decoration:none;transition:color ease 500ms}.alert-label,.alert-content{display:inline-block;vertical-align:top}.alert-label{width:60px}.modules{margin:0;padding:0;list-style:none}.modules li{float:left;margin-right:15px;margin-bottom:15px;padding:8px;width:200px;border-radius:4px;border-style:solid;border-width:1px}.modules .icon{float:left;margin-right:15px;font-size:50px}.modules .left{margin-top:5px}.modules .title{margin-top:6px;margin-left:20px;font-size:16px;font-weight:bold}.modules .button{margin-top:10px;width:100%;border-bottom-style:solid;border-bottom-width:2px;font-size:12px;font-weight:bold;transition:all ease 500ms}.modules a{text-decoration:none}.table-wrapper{margin-bottom:20px;border-radius:4px;border-style:solid;border-width:1px}.table{table-layout:fixed;margin-bottom:1px}.table caption{padding:5px 10px;text-align:left;font-weight:bold;font-size:18px;border-bottom-style:solid;border-bottom-width:1px}.table tbody tr{border-top-style:solid;border-top-width:1px;transition:background ease 500ms}.table tbody tr:last-child{border-radius:4px}.tfooter{margin-top:-1px;height:40px;border-top-style:solid;border-top-width:1px}.pagination{margin:10px 0}.progress{display:inline-block;margin-bottom:0;width:150px;height:10px}p.fieldset-legend{display:none}.content-tab-wrapper{border-style:solid;border-width:1px;border-radius:4px}.content-tab-wrapper .nav-tabs>li>a{border-radius:0;border:none!important;border-right-style:solid!important;border-right-width:1px!important;outline:0;font-weight:bold;transition:background ease 500ms}.content-tab-wrapper .nav-tabs li:not(:first-child) a{margin-left:-2px}.tab-content{padding:25px 10px}.input-group-btn .icon-calendar{font-size:18px}thead.dark th{height:40px;line-height:40px;font-weight:normal}thead.dark th.small-col{width:14%}thead.dark th.tiny-col{width:8%;overflow:hidden;text-overflow:ellipsis}thead.dark th[data-column]{cursor:pointer}thead.dark th[data-column][data-ordered]{font-weight:bold;position:relative}thead.dark th[data-column][data-ordered]:before{content:"";display:block;position:absolute;right:5px;top:16px;width:0;height:0;vertical-align:middle;border-bottom:5px solid #fff;border-top:5px solid transparent;border-right:5px solid transparent;border-left:6px solid transparent;line-height:inherit}thead.dark th[data-column][data-ordered="desc"]:before{top:21px;border-bottom:5px solid transparent;border-top:5px solid #fff}thead.dark td input,thead.dark td select{width:100%}#footer{margin:20px 0;padding-top:20px;border-top-style:solid;border-top-width:1px;text-align:center;font-size:10px}.menu-btn{display:none;cursor:pointer}.df-container,.gs-container{position:relative}.gs-container:after{content:"";display:table;clear:both}ul.df-resultbox,ul.gs-resultbox{display:block;position:absolute;left:0;top:100%;margin:0;padding:0 0 10px;min-width:250px;max-width:500px;z-index:999999;background:#fff;list-style:none;box-shadow:2px 2px 5px #c5c5c5;border-radius:5px}ul.df-resultbox li,ul.gs-resultbox li{float:none;display:block;cursor:pointer;padding:0 10px}ul.gs-resultbox li{padding:3px 10px;line-height:1.1;font-size:.9em}ul.df-resultbox li:nth-child(even),ul.gs-resultbox li:nth-child(even){background:#f2f5f7}ul.df-resultbox li.df-cheader,ul.gs-resultbox li.gs-cheader{background:#fff;padding-top:10px;margin-bottom:10px}ul.df-resultbox li p,ul.gs-resultbox li p{margin-bottom:0;color:inherit}ul.df-resultbox li.df-cheader p.df-cheader-title,ul.gs-resultbox li.gs-cheader p.gs-cheader-title{font-weight:bold;margin-bottom:0}ul.df-resultbox li.df-cheader p.df-cheader-limit,ul.gs-resultbox li.gs-cheader p.gs-cheader-limit{font-weight:normal}ul.df-resultbox li.df-cdata img,ul.gs-resultbox li.gs-cdata img{margin-right:12px}ul.df-resultbox li.df-cdata p span.df-cdata-title,ul.gs-resultbox li.gs-cdata p span.gs-cdata-title{font-weight:bold}ul.gs-resultbox li.gs-cdata p span.gs-cdata-title{display:block}ul.df-resultbox li:first-child,ul.gs-resultbox li:first-child{border-top-left-radius:5px;border-top-right-radius:5px}ul.df-resultbox li:last-child,ul.gs-resultbox li:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px}span.flags{background-image:url("../images/flags_sprite.png");background-repeat:no-repeat;min-height:20px;padding-left:27px;vertical-align:middle}span.flag-el{background-position:0 -1475px}span.flag-ad{background-position:0 -1px}span.flag-ae{background-position:0 -23px}span.flag-af{background-position:0 -45px}span.flag-ag{background-position:0 -67px}span.flag-ai{background-position:0 -89px}span.flag-al{background-position:0 -111px}span.flag-am{background-position:0 -133px}span.flag-an{background-position:0 -155px}span.flag-ao{background-position:0 -177px}span.flag-aq{background-position:0 -199px}span.flag-ar{background-position:0 -221px}span.flag-as{background-position:0 -243px}span.flag-at{background-position:0 -265px}span.flag-au{background-position:0 -287px}span.flag-aw{background-position:0 -309px}span.flag-ax{background-position:0 -331px}span.flag-az{background-position:0 -353px}span.flag-ba{background-position:0 -375px}span.flag-bb{background-position:0 -397px}span.flag-bd{background-position:0 -419px}span.flag-be{background-position:0 -441px}span.flag-bf{background-position:0 -463px}span.flag-bg{background-position:0 -485px}span.flag-bh{background-position:0 -507px}span.flag-bi{background-position:0 -529px}span.flag-bj{background-position:0 -551px}span.flag-bm{background-position:0 -573px}span.flag-bn{background-position:0 -595px}span.flag-bo{background-position:0 -617px}span.flag-br{background-position:0 -639px}span.flag-bs{background-position:0 -661px}span.flag-bt{background-position:0 -683px}span.flag-bv{background-position:0 -705px}span.flag-bw{background-position:0 -727px}span.flag-by{background-position:0 -749px}span.flag-bz{background-position:0 -771px}span.flag-ca{background-position:0 -793px}span.flag-cc{background-position:0 -837px}span.flag-cd{background-position:0 -859px}span.flag-cf{background-position:0 -881px}span.flag-cg{background-position:0 -903px}span.flag-ch{background-position:0 -925px}span.flag-ci{background-position:0 -947px}span.flag-ck{background-position:0 -969px}span.flag-cl{background-position:0 -991px}span.flag-cm{background-position:0 -1013px}span.flag-cn{background-position:0 -1035px}span.flag-co{background-position:0 -1057px}span.flag-cr{background-position:0 -1079px}span.flag-cs{background-position:0 -1101px}span.flag-cu{background-position:0 -1123px}span.flag-cv{background-position:0 -1145px}span.flag-cx{background-position:0 -1167px}span.flag-cy{background-position:0 -1189px}span.flag-cz{background-position:0 -1211px}span.flag-de{background-position:0 -1233px}span.flag-dj{background-position:0 -1255px}span.flag-dk{background-position:0 -1277px}span.flag-dm{background-position:0 -1299px}span.flag-do{background-position:0 -1321px}span.flag-dz{background-position:0 -1343px}span.flag-ec{background-position:0 -1365px}span.flag-ee{background-position:0 -1387px}span.flag-eg{background-position:0 -1409px}span.flag-eh{background-position:0 -1431px}span.flag-er{background-position:0 -1475px}span.flag-es{background-position:0 -1497px}span.flag-et{background-position:0 -1519px}span.flag-fi{background-position:0 -1585px}span.flag-fj{background-position:0 -1607px}span.flag-fk{background-position:0 -1629px}span.flag-fm{background-position:0 -1651px}span.flag-fo{background-position:0 -1673px}span.flag-fr{background-position:0 -1695px}span.flag-ga{background-position:0 -1717px}span.flag-gb,span.flag-en{background-position:0 -1739px}span.flag-gd{background-position:0 -1761px}span.flag-ge{background-position:0 -1783px}span.flag-gf{background-position:0 -1805px}span.flag-gh{background-position:0 -1827px}span.flag-gi{background-position:0 -1849px}span.flag-gl{background-position:0 -1871px}span.flag-gm{background-position:0 -1893px}span.flag-gn{background-position:0 -1915px}span.flag-gp{background-position:0 -1937px}span.flag-gq{background-position:0 -1959px}span.flag-gr{background-position:0 -1981px}span.flag-gs{background-position:0 -2003px}span.flag-gt{background-position:0 -2025px}span.flag-gu{background-position:0 -2047px}span.flag-gw{background-position:0 -2069px}span.flag-gy{background-position:0 -2091px}span.flag-hk{background-position:0 -2113px}span.flag-hm{background-position:0 -2135px}span.flag-hn{background-position:0 -2157px}span.flag-hr{background-position:0 -2179px}span.flag-ht{background-position:0 -2201px}span.flag-hu{background-position:0 -2223px}span.flag-id{background-position:0 -2245px}span.flag-ie{background-position:0 -2267px}span.flag-il{background-position:0 -2289px}span.flag-in{background-position:0 -2311px}span.flag-io{background-position:0 -2333px}span.flag-iq{background-position:0 -2355px}span.flag-ir{background-position:0 -2377px}span.flag-is{background-position:0 -2399px}span.flag-it{background-position:0 -2421px}span.flag-jm{background-position:0 -2443px}span.flag-jo{background-position:0 -2465px}span.flag-jp{background-position:0 -2487px}span.flag-ke{background-position:0 -2509px}span.flag-kg{background-position:0 -2531px}span.flag-kh{background-position:0 -2553px}span.flag-ki{background-position:0 -2575px}span.flag-km{background-position:0 -2597px}span.flag-kn{background-position:0 -2619px}span.flag-kp{background-position:0 -2641px}span.flag-kr{background-position:0 -2663px}span.flag-kw{background-position:0 -2685px}span.flag-ky{background-position:0 -2707px}span.flag-kz{background-position:0 -2729px}span.flag-la{background-position:0 -2751px}span.flag-lb{background-position:0 -2773px}span.flag-lc{background-position:0 -2795px}span.flag-li{background-position:0 -2817px}span.flag-lk{background-position:0 -2839px}span.flag-lr{background-position:0 -2861px}span.flag-ls{background-position:0 -2883px}span.flag-lt{background-position:0 -2905px}span.flag-lu{background-position:0 -2927px}span.flag-lv{background-position:0 -2949px}span.flag-ly{background-position:0 -2971px}span.flag-ma{background-position:0 -2993px}span.flag-mc{background-position:0 -3015px}span.flag-md{background-position:0 -3037px}span.flag-me{background-position:0 -3059px}span.flag-mg{background-position:0 -3081px}span.flag-mh{background-position:0 -3103px}span.flag-mk{background-position:0 -3125px}span.flag-ml{background-position:0 -3147px}span.flag-mm{background-position:0 -3169px}span.flag-mn{background-position:0 -3191px}span.flag-mo{background-position:0 -3213px}span.flag-mp{background-position:0 -3235px}span.flag-mq{background-position:0 -3257px}span.flag-mr{background-position:0 -3279px}span.flag-ms{background-position:0 -3301px}span.flag-mt{background-position:0 -3323px}span.flag-mu{background-position:0 -3345px}span.flag-mv{background-position:0 -3367px}span.flag-mw{background-position:0 -3389px}span.flag-mx{background-position:0 -3411px}span.flag-my{background-position:0 -3433px}span.flag-mz{background-position:0 -3455px}span.flag-na{background-position:0 -3477px}span.flag-nc{background-position:0 -3499px}span.flag-ne{background-position:0 -3521px}span.flag-nf{background-position:0 -3543px}span.flag-ng{background-position:0 -3565px}span.flag-ni{background-position:0 -3587px}span.flag-nl{background-position:0 -3609px}span.flag-no{background-position:0 -3631px}span.flag-np{background-position:0 -3653px}span.flag-nr{background-position:0 -3675px}span.flag-nu{background-position:0 -3697px}span.flag-nz{background-position:0 -3719px}span.flag-om{background-position:0 -3741px}span.flag-pa{background-position:0 -3763px}span.flag-pe{background-position:0 -3785px}span.flag-pf{background-position:0 -3807px}span.flag-pg{background-position:0 -3829px}span.flag-ph{background-position:0 -3851px}span.flag-pk{background-position:0 -3873px}span.flag-pl{background-position:0 -3895px}span.flag-pm{background-position:0 -3917px}span.flag-pn{background-position:0 -3939px}span.flag-pr{background-position:0 -3961px}span.flag-ps{background-position:0 -3983px}span.flag-pt{background-position:0 -4005px}span.flag-pw{background-position:0 -4027px}span.flag-py{background-position:0 -4049px}span.flag-qa{background-position:0 -4071px}span.flag-re{background-position:0 -4093px}span.flag-ro{background-position:0 -4115px}span.flag-rs{background-position:0 -4137px}span.flag-ru{background-position:0 -4159px}span.flag-rw{background-position:0 -4181px}span.flag-sa{background-position:0 -4203px}span.flag-sb{background-position:0 -4225px}span.flag-sc{background-position:0 -4247px}span.flag-sd{background-position:0 -4291px}span.flag-se{background-position:0 -4313px}span.flag-sg{background-position:0 -4335px}span.flag-sh{background-position:0 -4357px}span.flag-si{background-position:0 -4379px}span.flag-sj{background-position:0 -4401px}span.flag-sk{background-position:0 -4423px}span.flag-sl{background-position:0 -4445px}span.flag-sm{background-position:0 -4467px}span.flag-sn{background-position:0 -4489px}span.flag-so{background-position:0 -4511px}span.flag-sr{background-position:0 -4533px}span.flag-st{background-position:0 -4555px}span.flag-sv{background-position:0 -4577px}span.flag-sy{background-position:0 -4599px}span.flag-sz{background-position:0 -4621px}span.flag-tc{background-position:0 -4643px}span.flag-td{background-position:0 -4665px}span.flag-tf{background-position:0 -4687px}span.flag-tg{background-position:0 -4709px}span.flag-th{background-position:0 -4731px}span.flag-tj{background-position:0 -4753px}span.flag-tk{background-position:0 -4775px}span.flag-tl{background-position:0 -4797px}span.flag-tm{background-position:0 -4819px}span.flag-tn{background-position:0 -4841px}span.flag-to{background-position:0 -4863px}span.flag-tr{background-position:0 -4885px}span.flag-tt{background-position:0 -4907px}span.flag-tv{background-position:0 -4929px}span.flag-tw{background-position:0 -4951px}span.flag-tz{background-position:0 -4973px}span.flag-ua{background-position:0 -4995px}span.flag-ug{background-position:0 -5017px}span.flag-um{background-position:0 -5039px}span.flag-us{background-position:0 -5061px}span.flag-uy{background-position:0 -5083px}span.flag-uz{background-position:0 -5105px}span.flag-va{background-position:0 -5127px}span.flag-vc{background-position:0 -5149px}span.flag-ve{background-position:0 -5171px}span.flag-vg{background-position:0 -5193px}span.flag-vi{background-position:0 -5215px}span.flag-vn{background-position:0 -5237px}span.flag-vu{background-position:0 -5259px}span.flag-wf{background-position:0 -5303px}span.flag-ws{background-position:0 -5325px}span.flag-ye{background-position:0 -5347px}span.flag-yt{background-position:0 -5369px}span.flag-za{background-position:0 -5391px}span.flag-zm{background-position:0 -5413px}span.flag-zw{background-position:0 -5435px}@media(-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#logo{background-image:url("../images/logo@2x.png");background-size:200px 65px}}.input-group-field{display:table-cell;vertical-align:middle;border-radius:4px;min-width:1%;white-space:nowrap}.input-group-field .form-control{border-radius:inherit!important}.input-group-field:not(:first-child):not(:last-child){border-radius:0}.input-group-field:not(:first-child):not(:last-child) .form-control{border-left-width:0;border-right-width:0}.input-group-field:last-child{border-top-left-radius:0;border-bottom-left-radius:0}
body{overflow-y:scroll}.left{float:left}.right{float:right}.clear:after{content:"";display:table;clear:both}.marginTop15{margin-top:15px}.paddingX5{padding-left:5px!important;padding-right:5px!important}.width65{width:65px}.form-group input[type='checkbox']{margin-top:10px}.control-label{font-weight:normal}.control-label:after{content:":"}.formbutton-default{padding:6px 30px;border-bottom-style:solid;border-bottom-width:2px;font-size:12px;font-weight:bold;transition:all ease 500ms}.formbutton-success,.formbutton-danger{padding:6px 30px;border-style:solid;border-width:1px;border-bottom-width:solid;font-size:12px;font-weight:bold;transition:all ease 500ms}.formbutton-narrow{padding:6px 8px;margin-left:2px;margin-right:2px}.formbutton-narrower{padding:4px 6px}#main-wrapper{margin:0 auto;width:95%;max-width:1260px}#logo{float:left;width:200px;height:65px;margin-top:10px}#logo a{display:block;width:100%;height:100%}#headerbar{float:right}#searchform{float:right;margin-top:16px}#searchform>div{position:relative;display:table}#searchform>div>div{display:table-cell;padding-right:8px;vertical-align:top}#searchform .icon{padding:0 2px;font-size:16px}#logout-button{float:right;margin-top:16px;margin-left:25px;border-bottom-style:solid;border-bottom-width:2px;transition:all ease 500ms}#main-navigation{margin-top:24px}#main-navigation a{padding:0 12px;height:70px;border-bottom-style:solid;botder-bottom-width:2px;transition:all ease 500ms}#main-navigation .icon{font-size:32px}#main-navigation .title{margin-top:2px;font-weight:bold}.btn-group-justified .btn{border-right-width:0}.btn-group-justified .btn:last-of-type{border-right-width:1px}#content{width:78%}#passBar,#passText{display:inline-block;vertical-align:middle}#passBar{height:11px;padding:0}#passBar>div{height:100%;padding:0}#sidebar{margin-top:27px;width:18%;border-style:solid;border-width:1px;border-radius:4px}#sidebar header{margin:1px;padding:0 10px;height:40px;line-height:40px;font-weight:bold;border-top-left-radius:2px;border-top-right-radius:2px}#sidebar ul{margin:0;padding:0;list-style:none}#sidebar li{padding:10px;border-top-style:solid;border-top-width:1px;font-size:12px}#sidebar a{text-decoration:none;transition:color ease 500ms}.page-header{margin:20px 0;padding:0}.alert-notification a{font-weight:bold;text-decoration:none;transition:color ease 500ms}.alert-label,.alert-content{display:inline-block;vertical-align:top}.alert-label{width:60px}.modules{margin:0;padding:0;list-style:none}.modules li{float:left;margin-right:15px;margin-bottom:15px;padding:8px;width:200px;border-radius:4px;border-style:solid;border-width:1px}.modules .icon{float:left;margin-right:15px;font-size:50px}.modules .left{margin-top:5px}.modules .title{margin-top:6px;margin-left:20px;font-size:16px;font-weight:bold}.modules .button{margin-top:10px;width:100%;border-bottom-style:solid;border-bottom-width:2px;font-size:12px;font-weight:bold;transition:all ease 500ms}.modules a{text-decoration:none}.table-wrapper{margin-bottom:20px;border-radius:4px;border-style:solid;border-width:1px}.table{table-layout:fixed;margin-bottom:1px}.table caption{padding:5px 10px;text-align:left;font-weight:bold;font-size:18px;border-bottom-style:solid;border-bottom-width:1px}.table tbody tr{border-top-style:solid;border-top-width:1px;transition:background ease 500ms}.table tbody tr:last-child{border-radius:4px}.table tbody tr td{text-overflow:ellipsis;overflow-x:hidden}.tfooter{margin-top:-1px;height:40px;border-top-style:solid;border-top-width:1px}.pagination{margin:10px 0}.progress{display:inline-block;margin-bottom:0;width:150px;height:10px}p.fieldset-legend{display:none}.content-tab-wrapper{border-style:solid;border-width:1px;border-radius:4px}.content-tab-wrapper .nav-tabs>li>a{border-radius:0;border:none!important;border-right-style:solid!important;border-right-width:1px!important;outline:0;font-weight:bold;transition:background ease 500ms}.content-tab-wrapper .nav-tabs li:not(:first-child) a{margin-left:-2px}.tab-content{padding:25px 10px}.input-group-btn .icon-calendar{font-size:18px}thead.dark th{height:40px;line-height:40px;font-weight:normal}thead.dark th.small-col{width:14%}thead.dark th.tiny-col{width:8%;overflow:hidden;text-overflow:ellipsis}thead.dark th[data-column]{cursor:pointer}thead.dark th[data-column][data-ordered]{font-weight:bold;position:relative}thead.dark th[data-column][data-ordered]:before{content:"";display:block;position:absolute;right:5px;top:16px;width:0;height:0;vertical-align:middle;border-bottom:5px solid #fff;border-top:5px solid transparent;border-right:5px solid transparent;border-left:6px solid transparent;line-height:inherit}thead.dark th[data-column][data-ordered="desc"]:before{top:21px;border-bottom:5px solid transparent;border-top:5px solid #fff}thead.dark td input,thead.dark td select{width:100%}#footer{margin:20px 0;padding-top:20px;border-top-style:solid;border-top-width:1px;text-align:center;font-size:10px}.menu-btn{display:none;cursor:pointer}.df-container,.gs-container{position:relative}.gs-container:after{content:"";display:table;clear:both}ul.df-resultbox,ul.gs-resultbox{display:block;position:absolute;left:0;top:100%;margin:0;padding:0 0 10px;min-width:250px;max-width:500px;z-index:999999;background:#fff;list-style:none;box-shadow:2px 2px 5px #c5c5c5;border-radius:5px}ul.df-resultbox li,ul.gs-resultbox li{float:none;display:block;cursor:pointer;padding:0 10px}ul.gs-resultbox li{padding:3px 10px;line-height:1.1;font-size:.9em}ul.df-resultbox li:nth-child(even),ul.gs-resultbox li:nth-child(even){background:#f2f5f7}ul.df-resultbox li.df-cheader,ul.gs-resultbox li.gs-cheader{background:#fff;padding-top:10px;margin-bottom:10px}ul.df-resultbox li p,ul.gs-resultbox li p{margin-bottom:0;color:inherit}ul.df-resultbox li.df-cheader p.df-cheader-title,ul.gs-resultbox li.gs-cheader p.gs-cheader-title{font-weight:bold;margin-bottom:0}ul.df-resultbox li.df-cheader p.df-cheader-limit,ul.gs-resultbox li.gs-cheader p.gs-cheader-limit{font-weight:normal}ul.df-resultbox li.df-cdata img,ul.gs-resultbox li.gs-cdata img{margin-right:12px}ul.df-resultbox li.df-cdata p span.df-cdata-title,ul.gs-resultbox li.gs-cdata p span.gs-cdata-title{font-weight:bold}ul.gs-resultbox li.gs-cdata p span.gs-cdata-title{display:block}ul.df-resultbox li:first-child,ul.gs-resultbox li:first-child{border-top-left-radius:5px;border-top-right-radius:5px}ul.df-resultbox li:last-child,ul.gs-resultbox li:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px}span.flags{background-image:url("../images/flags_sprite.png");background-repeat:no-repeat;min-height:20px;padding-left:27px;vertical-align:middle}span.flag-el{background-position:0 -1475px}span.flag-ad{background-position:0 -1px}span.flag-ae{background-position:0 -23px}span.flag-af{background-position:0 -45px}span.flag-ag{background-position:0 -67px}span.flag-ai{background-position:0 -89px}span.flag-al{background-position:0 -111px}span.flag-am{background-position:0 -133px}span.flag-an{background-position:0 -155px}span.flag-ao{background-position:0 -177px}span.flag-aq{background-position:0 -199px}span.flag-ar{background-position:0 -221px}span.flag-as{background-position:0 -243px}span.flag-at{background-position:0 -265px}span.flag-au{background-position:0 -287px}span.flag-aw{background-position:0 -309px}span.flag-ax{background-position:0 -331px}span.flag-az{background-position:0 -353px}span.flag-ba{background-position:0 -375px}span.flag-bb{background-position:0 -397px}span.flag-bd{background-position:0 -419px}span.flag-be{background-position:0 -441px}span.flag-bf{background-position:0 -463px}span.flag-bg{background-position:0 -485px}span.flag-bh{background-position:0 -507px}span.flag-bi{background-position:0 -529px}span.flag-bj{background-position:0 -551px}span.flag-bm{background-position:0 -573px}span.flag-bn{background-position:0 -595px}span.flag-bo{background-position:0 -617px}span.flag-br{background-position:0 -639px}span.flag-bs{background-position:0 -661px}span.flag-bt{background-position:0 -683px}span.flag-bv{background-position:0 -705px}span.flag-bw{background-position:0 -727px}span.flag-by{background-position:0 -749px}span.flag-bz{background-position:0 -771px}span.flag-ca{background-position:0 -793px}span.flag-cc{background-position:0 -837px}span.flag-cd{background-position:0 -859px}span.flag-cf{background-position:0 -881px}span.flag-cg{background-position:0 -903px}span.flag-ch{background-position:0 -925px}span.flag-ci{background-position:0 -947px}span.flag-ck{background-position:0 -969px}span.flag-cl{background-position:0 -991px}span.flag-cm{background-position:0 -1013px}span.flag-cn{background-position:0 -1035px}span.flag-co{background-position:0 -1057px}span.flag-cr{background-position:0 -1079px}span.flag-cs{background-position:0 -1101px}span.flag-cu{background-position:0 -1123px}span.flag-cv{background-position:0 -1145px}span.flag-cx{background-position:0 -1167px}span.flag-cy{background-position:0 -1189px}span.flag-cz{background-position:0 -1211px}span.flag-de{background-position:0 -1233px}span.flag-dj{background-position:0 -1255px}span.flag-dk{background-position:0 -1277px}span.flag-dm{background-position:0 -1299px}span.flag-do{background-position:0 -1321px}span.flag-dz{background-position:0 -1343px}span.flag-ec{background-position:0 -1365px}span.flag-ee{background-position:0 -1387px}span.flag-eg{background-position:0 -1409px}span.flag-eh{background-position:0 -1431px}span.flag-er{background-position:0 -1475px}span.flag-es{background-position:0 -1497px}span.flag-et{background-position:0 -1519px}span.flag-fi{background-position:0 -1585px}span.flag-fj{background-position:0 -1607px}span.flag-fk{background-position:0 -1629px}span.flag-fm{background-position:0 -1651px}span.flag-fo{background-position:0 -1673px}span.flag-fr{background-position:0 -1695px}span.flag-ga{background-position:0 -1717px}span.flag-gb,span.flag-en{background-position:0 -1739px}span.flag-gd{background-position:0 -1761px}span.flag-ge{background-position:0 -1783px}span.flag-gf{background-position:0 -1805px}span.flag-gh{background-position:0 -1827px}span.flag-gi{background-position:0 -1849px}span.flag-gl{background-position:0 -1871px}span.flag-gm{background-position:0 -1893px}span.flag-gn{background-position:0 -1915px}span.flag-gp{background-position:0 -1937px}span.flag-gq{background-position:0 -1959px}span.flag-gr{background-position:0 -1981px}span.flag-gs{background-position:0 -2003px}span.flag-gt{background-position:0 -2025px}span.flag-gu{background-position:0 -2047px}span.flag-gw{background-position:0 -2069px}span.flag-gy{background-position:0 -2091px}span.flag-hk{background-position:0 -2113px}span.flag-hm{background-position:0 -2135px}span.flag-hn{background-position:0 -2157px}span.flag-hr{background-position:0 -2179px}span.flag-ht{background-position:0 -2201px}span.flag-hu{background-position:0 -2223px}span.flag-id{background-position:0 -2245px}span.flag-ie{background-position:0 -2267px}span.flag-il{background-position:0 -2289px}span.flag-in{background-position:0 -2311px}span.flag-io{background-position:0 -2333px}span.flag-iq{background-position:0 -2355px}span.flag-ir{background-position:0 -2377px}span.flag-is{background-position:0 -2399px}span.flag-it{background-position:0 -2421px}span.flag-jm{background-position:0 -2443px}span.flag-jo{background-position:0 -2465px}span.flag-jp{background-position:0 -2487px}span.flag-ke{background-position:0 -2509px}span.flag-kg{background-position:0 -2531px}span.flag-kh{background-position:0 -2553px}span.flag-ki{background-position:0 -2575px}span.flag-km{background-position:0 -2597px}span.flag-kn{background-position:0 -2619px}span.flag-kp{background-position:0 -2641px}span.flag-kr{background-position:0 -2663px}span.flag-kw{background-position:0 -2685px}span.flag-ky{background-position:0 -2707px}span.flag-kz{background-position:0 -2729px}span.flag-la{background-position:0 -2751px}span.flag-lb{background-position:0 -2773px}span.flag-lc{background-position:0 -2795px}span.flag-li{background-position:0 -2817px}span.flag-lk{background-position:0 -2839px}span.flag-lr{background-position:0 -2861px}span.flag-ls{background-position:0 -2883px}span.flag-lt{background-position:0 -2905px}span.flag-lu{background-position:0 -2927px}span.flag-lv{background-position:0 -2949px}span.flag-ly{background-position:0 -2971px}span.flag-ma{background-position:0 -2993px}span.flag-mc{background-position:0 -3015px}span.flag-md{background-position:0 -3037px}span.flag-me{background-position:0 -3059px}span.flag-mg{background-position:0 -3081px}span.flag-mh{background-position:0 -3103px}span.flag-mk{background-position:0 -3125px}span.flag-ml{background-position:0 -3147px}span.flag-mm{background-position:0 -3169px}span.flag-mn{background-position:0 -3191px}span.flag-mo{background-position:0 -3213px}span.flag-mp{background-position:0 -3235px}span.flag-mq{background-position:0 -3257px}span.flag-mr{background-position:0 -3279px}span.flag-ms{background-position:0 -3301px}span.flag-mt{background-position:0 -3323px}span.flag-mu{background-position:0 -3345px}span.flag-mv{background-position:0 -3367px}span.flag-mw{background-position:0 -3389px}span.flag-mx{background-position:0 -3411px}span.flag-my{background-position:0 -3433px}span.flag-mz{background-position:0 -3455px}span.flag-na{background-position:0 -3477px}span.flag-nc{background-position:0 -3499px}span.flag-ne{background-position:0 -3521px}span.flag-nf{background-position:0 -3543px}span.flag-ng{background-position:0 -3565px}span.flag-ni{background-position:0 -3587px}span.flag-nl{background-position:0 -3609px}span.flag-no{background-position:0 -3631px}span.flag-np{background-position:0 -3653px}span.flag-nr{background-position:0 -3675px}span.flag-nu{background-position:0 -3697px}span.flag-nz{background-position:0 -3719px}span.flag-om{background-position:0 -3741px}span.flag-pa{background-position:0 -3763px}span.flag-pe{background-position:0 -3785px}span.flag-pf{background-position:0 -3807px}span.flag-pg{background-position:0 -3829px}span.flag-ph{background-position:0 -3851px}span.flag-pk{background-position:0 -3873px}span.flag-pl{background-position:0 -3895px}span.flag-pm{background-position:0 -3917px}span.flag-pn{background-position:0 -3939px}span.flag-pr{background-position:0 -3961px}span.flag-ps{background-position:0 -3983px}span.flag-pt{background-position:0 -4005px}span.flag-pw{background-position:0 -4027px}span.flag-py{background-position:0 -4049px}span.flag-qa{background-position:0 -4071px}span.flag-re{background-position:0 -4093px}span.flag-ro{background-position:0 -4115px}span.flag-rs{background-position:0 -4137px}span.flag-ru{background-position:0 -4159px}span.flag-rw{background-position:0 -4181px}span.flag-sa{background-position:0 -4203px}span.flag-sb{background-position:0 -4225px}span.flag-sc{background-position:0 -4247px}span.flag-sd{background-position:0 -4291px}span.flag-se{background-position:0 -4313px}span.flag-sg{background-position:0 -4335px}span.flag-sh{background-position:0 -4357px}span.flag-si{background-position:0 -4379px}span.flag-sj{background-position:0 -4401px}span.flag-sk{background-position:0 -4423px}span.flag-sl{background-position:0 -4445px}span.flag-sm{background-position:0 -4467px}span.flag-sn{background-position:0 -4489px}span.flag-so{background-position:0 -4511px}span.flag-sr{background-position:0 -4533px}span.flag-st{background-position:0 -4555px}span.flag-sv{background-position:0 -4577px}span.flag-sy{background-position:0 -4599px}span.flag-sz{background-position:0 -4621px}span.flag-tc{background-position:0 -4643px}span.flag-td{background-position:0 -4665px}span.flag-tf{background-position:0 -4687px}span.flag-tg{background-position:0 -4709px}span.flag-th{background-position:0 -4731px}span.flag-tj{background-position:0 -4753px}span.flag-tk{background-position:0 -4775px}span.flag-tl{background-position:0 -4797px}span.flag-tm{background-position:0 -4819px}span.flag-tn{background-position:0 -4841px}span.flag-to{background-position:0 -4863px}span.flag-tr{background-position:0 -4885px}span.flag-tt{background-position:0 -4907px}span.flag-tv{background-position:0 -4929px}span.flag-tw{background-position:0 -4951px}span.flag-tz{background-position:0 -4973px}span.flag-ua{background-position:0 -4995px}span.flag-ug{background-position:0 -5017px}span.flag-um{background-position:0 -5039px}span.flag-us{background-position:0 -5061px}span.flag-uy{background-position:0 -5083px}span.flag-uz{background-position:0 -5105px}span.flag-va{background-position:0 -5127px}span.flag-vc{background-position:0 -5149px}span.flag-ve{background-position:0 -5171px}span.flag-vg{background-position:0 -5193px}span.flag-vi{background-position:0 -5215px}span.flag-vn{background-position:0 -5237px}span.flag-vu{background-position:0 -5259px}span.flag-wf{background-position:0 -5303px}span.flag-ws{background-position:0 -5325px}span.flag-ye{background-position:0 -5347px}span.flag-yt{background-position:0 -5369px}span.flag-za{background-position:0 -5391px}span.flag-zm{background-position:0 -5413px}span.flag-zw{background-position:0 -5435px}@media(-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#logo{background-image:url("../images/logo@2x.png");background-size:200px 65px}}.input-group-field{display:table-cell;vertical-align:middle;border-radius:4px;min-width:1%;white-space:nowrap}.input-group-field .form-control{border-radius:inherit!important}.input-group-field:not(:first-child):not(:last-child){border-radius:0}.input-group-field:not(:first-child):not(:last-child) .form-control{border-left-width:0;border-right-width:0}.input-group-field:last-child{border-top-left-radius:0;border-bottom-left-radius:0}
interface/web/themes/default/assets/stylesheets/select2x2.png
remoting_client/examples/rest_example.php
New file
@@ -0,0 +1,57 @@
<?php
$remote_user = 'test';
$remote_pass = 'apipassword';
$remote_url = 'https://yourserver.com:8080/remote/json.php';
function restCall($method, $data) {
    global $remote_url;
    if(!is_array($data)) return false;
    $json = json_encode($data);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_POST, 1);
    if($data) curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
    // needed for self-signed cert
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    // end of needed for self-signed cert
    curl_setopt($curl, CURLOPT_URL, $remote_url . '?' . $method);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}
$result = restCall('login', array('username' => $remote_user, 'password' => $remote_pass, 'client_login' => false));
if($result) {
    $data = json_decode($result, true);
    if(!$data) die("ERROR!\n");
    $session_id = $data['response'];
    $result = restCall('client_get', array('session_id' => $session_id, 'client_id' => array('username' => 'abcde')));
    if($result) var_dump(json_decode($result, true));
    else print "Could not get client_get result\n";
    // or by id
    $result = restCall('client_get', array('session_id' => $session_id, 'client_id' => 2));
    if($result) var_dump(json_decode($result, true));
    else print "Could not get client_get result\n";
    // or all
    $result = restCall('client_get', array('session_id' => $session_id, 'client_id' => array()));
    if($result) var_dump(json_decode($result, true));
    else print "Could not get client_get result\n";
    $result = restCall('logout', array('session_id' => $session_id));
    if($result) var_dump(json_decode($result, true));
    else print "Could not get logout result\n";
}
server/conf/vhost.conf.master
@@ -57,9 +57,9 @@
        SSLProtocol All -SSLv2 -SSLv3
        SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
        SSLHonorCipherOrder     on
        <IfModule mod_headers.c>
        Header always add Strict-Transport-Security "max-age=15768000"
        </IfModule>
        # <IfModule mod_headers.c>
        # Header always add Strict-Transport-Security "max-age=15768000"
        # </IfModule>
        SSLCertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='ssl_domain'>.crt
        SSLCertificateKeyFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='ssl_domain'>.key
<tmpl_if name='has_bundle_cert'>
server/lib/classes/cron.d/900-letsencrypt.inc.php
@@ -36,8 +36,10 @@
    public function onRunJob() {
        global $app, $conf;
        if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
            exec('/root/.local/share/letsencrypt/bin/letsencrypt renew');
        $letsencrypt = array_shift( split("\n", `which letsencrypt /root/.local/share/letsencrypt/bin/letsencrypt`) );
        if(is_executable($letsencrypt)) {
            exec($letsencrypt . ' -n renew');
            $app->services->restartServiceDelayed('httpd', 'reload');
        }
        
        parent::onRunJob();
server/lib/classes/monitor_tools.inc.php
@@ -35,23 +35,29 @@
    //   This is the same code as in install/lib/install.lib.php
    //   So if you change it here, you also have to change it in there!
    //   Please do not forget to remove the swriteln(); - lines here at this file
    public function get_distname() {
    function get_distname() {
        $distname = '';
        $distver = '';
        $distid = '';
        $distbaseid = '';
    $distname = '';
    $distver = '';
    $distid = '';
    $distbaseid = '';
        //** Debian or Ubuntu
        if (file_exists('/etc/debian_version')) {
            if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu')) {
                if (strstr(trim(file_get_contents('/etc/issue')), 'LTS')) {
    //** Debian or Ubuntu
    if(file_exists('/etc/debian_version')) {
        // Check if this is Ubuntu and not Debian
        if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu') || (is_file('/etc/os-release') && stristr(file_get_contents('/etc/os-release'), 'Ubuntu'))) {
            $issue = file_get_contents('/etc/issue');
            // Use content of /etc/issue file
            if(strstr($issue,'Ubuntu')) {
                if (strstr(trim($issue), 'LTS')) {
                    $lts=" LTS";
                } else {
                    $lts="";
                }
                $issue=file_get_contents('/etc/issue');
                $distname = 'Ubuntu';
                $distid = 'debian40';
                $distbaseid = 'debian';
@@ -61,206 +67,262 @@
                $mainver = explode('.', $ver);
                $mainver = array_filter($mainver);
                $mainver = current($mainver).'.'.next($mainver);
                switch ($mainver){
                case "16.04":
                    $relname = "(Xenial Xerus)";
                    $distid = 'ubuntu1604';
                    break;
                case "15.10":
                    $relname = "(Wily Werewolf)";
                    break;
                case "15.04":
                    $relname = "(Vivid Vervet)";
                    break;
                case "14.10":
                    $relname = "(Utopic Unicorn)";
                    break;
                case "14.04":
                    $relname = "(Trusty Tahr)";
                    break;
                case "13.10":
                    $relname = "(Saucy Salamander)";
                    break;
                case "13.04":
                    $relname = "(Raring Ringtail)";
                    break;
                case "12.10":
                    $relname = "(Quantal Quetzal)";
                    break;
                case "12.04":
                    $relname = "(Precise Pangolin)";
                    break;
                case "11.10":
                    $relname = "(Oneiric Ocelot)";
                    break;
                case "11.14":
                    $relname = "(Natty Narwhal)";
                    break;
                case "10.10":
                    $relname = "(Maverick Meerkat)";
                    break;
                case "10.04":
                    $relname = "(Lucid Lynx)";
                    break;
                case "9.10":
                    $relname = "(Karmic Koala)";
                    break;
                case "9.04":
                    $relname = "(Jaunty Jackpole)";
                    break;
                case "8.10":
                    $relname = "(Intrepid Ibex)";
                    break;
                case "8.04":
                    $relname = "(Hardy Heron)";
                    break;
                case "7.10":
                    $relname = "(Gutsy Gibbon)";
                    break;
                case "7.04":
                    $relname = "(Feisty Fawn)";
                    break;
                case "6.10":
                    $relname = "(Edgy Eft)";
                    break;
                case "6.06":
                    $relname = "(Dapper Drake)";
                    break;
                case "5.10":
                    $relname = "(Breezy Badger)";
                    break;
                case "5.04":
                    $relname = "(Hoary Hedgehog)";
                    break;
                case "4.10":
                    $relname = "(Warty Warthog)";
                    break;
                default:
                    $relname = "UNKNOWN";
            // Use content of /etc/os-release file
            } else {
                $os_release = file_get_contents('/etc/os-release');
                if (strstr(trim($os_release), 'LTS')) {
                    $lts = " LTS";
                } else {
                    $lts = "";
                }
                $distver = $ver.$lts." ".$relname;
            } elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
                $distname = 'Debian';
                $distver = '4.0';
                $distname = 'Ubuntu';
                $distid = 'debian40';
                $distbaseid = 'debian';
            } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '5.0')) {
                $distname = 'Debian';
                $distver = 'Lenny';
                $distid = 'debian40';
                $distbaseid = 'debian';
            } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '6.0') || trim(file_get_contents('/etc/debian_version')) == 'squeeze/sid') {
                $distname = 'Debian';
                $distver = 'Squeeze/Sid';
                $distid = 'debian60';
                $distbaseid = 'debian';
            } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || substr(trim(file_get_contents('/etc/debian_version')),0,2) == '7.' || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
                $distname = 'Debian';
                $distver = 'Wheezy/Sid';
                $distid = 'debian60';
                $distbaseid = 'debian';
            } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '8') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '8') {
                $distname = 'Debian';
                $distver = 'Jessie';
                $distid = 'debian60';
                $distbaseid = 'debian';
            } else {
                $distname = 'Debian';
                $distver = 'Unknown';
                $distid = 'debian40';
                $distbaseid = 'debian';
                preg_match("/.*VERSION=\"(.*)\".*/ui", $os_release, $ver);
                $ver = str_replace("LTS", "", $ver[1]);
                $ver = explode(" ", $ver, 2);
                $ver = reset($ver);
                $mainver = $ver;
            }
        }
        //** OpenSuSE
        elseif (file_exists('/etc/SuSE-release')) {
            if (stristr(file_get_contents('/etc/SuSE-release'), '11.0')) {
                $distname = 'openSUSE';
                $distver = '11.0';
                $distid = 'opensuse110';
                $distbaseid = 'opensuse';
            } elseif (stristr(file_get_contents('/etc/SuSE-release'), '11.1')) {
                $distname = 'openSUSE';
                $distver = '11.1';
                $distid = 'opensuse110';
                $distbaseid = 'opensuse';
            } elseif (stristr(file_get_contents('/etc/SuSE-release'), '11.2')) {
                $distname = 'openSUSE';
                $distver = '11.1';
                $distid = 'opensuse110';
                $distbaseid = 'opensuse';
            } else {
                $distname = 'openSUSE';
                $distver = 'Unknown';
                $distid = 'opensuse110';
                $distbaseid = 'opensuse';
            switch ($mainver){
            case "16.04":
                $relname = "(Xenial Xerus)";
                $distconfid = 'ubuntu1604';
                break;
            case "15.10":
                $relname = "(Wily Werewolf)";
                break;
            case "15.04":
                $relname = "(Vivid Vervet)";
                break;
            case "14.10":
                $relname = "(Utopic Unicorn)";
                break;
            case "14.04":
                $relname = "(Trusty Tahr)";
                break;
            case "13.10":
                $relname = "(Saucy Salamander)";
                break;
            case "13.04":
                $relname = "(Raring Ringtail)";
                break;
            case "12.10":
                $relname = "(Quantal Quetzal)";
                break;
            case "12.04":
                $relname = "(Precise Pangolin)";
                break;
            case "11.10":
                $relname = "(Oneiric Ocelot)";
                break;
            case "11.14":
                $relname = "(Natty Narwhal)";
                break;
            case "10.10":
                $relname = "(Maverick Meerkat)";
                break;
            case "10.04":
                $relname = "(Lucid Lynx)";
                break;
            case "9.10":
                $relname = "(Karmic Koala)";
                break;
            case "9.04":
                $relname = "(Jaunty Jackpole)";
                break;
            case "8.10":
                $relname = "(Intrepid Ibex)";
                break;
            case "8.04":
                $relname = "(Hardy Heron)";
                break;
            case "7.10":
                $relname = "(Gutsy Gibbon)";
                break;
            case "7.04":
                $relname = "(Feisty Fawn)";
                break;
            case "6.10":
                $relname = "(Edgy Eft)";
                break;
            case "6.06":
                $relname = "(Dapper Drake)";
                break;
            case "5.10":
                $relname = "(Breezy Badger)";
                break;
            case "5.04":
                $relname = "(Hoary Hedgehog)";
                break;
            case "4.10":
                $relname = "(Warty Warthog)";
                break;
            default:
                $relname = "UNKNOWN";
            }
        }
        //** Redhat
        elseif (file_exists('/etc/redhat-release')) {
            $content = file_get_contents('/etc/redhat-release');
            if (stristr($content, 'Fedora release 9 (Sulphur)')) {
                $distname = 'Fedora';
                $distver = '9';
                $distid = 'fedora9';
                $distbaseid = 'fedora';
            } elseif (stristr($content, 'Fedora release 10 (Cambridge)')) {
                $distname = 'Fedora';
                $distver = '10';
                $distid = 'fedora9';
                $distbaseid = 'fedora';
            } elseif (stristr($content, 'Fedora release 10')) {
                $distname = 'Fedora';
                $distver = '11';
                $distid = 'fedora9';
                $distbaseid = 'fedora';
            } elseif (stristr($content, 'CentOS release 5.2 (Final)')) {
                $distname = 'CentOS';
                $distver = '5.2';
                $distid = 'centos52';
                $distbaseid = 'fedora';
            } elseif (stristr($content, 'CentOS release 5.3 (Final)')) {
                $distname = 'CentOS';
                $distver = '5.3';
                $distid = 'centos53';
                $distbaseid = 'fedora';
            } elseif(stristr($content, 'CentOS Linux release 6')) {
                $distname = 'CentOS';
                $distver = 'Unknown';
                $distid = 'centos53';
                $distbaseid = 'fedora';
            } elseif(stristr($content, 'CentOS Linux release 7')) {
                $distname = 'CentOS';
                $distver = 'Unknown';
                $distid = 'centos53';
                $distbaseid = 'fedora';
            } else {
                $distname = 'Redhat';
                $distver = 'Unknown';
                $distid = 'fedora9';
                $distbaseid = 'fedora';
            }
        }
        //** Gentoo
        elseif (file_exists('/etc/gentoo-release')) {
            $content = file_get_contents('/etc/gentoo-release');
            preg_match_all('/([0-9]{1,2})/', $content, $version);
            $distname = 'Gentoo';
            $distver = $version[0][0] . $version[0][1];
            $distid = 'gentoo';
            $distbaseid = 'gentoo';
            $distver = $ver.$lts." ".$relname;
            swriteln("Operating System: ".$distname.' '.$distver."\n");
        } elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
            $distname = 'Debian';
            $distver = '4.0';
            $distid = 'debian40';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian 4.0 or compatible\n");
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '5.0')) {
            $distname = 'Debian';
            $distver = 'Lenny';
            $distid = 'debian40';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian Lenny or compatible\n");
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '6.0') || trim(file_get_contents('/etc/debian_version')) == 'squeeze/sid') {
            $distname = 'Debian';
            $distver = 'Squeeze/Sid';
            $distid = 'debian60';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian 6.0 (Squeeze/Sid) or compatible\n");
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || substr(trim(file_get_contents('/etc/debian_version')),0,2) == '7.' || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
            $distname = 'Debian';
            $distver = 'Wheezy/Sid';
            $distid = 'debian60';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian 7.0 (Wheezy/Sid) or compatible\n");
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '8') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '8') {
            $distname = 'Debian';
            $distver = 'Jessie';
            $distid = 'debian60';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian 8.0 (Jessie) or compatible\n");
        } else {
            die('Unrecognized GNU/Linux distribution');
            $distname = 'Debian';
            $distver = 'Unknown';
            $distid = 'debian40';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian or compatible, unknown version.\n");
        }
    }
        return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'baseid' => $distbaseid);
    //** OpenSuSE
    elseif(file_exists('/etc/SuSE-release')) {
        if(stristr(file_get_contents('/etc/SuSE-release'), '11.0')) {
            $distname = 'openSUSE';
            $distver = '11.0';
            $distid = 'opensuse110';
            $distbaseid = 'opensuse';
            swriteln("Operating System: openSUSE 11.0 or compatible\n");
        } elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.1')) {
            $distname = 'openSUSE';
            $distver = '11.1';
            $distid = 'opensuse110';
            $distbaseid = 'opensuse';
            swriteln("Operating System: openSUSE 11.1 or compatible\n");
        } elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.2')) {
            $distname = 'openSUSE';
            $distver = '11.2';
            $distid = 'opensuse112';
            $distbaseid = 'opensuse';
            swriteln("Operating System: openSUSE 11.2 or compatible\n");
        }  else {
            $distname = 'openSUSE';
            $distver = 'Unknown';
            $distid = 'opensuse112';
            $distbaseid = 'opensuse';
            swriteln("Operating System: openSUSE or compatible, unknown version.\n");
        }
    }
    //** Redhat
    elseif(file_exists('/etc/redhat-release')) {
        $content = file_get_contents('/etc/redhat-release');
        if(stristr($content, 'Fedora release 9 (Sulphur)')) {
            $distname = 'Fedora';
            $distver = '9';
            $distid = 'fedora9';
            $distbaseid = 'fedora';
            swriteln("Operating System: Fedora 9 or compatible\n");
        } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) {
            $distname = 'Fedora';
            $distver = '10';
            $distid = 'fedora9';
            $distbaseid = 'fedora';
            swriteln("Operating System: Fedora 10 or compatible\n");
        } elseif(stristr($content, 'Fedora release 10')) {
            $distname = 'Fedora';
            $distver = '11';
            $distid = 'fedora9';
            $distbaseid = 'fedora';
            swriteln("Operating System: Fedora 11 or compatible\n");
        } elseif(stristr($content, 'CentOS release 5.2 (Final)')) {
            $distname = 'CentOS';
            $distver = '5.2';
            $distid = 'centos52';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 5.2 or compatible\n");
        } elseif(stristr($content, 'CentOS release 5.3 (Final)')) {
            $distname = 'CentOS';
            $distver = '5.3';
            $distid = 'centos53';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 5.3 or compatible\n");
        } elseif(stristr($content, 'CentOS release 5')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
            $distid = 'centos53';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 5 or compatible\n");
        } elseif(stristr($content, 'CentOS Linux release 6')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
            $distid = 'centos53';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 6 or compatible\n");
        } elseif(stristr($content, 'CentOS Linux release 7.2')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
            $distid = 'centos70';
            $distconfid = 'centos72';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 7.2\n");
        } elseif(stristr($content, 'CentOS Linux release 7')) {
            $distname = 'CentOS';
            $distver = 'Unknown';
            $distid = 'centos70';
            $distbaseid = 'fedora';
            swriteln("Operating System: CentOS 7 or compatible\n");
        } else {
            $distname = 'Redhat';
            $distver = 'Unknown';
            $distid = 'fedora9';
            $distbaseid = 'fedora';
            swriteln("Operating System: Redhat or compatible, unknown version.\n");
        }
    }
    //** Gentoo
    elseif(file_exists('/etc/gentoo-release')) {
        $content = file_get_contents('/etc/gentoo-release');
        preg_match_all('/([0-9]{1,2})/', $content, $version);
        $distname = 'Gentoo';
        $distver = $version[0][0].$version[0][1];
        $distid = 'gentoo';
        $distbaseid = 'gentoo';
        swriteln("Operating System: Gentoo $distver or compatible\n");
    } else {
        die('Unrecognized GNU/Linux distribution');
    }
    // Set $distconfid to distid, if no different id for the config is defined
    if(!isset($distconfid)) $distconfid = $distid;
    return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'confid' => $distconfid, 'baseid' => $distbaseid);
    }
    // this function remains in the tools class, because it is used by cron AND rescue
server/plugins-available/apache2_plugin.inc.php
@@ -1234,8 +1234,9 @@
                $app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
                
                $success = false;
                if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
                    $success = $this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
                $letsencrypt = array_shift( split("\n", `which letsencrypt /root/.local/share/letsencrypt/bin/letsencrypt`) );
                if(is_executable($letsencrypt)) {
                    $success = $this->_exec($letsencrypt . " auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
                }
                if(!$success) {
                    // error issuing cert
server/plugins-available/nginx_plugin.inc.php
@@ -1312,8 +1312,9 @@
                $app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
                
                $success = false;
                if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
                    $success = $this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
                $letsencrypt = array_shift( split("\n", `which letsencrypt /root/.local/share/letsencrypt/bin/letsencrypt`) );
                if(is_executable($letsencrypt)) {
                    $success = $this->_exec($letsencrypt . " auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
                }
                if(!$success) {
                    // error issuing cert