diff options
Diffstat (limited to 'applications/luci-ddns/luasrc/tools/ddns.lua')
-rw-r--r-- | applications/luci-ddns/luasrc/tools/ddns.lua | 212 |
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 |