--[[ LuCI - Lua Configuration Interface shared module for luci-app-ddns-v2 Copyright 2014 Christian Schoenebeck 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 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 --[[ 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 ) ]]-- --- -- 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. -- -- ::= :///;?# -- ::= @: -- ::= [:] -- :: = {/} -- -- -- The leading / in / is considered part of -- . -- @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: -- scheme, authority, userinfo, -- user, password, host, -- port, path, params, -- query, and fragment. ----------------------------------------------------------------------------- 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