function shell_exec2($cmdline)
{
    $cmdline = str_replace("/usr/share/artica-postfix/ressources/exec.", "/usr/share/artica-postfix/exec.", $cmdline);
    if (function_exists("debug_backtrace")) {
        $trace = debug_backtrace();
        if (isset($trace[0])) {
            $T_FUNCTION = $trace[0]["function"];
            $T_LINE = $trace[0]["line"];
            $T_FILE = basename($trace[0]["file"]);
        }
        if (isset($trace[1])) {
            $T_FUNCTION = $trace[1]["function"];
            $T_LINE = $trace[1]["line"];
            $T_FILE = basename($trace[1]["file"]);
        }
    }
    if (!isset($GLOBALS["shell_exec2"])) {
        $GLOBALS["shell_exec2"] = array();
    }
    if (!is_array($GLOBALS["shell_exec2"])) {
        $GLOBALS["shell_exec2"] = array();
    }
    $md5 = md5($cmdline);
    $time = date("YmdHi");
    if (isset($GLOBALS["shell_exec2"][$time][$md5])) {
        if ($GLOBALS["VERBOSE"]) {
            echo "ERROR ALREADY EXECUTED {$cmdline}\n";
        }
        return;
    }
    if (count($GLOBALS["shell_exec2"]) > 5) {
        $GLOBALS["shell_exec2"] = array();
    }
    $GLOBALS["shell_exec2"][$time][$md5] = true;
    if (!preg_match("#\\/nohup\\s+#", $cmdline)) {
        $cmdline = "{$GLOBALS["nohup"]} {$cmdline}";
    }
    if (!preg_match("#\\s+>\\/.*?2>\\&1#", $cmdline)) {
        if (!preg_match("#\\&\$#", $cmdline)) {
            $cmdline = "{$cmdline} >/dev/null 2>&1 &";
        }
    }
    if ($GLOBALS["VERBOSE"]) {
        echo "******************* EXEC ********************************\n{$cmdline}\n********************************\n";
    }
    if (!$GLOBALS["VERBOSE"]) {
        _statussquid("{$T_FILE}:{$T_FUNCTION}:{$T_LINE}:Execute: {$cmdline}", __FUNCTION__, __LINE__);
    }
    shell_exec($cmdline);
}
Beispiel #2
0
function launch_all_status($force = false)
{
    $conf = array();
    $CacheFileTime = "/usr/share/artica-postfix/ressources/logs/global.status.ini";
    mkdir_test("/usr/share/artica-postfix/ressources/logs", 0755, true);
    if (!is_file("/usr/share/artica-postfix/ressources/logs/php.log")) {
        @touch("/usr/share/artica-postfix/ressources/logs/php.log");
    }
    events("launch_all_status() -> xLoadAvg().., started", __FUNCTION__, __LINE__);
    xLoadAvg();
    ChecksRoutes();
    events("global.status.ini OK next step...", __FUNCTION__, __LINE__);
    $trace = debug_backtrace();
    if (isset($trace[1])) {
        $called = " called by " . basename($trace[1]["file"]) . " {$trace[1]["function"]}() line {$trace[1]["line"]}";
        events("{$called}", __FUNCTION__, __LINE__);
    }
    events("global.status.ini OK CheckCallable()", __FUNCTION__, __LINE__);
    CheckCallable();
    if (!system_is_overloaded()) {
        $GLOBALS["CLASS_UNIX"]->Process1();
        if (!is_file("/usr/share/artica-postfix/ressources/logs/global.versions.conf")) {
            events("-> artica-install --write-version", __FUNCTION__, __LINE__);
            $GLOBALS["CLASS_UNIX"]->THREAD_COMMAND_SET("/usr/share/artica-postfix/bin/artica-install --write-versions");
        } else {
            $filetime = file_time_min("/usr/share/artica-postfix/ressources/logs/global.versions.conf");
            events("global.versions.conf={$filetime}mn ", __FUNCTION__, __LINE__);
            if ($filetime > 60) {
                events("global.versions.conf \"{$filetime}\"mn", __FUNCTION__, __LINE__);
                @unlink("/usr/share/artica-postfix/ressources/logs/global.versions.conf");
                $GLOBALS["CLASS_UNIX"]->THREAD_COMMAND_SET("/usr/share/artica-postfix/bin/artica-install --write-versions");
            }
        }
    }
    @unlink($GLOBALS["MY-POINTER"]);
    @file_put_contents($GLOBALS["MY-POINTER"], time());
    $authtailftime = "/etc/artica-postfix/pids/auth-tail.time";
    $unix = new unix();
    $timefile = $unix->file_time_min($authtailftime);
    events("/etc/artica-postfix/pids/auth-tail.time -> {$timefile}Mn", __FUNCTION__, __LINE__);
    if ($timefile > 15) {
        @unlink($timefile);
        @file_put_contents($authtailftime, time());
        $cmd = trim("{$GLOBALS["nohup"]} /etc/init.d/artica-postfix restart auth-logger >/dev/null 2>&1 &");
        events($cmd);
        shell_exec2($cmd);
    }
    $TimeF = "/etc/artica-postfix/pids/exec.system.last.php.xstart.php.time";
    $timefile = $unix->file_time_min($TimeF);
    if ($timefile > 60) {
        $cmd = trim("{$GLOBALS["nohup"]} {$GLOBALS["NICE"]} {$GLOBALS["PHP5"]} " . dirname(__FILE__) . "/exec.system.last.php >/dev/null 2>&1 &");
        events($cmd);
        shell_exec2($cmd);
    }
    @unlink($CacheFileTime);
    @file_put_contents($CacheFileTime, time());
    if (is_dir("/etc/resolvconf")) {
        if (!is_file("/etc/resolvconf/resolv.conf.d/base")) {
            $cmd = trim("{$GLOBALS["nohup"]} {$GLOBALS["NICE"]} {$GLOBALS["PHP5"]} " . dirname(__FILE__) . "/exec.virtuals-ip.php --resolvconf >/dev/null 2>&1 &");
            events($cmd);
            shell_exec2($cmd);
        }
    }
    events("**************** START ALL STATUS ****************");
    events("global.status.ini start processing", __FUNCTION__, __LINE__);
    events_syslog("start processing");
    $t1 = time();
    $GLOBALS["CLASS_UNIX"]->chmod_func(0755, "/etc/artica-postfix/settings/Daemons/*");
    $functions = array("Default_values", "load_stats", "fail2ban", "unifi_mongodb", "unifi", "Popuplate_cron", "squid_dashboard_statistics", "philesight", "cron", "transmission_daemon", "disks_monitor", "InfluxDB", "CleanLogs", "monit", "kav4Proxy_status", "dansguardian_master_status", "wpa_supplicant", "fetchmail", "milter_greylist", "irqbalance", "framework", "pdns_server", "pdns_recursor", "cyrus_imap", "mysql_server", "mysql_mgmt", "mysql_replica", "openldap", "saslauthd", "syslogger", "amavis", "amavis_milter", "boa", "lighttpd", "clamd", "clamscan", "clammilter", "freshclam", "retranslator_httpd", "spamassassin_milter", "spamassassin", "postfix", "postfix_logger", "mailman", "kas3_milter", "kas3_ap", "rpcbind", "smbd", "nmbd", "winbindd", "scanned_only", "roundcube", "cups", "apache_groupware", "gdm", "xfce", "vmtools", "hamachi", "artica_notifier", "dhcpd_server", "pure_ftpd", "mldonkey", "backuppc", "kav4fs", "kav4fsavs", "apache_ocsweb", "ocs_agent", "openssh", "gluster", "auditd", "milter_dkim", "dropbox", "artica_policy", "virtualbox_webserv", "tftpd", "dhcpd_server", "crossroads", "artica_status", "bandwith", "pptpd", "pptp_clients", "apt_mirror", "ddclient", "cluebringer", "apachesrc", "zarafa_server2", "assp", "openvpn", "vboxguest", "sabnzbdplus", "MemorySync", "MemoryWatchdog", "SwapWatchdog", "artica_meta_scheduler", "OpenVPNClientsStatus", "stunnel", "meta_checks", "avahi_daemon", "CheckCurl", "vnstat", "NetAdsWatchdog", "munin", "autofs", "greyhole", "dnsmasq", "iscsi", "watchdog_yorel", "netatalk", "postfwd2", "vps_servers", "smartd", "crossroads_multiple", "auth_tail", "greyhole_watchdog", "greensql", "nscd", "tomcat", "openemm", "openemm_sendmail", "cgroups", "ntpd_server", "arpd", "ps_mem", "ipsec", "yaffas", "ifconfig_network", "testingrrd", "zarafa_multi", "memcached", "UpdateUtilityHTTP", "udevd_daemon", "dbus_daemon", "ejabberd", "pymsnt", "arkwsd", "arkeiad", "haproxy", "klms_status", "klmsdb_status", "klms_milter", "CleanLogs", "mimedefangmx", "mimedefang", "zarafa_search", "snort", "amavisdb", "nginx", "nginx_db", "checksyslog", "freeradius", "maillog_watchdog", "arp_spoof", "caches_pages", "php_fpm", "php_fcgi", "CleanCloudCatz", "syslog_db", "roundcube_db", "Scheduler", "exim4", "snmpd", "ntopng", "redis_server", "bwm_ng", "XMail", "conntrackd", "iptables", "rdpproxy_authhook", "rdpproxy", "vde_all", "iptables_tasks", "l7filter", "syncthing", "killstrangeprocesses");
    ToSyslog("launch_all_status(): " . count($functions));
    $postfix_functions = array();
    $postconf = $GLOBALS["CLASS_UNIX"]->find_program("postconf");
    ToSyslog("launch_all_status(): postconf: {$postconf}");
    if (is_file($postconf)) {
        include_once '/usr/share/artica-postfix/ressources/class.status.postfix.inc';
        $postfix_functions = postfix_increment_func(array());
        if ($GLOBALS["ZARAFA_INSTALLED"]) {
            include_once '/usr/share/artica-postfix/ressources/class.status.zarafa.inc';
            $postfix_functions = zarafa_increment_func($postfix_functions);
        }
    }
    if ($GLOBALS["SQUID_INSTALLED"]) {
        include_once '/usr/share/artica-postfix/ressources/class.status.squid.inc';
        $squid_functions = squid_increment_func(array());
    }
    ToSyslog("launch_all_status(): " . count($functions));
    $stats = new status_hardware();
    $data1 = $GLOBALS["TIME_CLASS"];
    $data2 = time();
    $difference = $data2 - $data1;
    $min = round($difference / 60);
    if ($min > 9) {
        events("reloading classes...", __FUNCTION__, __LINE__);
        $GLOBALS["TIME_CLASS"] = time();
        $GLOBALS["CLASS_SOCKETS"] = new sockets();
        $GLOBALS["CLASS_USERS"] = new settings_inc();
        $GLOBALS["CLASS_UNIX"] = new unix();
    }
    if (!isset($GLOBALS["CLASS_UNIX"])) {
        $GLOBALS["CLASS_SOCKETS"] = new sockets();
        $GLOBALS["CLASS_USERS"] = new settings_inc();
        $GLOBALS["CLASS_UNIX"] = new unix();
    }
    $AllFunctionCount = count($functions);
    events("running {$AllFunctionCount} functions ", __FUNCTION__, __LINE__);
    if ($force) {
        events("running function in FORCE MODE !", __FUNCTION__, __LINE__);
    }
    $max = count($functions);
    $c = 0;
    $TEX = time();
    while (list($num, $func) = each($functions)) {
        $c++;
        $mem = round(memory_get_usage() / 1024 / 1000, 2);
        if ($GLOBALS["VERBOSE"]) {
            echo "*****\n{$func} {$c}/{$max}\n*****\n";
        }
        if (!function_exists($func)) {
            continue;
        }
        events("Running {$c}/{$max} {$func}() function {$mem}MB", __FUNCTION__, __LINE__);
        if (is_file("/etc/artica-postfix/ARTICA_STATUS_RELOAD")) {
            ToSyslog("Reloading settings and libraries...");
            Reload();
        }
        if (!$force) {
            if (system_is_overloaded(basename(__FILE__))) {
                events("System is overloaded: {$GLOBALS["SYSTEM_INTERNAL_LOAD"]}, aborting", __FUNCTION__, __LINE__);
                ToSyslog("System is overloaded: {$GLOBALS["SYSTEM_INTERNAL_LOAD"]}, aborting");
                AmavisWatchdog();
                greyhole_watchdog();
                break;
            }
        }
        try {
            if ($GLOBALS["VERBOSE"]) {
                echo "***** {$c}/{$max} {$func} *****\n";
            }
            $results = call_user_func($func);
            $GLOBALS["LAST_FUNCTION_USED"] = "{$func}()";
        } catch (Exception $e) {
            ToSyslog("Fatal while running function {$func} ({$e})");
        }
        if (trim($results) != null) {
            $conf[] = $results;
        }
    }
    events("Postfix functions: " . count($postfix_functions) . " functions", __FUNCTION__, __LINE__);
    if (count($postfix_functions) > 0) {
        $c = 0;
        $max = count($postfix_functions);
        while (list($num, $func) = each($postfix_functions)) {
            $c++;
            $mem = round(memory_get_usage() / 1024 / 1000, 2);
            if ($GLOBALS["VERBOSE"]) {
                echo "*****\npostfix_functions {$func} {$c}/{$max}\n*****\n";
            }
            events("Postfix functions: Running {$c}/{$max} {$func}() function {$mem}MB", __FUNCTION__, __LINE__);
            if (!function_exists($func)) {
                continue;
            }
            if (!$force) {
                if (system_is_overloaded(basename(__FILE__))) {
                    events("System is overloaded: {$GLOBALS["SYSTEM_INTERNAL_LOAD"]}, aborting", __FUNCTION__, __LINE__);
                    ToSyslog("System is overloaded: {$GLOBALS["SYSTEM_INTERNAL_LOAD"]}, aborting");
                    AmavisWatchdog();
                    greyhole_watchdog();
                    break;
                }
            }
            try {
                $results = call_user_func($func);
            } catch (Exception $e) {
                ToSyslog("Fatal while running function {$func} ({$e})");
            }
            if (trim($results) != null) {
                $conf[] = $results;
            }
        }
    }
    events("Squid functions: " . count($squid_functions) . " functions", __FUNCTION__, __LINE__);
    if (count($squid_functions) > 0) {
        $c = 0;
        $max = count($squid_functions);
        while (list($num, $func) = each($squid_functions)) {
            $mem = round(memory_get_usage() / 1024 / 1000, 2);
            if ($GLOBALS["VERBOSE"]) {
                echo "*****\n{$func} {$c}/{$max}\n*****\n";
            }
            if (!function_exists($func)) {
                events("Squid functions: {$func}() No such function", __FUNCTION__, __LINE__);
                continue;
            }
            events("Squid functions: Running {$c}/{$max} {$func}() function {$mem}MB", __FUNCTION__, __LINE__);
            _statussquid("Launch {$func}(): {$mem}MB in memory");
            $c++;
            try {
                $results = call_user_func($func);
            } catch (Exception $e) {
                events("Fatal while running function {$func} ({$e})", __FUNCTION__, __LINE__);
                _statussquid("Fatal while running function {$func} ({$e})");
            }
            if (trim($results) != null) {
                $conf[] = $results;
            }
        }
    }
    $p = new processes_php();
    $p->MemoryInstances();
    $p = null;
    $TOOK = $GLOBALS["CLASS_UNIX"]->distanceOfTimeInWords($TEX, time(), true);
    $mem = round(memory_get_usage() / 1024 / 1000, 2);
    $percent_free = $GLOBALS["CLASS_UNIX"]->GetMemFreePourc();
    ToSyslog("Executed " . count($functions) . " functions in {$TOOK} MemFree {$percent_free}% Used memory: {$mem}MB");
    @unlink("/usr/share/artica-postfix/ressources/logs/global.status.ini");
    file_put_contents("/usr/share/artica-postfix/ressources/logs/global.status.ini", @implode("\n", $conf));
    @chmod("/usr/share/artica-postfix/ressources/logs/global.status.ini", 0777);
    @file_put_contents("/etc/artica-postfix/cache.global.status", @implode("\n", $conf));
    events("creating status done " . count($conf) . " lines....", __FUNCTION__, __LINE__);
    $sock = new sockets();
    $WizardSavedSettingsSend = $sock->GET_INFO("WizardSavedSettingsSend");
    if (!is_numeric($WizardSavedSettingsSend)) {
        $WizardSavedSettingsSend = 0;
    }
    if ($WizardSavedSettingsSend == 0) {
        $cmd = trim("{$GLOBALS["nohup"]} {$GLOBALS["NICE"]} {$GLOBALS["PHP5"]} " . dirname(__FILE__) . "/exec.web-community-filter.php --register >/dev/null 2>&1 &");
        shell_exec2($cmd);
    }
    if (!is_file("/usr/share/artica-postfix/ressources/settings.inc")) {
        $GLOBALS["CLASS_UNIX"]->Process1(true);
    }
    if (is_dir("/opt/artica-agent/usr/share/artica-agent/ressources")) {
        events("writing /opt/artica-agent/usr/share/artica-agent/ressources/status.ini", __FUNCTION__, __LINE__);
        @file_put_contents("/opt/artica-agent/usr/share/artica-agent/ressources/status.ini", @implode("\n", $conf));
    }
    if (system_is_overloaded(__FILE__)) {
        ToSyslog("Overloaded system {$GLOBALS["SYSTEM_INTERNAL_LOAD"]} {$GLOBALS["SYSTEM_INTERNAL_MEMM"]}MB Memory free");
        return;
    }
    $cmd = trim("{$GLOBALS["nohup"]} {$GLOBALS["NICE"]} {$GLOBALS["PHP5"]} " . dirname(__FILE__) . "/exec.syslog-engine.php --admin-evs >/dev/null 2>&1 &");
    events($cmd);
    shell_exec2($cmd);
    $cmd = trim("{$GLOBALS["nohup"]} {$GLOBALS["NICE"]} {$GLOBALS["PHP5"]} " . __FILE__ . " --samba >/usr/share/artica-postfix/ressources/logs/web/samba.status 2>&1 &");
    shell_exec2($cmd);
    $GLOBALS["CLASS_UNIX"]->BLKID_ALL();
    events("*****  FINISH {$TOOK} ****", __FUNCTION__, __LINE__);
    events("********************************************************************", __FUNCTION__, __LINE__);
    if ($GLOBALS["VERBOSE"]) {
        echo " *****  FINISH **** \n\n";
    }
}