summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2017-07-09 03:18:15 +0800
committerYousong Zhou <yszhou4tech@gmail.com>2017-07-23 23:40:26 +0800
commit48b5ccfad54d6d21468f68a2ae8c52c377bc5c5e (patch)
treec5dd2a8fdcee0a4fe3c1dc49d0929a9a12b70678 /applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua
parent90de442347a54400d37ddb36ecb7a99e913d026a (diff)
luci-app-shadowsocks-libev: rewrite for shadowsocks-libev 3.0.6-2
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
Diffstat (limited to 'applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua')
-rw-r--r--applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua113
1 files changed, 113 insertions, 0 deletions
diff --git a/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua
new file mode 100644
index 0000000000..15e57df6bd
--- /dev/null
+++ b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instances.lua
@@ -0,0 +1,113 @@
+-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local ds = require "luci.dispatcher"
+local ss = require "luci.model.shadowsocks-libev"
+local ut = require "luci.util"
+local m, s, o
+
+m = Map("shadowsocks-libev",
+ translate("Local Instances"),
+ translate("Instances of shadowsocks-libev components, e.g. ss-local, \
+ ss-redir, ss-tunnel, ss-server, etc. To enable an instance it \
+ is required to enable both the instance itself and the remote \
+ server it refers to."))
+
+local instances = {}
+local cfgtypes = { "ss_local", "ss_redir", "ss_server", "ss_tunnel" }
+local instances_data = ut.ubus("service", "list", {name = "shadowsocks-libev"})["shadowsocks-libev"]
+if instances_data ~= nil then
+ instances_data = instances_data["instances"]
+end
+
+for sname, sdata in pairs(m:get()) do
+ local key, value = ss.cfgvalue_overview(sdata)
+ if key ~= nil then
+ if instances_data and instances_data[key] and instances_data[key]["running"] then
+ value["running"] = "yes"
+ else
+ value["running"] = "no"
+ end
+ instances[key] = value
+ end
+end
+
+s = m:section(Table, instances)
+s.addremove = true
+s.template_addremove = "shadowsocks-libev/add_instance"
+s.extedit = function(self, section)
+ local value = instances[section]
+ if type(value) == "table" then
+ return ds.build_url(unpack(ds.context.requestpath),
+ "services/shadowsocks-libev/instances",
+ value[".name"])
+ end
+end
+s.parse = function(self, ...)
+ Table.parse(self, ...)
+
+ local crval = REMOVE_PREFIX .. self.config
+ local name = self.map:formvaluetable(crval)
+ for k,v in pairs(name) do
+ local value = instances[k]
+ local sname = value[".name"]
+ if type(value) == "table" then
+ m:del(sname)
+ instances[k] = nil
+ for _, oname in ipairs({"redir_tcp", "redir_udp"}) do
+ local ovalue = m:get("ss_rules", oname)
+ if ovalue == sname then
+ m:del("ss_rules", oname)
+ end
+ end
+ end
+ end
+
+ local stype = m:formvalue("_newinst.type")
+ local sname = m:formvalue("_newinst.name")
+ if ut.contains(cfgtypes, stype) then
+ local created
+ if sname and #sname > 0 then
+ created = m:set(sname, nil, stype)
+ else
+ created = m:add(stype)
+ sname = created
+ end
+ if created then
+ m.uci:save("shadowsocks-libev")
+ luci.http.redirect(ds.build_url(
+ "admin/services/shadowsocks-libev/instances", sname
+ ))
+ end
+ end
+end
+
+o = s:option(DummyValue, "name", translate("Name"))
+o.rawhtml = true
+o = s:option(DummyValue, "overview", translate("Overview"))
+o.rawhtml = true
+
+s:option(DummyValue, "running", translate("Running"))
+
+o = s:option(Button, "disabled", translate("Enable/Disable"))
+o.render = function(self, section, scope)
+ if instances[section].disabled then
+ self.title = translate("Disabled")
+ self.inputstyle = "reset"
+ else
+ self.title = translate("Enabled")
+ self.inputstyle = "save"
+ end
+ Button.render(self, section, scope)
+end
+o.write = function(self, section)
+ local sdata = instances[section]
+ if type(sdata) == "table" then
+ local sname = sdata[".name"]
+ local disabled = not sdata["disabled"]
+ sdata["disabled"] = disabled
+ m:set(sname, "disabled", tostring(disabled))
+ end
+end
+
+return m