summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-ddns/luasrc/tools/ddns.lua
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-ddns/luasrc/tools/ddns.lua')
-rw-r--r--applications/luci-ddns/luasrc/tools/ddns.lua212
1 files changed, 212 insertions, 0 deletions
diff --git a/applications/luci-ddns/luasrc/tools/ddns.lua b/applications/luci-ddns/luasrc/tools/ddns.lua
new file mode 100644
index 000000000..4172d84ae
--- /dev/null
+++ b/applications/luci-ddns/luasrc/tools/ddns.lua
@@ -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