local api = require "luci.passwall.api" local appname = "passwall" local has_ss = api.is_finded("ss-redir") local has_ss_rust = api.is_finded("sslocal") local has_trojan_plus = api.is_finded("trojan-plus") local has_singbox = api.finded_com("singbox") local has_xray = api.finded_com("xray") local has_hysteria2 = api.finded_com("hysteria") local ss_type = {} local trojan_type = {} local vmess_type = {} local vless_type = {} local hysteria2_type = {} if has_ss then local s = "shadowsocks-libev" table.insert(ss_type, s) end if has_ss_rust then local s = "shadowsocks-rust" table.insert(ss_type, s) end if has_trojan_plus then local s = "trojan-plus" table.insert(trojan_type, s) end if has_singbox then local s = "sing-box" table.insert(trojan_type, s) table.insert(ss_type, s) table.insert(vmess_type, s) table.insert(vless_type, s) table.insert(hysteria2_type, s) end if has_xray then local s = "xray" table.insert(trojan_type, s) table.insert(ss_type, s) table.insert(vmess_type, s) table.insert(vless_type, s) end if has_hysteria2 then local s = "hysteria2" table.insert(hysteria2_type, s) end m = Map(appname) m.redirect = api.url("node_subscribe") api.set_apply_on_parse(m) s = m:section(NamedSection, arg[1]) s.addremove = false s.dynamic = false o = s:option(Value, "remark", translate("Subscribe Remark")) o.rmempty = false o = s:option(TextValue, "url", translate("Subscribe URL")) o.rows = 5 o.rmempty = false o = s:option(Flag, "allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) o.default = "0" o.rmempty = false o = s:option(ListValue, "filter_keyword_mode", translate("Filter keyword Mode")) o.default = "5" o:value("0", translate("Close")) o:value("1", translate("Discard List")) o:value("2", translate("Keep List")) o:value("3", translate("Discard List,But Keep List First")) o:value("4", translate("Keep List,But Discard List First")) o:value("5", translate("Use global config")) o = s:option(DynamicList, "filter_discard_list", translate("Discard List")) o:depends("filter_keyword_mode", "1") o:depends("filter_keyword_mode", "3") o:depends("filter_keyword_mode", "4") o = s:option(DynamicList, "filter_keep_list", translate("Keep List")) o:depends("filter_keyword_mode", "2") o:depends("filter_keyword_mode", "3") o:depends("filter_keyword_mode", "4") if #ss_type > 0 then o = s:option(ListValue, "ss_type", translatef("%s Node Use Type", "Shadowsocks")) o.default = "global" o:value("global", translate("Use global config")) for key, value in pairs(ss_type) do o:value(value) end end if #trojan_type > 0 then o = s:option(ListValue, "trojan_type", translatef("%s Node Use Type", "Trojan")) o.default = "global" o:value("global", translate("Use global config")) for key, value in pairs(trojan_type) do o:value(value) end end if #vmess_type > 0 then o = s:option(ListValue, "vmess_type", translatef("%s Node Use Type", "VMess")) o.default = "global" o:value("global", translate("Use global config")) for key, value in pairs(vmess_type) do o:value(value) end end if #vless_type > 0 then o = s:option(ListValue, "vless_type", translatef("%s Node Use Type", "VLESS")) o.default = "global" o:value("global", translate("Use global config")) for key, value in pairs(vless_type) do o:value(value) end end if #hysteria2_type > 0 then o = s:option(ListValue, "hysteria2_type", translatef("%s Node Use Type", "Hysteria2")) o.default = "global" o:value("global", translate("Use global config")) for key, value in pairs(hysteria2_type) do o:value(value) end end ---- Enable auto update subscribe o = s:option(Flag, "auto_update", translate("Enable auto update subscribe")) o.default = 0 o.rmempty = false ---- Week update rules o = s:option(ListValue, "week_update", translate("Week update rules")) o:value(7, translate("Every day")) for e = 1, 6 do o:value(e, translate("Week") .. e) end o:value(0, translate("Week") .. translate("day")) o.default = 0 o:depends("auto_update", true) ---- Day update rules o = s:option(ListValue, "time_update", translate("Day update rules")) for e = 0, 23 do o:value(e, e .. translate("oclock")) end o.default = 0 o:depends("auto_update", true) o = s:option(Value, "user_agent", translate("User-Agent")) o.default = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0" o:value("curl") o:value("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0") o:value("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0") o:value("Passwall/OpenWrt") return m