summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-ddns/luasrc/controller/ddns.lua
diff options
context:
space:
mode:
authorAnsuel Smith <ansuelsmth@gmail.com>2019-11-06 01:33:53 +0100
committerAnsuel Smith <ansuelsmth@gmail.com>2019-11-11 20:47:16 +0100
commit34fa5122f98af4ac635dfc26a64f6d2d3e4fafcb (patch)
tree39183ec3b008cd16a23e3fa0a6ab544602aa4408 /applications/luci-app-ddns/luasrc/controller/ddns.lua
parent0731f7e5e43f490c39e364e43988a59ee2be9576 (diff)
luci-app-ddns: convert to client side implementation
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Diffstat (limited to 'applications/luci-app-ddns/luasrc/controller/ddns.lua')
-rwxr-xr-xapplications/luci-app-ddns/luasrc/controller/ddns.lua330
1 files changed, 1 insertions, 329 deletions
diff --git a/applications/luci-app-ddns/luasrc/controller/ddns.lua b/applications/luci-app-ddns/luasrc/controller/ddns.lua
index 24735289e0..247edef321 100755
--- a/applications/luci-app-ddns/luasrc/controller/ddns.lua
+++ b/applications/luci-app-ddns/luasrc/controller/ddns.lua
@@ -6,334 +6,6 @@
module("luci.controller.ddns", package.seeall)
-local NX = require "nixio"
-local NXFS = require "nixio.fs"
-local DISP = require "luci.dispatcher"
-local HTTP = require "luci.http"
-local I18N = require "luci.i18n" -- not globally avalible here
-local IPKG = require "luci.model.ipkg"
-local SYS = require "luci.sys"
-local UCI = require "luci.model.uci"
-local UTIL = require "luci.util"
-local DDNS = require "luci.tools.ddns" -- ddns multiused functions
-
-luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
-
-local srv_name = "ddns-scripts"
-local srv_ver_min = "2.7.7" -- minimum version of service required
-local app_name = "luci-app-ddns"
-local app_title = "Dynamic DNS"
-local app_version = "2.4.9-1"
-
-local translate = I18N.translate
-
function index()
- local nxfs = require "nixio.fs" -- global definitions not available
- local sys = require "luci.sys" -- in function index()
- local muci = require "luci.model.uci"
-
- -- no config create an empty one
- if not nxfs.access("/etc/config/ddns") then
- nxfs.writefile("/etc/config/ddns", "")
- end
-
- -- preset new option "lookup_host" if not already defined
- local uci = muci.cursor()
- local commit = false
- uci:foreach("ddns", "service", function (s)
- if not s["lookup_host"] and s["domain"] then
- uci:set("ddns", s[".name"], "lookup_host", s["domain"])
- commit = true
- end
- end)
- if commit then uci:commit("ddns") end
- uci:unload("ddns")
-
- entry( {"admin", "services", "ddns"}, cbi("ddns/overview"), _("Dynamic DNS"), 59)
- entry( {"admin", "services", "ddns", "detail"}, cbi("ddns/detail"), nil ).leaf = true
- entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints",
- {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true
- entry( {"admin", "services", "ddns", "global"}, cbi("ddns/global"), nil ).leaf = true
- entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true
- entry( {"admin", "services", "ddns", "startstop"}, post("startstop") ).leaf = true
- entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true
-end
-
--- Application specific information functions
-function app_description()
- local tmp = {}
- tmp[#tmp+1] = translate("Dynamic DNS allows that your router can be reached with \
- a fixed hostname while having a dynamically changing IP address.")
- tmp[#tmp+1] = [[<br />]]
- tmp[#tmp+1] = translate("OpenWrt Wiki") .. ": "
- tmp[#tmp+1] = [[<a href="https://openwrt.org/docs/guide-user/services/ddns/client" target="_blank">]]
- tmp[#tmp+1] = translate("DDNS Client Documentation")
- tmp[#tmp+1] = [[</a>]]
- tmp[#tmp+1] = " --- "
- tmp[#tmp+1] = [[<a href="https://openwrt.org/docs/guide-user/base-system/ddns" target="_blank">]]
- tmp[#tmp+1] = translate("DDNS Client Configuration")
- tmp[#tmp+1] = [[</a>]]
-
- return table.concat(tmp)
-end
-function app_title_back()
- local tmp = {}
- tmp[#tmp+1] = [[<a href="]]
- tmp[#tmp+1] = DISP.build_url("admin", "services", "ddns")
- tmp[#tmp+1] = [[">]]
- tmp[#tmp+1] = translate(app_title)
- tmp[#tmp+1] = [[</a>]]
- return table.concat(tmp)
-end
-
--- Standardized application/service functions
-function app_title_main()
- local tmp = {}
- tmp[#tmp+1] = [[<a href="javascript:alert(']]
- tmp[#tmp+1] = translate("Version Information")
- tmp[#tmp+1] = [[\n\n]] .. app_name
- tmp[#tmp+1] = [[\n]] .. translate("Version") .. [[: ]] .. app_version
- tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. translate("required") .. [[:]]
- tmp[#tmp+1] = [[\n]] .. translate("Version") .. [[: ]]
- tmp[#tmp+1] = srv_ver_min .. [[ ]] .. translate("or higher")
- tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. translate("installed") .. [[:]]
- tmp[#tmp+1] = [[\n]] .. translate("Version") .. [[: ]]
- tmp[#tmp+1] = (service_version() or translate("NOT installed"))
- tmp[#tmp+1] = [[\n\n]]
- tmp[#tmp+1] = [[')">]]
- tmp[#tmp+1] = translate(app_title)
- tmp[#tmp+1] = [[</a>]]
-
- return table.concat(tmp)
-end
-
-function service_version()
-
- local srv_ver_cmd = luci_helper .. " -V | awk {'print $2'} "
- local ver
-
- if IPKG then
- ver = IPKG.info(srv_name)[srv_name].Version
- else
- ver = UTIL.exec(srv_ver_cmd)
- end
-
- if ver and #ver > 0 then return ver or nil end
-
-end
-
-function service_ok()
- return IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
-end
-
--- internal function to read all sections status and return data array
-local function _get_status()
- local uci = UCI.cursor()
- local service = SYS.init.enabled("ddns") and 1 or 0
- local url_start = DISP.build_url("admin", "system", "startup")
- local data = {} -- Array to transfer data to javascript
-
- data[#data+1] = {
- enabled = service, -- service enabled
- url_up = url_start, -- link to enable DDS (System-Startup)
- }
-
- uci:foreach("ddns", "service", function (s)
-
- -- Get section we are looking at
- -- and enabled state
- local section = s[".name"]
- local enabled = tonumber(s["enabled"]) or 0
- local datelast = "_empty_" -- formatted date of last update
- local datenext = "_empty_" -- formatted date of next update
- local datenextstat = nil
-
- -- get force seconds
- local force_seconds = DDNS.calc_seconds(
- tonumber(s["force_interval"]) or 72 ,
- s["force_unit"] or "hours" )
- -- get/validate pid and last update
- local pid = DDNS.get_pid(section)
- local uptime = SYS.uptime()
- local lasttime = DDNS.get_lastupd(section)
- if lasttime > uptime then -- /var might not be linked to /tmp
- lasttime = 0 -- and/or not cleared on reboot
- end
-
- -- no last update happen
- if lasttime == 0 then
- datelast = "_never_"
-
- -- we read last update
- else
- -- calc last update
- -- sys.epoch - sys uptime + lastupdate(uptime)
- local epoch = os.time() - uptime + lasttime
- -- use linux date to convert epoch
- datelast = DDNS.epoch2date(epoch)
- -- calc and fill next update
- datenext = DDNS.epoch2date(epoch + force_seconds)
- end
-
- -- process running but update needs to happen
- -- problems if force_seconds > uptime
- force_seconds = (force_seconds > uptime) and uptime or force_seconds
- if pid > 0 and ( lasttime + force_seconds - uptime ) <= 0 then
- datenext = "_verify_"
- datenextstat = translate("Verify")
-
- -- run once
- elseif force_seconds == 0 then
- datenext = "_runonce_"
- datenextstat = translate("Run once")
-
- -- no process running and NOT enabled
- elseif pid == 0 and enabled == 0 then
- datenext = "_disabled_"
- datenextstat = translate("Disabled")
-
- -- no process running and enabled
- elseif pid == 0 and enabled ~= 0 then
- datenext = "_stopped_"
- datenextstat = translate("Stopped")
- end
-
- -- get/set monitored interface and IP version
- local iface = s["interface"] or "wan"
- local use_ipv6 = tonumber(s["use_ipv6"]) or 0
- local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4"
- iface = ipv .. " / " .. iface
-
- -- try to get registered IP
- local lookup_host = s["lookup_host"] or "_nolookup_"
-
- local chk_sec = DDNS.calc_seconds(
- tonumber(s["check_interval"]) or 10,
- s["check_unit"] or "minutes" )
- local reg_ip = DDNS.get_regip(section, chk_sec)
-
- if reg_ip == "NOFILE" then
- local dnsserver = s["dns_server"] or ""
- local force_ipversion = tonumber(s["force_ipversion"] or 0)
- local force_dnstcp = tonumber(s["force_dnstcp"] or 0)
- local is_glue = tonumber(s["is_glue"] or 0)
- local command = luci_helper .. [[ -]]
- if (use_ipv6 == 1) then command = command .. [[6]] end
- if (force_ipversion == 1) then command = command .. [[f]] end
- if (force_dnstcp == 1) then command = command .. [[t]] end
- if (is_glue == 1) then command = command .. [[g]] end
- command = command .. [[l ]] .. lookup_host
- command = command .. [[ -S ]] .. section
- if (#dnsserver > 0) then command = command .. [[ -d ]] .. dnsserver end
- command = command .. [[ -- get_registered_ip]]
- reg_ip = SYS.exec(command)
- end
-
- -- fill transfer array
- data[#data+1] = {
- section = section,
- enabled = enabled,
- iface = iface,
- lookup = lookup_host,
- reg_ip = reg_ip,
- pid = pid,
- datelast = datelast,
- datenext = datenext,
- datenextstat = datenextstat
- }
- end)
-
- uci:unload("ddns")
- return data
-end
-
--- called by XHR.get from detail_logview.htm
-function logread(section)
- -- read application settings
- local uci = UCI.cursor()
- local ldir = uci:get("ddns", "global", "ddns_logdir") or "/var/log/ddns"
- local lfile = ldir .. "/" .. section .. ".log"
- local ldata = NXFS.readfile(lfile)
-
- if not ldata or #ldata == 0 then
- ldata="_nodata_"
- end
- uci:unload("ddns")
- HTTP.write(ldata)
-end
-
--- called by XHR.get from overview_status.htm
-function startstop(section, enabled)
- local uci = UCI.cursor()
- local pid = DDNS.get_pid(section)
- local data = {} -- Array to transfer data to javascript
-
- -- if process running we want to stop and return
- if pid > 0 then
- local tmp = NX.kill(pid, 15) -- terminate
- NX.nanosleep(2) -- 2 second "show time"
- -- status changed so return full status
- data = _get_status()
- HTTP.prepare_content("application/json")
- HTTP.write_json(data)
- return
- end
-
- -- read uncommitted changes
- -- we don't save and commit data from other section or other options
- -- only enabled will be done
- local exec = true
- local changed = uci:changes("ddns")
- for k_config, v_section in pairs(changed) do
- -- security check because uci.changes only gets our config
- if k_config ~= "ddns" then
- exec = false
- break
- end
- for k_section, v_option in pairs(v_section) do
- -- check if only section of button was changed
- if k_section ~= section then
- exec = false
- break
- end
- for k_option, v_value in pairs(v_option) do
- -- check if only enabled was changed
- if k_option ~= "enabled" then
- exec = false
- break
- end
- end
- end
- end
-
- -- we can not execute because other
- -- uncommitted changes pending, so exit here
- if not exec then
- HTTP.write("_uncommitted_")
- return
- end
-
- -- save enable state
- uci:set("ddns", section, "enabled", ( (enabled == "true") and "1" or "0") )
- uci:save("ddns")
- uci:commit("ddns")
- uci:unload("ddns")
-
- -- start ddns-updater for section
- local command = "%s -S %s -- start" %{ luci_helper, UTIL.shellquote(section) }
- os.execute(command)
- NX.nanosleep(3) -- 3 seconds "show time"
-
- -- status changed so return full status
- data = _get_status()
- HTTP.prepare_content("application/json")
- HTTP.write_json(data)
+ entry( {"admin", "services", "ddns"}, view("ddns/overview"), _("Dynamic DNS"), 59)
end
-
--- called by XHR.poll from overview_status.htm
-function status()
- local data = _get_status()
- HTTP.prepare_content("application/json")
- HTTP.write_json(data)
-end
-