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>
212 lines
5.6 KiB
Lua
212 lines
5.6 KiB
Lua
--[[
|
|
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
|