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:
Christian Schoenebeck 2014-10-10 21:55:22 +02:00
parent bb388f0873
commit c09f8a7e41
21 changed files with 3501 additions and 39 deletions

View file

@ -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
include ../../build/config.mk

View file

@ -0,0 +1,5 @@
#!/bin/sh
[ -n "${IPKG_INSTROOT}" ] || {
( . /etc/uci-defaults/luci-ddns ) && rm -f /etc/uci-defaults/luci-ddns
exit 0
}

View file

@ -3,6 +3,7 @@ LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
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");
you may not use this file except in compliance with the License.
@ -15,16 +16,238 @@ $Id$
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()
-- no configuration file, don't start
if not nixio.fs.access("/etc/config/ddns") then
return
end
local page
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.dependent = true
-- ddns-scripts 1.0.0 installed, run old luci app
if not nixio.fs.access("/usr/lib/ddns/services_ipv6")
or nixio.fs.access("/usr/lib/ddns/url_escape.sed") then
local page
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.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

View file

@ -26,6 +26,10 @@ s.anonymous = false
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.rmempty = false
svc.default = "dyndns.org"

File diff suppressed because it is too large Load diff

View 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

View 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

View 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

View file

@ -0,0 +1 @@
<%+ddns/system_status%>

View 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 ++ -->

View file

@ -0,0 +1,22 @@
<!-- ++ BEGIN ++ Dynamic DNS ++ detail_lvalue.htm ++ -->
<!-- no value header to supress next line -->
&#160;
<% 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 %>&#160;<% else %><br /><% end %>
<% end end %>
<% end %>
<%+cbi/valuefooter%>
<!-- ++ END ++ Dynamic DNS ++ detail_lvalue.htm ++ -->

View 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 ++ -->

View file

@ -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 ++ -->

View 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 ++ -->

View file

@ -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 ++ -->

View 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 "&#38;" or "&amp;"
// 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 ++ -->

View 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 ++ -->

View 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

View 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

View file

@ -1,17 +1,57 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-02 13:44+0100\n"
"PO-Revision-Date: 2012-11-21 20:48+0200\n"
"Last-Translator: Jo-Philipp <xm@subsignal.org>\n"
"Project-Id-Version: luci-app-ddns\n"
"POT-Creation-Date: 2014-10-04 16:26+1000\n"
"PO-Revision-Date: 2014-10-04 16:27+0100\n"
"Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\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"
msgstr "Teste auf neue IP alle"
@ -19,9 +59,97 @@ msgstr "Teste auf neue IP alle"
msgid "Check-time unit"
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"
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"
msgstr "Dynamisches DNS"
@ -32,8 +160,45 @@ msgstr ""
"Dynamisches DNS erlaubt es, den Router bei dynamischer IP-Adresse über einen "
"festen DNS-Namen zu erreichen."
msgid "Enable"
msgstr "Aktivieren"
msgid "Enable secure communication with DDNS provider"
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"
msgstr "Erzwinge Aktualisierung alle"
@ -41,50 +206,369 @@ msgstr "Erzwinge Aktualisierung alle"
msgid "Force-time unit"
msgstr "Zeiteinheit"
msgid "Hostname"
msgstr "Hostname"
msgid "Forced IP Version don't matched"
msgstr "Erzwungene IP Version stimmt nicht überein"
msgid "Interface"
msgstr "Schnittstelle"
msgid "Format"
msgstr "Format"
msgid "Network"
msgstr "Netzwerk"
msgid "Format: IP or FQDN"
msgstr "Format: IP-Adresse oder FQDN"
msgid "Password"
msgstr "Passwort"
msgid "HTTPS not supported"
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"
msgstr "Dienst"
msgid "Show more"
msgstr "Zeige mehr"
msgid "Source of IP address"
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"
msgstr "URL"
msgid "Username"
msgstr "Benutzername"
msgid "URL to detect"
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"
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"
msgstr "Stunden"
msgid "hours"
msgstr "Stunden"
msgid "install update here"
msgstr "Aktualisierung hier installieren"
msgid "interface"
msgstr "Schnittstelle"
# Minutes (not minimum)
msgid "invalid - Sample"
msgstr "ungültig - Beispiel"
msgid "min"
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"
msgstr "Netzwerk"
#~ msgid "Event interface"
#~ msgstr "Ereignis-Schnittstelle"
msgid "never"
msgstr "nie"
#~ msgid "On which interface up should start the ddns script process."
#~ msgstr ""
#~ "Spezifiziert die durch den DDNS-Prozess überwachte Netzwerkschnittstelle"
msgid "no data"
msgstr "Keine Daten"
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"

View file

@ -1,15 +1,111 @@
msgid ""
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"
msgstr ""
msgid "Check-time unit"
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"
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"
msgstr ""
@ -18,7 +114,42 @@ msgid ""
"while having a dynamically changing IP address."
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 ""
msgid "Force update every"
@ -27,41 +158,332 @@ msgstr ""
msgid "Force-time unit"
msgstr ""
msgid "Hostname"
msgid "Forced IP Version don't matched"
msgstr ""
msgid "Interface"
msgid "Format"
msgstr ""
msgid "Network"
msgid "Format: IP or FQDN"
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 ""
msgid "Service"
msgstr ""
msgid "Show more"
msgstr ""
msgid "Source of IP address"
msgstr ""
msgid "Start / Stop"
msgstr ""
msgid "Stopped"
msgstr ""
msgid "There is no service configured."
msgstr ""
msgid "Timer Settings"
msgstr ""
msgid "URL"
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 ""
msgid "custom"
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"
msgstr ""
msgid "hours"
msgstr ""
msgid "install update here"
msgstr ""
msgid "interface"
msgstr ""
msgid "invalid - Sample"
msgstr ""
msgid "min"
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"
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 ""