function stepfinal()
{
    $sock = new sockets();
    $sock->GET_INFO("FireHolConfigured", 1);
    $sock->SET_INFO("FireHolEnable", 1);
    $sock->SET_INFO("FireHolRouter", 0);
    $FireHolConf = unserialize(base64_decode($sock->GET_INFO("FireHolConf")));
    $eth = new system_nic($FireHolConf["IF_LAN"]);
    $eth->firewall_policy = $FireHolConf["IF_LAN_BEHAVIOR"];
    $eth->isFW = 1;
    $eth->SaveNic();
    $servs[] = "artica";
    $servs[] = "http";
    $servs[] = "https";
    $servs[] = "dns";
    $servs[] = "ping";
    $servs[] = "ssh";
    $servs[] = "squid";
    $servs[] = "snmp";
    $servs[] = "snmptrap";
    $servs[] = "icmp";
    $servs[] = "dhcp";
    $f = new firehol();
    if ($FireHolConf["IF_LAN_BEHAVIOR"] == "reject") {
        if (!$f->checkTables()) {
            echo "FAILED";
            return false;
        }
        while (list($a, $service) = each($servs)) {
            if (!$f->edit_service($FireHolConf["IF_LAN"], $service, 1, 1)) {
                echo "edit_service({$service}) FAILED";
                return;
            }
        }
    }
    $servs = array();
    $servs1[] = "http";
    $servs1[] = "https";
    $servs1[] = "ftp";
    $servs1[] = "dns";
    $servs1[] = "ping";
    $servs1[] = "icmp";
    if (!$f->checkTables()) {
        echo "FAILED";
        return false;
    }
    while (list($a, $service) = each($servs1)) {
        if (!$f->edit_client_service($FireHolConf["IF_LAN"], $service, 1, 1)) {
            echo "edit_client_service({$service}) FAILED";
            return;
        }
        if ($GLOBALS["VERBOSE"]) {
            echo "edit_client_service({$service}) TRUE<br>\n";
        }
    }
    $sock->SET_INFO("FireHolConfigured", 1);
    echo "<script>Loadjs('firehol.progress.php');</script>";
}
function search()
{
    $tpl = new templates();
    $MyPage = CurrentPageName();
    $q = new mysql();
    if (!$q->TABLE_EXISTS("firehol_services_routers")) {
        $fire = new firehol();
        $fire->checkTables();
    }
    $sock = new sockets();
    $t = $_GET["t"];
    $search = '%';
    $table = "firehol_services_routers";
    $page = 1;
    $total = 0;
    if (isset($_POST["sortname"])) {
        if ($_POST["sortname"] != null) {
            $ORDER = "ORDER BY {$_POST["sortname"]} {$_POST["sortorder"]}";
        }
    }
    if (isset($_POST['page'])) {
        $page = $_POST['page'];
    }
    $searchstring = string_to_flexquery();
    $sql = "SELECT COUNT(*) as TCOUNT FROM `{$table}` WHERE routerid={$_GET["routerid"]} {$searchstring}";
    $ligne = mysql_fetch_array($q->QUERY_SQL($sql, "artica_backup"));
    $total = $ligne["TCOUNT"];
    if (isset($_POST['rp'])) {
        $rp = $_POST['rp'];
    }
    $pageStart = ($page - 1) * $rp;
    if (is_numeric($rp)) {
        $limitSql = "LIMIT {$pageStart}, {$rp}";
    }
    $sql = "SELECT *  FROM `{$table}` WHERE routerid={$_GET["routerid"]} {$searchstring} {$ORDER} {$limitSql}";
    $results = $q->QUERY_SQL($sql, 'artica_backup');
    $no_rule = $tpl->_ENGINE_parse_body("{no_rule}");
    $all = $tpl->javascript_parse_text("{all}");
    $data = array();
    $data['page'] = $page;
    $data['total'] = $total;
    $data['rows'] = array();
    if (!$q->ok) {
        json_error_show($q->mysql_error . "<br>{$sql}");
    }
    if (mysql_num_rows($results) == 0) {
        json_error_show("!!! no data");
    }
    $tpl = new templates();
    $all = $tpl->javascript_parse_text("{all}");
    while ($ligne = mysql_fetch_assoc($results)) {
        $color = "black";
        $ID = $ligne["ID"];
        $service = $ligne["service"];
        $delete = imgsimple("delete-48.png", null, "Loadjs('{$MyPage}?delete-pattern-js={$ID}&routerid={$_GET["routerid"]}',true)");
        $pic = "cloud-deny-48.png";
        if ($ligne["allow"] == 1) {
            $pic = "cloud-goto-48.png";
        }
        $allow = imgtootltip($pic, "{allow}/{deny}", "Loadjs('{$MyPage}?switch-pattern-js=yes&ID={$ID}&routerid={$_GET["routerid"]}')");
        $excludes = imgtootltip("folder-script-48.png", "", "Loadjs('{$MyPage}?excludes-js=yes&service={$service}&routerid={$_GET["routerid"]}')");
        $ligne2 = mysql_fetch_array($q->QUERY_SQL("SELECT COUNt(ID) as tcount FROM firehol_routers_exclude\n\t\t\tWHERE service='{$service}' AND routerid='{$_GET["routerid"]}' AND destination=1", "artica_backup"));
        $whitelisted_destination_networks = $tpl->javascript_parse_text("{whitelisted_destination_networks}: {$ligne2["tcount"]}");
        $ligne2 = mysql_fetch_array($q->QUERY_SQL("SELECT COUNt(ID) as tcount FROM firehol_routers_exclude\n\t\t\tWHERE service='{$service}' AND routerid='{$_GET["routerid"]}' AND destination=0", "artica_backup"));
        $whitelisted_src_networks = $tpl->javascript_parse_text("{whitelisted_src_networks}: {$ligne2["tcount"]}");
        $data['rows'][] = array('id' => $ID, 'cell' => array("<center style='margin-top:3px;font-size:16px;font-weight:normal;color:{$color}'>{$allow}</center>", "<span style='font-size:36px;font-weight:normal;color:{$color}'>{$service}</span>\n\t\t\t\t\t<br> <span style='font-size:18px'>{$whitelisted_destination_networks}<br>{$whitelisted_src_networks}</span>\t\t\n\t\t\t\t\t", "<center style='margin-top:3px;font-size:16px;font-weight:normal;color:{$color}'>{$excludes}</center>", "<center style='margin-top:3px;font-size:16px;font-weight:normal;color:{$color}'>{$delete}</center>"));
    }
    echo json_encode($data);
}
function table()
{
    $page = CurrentPageName();
    $tpl = new templates();
    $tt = time();
    $t = $_GET["t"];
    $type = $tpl->javascript_parse_text("{type}");
    $networks = $tpl->_ENGINE_parse_body("{networks}");
    $new_rule = $tpl->_ENGINE_parse_body("{new_network}");
    $port = $tpl->javascript_parse_text("{listen_port}");
    $address = $tpl->javascript_parse_text("{listen_address}");
    $delete = $tpl->javascript_parse_text("{delete} {rule} ?");
    $enabled = $tpl->javascript_parse_text("{enabled}");
    $apply = $tpl->javascript_parse_text("{apply}");
    $q = new mysql();
    if (!$q->TABLE_EXISTS("firehol_routers_exclude", "artica_backup")) {
        $fire = new firehol();
        $fire->checkTables();
    }
    $ex[1] = '{whitelisted_destination_networks}';
    $ex[0] = "{whitelisted_src_networks}";
    $title = "<strong style=font-size:30px>" . $tpl->javascript_parse_text("{$ex[$_GET["destination"]]}") . "</strong>";
    $buttons = "\n\tbuttons : [\n\t{name: '<strong style=font-size:18px>{$new_rule}</strong>', bclass: 'add', onpress : NewRule{$tt}},\n\t{name: '<strong style=font-size:18px>{$apply}</strong>', bclass: 'Reconf', onpress : Apply{$tt}},\n\t],";
    $html = "\n<table class='TABLE_ROUTERS_SERVICE_EX{$_GET["destination"]}' style='display: none' id='TABLE_ROUTERS_SERVICE_EX{$_GET["destination"]}' style='width:100%'></table>\n<script>\nfunction Start{$tt}(){\n\t\$('#TABLE_ROUTERS_SERVICE_EX{$_GET["destination"]}').flexigrid({\n\t\turl: '{$page}?search=yes&service={$_GET["service"]}&routerid={$_GET["routerid"]}&destination={$_GET["destination"]}',\n\t\tdataType: 'json',\n\t\tcolModel : [\n\t\t\n\t\t\t{display: '<strong style=font-size:18px>{$networks}</strong>', name : 'networks', width :433, sortable : true, align: 'left'},\n\t\t\t{display: '&nbsp;', name : 'delete', width : 70, sortable : false, align: 'center'},\n\t\t\t],\n\t\t\t{$buttons}\n\t\t\tsearchitems : [\n\t\t\t\t{display: '{$networks}', name : 'networks'},\n\t\t\t],\n\t\t\tsortname: 'ID',\n\t\t\tsortorder: 'desc',\n\t\t\tusepager: true,\n\t\t\ttitle: '{$title}',\n\t\t\tuseRp: true,\n\t\t\trp: 50,\n\t\t\tshowTableToggleBtn: false,\n\t\t\twidth: '99%',\n\t\t\theight: 350,\n\t\t\tsingleSelect: true,\n\t\t\trpOptions: [10, 20, 30, 50,100,200]\n\t\n\t});\n}\n\t\nvar xNewRule{$tt}= function (obj) {\n\tvar res=obj.responseText;\n\tif (res.length>3){alert(res);return;}\n\t\$('#flexRT{$t}').flexReload();\n\t\$('#flexRT{$tt}').flexReload();\n}\n\t\nfunction Apply{$tt}(){\n\tLoadjs('firehol.progress.php');\n}\n\t\n\t\nfunction NewRule{$tt}(){\n\tLoadjs('{$page}?pattern-js=yes&service={$_GET["service"]}&routerid={$_GET["routerid"]}&destination={$_GET["destination"]}');\n}\nfunction RuleDestinationDelete{$tt}(zmd5){\n\tif(!confirm('{$delete}')){return;}\n\tvar XHR = new XHRConnection();\n\tXHR.appendData('rules-destination-delete', zmd5);\n\tXHR.sendAndLoad('{$page}', 'POST',xNewRule{$tt});\n}\nvar xRuleEnable{$t}= function (obj) {\n\tvar res=obj.responseText;\n\tif (res.length>3){alert(res);return;}\n\t\$('#flexRT{$t}').flexReload();\n\t\$('#flexRT{$tt}').flexReload();\n}\n\t\n\t\nfunction RuleEnable{$tt}(ID,md5){\n\tvar XHR = new XHRConnection();\n\tXHR.appendData('rule-enable', ID);\n\tif(document.getElementById(md5).checked){XHR.appendData('enable', 1);}else{XHR.appendData('enable', 0);}\n\tXHR.sendAndLoad('{$page}', 'POST',xRuleEnable{$tt});\n}\n\t\nStart{$tt}();\n</script>\n";
    echo $html;
}