luci-app-ddns: update/rebuild to support ddns-scripts V 2.x
extends/replaces exising luci-app-ddns to support ddns-scripts starting Version 2.0.1-8 Still supports ddns-scripts Version 1.0.0-23 with the old interface including fix for OpenWrt Ticket #18018. Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
This commit is contained in:
parent
bb388f0873
commit
c09f8a7e41
21 changed files with 3501 additions and 39 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
# supports ddns-scripts 1.0.0-23 and ddns-scripts starting
|
||||||
|
# PKG_VERSION:=2.0.1
|
||||||
|
# PKG_RELEASE:=8
|
||||||
|
# PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
|
||||||
|
|
||||||
PO = ddns
|
PO = ddns
|
||||||
|
|
||||||
include ../../build/config.mk
|
include ../../build/config.mk
|
||||||
|
|
5
applications/luci-ddns/ipkg/postinst
Normal file
5
applications/luci-ddns/ipkg/postinst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
[ -n "${IPKG_INSTROOT}" ] || {
|
||||||
|
( . /etc/uci-defaults/luci-ddns ) && rm -f /etc/uci-defaults/luci-ddns
|
||||||
|
exit 0
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ LuCI - Lua Configuration Interface
|
||||||
|
|
||||||
Copyright 2008 Steven Barth <steven@midlink.org>
|
Copyright 2008 Steven Barth <steven@midlink.org>
|
||||||
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
|
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
|
||||||
|
Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -15,16 +16,238 @@ $Id$
|
||||||
|
|
||||||
module("luci.controller.ddns", package.seeall)
|
module("luci.controller.ddns", package.seeall)
|
||||||
|
|
||||||
|
require "nixio"
|
||||||
|
require "nixio.fs"
|
||||||
|
require "luci.sys"
|
||||||
|
require "luci.http"
|
||||||
|
require "luci.model.uci"
|
||||||
|
require "luci.dispatcher"
|
||||||
|
require "luci.tools.ddns"
|
||||||
|
|
||||||
function index()
|
function index()
|
||||||
|
-- no configuration file, don't start
|
||||||
if not nixio.fs.access("/etc/config/ddns") then
|
if not nixio.fs.access("/etc/config/ddns") then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
-- ddns-scripts 1.0.0 installed, run old luci app
|
||||||
local page
|
if not nixio.fs.access("/usr/lib/ddns/services_ipv6")
|
||||||
|
or nixio.fs.access("/usr/lib/ddns/url_escape.sed") then
|
||||||
page = entry({"admin", "services", "ddns"}, cbi("ddns/ddns"), _("Dynamic DNS"), 60)
|
local page
|
||||||
page.dependent = true
|
page = entry({"admin", "services", "ddns"}, cbi("ddns/ddns"), _("Dynamic DNS"), 60)
|
||||||
|
page.dependent = true
|
||||||
page = entry({"mini", "network", "ddns"}, cbi("ddns/ddns", {autoapply=true}), _("Dynamic DNS"), 60)
|
page = entry({"mini", "network", "ddns"}, cbi("ddns/ddns", {autoapply=true}), _("Dynamic DNS"), 60)
|
||||||
page.dependent = true
|
page.dependent = true
|
||||||
|
-- it looks like ddns-scripts 2.x.x are installed
|
||||||
|
else
|
||||||
|
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", "logview"}, call("logread") ).leaf = true
|
||||||
|
entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true
|
||||||
|
entry( {"admin", "services", "ddns", "startstop"}, call("startstop") ).leaf = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- function to read all sections status and return data array
|
||||||
|
function _get_status()
|
||||||
|
local uci = luci.model.uci.cursor()
|
||||||
|
local service = luci.sys.init.enabled("ddns") and 1 or 0
|
||||||
|
local url_start = luci.dispatcher.build_url("admin", "system", "startup")
|
||||||
|
local data = {} -- Array to transfer data to javascript
|
||||||
|
|
||||||
|
-- read application settings
|
||||||
|
local date_format = uci:get("ddns", "global", "date_format") or "%F %R"
|
||||||
|
local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns"
|
||||||
|
|
||||||
|
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_" -- formated date of last update
|
||||||
|
local datenext = "_empty_" -- formated date of next update
|
||||||
|
|
||||||
|
-- get force seconds
|
||||||
|
local force_seconds = luci.tools.ddns.calc_seconds(
|
||||||
|
tonumber(s["force_interval"]) or 72 ,
|
||||||
|
s["force_unit"] or "hours" )
|
||||||
|
-- get/validate pid and last update
|
||||||
|
local pid = luci.tools.ddns.get_pid(section, run_dir)
|
||||||
|
local uptime = luci.sys.uptime()
|
||||||
|
local lasttime = tonumber(nixio.fs.readfile("%s/%s.update" % { run_dir, section } ) or 0 )
|
||||||
|
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 = luci.sys.exec([[/bin/date -d @]] .. epoch .. [[ +']] .. date_format .. [[']])
|
||||||
|
-- calc and fill next update
|
||||||
|
datenext = luci.sys.exec([[/bin/date -d @]] .. (epoch + force_seconds) ..
|
||||||
|
[[ +']] .. date_format .. [[']])
|
||||||
|
end
|
||||||
|
|
||||||
|
-- process running but update needs to happen
|
||||||
|
-- problems it 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_"
|
||||||
|
|
||||||
|
-- run once
|
||||||
|
elseif force_seconds == 0 then
|
||||||
|
datenext = "_runonce_"
|
||||||
|
|
||||||
|
-- no process running and NOT enabled
|
||||||
|
elseif pid == 0 and enabled == 0 then
|
||||||
|
datenext = "_disabled_"
|
||||||
|
|
||||||
|
-- no process running and NOT
|
||||||
|
elseif pid == 0 and enabled ~= 0 then
|
||||||
|
datenext = "_stopped_"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get/set monitored interface and IP version
|
||||||
|
local iface = s["interface"] or "_nonet_"
|
||||||
|
local use_ipv6 = tonumber(s["use_ipv6"]) or 0
|
||||||
|
if iface ~= "_nonet_" then
|
||||||
|
local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4"
|
||||||
|
iface = ipv .. " / " .. iface
|
||||||
|
end
|
||||||
|
|
||||||
|
-- try to get registered IP
|
||||||
|
local domain = s["domain"] or "_nodomain_"
|
||||||
|
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 command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]]
|
||||||
|
command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
|
||||||
|
[[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
|
||||||
|
local reg_ip = luci.sys.exec(command)
|
||||||
|
if reg_ip == "" then
|
||||||
|
reg_ip = "_nodata_"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- fill transfer array
|
||||||
|
data[#data+1] = {
|
||||||
|
section = section,
|
||||||
|
enabled = enabled,
|
||||||
|
iface = iface,
|
||||||
|
domain = domain,
|
||||||
|
reg_ip = reg_ip,
|
||||||
|
pid = pid,
|
||||||
|
datelast = datelast,
|
||||||
|
datenext = datenext
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
uci:unload("ddns")
|
||||||
|
|
||||||
|
return data
|
||||||
|
end
|
||||||
|
|
||||||
|
-- called by XHR.get from detail_logview.htm
|
||||||
|
function logread(section)
|
||||||
|
-- read application settings
|
||||||
|
local uci = luci.model.uci.cursor()
|
||||||
|
local log_dir = uci:get("ddns", "global", "log_dir") or "/var/log/ddns"
|
||||||
|
local lfile=log_dir .. "/" .. section .. ".log"
|
||||||
|
|
||||||
|
local ldata=nixio.fs.readfile(lfile)
|
||||||
|
if not ldata or #ldata == 0 then
|
||||||
|
ldata="_nodata_"
|
||||||
|
end
|
||||||
|
luci.http.write(ldata)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- called by XHR.get from overview_status.htm
|
||||||
|
function startstop(section, enabled)
|
||||||
|
-- Array to transfer data to javascript
|
||||||
|
local data = {}
|
||||||
|
-- read application settings
|
||||||
|
local uci = luci.model.uci.cursor()
|
||||||
|
local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns"
|
||||||
|
|
||||||
|
-- if process running we want to stop and return
|
||||||
|
local pid = luci.tools.ddns.get_pid(section, run_dir)
|
||||||
|
if pid > 0 then
|
||||||
|
os.execute ([[kill -9 %s]] % pid)
|
||||||
|
nixio.nanosleep(2) -- 2 second "show time"
|
||||||
|
-- status changed so return full status
|
||||||
|
data = _get_status()
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(data)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- read uncommited 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
|
||||||
|
-- uncommited changes pending, so exit here
|
||||||
|
if not exec then
|
||||||
|
luci.http.write("_uncommited_")
|
||||||
|
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 dynamic_dns_updater.sh script
|
||||||
|
os.execute ([[/usr/lib/ddns/dynamic_dns_updater.sh %s 0 > /dev/null 2>&1 &]] % section)
|
||||||
|
nixio.nanosleep(3) -- 3 seconds "show time"
|
||||||
|
|
||||||
|
-- status changed so return full status
|
||||||
|
data = _get_status()
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- called by XHR.poll from overview_status.htm
|
||||||
|
function status()
|
||||||
|
local data = _get_status()
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(data)
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,6 +26,10 @@ s.anonymous = false
|
||||||
|
|
||||||
s:option(Flag, "enabled", translate("Enable"))
|
s:option(Flag, "enabled", translate("Enable"))
|
||||||
|
|
||||||
|
interface = s:option(ListValue, "interface", translate("Event interface"), translate("Network on which the ddns-updater scripts will be started"))
|
||||||
|
luci.tools.webadmin.cbi_add_networks(interface)
|
||||||
|
interface.default = "wan"
|
||||||
|
|
||||||
svc = s:option(ListValue, "service_name", translate("Service"))
|
svc = s:option(ListValue, "service_name", translate("Service"))
|
||||||
svc.rmempty = false
|
svc.rmempty = false
|
||||||
svc.default = "dyndns.org"
|
svc.default = "dyndns.org"
|
||||||
|
|
1198
applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua
Normal file
1198
applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua
Normal file
File diff suppressed because it is too large
Load diff
129
applications/luci-ddns/luasrc/model/cbi/ddns/hints.lua
Normal file
129
applications/luci-ddns/luasrc/model/cbi/ddns/hints.lua
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
--[[
|
||||||
|
LuCI - Lua Configuration Interface
|
||||||
|
|
||||||
|
Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
]]--
|
||||||
|
|
||||||
|
require "luci.sys"
|
||||||
|
require "luci.dispatcher"
|
||||||
|
require "luci.tools.ddns"
|
||||||
|
|
||||||
|
-- check supported options
|
||||||
|
-- saved to local vars here because doing multiple os calls slow down the system
|
||||||
|
has_ssl = luci.tools.ddns.check_ssl() -- HTTPS support
|
||||||
|
has_proxy = luci.tools.ddns.check_proxy() -- Proxy support
|
||||||
|
has_dnstcp = luci.tools.ddns.check_bind_host() -- DNS TCP support
|
||||||
|
|
||||||
|
-- html constants
|
||||||
|
bold_on = [[<strong>]]
|
||||||
|
bold_off = [[</strong>]]
|
||||||
|
|
||||||
|
-- cbi-map definition
|
||||||
|
m = Map("ddns")
|
||||||
|
|
||||||
|
m.title = [[<a href="]] .. luci.dispatcher.build_url("admin", "services", "ddns") .. [[">]] ..
|
||||||
|
translate("Dynamic DNS") .. [[</a>]]
|
||||||
|
|
||||||
|
m.description = translate("Dynamic DNS allows that your router can be reached with " ..
|
||||||
|
"a fixed hostname while having a dynamically changing " ..
|
||||||
|
"IP address.")
|
||||||
|
|
||||||
|
m.redirect = luci.dispatcher.build_url("admin", "services", "ddns")
|
||||||
|
|
||||||
|
-- SimpleSection definition
|
||||||
|
-- show Hints to optimize installation and script usage
|
||||||
|
s = m:section( SimpleSection,
|
||||||
|
translate("Hints"),
|
||||||
|
translate("Below a list of configuration tips for your system to run Dynamic DNS updates without limitations") )
|
||||||
|
-- DDNS Service disabled
|
||||||
|
if not luci.sys.init.enabled("ddns") then
|
||||||
|
local dv = s:option(DummyValue, "_not_enabled")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "startup")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("DDNS Autostart disabled") .. bold_off
|
||||||
|
dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "<br />" ..
|
||||||
|
"This is the default if you run DDNS scripts by yourself (i.e. via cron with force_interval set to '0')" )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- No IPv6 support
|
||||||
|
if not luci.tools.ddns.check_ipv6() then
|
||||||
|
local dv = s:option(DummyValue, "_no_ipv6")
|
||||||
|
dv.titleref = 'http://www.openwrt.org" target="_blank'
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("IPv6 not supported") .. bold_off
|
||||||
|
dv.value = translate("IPv6 is currently not (fully) supported by this system" .. "<br />" ..
|
||||||
|
"Please follow the instructions on OpenWrt's homepage to enable IPv6 support" .. "<br />" ..
|
||||||
|
"or update your system to the latest OpenWrt Release")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- No HTTPS support
|
||||||
|
if not has_ssl then
|
||||||
|
local dv = s:option(DummyValue, "_no_https")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "packages")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("HTTPS not supported") .. bold_off
|
||||||
|
dv.value = translate("Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol.") ..
|
||||||
|
"<br />- " ..
|
||||||
|
translate("You should install GNU Wget with SSL (prefered) or cURL package.") ..
|
||||||
|
"<br />- " ..
|
||||||
|
translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- cURL without proxy support
|
||||||
|
if has_ssl and not has_proxy then
|
||||||
|
local dv = s:option(DummyValue, "_no_proxy")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "packages")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("cURL without Proxy Support") .. bold_off
|
||||||
|
dv.value = translate("cURL is installed, but libcurl was compiled without proxy support.") ..
|
||||||
|
"<br />- " ..
|
||||||
|
translate("You should install GNU Wget with SSL or replace libcurl.") ..
|
||||||
|
"<br />- " ..
|
||||||
|
translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "Force IP Version not supported"
|
||||||
|
if not (has_ssl and has_dnstcp) then
|
||||||
|
local dv = s:option(DummyValue, "_no_force_ip")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "packages")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("Force IP Version not supported") .. bold_off
|
||||||
|
local value = translate("BusyBox's nslookup and Wget do not support to specify " ..
|
||||||
|
"the IP version to use for communication with DDNS Provider.")
|
||||||
|
if not has_ssl then
|
||||||
|
value = value .. "<br />- " ..
|
||||||
|
translate("You should install GNU Wget with SSL (prefered) or cURL package.")
|
||||||
|
end
|
||||||
|
if not has_dnstcp then
|
||||||
|
value = value .. "<br />- " ..
|
||||||
|
translate("You should install BIND host package for DNS requests.")
|
||||||
|
end
|
||||||
|
dv.value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "DNS requests via TCP not supported"
|
||||||
|
if not has_dnstcp then
|
||||||
|
local dv = s:option(DummyValue, "_no_dnstcp")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "packages")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("DNS requests via TCP not supported") .. bold_off
|
||||||
|
dv.value = translate("BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server") ..
|
||||||
|
"<br />- " ..
|
||||||
|
translate("You should install BIND host package for DNS requests.")
|
||||||
|
end
|
||||||
|
|
||||||
|
return m
|
224
applications/luci-ddns/luasrc/model/cbi/ddns/overview.lua
Normal file
224
applications/luci-ddns/luasrc/model/cbi/ddns/overview.lua
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
--[[
|
||||||
|
LuCI - Lua Configuration Interface
|
||||||
|
|
||||||
|
Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
]]--
|
||||||
|
|
||||||
|
require "nixio.fs"
|
||||||
|
require "luci.sys"
|
||||||
|
require "luci.dispatcher"
|
||||||
|
require "luci.tools.ddns"
|
||||||
|
|
||||||
|
-- show hints ?
|
||||||
|
show_hints = not (luci.tools.ddns.check_ipv6() -- IPv6 support
|
||||||
|
and luci.tools.ddns.check_ssl() -- HTTPS support
|
||||||
|
and luci.tools.ddns.check_proxy() -- Proxy support
|
||||||
|
and luci.tools.ddns.check_bind_host() -- DNS TCP support
|
||||||
|
)
|
||||||
|
|
||||||
|
-- html constants
|
||||||
|
font_red = [[<font color="red">]]
|
||||||
|
font_off = [[</font>]]
|
||||||
|
bold_on = [[<strong>]]
|
||||||
|
bold_off = [[</strong>]]
|
||||||
|
|
||||||
|
-- cbi-map definition
|
||||||
|
m = Map("ddns",
|
||||||
|
translate("Dynamic DNS"),
|
||||||
|
translate("Dynamic DNS allows that your router can be reached with " ..
|
||||||
|
"a fixed hostname while having a dynamically changing " ..
|
||||||
|
"IP address."))
|
||||||
|
|
||||||
|
-- read application settings
|
||||||
|
date_format = m.uci:get(m.config, "global", "date_format") or "%F %R"
|
||||||
|
run_dir = m.uci:get(m.config, "global", "run_dir") or "/var/run/ddns"
|
||||||
|
|
||||||
|
-- SimpleSection definition
|
||||||
|
-- show Hints to optimize installation and script usage
|
||||||
|
-- only show if service not enabled
|
||||||
|
-- or no IPv6 support
|
||||||
|
-- or not GNU Wget and not cURL (for https support)
|
||||||
|
-- or not GNU Wget but cURL without proxy support
|
||||||
|
-- or not BIND's host
|
||||||
|
if show_hints or not luci.sys.init.enabled("ddns") then
|
||||||
|
s = m:section( SimpleSection, translate("Hints") )
|
||||||
|
-- DDNS Service disabled
|
||||||
|
if not luci.sys.init.enabled("ddns") then
|
||||||
|
local dv = s:option(DummyValue, "_not_enabled")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "system", "startup")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("DDNS Autostart disabled") .. bold_off
|
||||||
|
dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "<br />" ..
|
||||||
|
"You can start/stop each configuration here. It will run until next reboot.")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Show more hints on a separate page
|
||||||
|
if show_hints then
|
||||||
|
local dv = s:option(DummyValue, "_separate")
|
||||||
|
dv.titleref = luci.dispatcher.build_url("admin", "services", "ddns", "hints")
|
||||||
|
dv.rawhtml = true
|
||||||
|
dv.title = bold_on ..
|
||||||
|
translate("Show more") .. bold_off
|
||||||
|
dv.value = translate("Follow this link" .. "<br />" ..
|
||||||
|
"You will find more hints to optimize your system to run DDNS scripts with all options")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- SimpleSection definiton
|
||||||
|
-- with all the JavaScripts we need for "a good Show"
|
||||||
|
a = m:section( SimpleSection )
|
||||||
|
a.template = "ddns/overview_status"
|
||||||
|
|
||||||
|
-- TableSection definition
|
||||||
|
ts = m:section( TypedSection, "service",
|
||||||
|
translate("Overview"),
|
||||||
|
translate("Below is a list of configured DDNS configurations and their current state." .. "<br />" ..
|
||||||
|
"If you want to send updates for IPv4 and IPv6 you need to define two separate Configurations " ..
|
||||||
|
"i.e. 'myddns_ipv4' and 'myddns_ipv6'") )
|
||||||
|
ts.sectionhead = translate("Configuration")
|
||||||
|
ts.template = "cbi/tblsection"
|
||||||
|
ts.addremove = true
|
||||||
|
ts.extedit = luci.dispatcher.build_url("admin", "services", "ddns", "detail", "%s")
|
||||||
|
function ts.create(self, name)
|
||||||
|
AbstractSection.create(self, name)
|
||||||
|
luci.http.redirect( self.extedit:format(name) )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Domain and registered IP
|
||||||
|
dom = ts:option(DummyValue, "_domainIP",
|
||||||
|
translate("Hostname/Domain") .. "<br />" .. translate("Registered IP") )
|
||||||
|
dom.template = "ddns/overview_doubleline"
|
||||||
|
function dom.set_one(self, section)
|
||||||
|
local domain = self.map:get(section, "domain") or ""
|
||||||
|
if domain ~= "" then
|
||||||
|
return domain
|
||||||
|
else
|
||||||
|
return [[<em>]] .. translate("config error") .. [[</em>]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function dom.set_two(self, section)
|
||||||
|
local domain = self.map:get(section, "domain") or ""
|
||||||
|
if domain == "" then return "" end
|
||||||
|
local dnsserver = self.map:get(section, "dnsserver") or ""
|
||||||
|
local use_ipv6 = tonumber(self.map:get(section, "use_ipv6") or 0)
|
||||||
|
local force_ipversion = tonumber(self.map:get(section, "force_ipversion") or 0)
|
||||||
|
local force_dnstcp = tonumber(self.map:get(section, "force_dnstcp") or 0)
|
||||||
|
local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]]
|
||||||
|
if not nixio.fs.access(command, "rwx", "rx", "rx") then
|
||||||
|
nixio.fs.chmod(command, 755)
|
||||||
|
end
|
||||||
|
command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
|
||||||
|
[[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
|
||||||
|
local ip = luci.sys.exec(command)
|
||||||
|
if ip == "" then ip = translate("no data") end
|
||||||
|
return ip
|
||||||
|
end
|
||||||
|
|
||||||
|
-- enabled
|
||||||
|
ena = ts:option( Flag, "enabled",
|
||||||
|
translate("Enabled"))
|
||||||
|
ena.template = "ddns/overview_enabled"
|
||||||
|
ena.rmempty = false
|
||||||
|
|
||||||
|
-- show PID and next update
|
||||||
|
upd = ts:option( DummyValue, "_update",
|
||||||
|
translate("Last Update") .. "<br />" .. translate("Next Update"))
|
||||||
|
upd.template = "ddns/overview_doubleline"
|
||||||
|
function upd.set_one(self, section) -- fill Last Update
|
||||||
|
-- get/validate last update
|
||||||
|
local uptime = luci.sys.uptime()
|
||||||
|
local lasttime = tonumber(nixio.fs.readfile("%s/%s.update" % { run_dir, section } ) or 0 )
|
||||||
|
if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot
|
||||||
|
lasttime = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- no last update happen
|
||||||
|
if lasttime == 0 then
|
||||||
|
return translate("never")
|
||||||
|
|
||||||
|
-- we read last update
|
||||||
|
else
|
||||||
|
-- calc last update
|
||||||
|
-- os.epoch - sys.uptime + lastupdate(uptime)
|
||||||
|
local epoch = os.time() - uptime + lasttime
|
||||||
|
-- use linux date to convert epoch
|
||||||
|
return luci.sys.exec([[/bin/date -d @]] .. epoch .. [[ +']] .. date_format .. [[']])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function upd.set_two(self, section) -- fill Next Update
|
||||||
|
-- get enabled state
|
||||||
|
local enabled = tonumber(self.map:get(section, "enabled") or 0)
|
||||||
|
local datenext = translate("unknown error") -- formatted date of next update
|
||||||
|
|
||||||
|
-- get force seconds
|
||||||
|
local force_interval = tonumber(self.map:get(section, "force_interval") or 72)
|
||||||
|
local force_unit = self.map:get(section, "force_unit") or "hours"
|
||||||
|
local force_seconds = luci.tools.ddns.calc_seconds(force_interval, force_unit)
|
||||||
|
|
||||||
|
-- get last update and get/validate PID
|
||||||
|
local uptime = luci.sys.uptime()
|
||||||
|
local lasttime = tonumber(nixio.fs.readfile("%s/%s.update" % { run_dir, section } ) or 0 )
|
||||||
|
if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot
|
||||||
|
lasttime = 0
|
||||||
|
end
|
||||||
|
local pid = luci.tools.ddns.get_pid(section, run_dir)
|
||||||
|
|
||||||
|
-- calc next update
|
||||||
|
if lasttime > 0 then
|
||||||
|
local epoch = os.time() - uptime + lasttime + force_seconds
|
||||||
|
-- use linux date to convert epoch
|
||||||
|
datelast = luci.sys.exec([[/bin/date -d @]] .. epoch .. [[ +']] .. date_format .. [[']])
|
||||||
|
end
|
||||||
|
|
||||||
|
-- process running but update needs to happen
|
||||||
|
if pid > 0 and ( lasttime + force_seconds - uptime ) < 0 then
|
||||||
|
datenext = translate("Verify")
|
||||||
|
|
||||||
|
-- run once
|
||||||
|
elseif force_seconds == 0 then
|
||||||
|
datenext = translate("Run once")
|
||||||
|
|
||||||
|
-- no process running and NOT enabled
|
||||||
|
elseif pid == 0 and enabled == 0 then
|
||||||
|
datenext = translate("Disabled")
|
||||||
|
|
||||||
|
-- no process running and NOT
|
||||||
|
elseif pid == 0 and enabled ~= 0 then
|
||||||
|
datenext = translate("Stopped")
|
||||||
|
end
|
||||||
|
|
||||||
|
return datenext
|
||||||
|
end
|
||||||
|
|
||||||
|
-- start/stop button
|
||||||
|
btn = ts:option( Button, "_startstop",
|
||||||
|
translate("Process ID") .. "<br />" .. translate("Start / Stop") )
|
||||||
|
btn.template = "ddns/overview_startstop"
|
||||||
|
function btn.cfgvalue(self, section)
|
||||||
|
local pid = luci.tools.ddns.get_pid(section, run_dir)
|
||||||
|
if pid > 0 then
|
||||||
|
btn.inputtitle = "PID: " .. pid
|
||||||
|
btn.inputstyle = "reset"
|
||||||
|
btn.disabled = false
|
||||||
|
elseif (self.map:get(section, "enabled") or "0") ~= "0" then
|
||||||
|
btn.inputtitle = translate("Start")
|
||||||
|
btn.inputstyle = "apply"
|
||||||
|
btn.disabled = false
|
||||||
|
else
|
||||||
|
btn.inputtitle = "----------"
|
||||||
|
btn.inputstyle = "button"
|
||||||
|
btn.disabled = true
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return m
|
212
applications/luci-ddns/luasrc/tools/ddns.lua
Normal file
212
applications/luci-ddns/luasrc/tools/ddns.lua
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
--[[
|
||||||
|
LuCI - Lua Configuration Interface
|
||||||
|
|
||||||
|
shared module for luci-app-ddns-v2
|
||||||
|
Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
|
||||||
|
|
||||||
|
function parse_url copied from https://svn.nmap.org/nmap/nselib/url.lua
|
||||||
|
Parses a URL and returns a table with all its parts according to RFC 2396.
|
||||||
|
@author Diego Nehab @author Eddie Bell <ejlbell@gmail.com>
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
]]--
|
||||||
|
|
||||||
|
module("luci.tools.ddns", package.seeall)
|
||||||
|
|
||||||
|
require "luci.sys"
|
||||||
|
require "nixio.fs"
|
||||||
|
|
||||||
|
function check_ipv6()
|
||||||
|
return nixio.fs.access("/proc/net/ipv6_route")
|
||||||
|
and nixio.fs.access("/usr/sbin/ip6tables")
|
||||||
|
end
|
||||||
|
|
||||||
|
function check_ssl()
|
||||||
|
if (luci.sys.call([[ grep -iq "\+ssl" /usr/bin/wget 2>/dev/null ]]) == 0) then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return nixio.fs.access("/usr/bin/curl")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function check_proxy()
|
||||||
|
-- we prefere GNU Wget for communication
|
||||||
|
if (luci.sys.call([[ grep -iq "\+ssl" /usr/bin/wget 2>/dev/null ]]) == 0) then
|
||||||
|
return true
|
||||||
|
|
||||||
|
-- if not installed cURL must support proxy
|
||||||
|
elseif nixio.fs.access("/usr/bin/curl") then
|
||||||
|
return (luci.sys.call([[ grep -iq all_proxy /usr/lib/libcurl.so* 2>/dev/null ]]) == 0)
|
||||||
|
|
||||||
|
-- only BusyBox Wget is installed
|
||||||
|
else
|
||||||
|
return nixio.fs.access("/usr/bin/wget")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function check_bind_host()
|
||||||
|
return nixio.fs.access("/usr/bin/host")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- function to calculate seconds from given interval and unit
|
||||||
|
function calc_seconds(interval, unit)
|
||||||
|
if not tonumber(interval) then
|
||||||
|
return nil
|
||||||
|
elseif unit == "days" then
|
||||||
|
return (tonumber(interval) * 86400) -- 60 sec * 60 min * 24 h
|
||||||
|
elseif unit == "hours" then
|
||||||
|
return (tonumber(interval) * 3600) -- 60 sec * 60 min
|
||||||
|
elseif unit == "minutes" then
|
||||||
|
return (tonumber(interval) * 60) -- 60 sec
|
||||||
|
elseif unit == "seconds" then
|
||||||
|
return tonumber(interval)
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- read PID from run file and verify if still running
|
||||||
|
function get_pid(section, run_dir)
|
||||||
|
local pid = tonumber(nixio.fs.readfile("%s/%s.pid" % { run_dir, section } ) or 0 )
|
||||||
|
if pid > 0 and not luci.sys.process.signal(pid, 0) then
|
||||||
|
pid = 0
|
||||||
|
end
|
||||||
|
return pid
|
||||||
|
end
|
||||||
|
|
||||||
|
-- replacement of build-in read of UCI option
|
||||||
|
-- modified AbstractValue.cfgvalue(self, section) from cbi.lua
|
||||||
|
-- needed to read from other option then current value definition
|
||||||
|
function read_value(self, section, option)
|
||||||
|
local value
|
||||||
|
if self.tag_error[section] then
|
||||||
|
value = self:formvalue(section)
|
||||||
|
else
|
||||||
|
value = self.map:get(section, option)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not value then
|
||||||
|
return nil
|
||||||
|
elseif not self.cast or self.cast == type(value) then
|
||||||
|
return value
|
||||||
|
elseif self.cast == "string" then
|
||||||
|
if type(value) == "table" then
|
||||||
|
return value[1]
|
||||||
|
end
|
||||||
|
elseif self.cast == "table" then
|
||||||
|
return { value }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
-- copied from https://svn.nmap.org/nmap/nselib/url.lua
|
||||||
|
-- @author Diego Nehab
|
||||||
|
-- @author Eddie Bell <ejlbell@gmail.com>
|
||||||
|
--[[
|
||||||
|
URI parsing, composition and relative URL resolution
|
||||||
|
LuaSocket toolkit.
|
||||||
|
Author: Diego Nehab
|
||||||
|
RCS ID: $Id: url.lua,v 1.37 2005/11/22 08:33:29 diego Exp $
|
||||||
|
parse_query and build_query added For nmap (Eddie Bell <ejlbell@gmail.com>)
|
||||||
|
]]--
|
||||||
|
---
|
||||||
|
-- Parses a URL and returns a table with all its parts according to RFC 2396.
|
||||||
|
--
|
||||||
|
-- The following grammar describes the names given to the URL parts.
|
||||||
|
-- <code>
|
||||||
|
-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
|
||||||
|
-- <authority> ::= <userinfo>@<host>:<port>
|
||||||
|
-- <userinfo> ::= <user>[:<password>]
|
||||||
|
-- <path> :: = {<segment>/}<segment>
|
||||||
|
-- </code>
|
||||||
|
--
|
||||||
|
-- The leading <code>/</code> in <code>/<path></code> is considered part of
|
||||||
|
-- <code><path></code>.
|
||||||
|
-- @param url URL of request.
|
||||||
|
-- @param default Table with default values for each field.
|
||||||
|
-- @return A table with the following fields, where RFC naming conventions have
|
||||||
|
-- been preserved:
|
||||||
|
-- <code>scheme</code>, <code>authority</code>, <code>userinfo</code>,
|
||||||
|
-- <code>user</code>, <code>password</code>, <code>host</code>,
|
||||||
|
-- <code>port</code>, <code>path</code>, <code>params</code>,
|
||||||
|
-- <code>query</code>, and <code>fragment</code>.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
function parse_url(url) --, default)
|
||||||
|
-- initialize default parameters
|
||||||
|
local parsed = {}
|
||||||
|
-- for i,v in base.pairs(default or parsed) do
|
||||||
|
-- parsed[i] = v
|
||||||
|
-- end
|
||||||
|
|
||||||
|
-- remove whitespace
|
||||||
|
-- url = string.gsub(url, "%s", "")
|
||||||
|
-- get fragment
|
||||||
|
url = string.gsub(url, "#(.*)$",
|
||||||
|
function(f)
|
||||||
|
parsed.fragment = f
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
-- get scheme. Lower-case according to RFC 3986 section 3.1.
|
||||||
|
url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
|
||||||
|
function(s)
|
||||||
|
parsed.scheme = string.lower(s);
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
-- get authority
|
||||||
|
url = string.gsub(url, "^//([^/]*)",
|
||||||
|
function(n)
|
||||||
|
parsed.authority = n
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
-- get query stringing
|
||||||
|
url = string.gsub(url, "%?(.*)",
|
||||||
|
function(q)
|
||||||
|
parsed.query = q
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
-- get params
|
||||||
|
url = string.gsub(url, "%;(.*)",
|
||||||
|
function(p)
|
||||||
|
parsed.params = p
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
-- path is whatever was left
|
||||||
|
parsed.path = url
|
||||||
|
|
||||||
|
local authority = parsed.authority
|
||||||
|
if not authority then
|
||||||
|
return parsed
|
||||||
|
end
|
||||||
|
authority = string.gsub(authority,"^([^@]*)@",
|
||||||
|
function(u)
|
||||||
|
parsed.userinfo = u;
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
authority = string.gsub(authority, ":([0-9]*)$",
|
||||||
|
function(p)
|
||||||
|
if p ~= "" then
|
||||||
|
parsed.port = p
|
||||||
|
end;
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
if authority ~= "" then
|
||||||
|
parsed.host = authority
|
||||||
|
end
|
||||||
|
|
||||||
|
local userinfo = parsed.userinfo
|
||||||
|
if not userinfo then
|
||||||
|
return parsed
|
||||||
|
end
|
||||||
|
userinfo = string.gsub(userinfo, ":([^:]*)$",
|
||||||
|
function(p)
|
||||||
|
parsed.password = p;
|
||||||
|
return ""
|
||||||
|
end)
|
||||||
|
parsed.user = userinfo
|
||||||
|
return parsed
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
<%+ddns/system_status%>
|
56
applications/luci-ddns/luasrc/view/ddns/detail_logview.htm
Normal file
56
applications/luci-ddns/luasrc/view/ddns/detail_logview.htm
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ detail_logview.htm ++ -->
|
||||||
|
<script type="text/javascript">//<![CDATA[
|
||||||
|
function onclick_logview(section, bottom) {
|
||||||
|
// get elements
|
||||||
|
var txt = document.getElementById("cbid.ddns." + section + "._logview.txt"); // TextArea
|
||||||
|
if ( !txt ) { return; } // security check
|
||||||
|
|
||||||
|
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "logview")%>/' + section, null,
|
||||||
|
function(x) {
|
||||||
|
if (x.responseText == "_nodata_")
|
||||||
|
txt.value = "<%:File not found or empty%>";
|
||||||
|
else
|
||||||
|
txt.value = x.responseText;
|
||||||
|
if (bottom)
|
||||||
|
txt.scrollTop = txt.scrollHeight;
|
||||||
|
else
|
||||||
|
txt.scrollTop = 0; }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//]]></script>
|
||||||
|
|
||||||
|
<%+cbi/valueheader%>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<%
|
||||||
|
-- one button on top, one at the buttom
|
||||||
|
%>
|
||||||
|
<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, false)"
|
||||||
|
<%=
|
||||||
|
attr("name", section) .. attr("id", cbid .. ".btn1") .. attr("value", self.inputtitle)
|
||||||
|
%> />
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
<%
|
||||||
|
-- set a readable style taken from openwrt theme for textarea#syslog
|
||||||
|
-- in openwrt theme there are problems with a width of 100 so we check for theme and set to lower value
|
||||||
|
%>
|
||||||
|
<textarea style="width: <%if media == "/luci-static/openwrt.org" then%>98.7%<%else%>100%<%end%> ; min-height: 500px; border: 3px solid #cccccc; padding: 5px; font-family: monospace; resize: none;" wrap="off" readonly="readonly"
|
||||||
|
<%=
|
||||||
|
attr("name", cbid .. ".txt") .. attr("id", cbid .. ".txt") .. ifattr(self.rows, "rows")
|
||||||
|
%> >
|
||||||
|
<%-=pcdata(self:cfgvalue(section))-%>
|
||||||
|
</textarea>
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
<%
|
||||||
|
-- one button on top, one at the buttom
|
||||||
|
%>
|
||||||
|
<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, true)"
|
||||||
|
<%= attr("name", section) .. attr("id", cbid .. ".btn2") .. attr("value", self.inputtitle) %> />
|
||||||
|
|
||||||
|
<%+cbi/valuefooter%>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ detail_logview.htm ++ -->
|
22
applications/luci-ddns/luasrc/view/ddns/detail_lvalue.htm
Normal file
22
applications/luci-ddns/luasrc/view/ddns/detail_lvalue.htm
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ detail_lvalue.htm ++ -->
|
||||||
|
<!-- no value header to supress next line -->
|
||||||
|
 
|
||||||
|
<% if self.widget == "select" then %>
|
||||||
|
<select class="cbi-input-select" onchange="cbi_d_update(this.id)"<%= attr("id", cbid) .. attr("name", cbid) .. ifattr(self.size, "size") %>>
|
||||||
|
<% for i, key in pairs(self.keylist) do -%>
|
||||||
|
<option id="cbi-<%=self.config.."-"..section.."-"..self.option.."-"..key%>"<%= attr("value", key) .. ifattr(tostring(self:cfgvalue(section) or self.default) == key, "selected", "selected") %>><%=striptags(self.vallist[i])%></option>
|
||||||
|
<%- end %>
|
||||||
|
</select>
|
||||||
|
<% elseif self.widget == "radio" then
|
||||||
|
local c = 0
|
||||||
|
for i, key in pairs(self.keylist) do
|
||||||
|
c = c + 1
|
||||||
|
%>
|
||||||
|
<input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio"<%= attr("id", cbid..c) .. attr("name", cbid) .. attr("value", key) .. ifattr((self:cfgvalue(section) or self.default) == key, "checked", "checked") %> />
|
||||||
|
<label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label>
|
||||||
|
<% if c == self.size then c = 0 %><% if self.orientation == "horizontal" then %> <% else %><br /><% end %>
|
||||||
|
<% end end %>
|
||||||
|
<% end %>
|
||||||
|
<%+cbi/valuefooter%>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ detail_lvalue.htm ++ -->
|
9
applications/luci-ddns/luasrc/view/ddns/detail_value.htm
Normal file
9
applications/luci-ddns/luasrc/view/ddns/detail_value.htm
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ detail_value.htm ++ -->
|
||||||
|
<%+cbi/valueheader%>
|
||||||
|
<input type="text" class="cbi-input-text" style="width: 10em;" onchange="cbi_d_update(this.id)"<%=
|
||||||
|
attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
|
||||||
|
ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
|
||||||
|
%> />
|
||||||
|
<!-- no value footer to supress next line -->
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ detail_value.htm ++ -->
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ overview_doubleline.htm ++ -->
|
||||||
|
<%+cbi/valueheader%>
|
||||||
|
|
||||||
|
<span id="<%=cbid%>.one"><%=self:set_one(section)%></span>
|
||||||
|
<br />
|
||||||
|
<span id="<%=cbid%>.two"><%=self:set_two(section)%></span>
|
||||||
|
|
||||||
|
<%+cbi/valuefooter%>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ overview_doubleline.htm ++ -->
|
15
applications/luci-ddns/luasrc/view/ddns/overview_enabled.htm
Normal file
15
applications/luci-ddns/luasrc/view/ddns/overview_enabled.htm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ overview_enabled.htm ++ -->
|
||||||
|
<%+cbi/valueheader%>
|
||||||
|
|
||||||
|
<input type="hidden" value="1"<%=
|
||||||
|
attr("name", "cbi.cbe." .. self.config .. "." .. section .. "." .. self.option)
|
||||||
|
%> />
|
||||||
|
<!-- modified to call own function -->
|
||||||
|
<input class="cbi-input-checkbox" onclick="cbi_d_update(this.id)" onchange="onchange_enabled(this.id)" type="checkbox"<%=
|
||||||
|
attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) ..
|
||||||
|
ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked")
|
||||||
|
%> />
|
||||||
|
|
||||||
|
<%+cbi/valuefooter%>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ overview_enabled.htm ++ -->
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ overview_startstop.htm ++ -->
|
||||||
|
<%+cbi/valueheader%>
|
||||||
|
|
||||||
|
<% if self:cfgvalue(section) ~= false then
|
||||||
|
-- We need to garantie that function cfgvalue run first to set missing parameters
|
||||||
|
%>
|
||||||
|
<!-- style="font-size: 100%;" needed for openwrt theme to fix font size -->
|
||||||
|
<!-- type="button" onclick="..." enable standard onclick functionalty -->
|
||||||
|
<input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)"
|
||||||
|
<%=
|
||||||
|
attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled")
|
||||||
|
%> />
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%+cbi/valuefooter%>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ overview_startstop.htm ++ -->
|
178
applications/luci-ddns/luasrc/view/ddns/overview_status.htm
Normal file
178
applications/luci-ddns/luasrc/view/ddns/overview_status.htm
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ overview_status.htm ++ -->
|
||||||
|
<script type="text/javascript">//<![CDATA[
|
||||||
|
|
||||||
|
// helper to extract section from objects id
|
||||||
|
// cbi.ddns.SECTION._xyz
|
||||||
|
function _id2section(id) {
|
||||||
|
var x = id.split(".");
|
||||||
|
return x[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper to move status data to the relevant
|
||||||
|
// screen objects
|
||||||
|
// called by XHR.poll and onclick_startstop
|
||||||
|
function _data2elements(data) {
|
||||||
|
// DDNS Service
|
||||||
|
// data[0] ignored here
|
||||||
|
|
||||||
|
// Service sections
|
||||||
|
for( i = 1; i < data.length; i++ )
|
||||||
|
{
|
||||||
|
var section = data[i].section // Section to handle
|
||||||
|
var cbx = document.getElementById("cbid.ddns." + section + ".enabled"); // Enabled
|
||||||
|
var btn = document.getElementById("cbid.ddns." + section + "._startstop"); // Start/Stop button
|
||||||
|
var rip = document.getElementById("cbid.ddns." + section + "._domainIP.two"); // Registered IP
|
||||||
|
var lup = document.getElementById("cbid.ddns." + section + "._update.one"); // Last Update
|
||||||
|
var nup = document.getElementById("cbid.ddns." + section + "._update.two"); // Next Update
|
||||||
|
if ( !(cbx && btn && rip && lup && nup) ) { return; } // security check
|
||||||
|
|
||||||
|
// process id
|
||||||
|
if (data[i].pid > 0) {
|
||||||
|
// stop always possible if process running
|
||||||
|
btn.value = "PID: " + data[i].pid;
|
||||||
|
btn.className = "cbi-button cbi-input-reset";
|
||||||
|
} else {
|
||||||
|
// default Start / enabled
|
||||||
|
btn.value = "<%:Start%>";
|
||||||
|
btn.className = "cbi-button cbi-input-apply";
|
||||||
|
}
|
||||||
|
btn.disabled = false; // button enabled
|
||||||
|
|
||||||
|
// last update
|
||||||
|
switch (data[i].datelast) {
|
||||||
|
case "_empty_":
|
||||||
|
lup.innerHTML = '<em><%:Unknown error%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_never_":
|
||||||
|
lup.innerHTML = '<em><%:Never%></em>' ;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lup.innerHTML = data[i].datelast;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// next update
|
||||||
|
switch (data[i].datenext) {
|
||||||
|
case "_empty_":
|
||||||
|
nup.innerHTML = '<em><%:Unknown error%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_verify_":
|
||||||
|
nup.innerHTML = '<em><%:Verify%></em>';
|
||||||
|
break;
|
||||||
|
case "_runonce_":
|
||||||
|
case "_stopped_":
|
||||||
|
case "_disabled_":
|
||||||
|
if (cbx.checked && data[i].datenext == "_runonce_") {
|
||||||
|
nup.innerHTML = '<em><%:Run once%></em>';
|
||||||
|
} else if (cbx.checked) {
|
||||||
|
nup.innerHTML = '<em><%:Stopped%></em>';
|
||||||
|
} else {
|
||||||
|
nup.innerHTML = '<em><%:Disabled%></em>';
|
||||||
|
btn.value = '----------';
|
||||||
|
btn.className = "cbi-button cbi-input-button"; // no image
|
||||||
|
btn.disabled = true; // disabled
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
nup.innerHTML = data[i].datenext;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// domain
|
||||||
|
// (data[i].domain ignored here
|
||||||
|
|
||||||
|
// registered IP
|
||||||
|
// rip.innerHTML = "Registered IP";
|
||||||
|
if (data[i].domain == "_nodomain_")
|
||||||
|
rip.innerHTML = '';
|
||||||
|
else if (data[i].reg_ip == "_nodata_")
|
||||||
|
rip.innerHTML = '<em><%:No data%></em>';
|
||||||
|
else
|
||||||
|
rip.innerHTML = data[i].reg_ip;
|
||||||
|
|
||||||
|
// monitored interfacce
|
||||||
|
// data[i].iface ignored here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// event handler for enabled checkbox
|
||||||
|
function onchange_enabled(id) {
|
||||||
|
// run original function in cbi.js
|
||||||
|
// whatever is done there
|
||||||
|
cbi_d_update(id);
|
||||||
|
|
||||||
|
var section = _id2section(id);
|
||||||
|
var cbx = document.getElementById("cbid.ddns." + section + ".enabled");
|
||||||
|
var btn = document.getElementById("cbid.ddns." + section + "._startstop");
|
||||||
|
if ( !(cbx && btn) ) { return; } // security check
|
||||||
|
|
||||||
|
var pid_txt = btn.value;
|
||||||
|
var pid_found = ( pid_txt.search("PID") >= 0 ) ? true : false;
|
||||||
|
|
||||||
|
if (pid_found) {
|
||||||
|
// btn.value = "PID: 0000";
|
||||||
|
btn.className = "cbi-button cbi-button-reset";
|
||||||
|
btn.disabled = false;
|
||||||
|
} else if (cbx.checked) {
|
||||||
|
btn.value = "<%:Start%>";
|
||||||
|
btn.className = "cbi-button cbi-button-apply";
|
||||||
|
btn.disabled = false;
|
||||||
|
} else {
|
||||||
|
btn.value = '----------';
|
||||||
|
btn.className = "cbi-button cbi-input-button"; // no image
|
||||||
|
btn.disabled = true; // disabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// event handler for start/stop button
|
||||||
|
function onclick_startstop(id) {
|
||||||
|
// extract section
|
||||||
|
var section = _id2section(id);
|
||||||
|
// get elements
|
||||||
|
var cbx = document.getElementById("cbid.ddns." + section + ".enabled"); // Enabled
|
||||||
|
var obj = document.getElementById("cbi-ddns-overview-status-legend"); // objext defined below to make in-/visible
|
||||||
|
if ( !(obj && cbx) ) { return; } // security check
|
||||||
|
|
||||||
|
// make me visible
|
||||||
|
obj.parentNode.style.display = "block";
|
||||||
|
|
||||||
|
// do start/stop
|
||||||
|
var btnXHR = new XHR();
|
||||||
|
btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "startstop")%>/' + section + '/' + cbx.checked, null,
|
||||||
|
function(x, data) {
|
||||||
|
if (x.responseText == "_uncommited_") {
|
||||||
|
// we need a trick to display Ampersand "&" in stead of "&" or "&"
|
||||||
|
// after translation
|
||||||
|
txt="<%:Please [Save & Apply] your changes first%>";
|
||||||
|
alert( txt.replace(new RegExp("<%:&%>", "g"), "&") );
|
||||||
|
} else {
|
||||||
|
// should have data because status changed
|
||||||
|
// so update screen
|
||||||
|
if (data)
|
||||||
|
_data2elements(data);
|
||||||
|
}
|
||||||
|
// make me invisible
|
||||||
|
obj.parentNode.style.display = "none";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// define only ONE XHR.poll in a page because if one is running it blocks the other one
|
||||||
|
// optimum is to define on Map or Section Level from here you can reach all elements
|
||||||
|
// we need update every 30 seconds only
|
||||||
|
XHR.poll(30, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
|
||||||
|
function(x, data)
|
||||||
|
{
|
||||||
|
_data2elements(data);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
//]]></script>
|
||||||
|
|
||||||
|
<fieldset class="cbi-section" style="display:none">
|
||||||
|
<legend id="cbi-ddns-overview-status-legend"><%:Applying changes%></legend>
|
||||||
|
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
|
||||||
|
<span id="cbi-ddns-overview-status-text"><%:Waiting for changes to be applied...%></span>
|
||||||
|
</fieldset>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ overview_status.htm ++ -->
|
145
applications/luci-ddns/luasrc/view/ddns/system_status.htm
Normal file
145
applications/luci-ddns/luasrc/view/ddns/system_status.htm
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
|
||||||
|
<!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ -->
|
||||||
|
<script type="text/javascript">//<![CDATA[
|
||||||
|
XHR.poll(10, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
|
||||||
|
function(x, data)
|
||||||
|
{
|
||||||
|
var tbl = document.getElementById('ddns_status_table');
|
||||||
|
// security check
|
||||||
|
if ( !(tbl) ) { return; }
|
||||||
|
|
||||||
|
// clear all rows
|
||||||
|
while (tbl.rows.length > 1)
|
||||||
|
tbl.deleteRow(1);
|
||||||
|
|
||||||
|
// variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1)
|
||||||
|
var x = -1;
|
||||||
|
var i = 1;
|
||||||
|
|
||||||
|
// no data => no ddns-scripts Version 2 installed
|
||||||
|
if ( !data ) {
|
||||||
|
var txt = '<br /><strong><font color="red"><%:Old version of ddns-scripts installed%></font>' ;
|
||||||
|
var url = '<a href="' ;
|
||||||
|
url += '<%=luci.dispatcher.build_url("admin", "system", "packages")%>' ;
|
||||||
|
url += '"><%:install update here%></a></strong>' ;
|
||||||
|
var tr = tbl.insertRow(-1);
|
||||||
|
tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((i + x) % 2) + 1);
|
||||||
|
var td = tr.insertCell(-1);
|
||||||
|
td.colSpan = 2 ;
|
||||||
|
td.innerHTML = txt + " - " + url
|
||||||
|
tr.insertCell(-1).colSpan = 3 ;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DDNS Service disabled
|
||||||
|
if (data[0].enabled == 0) {
|
||||||
|
var txt = '<strong><font color="red"><%:DDNS Autostart disabled%></font>' ;
|
||||||
|
var url = '<a href="' + data[0].url_up + '"><%:enable here%></a></strong>' ;
|
||||||
|
var tr = tbl.insertRow(-1);
|
||||||
|
tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((i + x) % 2) + 1);
|
||||||
|
var td = tr.insertCell(-1);
|
||||||
|
td.colSpan = 2 ;
|
||||||
|
td.innerHTML = txt + " - " + url
|
||||||
|
tr.insertCell(-1).colSpan = 3 ;
|
||||||
|
x++ ;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i = 1; i < data.length; i++ )
|
||||||
|
{
|
||||||
|
var tr = tbl.insertRow(-1);
|
||||||
|
tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((i + x) % 2) + 1) ;
|
||||||
|
|
||||||
|
// configuration
|
||||||
|
tr.insertCell(-1).innerHTML = '<strong>' + data[i].section + '</strong>' ;
|
||||||
|
|
||||||
|
// pid
|
||||||
|
// data[i].pid ignored here
|
||||||
|
|
||||||
|
// last update
|
||||||
|
// data[i].datelast ignored here
|
||||||
|
|
||||||
|
// next update
|
||||||
|
switch (data[i].datenext) {
|
||||||
|
case "_empty_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_stopped_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_disabled_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_noupdate_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_runonce_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ;
|
||||||
|
break;
|
||||||
|
case "_verify_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
tr.insertCell(-1).innerHTML = data[i].datenext ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// domain
|
||||||
|
if (data[i].domain == "_nodomain_")
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
|
||||||
|
else
|
||||||
|
tr.insertCell(-1).innerHTML = data[i].domain;
|
||||||
|
|
||||||
|
// registered IP
|
||||||
|
switch (data[i].reg_ip) {
|
||||||
|
case "_nodomain_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
|
||||||
|
break;
|
||||||
|
case "_nodata_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:No data%></em>';
|
||||||
|
break;
|
||||||
|
case "_noipv6_":
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
tr.insertCell(-1).innerHTML = data[i].reg_ip;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// monitored interfacce
|
||||||
|
if (data[i].iface == "_nonet_")
|
||||||
|
tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
|
||||||
|
else
|
||||||
|
tr.insertCell(-1).innerHTML = data[i].iface;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) {
|
||||||
|
var br = '<br />';
|
||||||
|
if (tbl.rows.length > 1)
|
||||||
|
br = '';
|
||||||
|
var tr = tbl.insertRow(-1);
|
||||||
|
tr.className = "cbi-section-table-row";
|
||||||
|
var td = tr.insertCell(-1);
|
||||||
|
td.colSpan = 5;
|
||||||
|
td.innerHTML = '<em>' + br + '<%:There is no service configured.%></em>' ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
//]]></script>
|
||||||
|
|
||||||
|
<fieldset class="cbi-section" id="ddns_status_section">
|
||||||
|
<legend><a href="<%=luci.dispatcher.build_url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
|
||||||
|
|
||||||
|
<table class="cbi-section-table" id="ddns_status_table">
|
||||||
|
<tr class="cbi-section-table-titles">
|
||||||
|
<th class="cbi-section-table-cell"><%:Configuration%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Next Update%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Hostname/Domain%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Registered IP%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Network%></th>
|
||||||
|
</tr>
|
||||||
|
<tr class="cbi-section-table-row">
|
||||||
|
<td colspan="5"><em><br /><%:Collecting data...%></em></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
<!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ -->
|
21
applications/luci-ddns/root/etc/uci-defaults/luci-ddns
Executable file
21
applications/luci-ddns/root/etc/uci-defaults/luci-ddns
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# needed for "Save and Apply" to restart ddns
|
||||||
|
uci -q batch <<-EOF >/dev/null
|
||||||
|
delete ucitrack.@ddns[-1]
|
||||||
|
add ucitrack ddns
|
||||||
|
set ucitrack.@ddns[-1].init="ddns"
|
||||||
|
commit ucitrack
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# make helper script executable
|
||||||
|
chmod 755 /usr/lib/ddns/dynamic_dns_lucihelper.sh
|
||||||
|
|
||||||
|
# update application section for luci-app-ddns
|
||||||
|
uci -q get ddns.global > /dev/null || uci -q set ddns.global='ddns'
|
||||||
|
uci -q get ddns.global.date_format > /dev/null || uci -q set ddns.global.date_format='%F %R'
|
||||||
|
uci -q get ddns.global.log_lines > /dev/null || uci -q set ddns.global.log_lines='250'
|
||||||
|
uci -q commit ddns
|
||||||
|
|
||||||
|
rm -f /tmp/luci-indexcache
|
||||||
|
exit 0
|
82
applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh
Executable file
82
applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh
Executable file
|
@ -0,0 +1,82 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# /usr/lib/ddns/luci_dns_helper.sh
|
||||||
|
#
|
||||||
|
# Written by Christian Schoenebeck in August 2014 to support:
|
||||||
|
# this script is used by luci-app-ddns
|
||||||
|
# - getting registered IP
|
||||||
|
# - check if possible to get local IP
|
||||||
|
# - verifing given DNS- or Proxy-Server
|
||||||
|
#
|
||||||
|
# variables in small chars are read from /etc/config/ddns
|
||||||
|
# variables in big chars are defined inside these scripts as gloval vars
|
||||||
|
# variables in big chars beginning with "__" are local defined inside functions only
|
||||||
|
# set -vx #script debugger
|
||||||
|
|
||||||
|
[ $# -lt 2 ] && exit 1
|
||||||
|
|
||||||
|
. /usr/lib/ddns/dynamic_dns_functions.sh # global vars are also defined here
|
||||||
|
|
||||||
|
# set -vx #script debugger
|
||||||
|
|
||||||
|
# preset some variables wrong or not set in dynamic_dns_functions.sh
|
||||||
|
SECTION_ID="dynamic_dns_lucihelper"
|
||||||
|
LOGFILE="$LOGDIR/$SECTION_ID.log"
|
||||||
|
LUCI_HELPER="ACTIV" # supress verbose and critical logging
|
||||||
|
# global variables normally set by reading DDNS UCI configuration
|
||||||
|
use_logfile=0
|
||||||
|
use_syslog=0
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
get_registered_ip)
|
||||||
|
local IP
|
||||||
|
domain=$2 # Hostname/Domain
|
||||||
|
use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
|
||||||
|
force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
|
||||||
|
force_dnstcp=${5:-"0"} # Force TCP on DNS - default 0 - No
|
||||||
|
dns_server=${6:-""} # DNS server - default No DNS
|
||||||
|
get_registered_ip IP
|
||||||
|
[ $? -ne 0 ] && IP=""
|
||||||
|
echo -n "$IP" # suppress LF
|
||||||
|
;;
|
||||||
|
verify_dns)
|
||||||
|
# $2 == dns-server to verify # no need for force_dnstcp because
|
||||||
|
# verify with nc (netcat) uses tcp anyway
|
||||||
|
use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
|
||||||
|
force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
|
||||||
|
verify_dns "$2"
|
||||||
|
;;
|
||||||
|
verify_proxy)
|
||||||
|
# $2 == proxy string to verify
|
||||||
|
use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
|
||||||
|
force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
|
||||||
|
verify_proxy "$2"
|
||||||
|
;;
|
||||||
|
get_local_ip)
|
||||||
|
local IP
|
||||||
|
use_ipv6="$2" # Use IPv6
|
||||||
|
ip_source="$3" # IP source
|
||||||
|
ip_network="$4" # set if source = "network" otherwise "-"
|
||||||
|
ip_url="$5" # set if source = "web" otherwise "-"
|
||||||
|
ip_interface="$6" # set if source = "interface" itherwiase "-"
|
||||||
|
ip_script="$7" # set if source = "script" otherwise "-"
|
||||||
|
proxy="$8" # proxy if set
|
||||||
|
force_ipversion="0" # not needed but must be set
|
||||||
|
use_https="0" # not needed but must be set
|
||||||
|
[ -n "$proxy" -a "$ip_source" == "web" ] && {
|
||||||
|
# proxy defined, used for ip_source=web
|
||||||
|
export HTTP_PROXY="http://$proxy"
|
||||||
|
export HTTPS_PROXY="http://$proxy"
|
||||||
|
export http_proxy="http://$proxy"
|
||||||
|
export https_proxy="http://$proxy"
|
||||||
|
}
|
||||||
|
# don't need IP only the return code
|
||||||
|
[ "$ip_source" == "web" -o "$ip_source" == "script"] && {
|
||||||
|
# we wait only 3 seconds for an
|
||||||
|
# answer from "web" or "script"
|
||||||
|
__timeout 3 -- get_local_ip IP
|
||||||
|
} || get_local_ip IP
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
534
po/de/ddns.po
534
po/de/ddns.po
|
@ -1,17 +1,57 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: luci-app-ddns\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"POT-Creation-Date: 2014-10-04 16:26+1000\n"
|
||||||
"POT-Creation-Date: 2010-04-02 13:44+0100\n"
|
"PO-Revision-Date: 2014-10-04 16:27+0100\n"
|
||||||
"PO-Revision-Date: 2012-11-21 20:48+0200\n"
|
"Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
|
||||||
"Last-Translator: Jo-Philipp <xm@subsignal.org>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: Poedit 1.5.4\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Pootle 2.0.6\n"
|
"X-Poedit-SourceCharset: UTF-8\n"
|
||||||
|
"X-Poedit-Basepath: .\n"
|
||||||
|
|
||||||
|
msgid "&"
|
||||||
|
msgstr "&"
|
||||||
|
|
||||||
|
msgid "Basic Settings"
|
||||||
|
msgstr "Grundlegende Einstellungen"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Below a list of configuration tips for your system to run Dynamic DNS "
|
||||||
|
"updates without limitations"
|
||||||
|
msgstr ""
|
||||||
|
"Liste der Konfigurationshinweise um Dynamische DNS Aktualisierungen ohne "
|
||||||
|
"Einschränkungen zu nutzen"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Below is a list of configured DDNS configurations and their current state."
|
||||||
|
"<br />If you want to send updates for IPv4 and IPv6 you need to define two "
|
||||||
|
"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
|
||||||
|
msgstr ""
|
||||||
|
"Liste der definierten DDNS Konfigurationen und ihr aktueller Status.<br /"
|
||||||
|
">Wenn Sie Aktualisierungen für IPv4 und IPv6 senden möchten benötigen Sie "
|
||||||
|
"zwei Konfigurationen z.B. 'myddns_ipv4' und 'myddns_ipv6'"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"BusyBox's nslookup and Wget do not support to specify the IP version to use "
|
||||||
|
"for communication with DDNS Provider."
|
||||||
|
msgstr ""
|
||||||
|
"BusyBox's nslookup und Wget unterstützen nicht die IP Version für die "
|
||||||
|
"Kommunikation festzulegen."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"BusyBox's nslookup does not support to specify to use TCP instead of default "
|
||||||
|
"UDP when requesting DNS server"
|
||||||
|
msgstr ""
|
||||||
|
"BusyBox's nslookup unterstützt es nicht das TCP-Protokoll für DNS Anfragen "
|
||||||
|
"anstelle des standardmäßigen UDP-Protokolls."
|
||||||
|
|
||||||
|
msgid "Check Interval"
|
||||||
|
msgstr "Prüfinterval"
|
||||||
|
|
||||||
msgid "Check for changed IP every"
|
msgid "Check for changed IP every"
|
||||||
msgstr "Teste auf neue IP alle"
|
msgstr "Teste auf neue IP alle"
|
||||||
|
@ -19,9 +59,97 @@ msgstr "Teste auf neue IP alle"
|
||||||
msgid "Check-time unit"
|
msgid "Check-time unit"
|
||||||
msgstr "Zeiteinheit"
|
msgstr "Zeiteinheit"
|
||||||
|
|
||||||
|
msgid "Config error"
|
||||||
|
msgstr "Konfigurationsfehler"
|
||||||
|
|
||||||
|
msgid "Configure here the details for selected Dynamic DNS service"
|
||||||
|
msgstr "Konfiguriere hier die Details für den gewählten Dynamik DNS Dienst"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Currently DDNS updates are not started at boot or on interface events.<br /"
|
||||||
|
">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
|
||||||
|
"force_interval set to '0')"
|
||||||
|
msgstr ""
|
||||||
|
"Aktuell werden keine DDNS Aktualisierungen beim Systemstart oder bei "
|
||||||
|
"Netzwerkereignissen gestartet.<br />Dieses ist der Standard, wenn Sie die "
|
||||||
|
"DDSN Skripte über eigene Routinen (z.B. cron und Erzwungener Aktualisierung "
|
||||||
|
"von '0') starten."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Currently DDNS updates are not started at boot or on interface events.<br /"
|
||||||
|
">You can start/stop each configuration here. It will run until next reboot."
|
||||||
|
msgstr ""
|
||||||
|
"Aktuell werden DDNS Aktualisierungen nicht bei Systemstart oder bei "
|
||||||
|
"Netzwerkereignissen gestartet.<br />Sie können jede Konfiguration hier "
|
||||||
|
"starten und stoppen. Sie wird bis zum nächsten Neustart ausgeführt."
|
||||||
|
|
||||||
|
msgid "Custom update script to be used for updating your DDNS Provider."
|
||||||
|
msgstr "Update-Skript um Aktualisierungen an Ihren DDNS Anbieter zu senden."
|
||||||
|
|
||||||
msgid "Custom update-URL"
|
msgid "Custom update-URL"
|
||||||
msgstr "Eigene Update-URL"
|
msgstr "Eigene Update-URL"
|
||||||
|
|
||||||
|
msgid "Custom update-script"
|
||||||
|
msgstr "Eigenes Update-Skript"
|
||||||
|
|
||||||
|
msgid "DDNS Autostart disabled"
|
||||||
|
msgstr "DDNS Autostart deaktiviert"
|
||||||
|
|
||||||
|
msgid "DDNS Service provider"
|
||||||
|
msgstr "DDNS-Dienstanbieter"
|
||||||
|
|
||||||
|
msgid "DNS requests via TCP not supported"
|
||||||
|
msgstr "DNS Anfragen über TCP nicht unterstützt"
|
||||||
|
|
||||||
|
msgid "DNS-Server"
|
||||||
|
msgstr "DNS-Server"
|
||||||
|
|
||||||
|
msgid "Defines the Web page to read systems IPv4-Address from"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert die Web-Seite von der die aktuelle IPv4-Adresse des System gelesen "
|
||||||
|
"wird."
|
||||||
|
|
||||||
|
msgid "Defines the Web page to read systems IPv6-Address from"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert die Web-Seite von der die aktuelle IPv6-Adresse des System gelesen "
|
||||||
|
"wird."
|
||||||
|
|
||||||
|
msgid "Defines the interface to read systems IP-Address from"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert die Schnittstelle von der die aktuelle IP-Adresse des System "
|
||||||
|
"gelesen wird."
|
||||||
|
|
||||||
|
msgid "Defines the network to read systems IPv4-Address from"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert das Netzwerk von dem die aktuelle IPv4-Adresse des System gelesen "
|
||||||
|
"wird."
|
||||||
|
|
||||||
|
msgid "Defines the network to read systems IPv6-Address from"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert das Netzwerk von dem die aktuelle IPv6-Adresse des System gelesen "
|
||||||
|
"wird."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Defines the source to read systems IPv4-Address from, that will be send to "
|
||||||
|
"the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert die Quelle von der die aktuelle IPv4-Adresse des Systems gelesen "
|
||||||
|
"wird, die an Ihren DDNS Anbieter gesendet wird."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Defines the source to read systems IPv6-Address from, that will be send to "
|
||||||
|
"the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert die Quelle von der die aktuelle IPv6-Adresse des Systems gelesen "
|
||||||
|
"wird, die an Ihren DDNS Anbieter gesendet wird."
|
||||||
|
|
||||||
|
msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
"Legt fest welche IP-Adresse 'IPv4/IPv6' zum DDNS Anbieter gesendet wird"
|
||||||
|
|
||||||
|
msgid "Details for"
|
||||||
|
msgstr "Details für"
|
||||||
|
|
||||||
msgid "Dynamic DNS"
|
msgid "Dynamic DNS"
|
||||||
msgstr "Dynamisches DNS"
|
msgstr "Dynamisches DNS"
|
||||||
|
|
||||||
|
@ -32,8 +160,45 @@ msgstr ""
|
||||||
"Dynamisches DNS erlaubt es, den Router bei dynamischer IP-Adresse über einen "
|
"Dynamisches DNS erlaubt es, den Router bei dynamischer IP-Adresse über einen "
|
||||||
"festen DNS-Namen zu erreichen."
|
"festen DNS-Namen zu erreichen."
|
||||||
|
|
||||||
msgid "Enable"
|
msgid "Enable secure communication with DDNS provider"
|
||||||
msgstr "Aktivieren"
|
msgstr "Aktiviert sichere Kommunikation mit dem DDNS Anbieter"
|
||||||
|
|
||||||
|
msgid "Error Retry Counter"
|
||||||
|
msgstr "Wiederholungszähler bei Fehler"
|
||||||
|
|
||||||
|
msgid "Error Retry Interval"
|
||||||
|
msgstr "Wiederholungsintervall bei Fehler"
|
||||||
|
|
||||||
|
msgid "Event Network"
|
||||||
|
msgstr "Ereignis Netzwerk"
|
||||||
|
|
||||||
|
msgid "Event interface"
|
||||||
|
msgstr "Ereignis Netzwerk"
|
||||||
|
|
||||||
|
msgid "File not found"
|
||||||
|
msgstr "Datei nicht gefunden"
|
||||||
|
|
||||||
|
msgid "File not found or empty"
|
||||||
|
msgstr "Datei nicht gefunden oder leer"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Follow this link<br />You will find more hints to optimize your system to "
|
||||||
|
"run DDNS scripts with all options"
|
||||||
|
msgstr ""
|
||||||
|
"Folgen Sie dem Link<br />Hier finden Sie weitere Hinweise um Ihr System für "
|
||||||
|
"die Nutzung aller Optionen der DDNS Skripte zu optimieren."
|
||||||
|
|
||||||
|
msgid "Force IP Version"
|
||||||
|
msgstr "Erzwinge IP-Version"
|
||||||
|
|
||||||
|
msgid "Force IP Version not supported"
|
||||||
|
msgstr "Erzwinge IP-Version nicht unterstützt"
|
||||||
|
|
||||||
|
msgid "Force Interval"
|
||||||
|
msgstr "Erzwungene Aktualisierung"
|
||||||
|
|
||||||
|
msgid "Force TCP on DNS"
|
||||||
|
msgstr "Erzwinge TCP bei DNS-Anfragen"
|
||||||
|
|
||||||
msgid "Force update every"
|
msgid "Force update every"
|
||||||
msgstr "Erzwinge Aktualisierung alle"
|
msgstr "Erzwinge Aktualisierung alle"
|
||||||
|
@ -41,50 +206,369 @@ msgstr "Erzwinge Aktualisierung alle"
|
||||||
msgid "Force-time unit"
|
msgid "Force-time unit"
|
||||||
msgstr "Zeiteinheit"
|
msgstr "Zeiteinheit"
|
||||||
|
|
||||||
msgid "Hostname"
|
msgid "Forced IP Version don't matched"
|
||||||
msgstr "Hostname"
|
msgstr "Erzwungene IP Version stimmt nicht überein"
|
||||||
|
|
||||||
msgid "Interface"
|
msgid "Format"
|
||||||
msgstr "Schnittstelle"
|
msgstr "Format"
|
||||||
|
|
||||||
msgid "Network"
|
msgid "Format: IP or FQDN"
|
||||||
msgstr "Netzwerk"
|
msgstr "Format: IP-Adresse oder FQDN"
|
||||||
|
|
||||||
msgid "Password"
|
msgid "HTTPS not supported"
|
||||||
msgstr "Passwort"
|
msgstr "HTTPS nicht unterstützt"
|
||||||
|
|
||||||
|
msgid "Hints"
|
||||||
|
msgstr "Hinweise"
|
||||||
|
|
||||||
|
msgid "Hostname/Domain"
|
||||||
|
msgstr "Rechnername/Domäne"
|
||||||
|
|
||||||
|
msgid "IP address source"
|
||||||
|
msgstr "IP-Adressquelle"
|
||||||
|
|
||||||
|
msgid "IP address version"
|
||||||
|
msgstr "IP-Adressversion"
|
||||||
|
|
||||||
|
msgid "IPv6 address must be given in square brackets"
|
||||||
|
msgstr "Eine IPv6 Adresse muss in eckigen Klammern angegeben werden"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"IPv6 is currently not (fully) supported by this system<br />Please follow "
|
||||||
|
"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
|
||||||
|
"your system to the latest OpenWrt Release"
|
||||||
|
msgstr ""
|
||||||
|
"IPv6 wird vom System nicht (voll) unterstützt.<br /> Bitte folgen Sie den "
|
||||||
|
"Hinweisen auf der Homepage von OpenWrt um die volle IPv6-Unterstützung zu "
|
||||||
|
"aktivieren<br /> oder installieren Sie die aktuellste OpenWrt Version."
|
||||||
|
|
||||||
|
msgid "IPv6 not supported"
|
||||||
|
msgstr "IPv6 nicht unterstützt"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"If this service section is disabled it could not be started.<br />Neither "
|
||||||
|
"from LuCI interface nor from console"
|
||||||
|
msgstr ""
|
||||||
|
"Wenn deaktiviert kann die Aktualisierung nicht gestartet werden.<br />Weder "
|
||||||
|
"über das LuCI Web Interface noch von der Geräte-Konsole"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
|
||||||
|
msgstr ""
|
||||||
|
"In einigen Versionen von OpenWrt wurde cURL/libcurl ohne Proxy Unterstützung "
|
||||||
|
"compiliert."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
|
||||||
|
"are not supported"
|
||||||
|
msgstr ""
|
||||||
|
"Intervall zur Prüfung auf geänderte IP-Adresse<br />Minimum Wert 5 Minuten "
|
||||||
|
"== 300 Sekunden"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Interval to force updates send to DDNS Provider<br />Setting this parameter "
|
||||||
|
"to 0 will force the script to only run once<br />Values lower 'Check "
|
||||||
|
"Interval' except '0' are not supported"
|
||||||
|
msgstr ""
|
||||||
|
"Intervall mit dem Aktualisierungen erzwungen an den DDNS Anbieter gesendet "
|
||||||
|
"werden.<br />Ein Wert von '0' führt das Skript nur einmalig aus. <br />Der "
|
||||||
|
"Wert muss größer als das Prüfintervall sein oder '0'."
|
||||||
|
|
||||||
|
msgid "Last Update"
|
||||||
|
msgstr "Letztes Aktualisierung"
|
||||||
|
|
||||||
|
msgid "Log File Viewer"
|
||||||
|
msgstr "Protokolldatei"
|
||||||
|
|
||||||
|
msgid "Log to file"
|
||||||
|
msgstr "Protokoll in Datei schreiben"
|
||||||
|
|
||||||
|
msgid "Log to syslog"
|
||||||
|
msgstr "Systemprotokoll verwenden"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
|
||||||
|
"protocol."
|
||||||
|
msgstr ""
|
||||||
|
"Weder GNU Wget mit SSL noch cURL sind installiert um Aktualisierungen über "
|
||||||
|
"HTTPS Protokoll zu unterstützen."
|
||||||
|
|
||||||
|
msgid "Network on which the ddns-updater scripts will be started"
|
||||||
|
msgstr "Netzwerk auf dem Ereignisse die ddns-updater Skripte starten"
|
||||||
|
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Nie"
|
||||||
|
|
||||||
|
msgid "Next Update"
|
||||||
|
msgstr "Nächste Aktualisierung"
|
||||||
|
|
||||||
|
msgid "No data"
|
||||||
|
msgstr "Keine Daten"
|
||||||
|
|
||||||
|
msgid "No logging"
|
||||||
|
msgstr "Keine Protokollierung"
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
|
||||||
|
msgstr ""
|
||||||
|
"OPTIONAL: Erzwingt die Verwendung einer reinen IPv4/IPv6 Kommunikation."
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
|
||||||
|
msgstr ""
|
||||||
|
"OPTIONAL: Erzwingt die Verwendung von TCP anstelle von UDP bei DNS Anfragen."
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Proxy-Server for detection and updates."
|
||||||
|
msgstr "OPTIONAL: Proxy-Server für Adresserkennung und Aktualisierungen"
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
|
||||||
|
msgstr ""
|
||||||
|
"OPTIONAL: Ersetzt den voreingestellten DNS-Server um die 'Registrierte IP' "
|
||||||
|
"zu ermitteln."
|
||||||
|
|
||||||
|
msgid "Old version of ddns-scripts installed"
|
||||||
|
msgstr "Alte Version von ddns-scripts installiert"
|
||||||
|
|
||||||
|
msgid "On Error the script will retry the failed action after given time"
|
||||||
|
msgstr ""
|
||||||
|
"Bei Fehlern wird das Skript die fehlerhafte Aktion nach der gegebenen Zeit "
|
||||||
|
"wiederholen"
|
||||||
|
|
||||||
|
msgid "On Error the script will stop execution after given number of retrys"
|
||||||
|
msgstr "Das Skript wird nach der gegebener Anzahlt von Fehlversuchen beendet"
|
||||||
|
|
||||||
|
msgid "PROXY-Server"
|
||||||
|
msgstr "Proxy-Server"
|
||||||
|
|
||||||
|
msgid "PROXY-Server not supported"
|
||||||
|
msgstr "Proxy-Server nicht unterstützt"
|
||||||
|
|
||||||
|
msgid "Please [Save & Apply] your changes first"
|
||||||
|
msgstr "Bitte [Speichern & Anwenden] Sie Änderungen zunächst"
|
||||||
|
|
||||||
|
msgid "Please press [Read] button"
|
||||||
|
msgstr "Bitte Protokolldatei einlesen"
|
||||||
|
|
||||||
|
msgid "Process ID"
|
||||||
|
msgstr "Prozess ID"
|
||||||
|
|
||||||
|
msgid "Read / Reread log file"
|
||||||
|
msgstr "Protokolldatei (neu) einlesen"
|
||||||
|
|
||||||
|
msgid "Registered IP"
|
||||||
|
msgstr "Registrierte IP"
|
||||||
|
|
||||||
|
msgid "Replaces [DOMAIN] in Update-URL"
|
||||||
|
msgstr "Ersetzt [DOMAIN] in der Update-URL"
|
||||||
|
|
||||||
|
msgid "Replaces [PASSWORD] in Update-URL"
|
||||||
|
msgstr "Ersetzt [PASSWORD] in der Update-URL"
|
||||||
|
|
||||||
|
msgid "Replaces [USERNAME] in Update-URL"
|
||||||
|
msgstr "Ersetzt [USERNAME] in der Update-URL"
|
||||||
|
|
||||||
|
msgid "Run once"
|
||||||
|
msgstr "Einmalig ausführen"
|
||||||
|
|
||||||
|
msgid "Script"
|
||||||
|
msgstr "Skript"
|
||||||
|
|
||||||
msgid "Service"
|
msgid "Service"
|
||||||
msgstr "Dienst"
|
msgstr "Dienst"
|
||||||
|
|
||||||
|
msgid "Show more"
|
||||||
|
msgstr "Zeige mehr"
|
||||||
|
|
||||||
msgid "Source of IP address"
|
msgid "Source of IP address"
|
||||||
msgstr "Quelle der IP-Adresse"
|
msgstr "Quelle der IP-Adresse"
|
||||||
|
|
||||||
|
msgid "Start / Stop"
|
||||||
|
msgstr "Start / Stopp"
|
||||||
|
|
||||||
|
msgid "Stopped"
|
||||||
|
msgstr "Angehalten"
|
||||||
|
|
||||||
|
msgid "There is no service configured."
|
||||||
|
msgstr "Kein Dienst konfiguriert"
|
||||||
|
|
||||||
|
msgid "Timer Settings"
|
||||||
|
msgstr "Zeitgeber Einstellungen"
|
||||||
|
|
||||||
msgid "URL"
|
msgid "URL"
|
||||||
msgstr "URL"
|
msgstr "URL"
|
||||||
|
|
||||||
msgid "Username"
|
msgid "URL to detect"
|
||||||
msgstr "Benutzername"
|
msgstr "URL zur Adresserkennung für"
|
||||||
|
|
||||||
|
msgid "Unknown error"
|
||||||
|
msgstr "Unbekannter Fehler"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Update URL to be used for updating your DDNS Provider.<br />Follow "
|
||||||
|
"instructions you will find on their WEB page."
|
||||||
|
msgstr ""
|
||||||
|
"Update-URL um Aktualisierungen an Ihren DDNS Anbieter zu senden.<br />Folgen "
|
||||||
|
"Sie der Anleitung auf der Internet Seite des Anbieters."
|
||||||
|
|
||||||
|
msgid "Update error"
|
||||||
|
msgstr "Aktualisierungsfehler"
|
||||||
|
|
||||||
|
msgid "Use HTTP Secure"
|
||||||
|
msgstr "Verwende sicheres HTTP"
|
||||||
|
|
||||||
|
msgid "User defined script to read systems IP-Address"
|
||||||
|
msgstr ""
|
||||||
|
"Definiert das Skript mit dem die aktuelle IP-Adresse des System gelesen "
|
||||||
|
"wird."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Writes detailed messages to log file. File will be truncated automatically."
|
||||||
|
msgstr ""
|
||||||
|
"Schreibt detaillierte Meldungen in die Protokolldatei. Die Datei wird "
|
||||||
|
"automatisch gekürzt."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Writes log messages to syslog. Critical Errors will always be written to "
|
||||||
|
"syslog."
|
||||||
|
msgstr ""
|
||||||
|
"Schreibt Meldungen ins Systemprotokoll. Kritische Fehler werden immer in das "
|
||||||
|
"Systemprotokoll geschrieben."
|
||||||
|
|
||||||
|
msgid "You should install BIND host package for DNS requests."
|
||||||
|
msgstr ""
|
||||||
|
"Sie sollten das Programmpakete BIND host for DNS Anfragen installieren."
|
||||||
|
|
||||||
|
msgid "You should install GNU Wget with SSL (prefered) or cURL package."
|
||||||
|
msgstr ""
|
||||||
|
"Sie sollten das Programmpaket GNU Wget mit SSL (bevorzugt) oder cURL "
|
||||||
|
"installieren."
|
||||||
|
|
||||||
|
msgid "You should install GNU Wget with SSL or replace libcurl."
|
||||||
|
msgstr ""
|
||||||
|
"Sie sollten das Programmpaket GNU Wget mit SSL installieren oder libcurl "
|
||||||
|
"austauschen."
|
||||||
|
|
||||||
|
msgid "cURL is installed, but libcurl was compiled without proxy support."
|
||||||
|
msgstr ""
|
||||||
|
"cURL ist installiert, aber libcurl wurde ohne Proxy Unterstützung compiliert"
|
||||||
|
|
||||||
|
msgid "cURL without Proxy Support"
|
||||||
|
msgstr "cURL ohne Proxy Unterstützung"
|
||||||
|
|
||||||
|
msgid "can not detect local IP. Please select a different Source combination"
|
||||||
|
msgstr ""
|
||||||
|
"kann lokale IP-Adresse nicht ermitteln. Bitte wählen Sie eine andere Quelle."
|
||||||
|
|
||||||
|
msgid "can not resolve host:"
|
||||||
|
msgstr "Konnte Server nicht finden:"
|
||||||
|
|
||||||
|
msgid "config error"
|
||||||
|
msgstr "Konfigurationsfehler"
|
||||||
|
|
||||||
msgid "custom"
|
msgid "custom"
|
||||||
msgstr "benutzerdefiniert"
|
msgstr "benutzerdefiniert"
|
||||||
|
|
||||||
# Hours
|
msgid "days"
|
||||||
|
msgstr "Tage"
|
||||||
|
|
||||||
|
msgid "directory or path/file"
|
||||||
|
msgstr "Verzeichnis oder Pfad/zur/Datei"
|
||||||
|
|
||||||
|
msgid "either url or script could be set"
|
||||||
|
msgstr "Weder Url noch Script ist definiert"
|
||||||
|
|
||||||
|
msgid "enable here"
|
||||||
|
msgstr "hier aktivieren"
|
||||||
|
|
||||||
|
msgid "file or directory not found or not 'IGNORE'"
|
||||||
|
msgstr "Datei oder Verzeichnis nicht gefunden oder nicht 'IGNORE'"
|
||||||
|
|
||||||
msgid "h"
|
msgid "h"
|
||||||
msgstr "Stunden"
|
msgstr "Stunden"
|
||||||
|
|
||||||
|
msgid "hours"
|
||||||
|
msgstr "Stunden"
|
||||||
|
|
||||||
|
msgid "install update here"
|
||||||
|
msgstr "Aktualisierung hier installieren"
|
||||||
|
|
||||||
msgid "interface"
|
msgid "interface"
|
||||||
msgstr "Schnittstelle"
|
msgstr "Schnittstelle"
|
||||||
|
|
||||||
# Minutes (not minimum)
|
msgid "invalid - Sample"
|
||||||
|
msgstr "ungültig - Beispiel"
|
||||||
|
|
||||||
msgid "min"
|
msgid "min"
|
||||||
msgstr "Minuten"
|
msgstr "Minuten"
|
||||||
|
|
||||||
|
msgid "minimum value '0'"
|
||||||
|
msgstr "Minimum Wert '0'"
|
||||||
|
|
||||||
|
msgid "minimum value '1'"
|
||||||
|
msgstr "Minimum Wert '1'"
|
||||||
|
|
||||||
|
msgid "minimum value 5 minutes == 300 seconds"
|
||||||
|
msgstr "Minimum Wert 5 Minuten == 300 Sekunden"
|
||||||
|
|
||||||
|
msgid "minutes"
|
||||||
|
msgstr "Minuten"
|
||||||
|
|
||||||
|
msgid "missing / required"
|
||||||
|
msgstr "fehlt / Pflichteingabe"
|
||||||
|
|
||||||
|
msgid "must be greater or equal 'Check Interval'"
|
||||||
|
msgstr "muss größer als das Prüfintervall sein"
|
||||||
|
|
||||||
|
msgid "must start with 'http://'"
|
||||||
|
msgstr "muss mit 'http://' beginnen"
|
||||||
|
|
||||||
|
msgid "nc (netcat) can not connect"
|
||||||
|
msgstr "nc (netcat) kann keine Verbindung herstellen"
|
||||||
|
|
||||||
msgid "network"
|
msgid "network"
|
||||||
msgstr "Netzwerk"
|
msgstr "Netzwerk"
|
||||||
|
|
||||||
#~ msgid "Event interface"
|
msgid "never"
|
||||||
#~ msgstr "Ereignis-Schnittstelle"
|
msgstr "nie"
|
||||||
|
|
||||||
#~ msgid "On which interface up should start the ddns script process."
|
msgid "no data"
|
||||||
#~ msgstr ""
|
msgstr "Keine Daten"
|
||||||
#~ "Spezifiziert die durch den DDNS-Prozess überwachte Netzwerkschnittstelle"
|
|
||||||
|
msgid "not found or not executable - Sample: '/path/to/script.sh'"
|
||||||
|
msgstr ""
|
||||||
|
"Skript nicht gefunden oder nicht ausführbar. - Beispiel: 'Pfad/zum/Skript.sh'"
|
||||||
|
|
||||||
|
msgid "nslookup can not resolve host"
|
||||||
|
msgstr "nslookup kann den Namen nicht auflösen"
|
||||||
|
|
||||||
|
msgid "or"
|
||||||
|
msgstr "oder"
|
||||||
|
|
||||||
|
msgid "please disable"
|
||||||
|
msgstr "Bitte deaktivieren"
|
||||||
|
|
||||||
|
msgid "please remove entry"
|
||||||
|
msgstr "Bitte Eintrag entfernen"
|
||||||
|
|
||||||
|
msgid "please select 'IPv4' address version"
|
||||||
|
msgstr "Bitte 'IPv4' Adressversion auswählen"
|
||||||
|
|
||||||
|
msgid "please select 'IPv4' address version in"
|
||||||
|
msgstr "Bitte 'IPv4' Adressversion auswählen in den"
|
||||||
|
|
||||||
|
msgid "proxy port missing"
|
||||||
|
msgstr "Proxy-Port fehlt"
|
||||||
|
|
||||||
|
msgid "seconds"
|
||||||
|
msgstr "Sekunden"
|
||||||
|
|
||||||
|
msgid "to run HTTPS without verification of server certificates (insecure)"
|
||||||
|
msgstr ""
|
||||||
|
"um HTTPS ohne Überprüfung der Server Zertifikate auszuführen (unsicher)"
|
||||||
|
|
||||||
|
msgid "unknown error"
|
||||||
|
msgstr "Unbekannter Fehler"
|
||||||
|
|
||||||
|
msgid "unspecific error"
|
||||||
|
msgstr "Unspezifischer Fehler"
|
||||||
|
|
||||||
|
msgid "use hostname, FQDN, IPv4- or IPv6-Address"
|
||||||
|
msgstr "verwende Rechnername, FQDN, IPv4- oder IPv6-Adresse"
|
||||||
|
|
|
@ -1,15 +1,111 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr "Content-Type: text/plain; charset=UTF-8"
|
msgstr "Content-Type: text/plain; charset=UTF-8"
|
||||||
|
|
||||||
|
msgid "&"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Basic Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Below a list of configuration tips for your system to run Dynamic DNS "
|
||||||
|
"updates without limitations"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Below is a list of configured DDNS configurations and their current state."
|
||||||
|
"<br />If you want to send updates for IPv4 and IPv6 you need to define two "
|
||||||
|
"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"BusyBox's nslookup and Wget do not support to specify the IP version to use "
|
||||||
|
"for communication with DDNS Provider."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"BusyBox's nslookup does not support to specify to use TCP instead of default "
|
||||||
|
"UDP when requesting DNS server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Check Interval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Check for changed IP every"
|
msgid "Check for changed IP every"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Check-time unit"
|
msgid "Check-time unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Config error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Configure here the details for selected Dynamic DNS service"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Currently DDNS updates are not started at boot or on interface events.<br /"
|
||||||
|
">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
|
||||||
|
"force_interval set to '0')"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Currently DDNS updates are not started at boot or on interface events.<br /"
|
||||||
|
">You can start/stop each configuration here. It will run until next reboot."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Custom update script to be used for updating your DDNS Provider."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Custom update-URL"
|
msgid "Custom update-URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Custom update-script"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "DDNS Autostart disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "DDNS Service provider"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "DNS requests via TCP not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "DNS-Server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines the Web page to read systems IPv4-Address from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines the Web page to read systems IPv6-Address from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines the interface to read systems IP-Address from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines the network to read systems IPv4-Address from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines the network to read systems IPv6-Address from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Defines the source to read systems IPv4-Address from, that will be send to "
|
||||||
|
"the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Defines the source to read systems IPv6-Address from, that will be send to "
|
||||||
|
"the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Details for"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Dynamic DNS"
|
msgid "Dynamic DNS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -18,7 +114,42 @@ msgid ""
|
||||||
"while having a dynamically changing IP address."
|
"while having a dynamically changing IP address."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable"
|
msgid "Enable secure communication with DDNS provider"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Error Retry Counter"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Error Retry Interval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Event Network"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Event interface"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "File not found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "File not found or empty"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Follow this link<br />You will find more hints to optimize your system to "
|
||||||
|
"run DDNS scripts with all options"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Force IP Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Force IP Version not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Force Interval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Force TCP on DNS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Force update every"
|
msgid "Force update every"
|
||||||
|
@ -27,41 +158,332 @@ msgstr ""
|
||||||
msgid "Force-time unit"
|
msgid "Force-time unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hostname"
|
msgid "Forced IP Version don't matched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Interface"
|
msgid "Format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Network"
|
msgid "Format: IP or FQDN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Password"
|
msgid "HTTPS not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Hints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Hostname/Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "IP address source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "IP address version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "IPv6 address must be given in square brackets"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"IPv6 is currently not (fully) supported by this system<br />Please follow "
|
||||||
|
"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
|
||||||
|
"your system to the latest OpenWrt Release"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "IPv6 not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"If this service section is disabled it could not be started.<br />Neither "
|
||||||
|
"from LuCI interface nor from console"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
|
||||||
|
"are not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Interval to force updates send to DDNS Provider<br />Setting this parameter "
|
||||||
|
"to 0 will force the script to only run once<br />Values lower 'Check "
|
||||||
|
"Interval' except '0' are not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Last Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Log File Viewer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Log to file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Log to syslog"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
|
||||||
|
"protocol."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Network on which the ddns-updater scripts will be started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Never"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Next Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "No data"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "No logging"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Proxy-Server for detection and updates."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Old version of ddns-scripts installed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "On Error the script will retry the failed action after given time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "On Error the script will stop execution after given number of retrys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "PROXY-Server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "PROXY-Server not supported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Please [Save & Apply] your changes first"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Please press [Read] button"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Process ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Read / Reread log file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Registered IP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Replaces [DOMAIN] in Update-URL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Replaces [PASSWORD] in Update-URL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Replaces [USERNAME] in Update-URL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Run once"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Script"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Service"
|
msgid "Service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show more"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Source of IP address"
|
msgid "Source of IP address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Start / Stop"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Stopped"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "There is no service configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Timer Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "URL"
|
msgid "URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Username"
|
msgid "URL to detect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Unknown error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Update URL to be used for updating your DDNS Provider.<br />Follow "
|
||||||
|
"instructions you will find on their WEB page."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Update error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Use HTTP Secure"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "User defined script to read systems IP-Address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Writes detailed messages to log file. File will be truncated automatically."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Writes log messages to syslog. Critical Errors will always be written to "
|
||||||
|
"syslog."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "You should install BIND host package for DNS requests."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "You should install GNU Wget with SSL (prefered) or cURL package."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "You should install GNU Wget with SSL or replace libcurl."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "cURL is installed, but libcurl was compiled without proxy support."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "cURL without Proxy Support"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "can not detect local IP. Please select a different Source combination"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "can not resolve host:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "config error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "custom"
|
msgid "custom"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "days"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "directory or path/file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "either url or script could be set"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "enable here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "file or directory not found or not 'IGNORE'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "h"
|
msgid "h"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "hours"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "install update here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "interface"
|
msgid "interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "invalid - Sample"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "min"
|
msgid "min"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "minimum value '0'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "minimum value '1'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "minimum value 5 minutes == 300 seconds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "minutes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "missing / required"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "must be greater or equal 'Check Interval'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "must start with 'http://'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "nc (netcat) can not connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "network"
|
msgid "network"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "never"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "no data"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "not found or not executable - Sample: '/path/to/script.sh'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "nslookup can not resolve host"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "please disable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "please remove entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "please select 'IPv4' address version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "please select 'IPv4' address version in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "proxy port missing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "seconds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "to run HTTPS without verification of server certificates (insecure)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "unknown error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "unspecific error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "use hostname, FQDN, IPv4- or IPv6-Address"
|
||||||
|
msgstr ""
|
||||||
|
|
Loading…
Reference in a new issue