local m, s, o local openclash = "openclash" local uci = luci.model.uci.cursor() local fs = require "luci.openclash" local sys = require "luci.sys" local json = require "luci.jsonc" local sid = arg[1] font_red = [[]] font_off = [[]] bold_on = [[]] bold_off = [[]] m = Map(openclash, translate("Config Subscribe Edit")) m.pageaction = false m.description=translate("Convert Subscribe function of Online is Supported By subconverter Written By tindy X") .. "
".. "
"..translate("API By tindy X & lhie1").. "
".. "
"..translate("Subconverter external configuration (subscription conversion template) Description: https://github.com/tindy2013/subconverter#external-configuration-file").. "
".. "
"..translate("If you need to customize the external configuration file (subscription conversion template), please write it according to the instructions, upload it to the accessible location of the external network, and fill in the address correctly when using it").. "
".. "
"..translate("If you have a recommended external configuration file (subscription conversion template), you can modify by following The file format of /usr/share/openclash/res/sub_ini.list and pr") m.redirect = luci.dispatcher.build_url("admin/services/openclash/config-subscribe") if m.uci:get(openclash, sid) ~= "config_subscribe" then luci.http.redirect(m.redirect) return end -- [[ Config Subscribe Setting ]]-- s = m:section(NamedSection, sid, "config_subscribe") s.anonymous = true s.addremove = false ---- name o = s:option(Value, "name", translate("Config Alias")) o.description = font_red..bold_on..translate("Name For Distinguishing")..bold_off..font_off o.placeholder = translate("config") o.rmempty = true ---- address o = s:option(Value, "address", translate("Subscribe Address")) o.template = "cbi/tvalue" o.rows = 10 o.wrap = "off" o.description = font_red..bold_on..translate("SS/SSR/Vmess or Other Link And Subscription Address is Supported When Online Subscription Conversion is Enabled, Multiple Links Should be One Per Line or Separated By |")..bold_off..font_off o.placeholder = translate("Not Null") o.rmempty = false function o.validate(self, value) if value then value = value:gsub("\r\n?", "\n") value = value:gsub("%c*$", "") end return value end local sub_path = "/tmp/dler_sub" local info, token, get_sub, sub_info local token = uci:get("openclash", "config", "dler_token") if token then get_sub = string.format("curl -sL -H 'Content-Type: application/json' --connect-timeout 2 -d '{\"access_token\":\"%s\"}' -X POST https://dler.cloud/api/v1/managed/clash -o %s", token, sub_path) if not nixio.fs.access(sub_path) then luci.sys.exec(get_sub) else if fs.readfile(sub_path) == "" or not fs.readfile(sub_path) then luci.sys.exec(get_sub) end end sub_info = fs.readfile(sub_path) if sub_info then sub_info = json.parse(sub_info) end if sub_info and sub_info.ret == 200 then o:value(sub_info.smart) o:value(sub_info.ss) o:value(sub_info.vmess) o:value(sub_info.trojan) else fs.unlink(sub_path) end end ---- UA o = s:option(Value, "sub_ua", "User-Agent") o.description = font_red..bold_on..translate("Used for Downloading Subscriptions, Defaults to Clash")..bold_off..font_off o:value("clash.meta") o:value("clash-verge/v1.5.1") o:value("Clash") o.default = "clash.meta" o.rmempty = true ---- subconverter o = s:option(Flag, "sub_convert", translate("Subscribe Convert Online")) o.description = translate("Convert Subscribe Online With Template") o.default = 0 ---- Convert Address o = s:option(Value, "convert_address", translate("Convert Address")) o.rmempty = true o.description = font_red..bold_on..translate("Note: There is A Risk of Privacy Leakage in Online Convert")..bold_off..font_off o:depends("sub_convert", "1") o:value("https://api.dler.io/sub", translate("api.dler.io")..translate("(Default)")) o:value("https://v.id9.cc/sub", translate("v.id9.cc")..translate("(Support Vless By Pinyun)")) o:value("https://sub.id9.cc/sub", translate("sub.id9.cc")) o:value("https://api.wcc.best/sub", translate("api.wcc.best")) o.default = "https://api.dler.io/sub" o.placeholder = "https://api.dler.io/sub" ---- Template o = s:option(ListValue, "template", translate("Template Name")) o.rmempty = true o:depends("sub_convert", "1") file = io.open("/usr/share/openclash/res/sub_ini.list", "r"); for l in file:lines() do if l ~= "" and l ~= nil then o:value(string.sub(luci.sys.exec(string.format("echo '%s' |awk -F ',' '{print $1}' 2>/dev/null",l)),1,-2)) end end file:close() o:value("0", translate("Custom Template")) ---- Custom Template o = s:option(Value, "custom_template_url", translate("Custom Template URL")) o.rmempty = true o.placeholder = translate("Not Null") o.datatype = "or(host, string)" o:depends("template", "0") ---- emoji o = s:option(ListValue, "emoji", translate("Emoji")) o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- udp o = s:option(ListValue, "udp", translate("UDP Enable")) o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- skip-cert-verify o = s:option(ListValue, "skip_cert_verify", translate("skip-cert-verify")) o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- sort o = s:option(ListValue, "sort", translate("Sort")) o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- node type o = s:option(ListValue, "node_type", translate("Append Node Type")) o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- rule provider o = s:option(ListValue, "rule_provider", translate("Use Rule Provider")) o.description = font_red..bold_on..translate("Note: Please Make Sure Backend Service Supports This Feature")..bold_off..font_off o.rmempty = false o:value("false", translate("Disable")) o:value("true", translate("Enable")) o.default = "false" o:depends("sub_convert", "1") ---- custom params o = s:option(DynamicList, "custom_params", translate("Custom Params")) o.description = font_red..bold_on..translate("eg: \"rename=\\s+([2-9])[xX]@ (HIGH:$1)\"")..bold_off..font_off o.rmempty = false o:depends("sub_convert", "1") ---- key o = s:option(DynamicList, "keyword", font_red..bold_on..translate("Keyword Match")..bold_off..font_off) o.description = font_red..bold_on..translate("eg: hk or tw&bgp")..bold_off..font_off o.rmempty = true ---- exkey o = s:option(DynamicList, "ex_keyword", font_red..bold_on..translate("Exclude Keyword Match")..bold_off..font_off) o.description = font_red..bold_on..translate("eg: hk or tw&bgp")..bold_off..font_off o.rmempty = true ---- de_exkey o = s:option(MultiValue, "de_ex_keyword", font_red..bold_on..translate("Exclude Keyword Match Default")..bold_off..font_off) o.rmempty = true o:depends("sub_convert", 0) o:value("过期时间") o:value("剩余流量") o:value("TG群") o:value("官网") local t = { {Commit, Back} } a = m:section(Table, t) o = a:option(Button,"Commit", " ") o.inputtitle = translate("Commit Settings") o.inputstyle = "apply" o.write = function() m.uci:commit(openclash) luci.http.redirect(m.redirect) end o = a:option(Button,"Back", " ") o.inputtitle = translate("Back Settings") o.inputstyle = "reset" o.write = function() m.uci:revert(openclash, sid) luci.http.redirect(m.redirect) end m:append(Template("openclash/toolbar_show")) return m