local m, s, o local openclash = "openclash" local NXFS = require "nixio.fs" local SYS = require "luci.sys" local HTTP = require "luci.http" local DISP = require "luci.dispatcher" local UTIL = require "luci.util" local fs = require "luci.openclash" local uci = require "luci.model.uci".cursor() m = Map(openclash, translate("Rule Providers Append")) m.pageaction = false m.description=translate("Attention:").. "
"..translate("The game proxy is a test function and does not guarantee the availability of rules").. "
"..translate("Preparation steps:").. "
"..translate("1. Check the policy group and node you are going to use, Policy group type suggestion: fallback, game nodes must be support UDP and not a Vmess").. "
"..translate("2. Click the or button to enter the rule list and download the rules you want to use").. "
"..translate("3. On this page, set the corresponding configuration file and policy group of the rule you have downloaded, and save the settings").. "
".. "
"..translate("When setting this page, if the groups is empty, please go to the page to add").. "
".. "
"..translate("Introduction to rule set usage: https://wiki.metacubex.one/config/rule-providers/content/") function IsRuleFile(e) e=e or"" local e=string.lower(string.sub(e,-6,-1)) return e==".rules" end function IsYamlFile(e) e=e or"" local e=string.lower(string.sub(e,-5,-1)) return e == ".yaml" end function IsYmlFile(e) e=e or"" local e=string.lower(string.sub(e,-4,-1)) return e == ".yml" end local groupnames, filename local group_list = {} filename = m.uci:get(openclash, "config", "config_path") if filename then groupnames = SYS.exec(string.format('ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "YAML.load_file(\'%s\')[\'proxy-groups\'].each do |i| puts i[\'name\']+\'##\' end" 2>/dev/null',filename)) if groupnames then for groupname in string.gmatch(groupnames, "([^'##\n']+)##") do if groupname ~= nil and groupname ~= "" then table.insert(group_list, groupname) end end end end m.uci:foreach("openclash", "groups", function(s) if s.name ~= "" and s.name ~= nil then table.insert(group_list, s.name) end end) table.sort(group_list) table.insert(group_list, "DIRECT") table.insert(group_list, "REJECT") table.insert(group_list, "REJECT-DROP") table.insert(group_list, "PASS") table.insert(group_list, "GLOBAL") -- [[ Edit Game Rule ]] -- s = m:section(TypedSection, "game_config", translate("Game Rules Append")) s.anonymous = true s.addremove = true s.sortable = true s.template = "openclash/tblsection" s.rmempty = false ---- enable flag o = s:option(Flag, "enabled", translate("Enable")) o.rmempty = false o.default = o.enabled o.cfgvalue = function(...) return Flag.cfgvalue(...) or "1" end ---- config o = s:option(ListValue, "config", translate("Config File")) o:value("all", translate("Use For All Config File")) local e,a={} for t,f in ipairs(fs.glob("/etc/openclash/config/*"))do a=fs.stat(f) if a then e[t]={} e[t].name=fs.basename(f) if IsYamlFile(e[t].name) or IsYmlFile(e[t].name) then o:value(e[t].name) end end end ---- rule name o = s:option(DynamicList, "rule_name", translate("Game Rule's Name")) local e,a={} for t,f in ipairs(fs.glob("/etc/openclash/game_rules/*"))do a=fs.stat(f) if a then e[t]={} e[t].filename=fs.basename(f) if IsRuleFile(e[t].filename) then e[t].name=string.gsub(luci.sys.exec(string.format("grep ',%s$' /usr/share/openclash/res/game_rules.list |awk -F ',' '{print $1}' 2>/dev/null",e[t].filename)), "[\r\n]", "") if e[t].name ~= "" and e[t].name ~= nil then o:value(e[t].name) end end end end o.rmempty = true ---- Proxy Group o = s:option(ListValue, "group", translate("Select Proxy Group")) o.rmempty = true for _, groupname in ipairs(group_list) do o:value(groupname) end -- [[ Edit Other Rule Provider ]] -- s = m:section(TypedSection, "rule_provider_config", translate("Other Rule Providers Append")) s.anonymous = true s.addremove = true s.sortable = true s.template = "openclash/tblsection" s.rmempty = false ---- enable flag o = s:option(Flag, "enabled", translate("Enable")) o.rmempty = false o.default = o.enabled o.cfgvalue = function(...) return Flag.cfgvalue(...) or "1" end ---- config o = s:option(ListValue, "config", translate("Config File")) o:value("all", translate("Use For All Config File")) local e,a={} for t,f in ipairs(fs.glob("/etc/openclash/config/*"))do a=fs.stat(f) if a then e[t]={} e[t].name=fs.basename(f) if IsYamlFile(e[t].name) or IsYmlFile(e[t].name) then o:value(e[t].name) end end end ---- rule name o = s:option(DynamicList, "rule_name", translate("Rule Provider's Name")) local e,a={} for t,f in ipairs(fs.glob("/etc/openclash/rule_provider/*"))do a=fs.stat(f) if a then e[t]={} e[t].filename=fs.basename(f) if IsYamlFile(e[t].filename) or IsYmlFile(e[t].filename) then e[t].name=string.gsub(luci.sys.exec(string.format("grep ',%s$' /usr/share/openclash/res/rule_providers.list |awk -F ',' '{print $1}' 2>/dev/null",e[t].filename)), "[\r\n]", "") if e[t].name ~= "" and e[t].name ~= nil then o:value(e[t].name) end end end end o.rmempty = true ---- Proxy Group o = s:option(ListValue, "group", translate("Select Proxy Group")) o.rmempty = true for _, groupname in ipairs(group_list) do o:value(groupname) end o = s:option(Value, "interval", translate("Rule Providers Interval(s)")) o.default = "86400" o.rmempty = false ---- position o = s:option(ListValue, "position", translate("Append Position")) o.rmempty = false o:value("0", translate("Priority Match")) o:value("1", translate("Extended Match")) -- [[ Edit Custom Rule Provider ]] -- s = m:section(TypedSection, "rule_providers", translate("Custom Rule Providers Append")) s.anonymous = true s.addremove = true s.sortable = true s.template = "openclash/tblsection" s.extedit = luci.dispatcher.build_url("admin/services/openclash/rule-providers-config/%s") function s.create(...) local sid = TypedSection.create(...) if sid then luci.http.redirect(s.extedit % sid) return end end ---- enable flag o = s:option(Flag, "enabled", translate("Enable")) o.rmempty = false o.default = o.enabled o.cfgvalue = function(...) return Flag.cfgvalue(...) or "1" end o = s:option(DummyValue, "config", translate("Config File")) function o.cfgvalue(...) return Value.cfgvalue(...) or translate("all") end o = s:option(DummyValue, "name", translate("Rule Providers Name")) function o.cfgvalue(...) return Value.cfgvalue(...) or translate("None") end ---- Proxy Group o = s:option(ListValue, "group", translate("Select Proxy Group")) o.rmempty = true for _, groupname in ipairs(group_list) do o:value(groupname) end o = s:option(ListValue, "position", translate("Append Position")) o.rmempty = false o:value("0", translate("Priority Match")) o:value("1", translate("Extended Match")) local rm = { {rule_mg, pro_mg} } rmg = m:section(Table, rm) o = rmg:option(Button, "rule_mg", " ") o.inputtitle = translate("Game Rules Manage") o.inputstyle = "reload" o.write = function() HTTP.redirect(DISP.build_url("admin", "services", "openclash", "game-rules-manage")) end o = rmg:option(Button, "pro_mg", " ") o.inputtitle = translate("Other Rule Provider Manage") o.inputstyle = "reload" o.write = function() HTTP.redirect(DISP.build_url("admin", "services", "openclash", "rule-providers-manage")) end local t = { {Commit, Apply} } ss = m:section(Table, t) o = ss:option(Button, "Commit", " ") o.inputtitle = translate("Commit Settings") o.inputstyle = "apply" o.write = function() m.uci:commit("openclash") end o = ss:option(Button, "Apply", " ") o.inputtitle = translate("Apply Settings") o.inputstyle = "apply" o.write = function() m.uci:set("openclash", "config", "enable", 1) m.uci:commit("openclash") SYS.call("/etc/init.d/openclash restart >/dev/null 2>&1 &") HTTP.redirect(DISP.build_url("admin", "services", "openclash")) end m:append(Template("openclash/toolbar_show")) return m