function updatev2()
{
    $sock = new sockets();
    $unix = new unix();
    $GLOBALS["TEMP_PATH"] = $unix->TEMP_DIR();
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    $timeFile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".time";
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
    $ArticaDbReplicate = $sock->GET_INFO("ArticaDbReplicate");
    $CategoriesDatabasesByCron = $sock->GET_INFO("CategoriesDatabaseByCron");
    if (!is_numeric($CategoriesDatabasesByCron)) {
        $CategoriesDatabasesByCron = 1;
    }
    $DisableArticaProxyStatistics = $sock->GET_INFO("DisableArticaProxyStatistics");
    $ArticaDBPath = $sock->GET_INFO("ArticaDBPath");
    if ($ArticaDBPath == null) {
        $ArticaDBPath = "/opt/articatech";
    }
    $ManualArticaDBPath = $sock->GET_INFO("ManualArticaDBPath");
    if ($ManualArticaDBPath == null) {
        $ManualArticaDBPath = "/home/manualupdate/articadb.tar.gz";
    }
    $ManualArticaDBPathNAS = $sock->GET_INFO("ManualArticaDBPathNAS");
    $datas = unserialize(base64_decode($sock->GET_INFO("ufdbguardConfig")));
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    if (!is_numeric($ManualArticaDBPathNAS)) {
        $ManualArticaDBPathNAS = 0;
    }
    if (!is_numeric($DisableArticaProxyStatistics)) {
        $DisableArticaProxyStatistics = 0;
    }
    if (!is_numeric($ArticaDbReplicate)) {
        $ArticaDbReplicate = 0;
    }
    $WizardStatsAppliance = unserialize(base64_decode($sock->GET_INFO("WizardStatsAppliance")));
    if (!isset($WizardStatsAppliance["SERVER"])) {
        $WizardStatsAppliance["SERVER"] = null;
    }
    if ($DisableArticaProxyStatistics == 1) {
        updatev2_progress(110, "Error: Artica statistics are disabled");
    }
    if ($datas["UseRemoteUfdbguardService"] == 1) {
        updatev2_progress(110, "Error: - UseRemoteUfdbguardService -  Only used by {$WizardStatsAppliance["SERVER"]}");
        return;
    }
    if (!$GLOBALS["FORCE"]) {
        if ($CategoriesDatabasesByCron == 1) {
            if (!$GLOBALS["BYCRON"]) {
                updatev2_progress(110, "Error: Only executed by schedule...");
                return;
            }
        }
    }
    if ($GLOBALS["FORCE"]) {
        ufdbevents("***** Force enabled ***** ");
        ufdbevents("*****");
        ufdbevents("*****");
        ufdbevents("Executed as {$GLOBALS["CMDLINE"]}");
        ufdbevents("*****");
        ufdbevents("*****");
    }
    if (!$GLOBALS["CHECKTIME"]) {
        ufdbevents("***** CHECKTIME disabled ***** ");
    }
    $CHECKTIME = $unix->file_time_min($timeFile);
    ufdbevents(" **");
    ufdbevents(" **");
    ufdbevents("{$timeFile} = {$CHECKTIME}Mn");
    ufdbevents(" **");
    ufdbevents(" **");
    if (!$GLOBALS["FORCE"]) {
        if ($CHECKTIME < 240) {
            updatev2_progress(110, "STOP: current {$CHECKTIME}Mn, require 240mn");
            return;
        }
    }
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    $pid = @file_get_contents($pidfile);
    if ($unix->process_exists($pid, __FILE__)) {
        $time = $unix->PROCCESS_TIME_MIN($pid);
        if ($time < 10200) {
            updatev2_progress(110, "Error: already running pid {$pid} since {$time}Mn");
            return;
        } else {
            $kill = $unix->find_program("kill");
            unix_system_kill_force($pid);
            if ($GLOBALS["SCHEDULE_ID"] > 0) {
                artica_update_event(1, "Warning: Old task pid {$pid} since {$time}Mn has been killed, (reach 7200mn)", null, __FILE__, __LINE__);
            }
        }
    }
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    ufdbevents("Stamp {$timeFile}");
    @unlink($timeFile);
    $tlse_force_token = null;
    @file_put_contents($timeFile, time());
    @file_put_contents($pidfile, getmypid());
    $tlse_token = null;
    if ($GLOBALS["BYCRON"]) {
        $tlse_token == " --bycron --force";
    }
    if ($GLOBALS["FORCE"]) {
        $tlse_force_token = " --force";
    }
    $php = $unix->LOCATE_PHP5_BIN();
    $nohup = $unix->find_program("nohup");
    ufdbevents("Running  exec.update.squid.tlse.php");
    shell_exec("{$nohup} {$php} /usr/share/artica-postfix/exec.update.squid.tlse.php --schedule-id={$GLOBALS["SCHEDULE_ID"]}{$tlse_force_token}{$tlse_token} >/dev/null 2>&1 &");
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    updatev2_checkversion();
    updatev2_progress(12, "{runing} [" . __LINE__ . "]");
    ufdbtables(true);
    C_ICAP_TABLES(true);
    schedulemaintenance();
    EXECUTE_BLACK_INSTANCE();
}
function updatev2()
{
    $sock = new sockets();
    $unix = new unix();
    $GLOBALS["TEMP_PATH"] = $unix->TEMP_DIR();
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    $timeFile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".time";
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
    $ArticaDbReplicate = $sock->GET_INFO("ArticaDbReplicate");
    $CategoriesDatabasesByCron = $sock->GET_INFO("CategoriesDatabaseByCron");
    if (!is_numeric($CategoriesDatabasesByCron)) {
        $CategoriesDatabasesByCron = 1;
    }
    $DisableArticaProxyStatistics = $sock->GET_INFO("DisableArticaProxyStatistics");
    $CategoriesDatabasesUpdatesAllTimes = intval($sock->GET_INFO("CategoriesDatabasesUpdatesAllTimes"));
    $ArticaDBPath = $sock->GET_INFO("ArticaDBPath");
    if ($ArticaDBPath == null) {
        $ArticaDBPath = "/opt/articatech";
    }
    $ManualArticaDBPath = $sock->GET_INFO("ManualArticaDBPath");
    if ($ManualArticaDBPath == null) {
        $ManualArticaDBPath = "/home/manualupdate/articadb.tar.gz";
    }
    $ManualArticaDBPathNAS = $sock->GET_INFO("ManualArticaDBPathNAS");
    $EnableArticaMetaServer = intval($sock->GET_INFO("EnableArticaMetaServer"));
    $datas = unserialize(base64_decode($sock->GET_INFO("ufdbguardConfig")));
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    if (!is_numeric($ManualArticaDBPathNAS)) {
        $ManualArticaDBPathNAS = 0;
    }
    if (!is_numeric($DisableArticaProxyStatistics)) {
        $DisableArticaProxyStatistics = 0;
    }
    if (!is_numeric($ArticaDbReplicate)) {
        $ArticaDbReplicate = 0;
    }
    $WizardStatsAppliance = unserialize(base64_decode($sock->GET_INFO("WizardStatsAppliance")));
    if (!isset($WizardStatsAppliance["SERVER"])) {
        $WizardStatsAppliance["SERVER"] = null;
    }
    if ($EnableArticaMetaServer == 0) {
        if ($DisableArticaProxyStatistics == 1) {
            updatev2_progress(110, "Error: Artica statistics are disabled");
        }
    }
    if ($EnableArticaMetaServer == 0) {
        if ($datas["UseRemoteUfdbguardService"] == 1) {
            updatev2_progress(110, "Error: - UseRemoteUfdbguardService -  Only used by {$WizardStatsAppliance["SERVER"]}");
            return;
        }
    }
    $CHECKTIME = $unix->file_time_min($timeFile);
    ufdbevents(" **");
    ufdbevents(" **");
    ufdbevents("{$timeFile} = {$CHECKTIME}Mn");
    ufdbevents(" **");
    ufdbevents(" **");
    if (!$GLOBALS["FORCE"]) {
        if ($CategoriesDatabasesByCron == 1) {
            if ($EnableArticaMetaServer == 0) {
                if (!$GLOBALS["BYCRON"]) {
                    updatev2_progress(110, "Error: Only executed by schedule [" . __LINE__ . "]");
                    if ($CHECKTIME > 60) {
                        updatev2_checkversions();
                    }
                    return;
                }
            }
        }
        if ($CategoriesDatabasesUpdatesAllTimes == 0) {
            if ($EnableArticaMetaServer == 0) {
                if ($unix->IsProductionTime()) {
                    webupdate_admin_mysql(2, "Update aborted, only allowed outside the production time", null, __FILE__, __LINE__);
                    updatev2_progress(110, "Error: Only outside production time");
                    if ($CHECKTIME > 60) {
                        updatev2_checkversions();
                    }
                    return;
                }
            }
        }
    }
    if ($GLOBALS["FORCE"]) {
        ufdbevents("***** Force enabled ***** ");
        ufdbevents("*****");
        ufdbevents("*****");
        ufdbevents("Executed as {$GLOBALS["CMDLINE"]}");
        ufdbevents("*****");
        ufdbevents("*****");
    }
    $MaxCheckTime = 240;
    if ($EnableArticaMetaServer == 1) {
        $MaxCheckTime = 60;
    }
    if (!$GLOBALS["FORCE"]) {
        if ($CHECKTIME < 240) {
            updatev2_progress(110, "STOP: current {$CHECKTIME}Mn, require {$MaxCheckTime}mn");
            if ($CHECKTIME > 60) {
                updatev2_checkversions();
            }
            return;
        }
    }
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    $pid = @file_get_contents($pidfile);
    if ($unix->process_exists($pid, __FILE__)) {
        $time = $unix->PROCCESS_TIME_MIN($pid);
        if ($time < 10200) {
            updatev2_progress(110, "Error: already running pid {$pid} since {$time}Mn");
            return;
        } else {
            $kill = $unix->find_program("kill");
            unix_system_kill_force($pid);
            if ($GLOBALS["SCHEDULE_ID"] > 0) {
                artica_update_event(1, "Warning: Old task pid {$pid} since {$time}Mn has been killed, (reach 7200mn)", null, __FILE__, __LINE__);
            }
        }
    }
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    ufdbevents("Stamp {$timeFile}");
    @unlink($timeFile);
    $tlse_force_token = null;
    @file_put_contents($timeFile, time());
    @file_put_contents($pidfile, getmypid());
    $tlse_token = null;
    if ($GLOBALS["BYCRON"]) {
        $tlse_token == " --bycron --force";
    }
    if ($GLOBALS["FORCE"]) {
        $tlse_force_token = " --force";
    }
    $php = $unix->LOCATE_PHP5_BIN();
    $nohup = $unix->find_program("nohup");
    $PrivoxyEnabled = intval(@file_get_contents("/etc/artica-postfix/settings/Daemons/PrivoxyEnabled"));
    if ($PrivoxyEnabled == 1) {
        @chmod("/usr/share/artica-postfix/bin/privoxy-blocklist.sh", 0755);
        system("{$nohup} /usr/share/artica-postfix/bin/privoxy-blocklist.sh >/dev/null 2>&1 &");
    }
    system("{$nohup} {$php} /usr/share/artica-postfix/exec.infected.urls.php >/dev/null 2>&1 &");
    $EnableArticaMetaClient = intval(@file_get_contents("/etc/artica-postfix/settings/Daemons/EnableArticaMetaClient"));
    $EnableArticaMetaServer = intval(@file_get_contents("/etc/artica-postfix/settings/Daemons/EnableArticaMetaServer"));
    if ($EnableArticaMetaServer == 1) {
        $EnableArticaMetaClient = 0;
    }
    if ($EnableArticaMetaClient == 1) {
        updatev2_progress(10, "Using Meta console [" . __LINE__ . "]");
        return ufdbtables_artica_meta();
    }
    updatev2_progress(10, "{checking} [" . __LINE__ . "]");
    updatev2_checkversions();
    updatev2_progress(12, "{running} [" . __LINE__ . "]");
    $GLOBALS["DOWNLOADED_INSTALLED"] = 0;
    ufdbtables(true);
    tlsetables(true);
    ufdb_phistank();
    TranslateToMetaServer();
    if ($GLOBALS["DOWNLOADED_INSTALLED"] > 0) {
        updatev2_progress(96, "{restarting_webfiltering_service} [" . __LINE__ . "]");
        squid_admin_mysql(2, "{$GLOBALS["DOWNLOADED_INSTALLED"]} updated blacklists databases [action=restart]", __FILE__, __LINE__);
        system("/etc/init.d/ufdb restart --updater");
        system("/etc/init.d/ufdbcat restart --updater");
        $squidbin = $unix->LOCATE_SQUID_BIN();
        squid_admin_mysql(1, "Reloading proxy service after updating Web filtering databases", __FILE__, __LINE__);
        system("{$squidbin} -f /etc/squid3/squid.conf -k reconfigure");
    }
    if ($GLOBALS["VERBOSE"]) {
        echo " **************** C_ICAP_TABLES ***************\n";
    }
    C_ICAP_TABLES(true);
    if ($GLOBALS["VERBOSE"]) {
        echo " **************** schedulemaintenance ***************\n";
    }
    schedulemaintenance();
    if ($GLOBALS["VERBOSE"]) {
        echo " **************** EXECUTE_BLACK_INSTANCE ***************\n";
    }
    EXECUTE_BLACK_INSTANCE();
    if ($GLOBALS["VERBOSE"]) {
        echo " **************** FINISH ***************\n";
    }
    updatev2_progress(100, "{done}");
}