v0.5. New modules, refactoring

This commit is contained in:
gSpot
2022-02-06 17:17:02 +03:00
parent 4f89925348
commit cb4ddc4062
23 changed files with 1853 additions and 627 deletions

View File

@@ -8,53 +8,40 @@ Internet-detector is an application for checking the availability of the Interne
**Features:** **Features:**
- It can run continuously as a system service or only in an open web interface. - It can run continuously as a system service or only in an open web interface.
- Checking the availability of a host using ping or by connecting via TCP to a specified port. - Checking the availability of a host using ping or by connecting via TCP to a specified port.
- Execution of custom shell scripts when connecting and disconnecting the Internet.
- LED indication of Internet availability. - LED indication of Internet availability.
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/internet-led.jpg) ![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/internet-led.jpg)
- Performing actions when connecting and disconnecting the Internet (Restarting network, modem or device. Executing custom shell scripts).
- Sending email notification when Internet access is restored.
- The daemon is written entirely in Lua using the nixio library. - The daemon is written entirely in Lua using the nixio library.
## Installation notes ## Installation notes
**OpenWrt >= 21.02:** **OpenWrt >= 21.02:**
wget --no-check-certificate -O /tmp/internet-detector_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_0.4-3_all.ipk wget --no-check-certificate -O /tmp/internet-detector_0.5-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_0.5-0_all.ipk
opkg install /tmp/internet-detector_0.4-3_all.ipk opkg install /tmp/internet-detector_0.5-0_all.ipk
rm /tmp/internet-detector_0.4-3_all.ipk rm /tmp/internet-detector_0.5-0_all.ipk
/etc/init.d/internet-detector start /etc/init.d/internet-detector start
/etc/init.d/internet-detector enable /etc/init.d/internet-detector enable
wget --no-check-certificate -O /tmp/luci-app-internet-detector_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_0.4-3_all.ipk wget --no-check-certificate -O /tmp/luci-app-internet-detector_0.5-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_0.5-0_all.ipk
opkg install /tmp/luci-app-internet-detector_0.4-3_all.ipk opkg install /tmp/luci-app-internet-detector_0.5-0_all.ipk
rm /tmp/luci-app-internet-detector_0.4-3_all.ipk rm /tmp/luci-app-internet-detector_0.5-0_all.ipk
/etc/init.d/rpcd restart /etc/init.d/rpcd restart
Email notification:
opkg install mailsend
i18n-ru: i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_0.4-3_all.ipk wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_0.5-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_0.5-0_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk opkg install /tmp/luci-i18n-internet-detector-ru_0.5-0_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk rm /tmp/luci-i18n-internet-detector-ru_0.5-0_all.ipk
**OpenWrt 19.07:** **[OpenWrt 19.07](https://github.com/gSpotx2f/luci-app-internet-detector/tree/19.07)**
wget --no-check-certificate -O /tmp/internet-detector_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/19.07/internet-detector_0.4-3_all.ipk
opkg install /tmp/internet-detector_0.4-3_all.ipk
rm /tmp/internet-detector_0.4-3_all.ipk
/etc/init.d/internet-detector start
/etc/init.d/internet-detector enable
wget --no-check-certificate -O /tmp/luci-app-internet-detector_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/19.07/luci-app-internet-detector_0.4-3_all.ipk
opkg install /tmp/luci-app-internet-detector_0.4-3_all.ipk
rm /tmp/luci-app-internet-detector_0.4-3_all.ipk
/etc/init.d/rpcd restart
i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/19.07/luci-i18n-internet-detector-ru_0.4-3_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_0.4-3_all.ipk
## Screenshots: ## Screenshots:
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/01.jpg) ![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/01.jpg)
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/03.jpg) ![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/02.jpg)
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/04.jpg)

View File

@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector PKG_NAME:=internet-detector
PKG_VERSION:=0.4 PKG_VERSION:=0.5
PKG_RELEASE:=3 PKG_RELEASE:=0
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector> PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
@@ -41,14 +41,18 @@ define Package/$(PKG_NAME)/install
$(INSTALL_CONF) ./files/etc/config/internet-detector $(1)/etc/config/internet-detector $(INSTALL_CONF) ./files/etc/config/internet-detector $(1)/etc/config/internet-detector
$(INSTALL_DIR) $(1)/etc/internet-detector $(INSTALL_DIR) $(1)/etc/internet-detector
$(INSTALL_BIN) ./files/etc/internet-detector/down-script $(1)/etc/internet-detector/down-script $(INSTALL_BIN) ./files/etc/internet-detector/down-script $(1)/etc/internet-detector/down-script
$(INSTALL_BIN) ./files/etc/internet-detector/run-script $(1)/etc/internet-detector/run-script
$(INSTALL_BIN) ./files/etc/internet-detector/up-script $(1)/etc/internet-detector/up-script $(INSTALL_BIN) ./files/etc/internet-detector/up-script $(1)/etc/internet-detector/up-script
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/etc/init.d/internet-detector $(1)/etc/init.d/internet-detector $(INSTALL_BIN) ./files/etc/init.d/internet-detector $(1)/etc/init.d/internet-detector
$(INSTALL_DIR) $(1)/usr/bin $(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) ./files/usr/bin/internet-detector $(1)/usr/bin/internet-detector $(INSTALL_BIN) ./files/usr/bin/internet-detector $(1)/usr/bin/internet-detector
$(INSTALL_DIR) $(1)/usr/lib/internet-detector $(INSTALL_DIR) $(1)/usr/lib/internet-detector
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_email.lua $(1)/usr/lib/internet-detector/mod_email.lua
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_led_control.lua $(1)/usr/lib/internet-detector/mod_led_control.lua $(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_led_control.lua $(1)/usr/lib/internet-detector/mod_led_control.lua
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_modem_restart.lua $(1)/usr/lib/internet-detector/mod_modem_restart.lua
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_network_restart.lua $(1)/usr/lib/internet-detector/mod_network_restart.lua
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_reboot.lua $(1)/usr/lib/internet-detector/mod_reboot.lua
$(INSTALL_DATA) ./files/usr/lib/internet-detector/mod_user_scripts.lua $(1)/usr/lib/internet-detector/mod_user_scripts.lua
endef endef
$(eval $(call BuildPackage,$(PKG_NAME))) $(eval $(call BuildPackage,$(PKG_NAME)))

View File

@@ -4,22 +4,43 @@ config main 'config'
list hosts '1.1.1.1' list hosts '1.1.1.1'
option check_type '0' option check_type '0'
option tcp_port '53' option tcp_port '53'
option ui_interval_up '6'
config main 'ui_config' option ui_interval_down '1'
option interval_up '6' option ui_connection_attempts '1'
option interval_down '1' option ui_connection_timeout '1'
option connection_attempts '1' option service_interval_up '30'
option connection_timeout '1' option service_interval_down '5'
option service_connection_attempts '2'
config main 'service_config' option service_connection_timeout '2'
option interval_up '30' option service_enable_logger '1'
option interval_down '5'
option connection_attempts '2'
option connection_timeout '2'
option enable_logger '1'
option enable_up_script '0'
option enable_down_script '0'
option enable_run_script '0'
config module 'mod_led_control' config module 'mod_led_control'
option enabled '0' option enabled '0'
config module 'mod_reboot'
option enabled '0'
option dead_period '3600'
option force_reboot_delay '300'
config module 'mod_network_restart'
option enabled '0'
option dead_period '900'
option attempts '1'
option restart_timeout '0'
config module 'mod_modem_restart'
option enabled '0'
option dead_period '600'
option any_band '1'
config module 'mod_email'
option enabled '0'
option alive_period '0'
option mail_smtp 'smtp.gmail.com'
option mail_smtp_port '587'
option mail_security 'tls'
config module 'mod_user_scripts'
option enabled '0'
option alive_period '0'
option dead_period '0'

View File

@@ -1,6 +1,6 @@
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
START=99 START=97
STOP=01 STOP=01
ID="/usr/bin/internet-detector" ID="/usr/bin/internet-detector"

View File

@@ -1,4 +0,0 @@
# Shell commands that are executed every time the Internet is checked for availability
#
# $1 - (0|1) - internet status: 0 is up, 1 is down
#

View File

@@ -14,38 +14,36 @@
-- Default settings -- Default settings
local Config = { local Config = {
["mode"] = 2, mode = 2,
["enableLogger"] = true, enableLogger = true,
["enableUpScript"] = false, intervalUp = 30,
["enableDownScript"] = false, intervalDown = 5,
["enableRunScript"] = false, connectionAttempts = 2,
["intervalUp"] = 30, connectionTimeout = 2,
["intervalDown"] = 5, UIConnectionAttempts = 1,
["connectionAttempts"] = 1, UIConnectionTimeout = 1,
["UIConnectionAttempts"] = 1, hosts = {
["hosts"] = {
[1] = "8.8.8.8", [1] = "8.8.8.8",
[2] = "1.1.1.1", [2] = "1.1.1.1",
}, },
["parsedHosts"] = {}, tcpPort = 53,
["appName"] = "internet-detector", pingPacketSize = 56,
["commonDir"] = "/tmp/run", iface = nil,
["pingCmd"] = "ping", checkType = 0, -- 0: TCP, 1: ping
["pingParams"] = "-c 1", hostname = "OpenWrt",
["connectionTimeout"] = 3, appName = "internet-detector",
["UIConnectionTimeout"] = 1, commonDir = "/tmp/run",
["tcpPort"] = 53, debugLog = "/tmp/internet-detector.debug",
["checkType"] = 0, -- 0: TCP, 1: ping pingCmd = "/bin/ping",
["loggerLevel"] = "info", pingParams = "-c 1",
["modules"] = {}, debug = false,
modules = {},
parsedHosts = {},
} }
Config.configDir = "/etc/" .. Config.appName Config.configDir = string.format("/etc/%s", Config.appName)
Config.modulesDir = "/usr/lib/" .. Config.appName Config.modulesDir = string.format("/usr/lib/%s", Config.appName)
Config.upScript = Config.configDir .. "/" .. "up-script" Config.pidFile = string.format("%s/%s.pid", Config.commonDir, Config.appName)
Config.downScript = Config.configDir .. "/" .. "down-script" Config.statusFile = string.format("%s/%s.status", Config.commonDir, Config.appName)
Config.runScript = Config.configDir .. "/" .. "run-script"
Config.pidFile = Config.commonDir .. "/" .. Config.appName .. ".pid"
Config.statusFile = Config.commonDir .. "/" .. Config.appName .. ".status"
-- Importing packages -- Importing packages
@@ -69,31 +67,48 @@ end
local uciCursor = uci.cursor() local uciCursor = uci.cursor()
Config.mode = tonumber(uciCursor:get( Config.mode = tonumber(uciCursor:get(
Config.appName, "config", "mode")) Config.appName, "config", "mode"))
Config.enableLogger = (tonumber(uciCursor:get(
Config.appName, "config", "service_enable_logger")) ~= 0)
Config.intervalUp = tonumber(uciCursor:get(
Config.appName, "config", "service_interval_up"))
Config.intervalDown = tonumber(uciCursor:get(
Config.appName, "config", "service_interval_down"))
Config.connectionAttempts = tonumber(uciCursor:get(
Config.appName, "config", "service_connection_attempts"))
Config.connectionTimeout = tonumber(uciCursor:get(
Config.appName, "config", "service_connection_timeout"))
Config.UIConnectionAttempts = tonumber(uciCursor:get(
Config.appName, "config", "ui_connection_attempts"))
Config.UIConnectionTimeout = tonumber(uciCursor:get(
Config.appName, "config", "ui_connection_timeout"))
Config.hosts = uciCursor:get(Config.appName, "config", "hosts") Config.hosts = uciCursor:get(Config.appName, "config", "hosts")
local tcpPort = uciCursor:get(
Config.appName, "config", "tcp_port")
if tcpPort ~= nil then
Config.tcpPort = tonumber(tcpPort)
end
local pingPacketSize = uciCursor:get(
Config.appName, "config", "ping_packet_size")
if pingPacketSize ~= nil then
Config.pingPacketSize = tonumber(pingPacketSize)
end
local iface = uciCursor:get(
Config.appName, "config", "iface")
if iface ~= nil then
Config.iface = iface
end
Config.checkType = tonumber(uciCursor:get( Config.checkType = tonumber(uciCursor:get(
Config.appName, "config", "check_type")) Config.appName, "config", "check_type"))
Config.tcpPort = tonumber(uciCursor:get(
Config.appName, "config", "tcp_port")) local hostname = uciCursor:get("system", "@[0]", "hostname")
Config.UIConnectionAttempts = tonumber(uciCursor:get( if hostname ~= nil then
Config.appName, "ui_config", "connection_attempts")) Config.hostname = hostname
Config.UIConnectionTimeout = tonumber(uciCursor:get( end
Config.appName, "ui_config", "connection_timeout"))
Config.enableLogger = (tonumber(uciCursor:get(
Config.appName, "service_config", "enable_logger")) ~= 0)
Config.enableUpScript = (tonumber(uciCursor:get(
Config.appName, "service_config", "enable_up_script")) ~= 0)
Config.enableDownScript = (tonumber(uciCursor:get(
Config.appName, "service_config", "enable_down_script")) ~= 0)
Config.enableRunScript = (tonumber(uciCursor:get(
Config.appName, "service_config", "enable_run_script")) ~= 0)
Config.intervalUp = tonumber(uciCursor:get(
Config.appName, "service_config", "interval_up"))
Config.intervalDown = tonumber(uciCursor:get(
Config.appName, "service_config", "interval_down"))
Config.connectionAttempts = tonumber(uciCursor:get(
Config.appName, "service_config", "connection_attempts"))
Config.connectionTimeout = tonumber(uciCursor:get(
Config.appName, "service_config", "connection_timeout"))
local function writeValueToFile(filePath, str) local function writeValueToFile(filePath, str)
local retValue = false local retValue = false
@@ -134,6 +149,7 @@ local function loadModules()
if mod_name and s.enabled == "1" then if mod_name and s.enabled == "1" then
local m = prequire(mod_name) local m = prequire(mod_name)
if m then if m then
m.config = Config
m.syslog = writeLogMessage m.syslog = writeLogMessage
m.writeValue = writeValueToFile m.writeValue = writeValueToFile
m.readValue = readValueFromFile m.readValue = readValueFromFile
@@ -145,40 +161,43 @@ local function loadModules()
) )
end end
local function runExternalScript(scriptPath, inetStat)
if inetStat == nil then
inetStat = ""
end
if nixio.fs.access(scriptPath, "x") then
local fh = io.popen(
string.format('/bin/sh -c "%s %s" &', scriptPath, inetStat), "r")
fh:close()
end
end
local function parseHost(host) local function parseHost(host)
local port local addr, port = host:match("^([^:]+):?(%d*)")
local addr = host:match("^[^:]+") return addr, tonumber(port) or false
if host:find(":") then
port = host:match("[^:]+$")
end
return addr, port
end end
local function parseHosts() local function parseHosts()
Config.parsedHosts = {} Config.parsedHosts = {}
for k, v in ipairs(Config.hosts) do for k, v in ipairs(Config.hosts) do
local addr, port = parseHost(v) local addr, port = parseHost(v)
Config.parsedHosts[k] = {[1] = addr, [2] = (tonumber(port) or false)} Config.parsedHosts[k] = { addr = addr, port = port }
end end
end end
local function pingHost(host) local function pingHost(host)
return os.execute(string.format("%s %s -W %d %s > /dev/null 2>&1", local ping = string.format(
Config.pingCmd, Config.pingParams, Config.connectionTimeout, host)) "%s %s -W %d -s %d%s %s > /dev/null 2>&1",
Config.pingCmd,
Config.pingParams,
Config.connectionTimeout,
Config.pingPacketSize,
Config.iface and (" -I " .. Config.iface) or "",
host
)
local retCode = os.execute(ping)
-- Debug
if Config.debug then
io.stdout:write(string.format(
"--- Ping ---\ntime = %s\n%s\nretCode = %s\n", os.time(), ping, retCode)
)
io.stdout:flush()
end end
local function tcpConnectToHost(host, port) return retCode
end
local function TCPConnectionToHost(host, port)
local retCode = 1 local retCode = 1
local addrInfo = nixio.getaddrinfo(host, "any") local addrInfo = nixio.getaddrinfo(host, "any")
if addrInfo then if addrInfo then
@@ -187,7 +206,31 @@ local function tcpConnectToHost(host, port)
local socket = nixio.socket(family, "stream") local socket = nixio.socket(family, "stream")
socket:setopt("socket", "sndtimeo", Config.connectionTimeout) socket:setopt("socket", "sndtimeo", Config.connectionTimeout)
socket:setopt("socket", "rcvtimeo", Config.connectionTimeout) socket:setopt("socket", "rcvtimeo", Config.connectionTimeout)
if Config.iface then
socket:setopt("socket", "bindtodevice", Config.iface)
end
local success = socket:connect(host, port or Config.tcpPort) local success = socket:connect(host, port or Config.tcpPort)
-- Debug
if Config.debug then
local sockAddr, sockPort = socket:getsockname()
local peerAddr, peerPort = socket:getpeername()
io.stdout:write(string.format(
"--- TCP ---\ntime = %s\nconnectionTimeout = %s\niface = %s\nhost:port = %s:%s\nsockname = %s:%s\npeername = %s:%s\nsuccess = %s\n",
os.time(),
Config.connectionTimeout,
tostring(Config.iface),
host,
port or Config.tcpPort,
tostring(sockAddr),
tostring(sockPort),
tostring(peerAddr),
tostring(peerPort),
tostring(success))
)
io.stdout:flush()
end
socket:close() socket:close()
retCode = success and 0 or 1 retCode = success and 0 or 1
end end
@@ -196,11 +239,11 @@ local function tcpConnectToHost(host, port)
end end
local function checkHosts() local function checkHosts()
local checkFunc = (Config.checkType == 1) and pingHost or tcpConnectToHost local checkFunc = (Config.checkType == 1) and pingHost or TCPConnectionToHost
local retCode = 1 local retCode = 1
for k, v in ipairs(Config.parsedHosts) do for k, v in ipairs(Config.parsedHosts) do
for i = 1, Config.connectionAttempts do for i = 1, Config.connectionAttempts do
if checkFunc(v[1], v[2]) == 0 then if checkFunc(v.addr, v.port) == 0 then
retCode = 0 retCode = 0
break break
end end
@@ -213,11 +256,12 @@ local function checkHosts()
end end
local function main() local function main()
local lastStatus local lastStatus, currentStatus, timeNow, timeDiff, lastTime
local currentStatus
local interval = Config.intervalUp local interval = Config.intervalUp
local counter = 0
while true do while true do
if counter == 0 or counter >= interval then
currentStatus = checkHosts() currentStatus = checkHosts()
if not nixio.fs.access(Config.statusFile, "r") then if not nixio.fs.access(Config.statusFile, "r") then
writeValueToFile(Config.statusFile, currentStatus) writeValueToFile(Config.statusFile, currentStatus)
@@ -227,32 +271,33 @@ local function main()
interval = Config.intervalUp interval = Config.intervalUp
if lastStatus ~= nil and currentStatus ~= lastStatus then if lastStatus ~= nil and currentStatus ~= lastStatus then
writeValueToFile(Config.statusFile, currentStatus) writeValueToFile(Config.statusFile, currentStatus)
writeLogMessage("notice", "internet connected") writeLogMessage("notice", "Internet connected")
if Config.enableUpScript then
runExternalScript(Config.upScript)
end
end end
else else
interval = Config.intervalDown interval = Config.intervalDown
if lastStatus ~= nil and currentStatus ~= lastStatus then if lastStatus ~= nil and currentStatus ~= lastStatus then
writeValueToFile(Config.statusFile, currentStatus) writeValueToFile(Config.statusFile, currentStatus)
writeLogMessage("notice", "internet disconnected") writeLogMessage("notice", "Internet disconnected")
if Config.enableDownScript then
runExternalScript(Config.downScript)
end
end end
end end
counter = 0
end
timeDiff = 0
for _, e in ipairs(Config.modules) do for _, e in ipairs(Config.modules) do
e:run(currentStatus, lastStatus) timeNow = nixio.sysinfo().uptime
if lastTime then
timeDiff = timeDiff + timeNow - lastTime
else
timeDiff = 1
end end
lastTime = timeNow
if Config.enableRunScript then e:run(currentStatus, lastStatus, timeDiff)
runExternalScript(Config.runScript, currentStatus)
end end
lastStatus = currentStatus lastStatus = currentStatus
nixio.nanosleep(interval) nixio.nanosleep(1)
counter = counter + 1
end end
end end
@@ -369,6 +414,30 @@ local function run()
) )
end end
-- Debug
if Config.debug then
local function inspectTable()
local tables = {}, f
f = function(t, prefix)
tables[t] = true
for k, v in pairs(t) do
io.stdout:write(string.format(
"%s%s = %s\n", prefix, k, tostring(v))
)
if type(v) == "table" and not tables[v] then
f(v, string.format("%s%s.", prefix, k))
end
end
end
return f
end
io.stdout:write("--- Config ---\n")
inspectTable()(Config, "Config.")
io.stdout:flush()
end
main() main()
if Config.enableLogger then if Config.enableLogger then
nixio.closelog() nixio.closelog()
@@ -382,7 +451,7 @@ local function noDaemon()
run() run()
end end
local function daemon() local function daemon(debug)
if not preRun() then if not preRun() then
return return
end end
@@ -392,12 +461,16 @@ local function daemon()
if nixio.fork() == 0 then if nixio.fork() == 0 then
nixio.chdir("/") nixio.chdir("/")
nixio.umask(0) nixio.umask(0)
local devnull = "/dev/null" local output = "/dev/null"
if debug then
output = Config.debugLog
Config.debug = true
end
io.stdout:flush() io.stdout:flush()
io.stderr:flush() io.stderr:flush()
nixio.dup(io.open(devnull, "r"), io.stdin) nixio.dup(io.open("/dev/null", "r"), io.stdin)
nixio.dup(io.open(devnull, "a+"), io.stdout) nixio.dup(io.open(output, "a+"), io.stdout)
nixio.dup(io.open(devnull, "a+"), io.stderr) nixio.dup(io.open(output, "a+"), io.stderr)
run() run()
end end
os.exit(0) os.exit(0)
@@ -416,7 +489,7 @@ parseHosts()
local function help() local function help()
return string.format( return string.format(
"Usage: %s [start|no-daemon|stop|restart|status|inet-status|poll [<attempts num>] [<timeout sec>]|--help]", "Usage: %s [start|stop|restart|no-daemon|debug|status|inet-status|poll [<attempts num>] [<timeout sec>]|--help]",
arg[0] arg[0]
) )
end end
@@ -426,6 +499,8 @@ if arg[1] == "start" or #arg == 0 then
daemon() daemon()
elseif arg[1] == "no-daemon" then elseif arg[1] == "no-daemon" then
noDaemon() noDaemon()
elseif arg[1] == "debug" then
daemon(true)
elseif arg[1] == "stop" then elseif arg[1] == "stop" then
stop() stop()
elseif arg[1] == "restart" then elseif arg[1] == "restart" then

View File

@@ -0,0 +1,138 @@
--[[
Dependences:
mailsend
--]]
local nixio = require("nixio")
local Module = {
name = "mod_email",
config = {},
syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end,
alivePeriod = 0,
hostAlias = "OpenWrt",
mta = "/usr/bin/mailsend",
mailRecipient = "email@gmail.com",
mailSender = "email@gmail.com",
mailUser = "email@gmail.com",
mailPassword = "password",
mailSmtp = "smtp.gmail.com",
mailSmtpPort = '587',
mailSecurity = "tls",
_enabled = false,
_aliveCounter = 0,
_msgSent = true,
_disconnected = true,
_lastDisconnection = nil,
_lastConnection = nil,
}
function Module:init(t)
self.alivePeriod = tonumber(t.alive_period)
if t.host_alias then
self.hostAlias = t.host_alias
else
self.hostAlias = self.config.hostname
end
self.mailRecipient = t.mail_recipient
self.mailSender = t.mail_sender
self.mailUser = t.mail_user
self.mailPassword = t.mail_password
self.mailSmtp = t.mail_smtp
self.mailSmtpPort = t.mail_smtp_port
self.mailSecurity = t.mail_security
if nixio.fs.access(self.mta, "x") then
self._enabled = true
else
self._enabled = false
self.syslog("warning", string.format("%s: %s is not available", self.name, self.mta))
end
if (not self.mailRecipient or
not self.mailSender or
not self.mailUser or
not self.mailPassword or
not self.mailSmtp or
not self.mailSmtpPort) then
self._enabled = false
self.syslog("warning", string.format(
"%s: Insufficient data to connect to the SMTP server", self.name))
end
end
function Module:sendMessage(msg)
local verboseArg = ""
-- Debug
if self.config.debug then
verboseArg = " -v"
io.stdout:write("--- mod_email ---\n")
io.stdout:flush()
end
local securityArgs = "-starttls -auth-login"
if self.mailSecurity == "ssl" then
securityArgs = "-ssl -auth"
end
local mtaCmd = string.format(
'%s%s %s -smtp "%s" -port %s -cs utf-8 -user "%s" -pass "%s" -f "%s" -t "%s" -sub "%s" -M "%s"',
self.mta, verboseArg, securityArgs, self.mailSmtp, self.mailSmtpPort,
self.mailUser, self.mailPassword, self.mailSender, self.mailRecipient,
string.format("%s notification", self.hostAlias),
string.format("%s:\n%s", self.hostAlias, msg))
if os.execute(mtaCmd) ~= 0 then
self.syslog("err", string.format(
"%s: An error occured while sending message", self.name))
else
self.syslog("info", string.format(
"%s: Message sent to %s", self.name, self.mailRecipient))
end
end
function Module:run(currentStatus, lastStatus, timeDiff)
if not self._enabled then
return
end
if currentStatus == 1 then
self._aliveCounter = 0
self._msgSent = false
self._lastConnection = nil
if not self._disconnected then
self._disconnected = true
if not self._lastDisconnection then
self._lastDisconnection = os.date("%Y.%m.%d %H:%M:%S", os.time())
end
end
else
if not self._msgSent then
if not self._lastConnection then
self._lastConnection = os.date("%Y.%m.%d %H:%M:%S", os.time())
end
if self._aliveCounter >= self.alivePeriod then
local message = {}
if self._lastDisconnection then
message[#message + 1] = string.format(
"Internet disconnected: %s", self._lastDisconnection)
self._lastDisconnection = nil
end
if self._lastConnection then
message[#message + 1] = string.format(
"Internet connected: %s", self._lastConnection)
self:sendMessage(table.concat(message, ", "))
self._msgSent = true
end
else
self._aliveCounter = self._aliveCounter + timeDiff
end
end
self._disconnected = false
end
end
return Module

View File

@@ -3,16 +3,19 @@ local nixio = require("nixio")
local Module = { local Module = {
name = "mod_led_control", name = "mod_led_control",
sysLedsDir = "/sys/class/leds", config = {},
syslog = function(level, msg) return true end, syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end, writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end, readValue = function(filePath) return nil end,
runInterval = 5,
sysLedsDir = "/sys/class/leds",
ledName = nil, ledName = nil,
_enabled = false, _enabled = false,
_ledDir = nil, _ledDir = nil,
_ledMaxBrightnessFile = nil, _ledMaxBrightnessFile = nil,
_ledBrightnessFile = nil, _ledBrightnessFile = nil,
_ledMaxBrightness = nil, _ledMaxBrightness = nil,
_counter = 0,
} }
function Module:resetLeds() function Module:resetLeds()
@@ -34,13 +37,13 @@ function Module:init(t)
return return
end end
self._ledDir = string.format("%s/%s", self.sysLedsDir, self.ledName) self._ledDir = string.format("%s/%s", self.sysLedsDir, self.ledName)
self._ledMaxBrightnessFile = self._ledDir .. "/max_brightness" self._ledMaxBrightnessFile = string.format("%s/max_brightness", self._ledDir)
self._ledBrightnessFile = self._ledDir .. "/brightness" self._ledBrightnessFile = string.format("%s/brightness", self._ledDir)
self._ledMaxBrightness = self.readValue(self._ledMaxBrightnessFile) or 1 self._ledMaxBrightness = self.readValue(self._ledMaxBrightnessFile) or 1
if (not nixio.fs.access(self._ledDir, "r") or if (not nixio.fs.access(self._ledDir, "r") or
not nixio.fs.access(self._ledBrightnessFile, "r", "w")) then not nixio.fs.access(self._ledBrightnessFile, "r", "w")) then
self._enabled = false self._enabled = false
self.syslog("warning", string.format('%s: "%s" is not available', self.name, self.ledName)) self.syslog("warning", string.format("%s: LED '%s' is not available", self.name, self.ledName))
else else
self._enabled = true self._enabled = true
-- Reset all LEDs -- Reset all LEDs
@@ -63,10 +66,12 @@ function Module:off()
self.writeValue(self._ledBrightnessFile, 0) self.writeValue(self._ledBrightnessFile, 0)
end end
function Module:run(currentStatus, lastStatus) function Module:run(currentStatus, lastStatus, timeDiff)
if not self._enabled then if not self._enabled then
return return
end end
if self._counter == 0 or self._counter >= self.runInterval or currentStatus ~= lastStatus then
if currentStatus == 0 then if currentStatus == 0 then
if not self:getCurrentState() then if not self:getCurrentState() then
self:on() self:on()
@@ -76,6 +81,10 @@ function Module:run(currentStatus, lastStatus)
self:off() self:off()
end end
end end
self._counter = 0
end
self._counter = self._counter + timeDiff
end end
return Module return Module

View File

@@ -0,0 +1,84 @@
--[[
Dependences:
modemmanager
--]]
local nixio = require("nixio")
local Module = {
name = "mod_modem_restart",
config = {},
syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end,
mmcli = "/usr/bin/mmcli",
mmInit = "/etc/init.d/modemmanager",
deadPeriod = 0,
iface = nil,
anyBand = false,
_enabled = false,
_deadCounter = 0,
_restarted = false,
}
function Module:toggleIface(flag)
return os.execute(
string.format("%s %s", (flag and "/sbin/ifup" or "/sbin/ifdown"), self.iface)
)
end
function Module:restartMM()
if self.anyBand then
self.syslog("info", string.format(
"%s: resetting current-bands to 'any'", self.name))
os.execute(string.format("%s -m any --set-current-bands=any", self.mmcli))
end
self.syslog("info", string.format("%s: reconnecting modem", self.name))
os.execute(string.format("%s restart", self.mmInit))
if self.iface then
self.syslog("info", string.format(
"%s: restarting network interface '%s'", self.name, self.iface))
self:toggleIface(false)
self:toggleIface(true)
end
end
function Module:init(t)
self.deadPeriod = tonumber(t.dead_period)
self.iface = t.iface
self.anyBand = (tonumber(t.any_band) ~= 0)
if not nixio.fs.access(self.mmcli, "x") then
self.anyBand = false
end
if nixio.fs.access(self.mmInit, "x") then
self._enabled = true
else
self._enabled = false
self.syslog("warning", string.format(
"%s: modemmanager service is not available", self.name))
end
end
function Module:run(currentStatus, lastStatus, timeDiff)
if not self._enabled then
return
end
if currentStatus == 1 then
if not self._restarted then
if self._deadCounter >= self.deadPeriod then
self:restartMM()
self._restarted = true
else
self._deadCounter = self._deadCounter + timeDiff
end
end
else
self._deadCounter = 0
self._restarted = false
end
end
return Module

View File

@@ -0,0 +1,91 @@
local nixio = require("nixio")
local Module = {
name = "mod_network_restart",
config = {},
syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end,
iface = false,
attempts = 0,
deadPeriod = 0,
restartTimeout = 0,
_attemptsCounter = 0,
_deadCounter = 0,
}
function Module:toggleFunc(flag)
return
end
function Module:toggleDevice(flag)
local ip = "/sbin/ip"
if nixio.fs.access(ip, "x") then
return os.execute(
string.format("%s link set dev %s %s", ip, self.iface, (flag and "up" or "down"))
)
end
end
function Module:toggleIface(flag)
return os.execute(
string.format("%s %s", (flag and "/sbin/ifup" or "/sbin/ifdown"), self.iface)
)
end
function Module:ifaceUp()
self:toggleFunc(true)
end
function Module:ifaceDown()
self:toggleFunc(false)
end
function Module:networkRestart()
return os.execute("/etc/init.d/network restart")
end
function Module:init(t)
local iface = t.iface
if iface then
self.iface = iface
if self.iface:match("^@") then
self.iface = self.iface:gsub("^@", "")
self.toggleFunc = self.toggleIface
else
self.toggleFunc = self.toggleDevice
end
end
self.attempts = tonumber(t.attempts)
self.deadPeriod = tonumber(t.dead_period)
self.restartTimeout = tonumber(t.restart_timeout)
end
function Module:run(currentStatus, lastStatus, timeDiff)
if currentStatus == 1 then
if self.attempts == 0 or self._attemptsCounter < self.attempts then
if self._deadCounter >= self.deadPeriod then
if self.iface then
self.syslog("info", string.format(
"%s: restarting network interface '%s'", self.name, self.iface))
self:ifaceDown()
nixio.nanosleep(self.restartTimeout)
self:ifaceUp()
else
self.syslog("info", string.format("%s: restarting network", self.name))
self:networkRestart()
end
self._deadCounter = 0
self._attemptsCounter = self._attemptsCounter + 1
else
self._deadCounter = self._deadCounter + timeDiff
end
end
else
self._attemptsCounter = 0
self._deadCounter = 0
end
end
return Module

View File

@@ -0,0 +1,46 @@
local nixio = require("nixio")
local Module = {
name = "mod_reboot",
config = {},
syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end,
deadPeriod = 0,
forceRebootDelay = 0,
_deadCounter = 0,
}
function Module:rebootDevice()
self.syslog("warning", string.format("%s: reboot", self.name))
os.execute("/sbin/reboot &")
if self.forceRebootDelay > 0 then
nixio.nanosleep(self.forceRebootDelay)
self.syslog("warning", string.format("%s: force reboot", self.name))
self.writeValue("/proc/sys/kernel/sysrq", "1")
self.writeValue("/proc/sysrq-trigger", "b")
end
end
function Module:init(t)
self.deadPeriod = tonumber(t.dead_period)
self.forceRebootDelay = tonumber(t.force_reboot_delay)
end
function Module:run(currentStatus, lastStatus, timeDiff)
if currentStatus == 1 then
if self._deadCounter >= self.deadPeriod then
self:rebootDevice()
self._deadCounter = 0
else
self._deadCounter = self._deadCounter + timeDiff
end
else
self._deadCounter = 0
end
end
return Module

View File

@@ -0,0 +1,63 @@
local nixio = require("nixio")
local Module = {
name = "mod_user_scripts",
config = {},
syslog = function(level, msg) return true end,
writeValue = function(filePath, str) return false end,
readValue = function(filePath) return nil end,
deadPeriod = 0,
alivePeriod = 0,
upScript = "",
downScript = "",
_deadCounter = 0,
_aliveCounter = 0,
_upScriptExecuted = true,
_downScriptExecuted = true,
}
function Module:runExternalScript(scriptPath)
if nixio.fs.access(scriptPath, "x") then
os.execute(string.format('/bin/sh -c "%s" &', scriptPath))
end
end
function Module:init(t)
self.deadPeriod = tonumber(t.dead_period)
self.alivePeriod = tonumber(t.alive_period)
if self.config.configDir then
self.upScript = string.format("%s/up-script", self.config.configDir)
self.downScript = string.format("%s/down-script", self.config.configDir)
end
end
function Module:run(currentStatus, lastStatus, timeDiff)
if currentStatus == 1 then
self._aliveCounter = 0
self._downScriptExecuted = false
if not self._upScriptExecuted then
if self._deadCounter >= self.deadPeriod then
self:runExternalScript(self.downScript)
self._upScriptExecuted = true
else
self._deadCounter = self._deadCounter + timeDiff
end
end
else
self._deadCounter = 0
self._upScriptExecuted = false
if not self._downScriptExecuted then
if self._aliveCounter >= self.alivePeriod then
self:runExternalScript(self.upScript)
self._downScriptExecuted = true
else
self._aliveCounter = self._aliveCounter + timeDiff
end
end
end
end
return Module

View File

@@ -4,7 +4,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_VERSION:=0.4-3 PKG_VERSION:=0.5-0
LUCI_TITLE:=LuCI support for internet-detector LUCI_TITLE:=LuCI support for internet-detector
LUCI_DEPENDS:=+internet-detector LUCI_DEPENDS:=+internet-detector
LUCI_PKGARCH:=all LUCI_PKGARCH:=all

View File

@@ -5,6 +5,7 @@
return baseclass.extend({ return baseclass.extend({
title : _('Internet'), title : _('Internet'),
appName : 'internet-detector',
execPath : '/usr/bin/internet-detector', execPath : '/usr/bin/internet-detector',
inetStatus : null, inetStatus : null,
@@ -14,10 +15,10 @@ return baseclass.extend({
'uiCheckIntervalDown' in window && 'uiCheckIntervalDown' in window &&
'currentAppMode' in window 'currentAppMode' in window
)) { )) {
await uci.load('internet-detector').then(data => { await uci.load(this.appName).then(data => {
window.uiCheckIntervalUp = Number(uci.get('internet-detector', 'ui_config', 'interval_up')); window.uiCheckIntervalUp = Number(uci.get(this.appName, 'config', 'ui_interval_up'));
window.uiCheckIntervalDown = Number(uci.get('internet-detector', 'ui_config', 'interval_down')); window.uiCheckIntervalDown = Number(uci.get(this.appName, 'config', 'ui_interval_down'));
window.currentAppMode = uci.get('internet-detector', 'config', 'mode'); window.currentAppMode = uci.get(this.appName, 'config', 'mode');
}).catch(e => {}); }).catch(e => {});
}; };

View File

@@ -9,24 +9,44 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 2.4.2\n"
"Last-Translator: \n" "Last-Translator: \n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? "
"1 : 2);\n"
"Language: ru\n" "Language: ru\n"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
msgstr "Имя <abbr title=\"Светодиод\">LED</abbr>"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr "Управление <abbr title=\"Светодиод\">LED</abbr>"
msgid ""
"<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is "
"available."
msgstr "<abbr title=\"Светодиод\">LED</abbr> включен если Интернет доступен."
msgid "Alive interval" msgid "Alive interval"
msgstr "Интервал при подключении" msgstr "Интервал при подключении"
msgid "Alive period"
msgstr "Период после подключения"
msgid ""
"An email will be sent when the internet connection is restored after being "
"disconnected."
msgstr "Сообщение будет отправлено при восстановлении соединения с Интернет после отключения."
msgid "An error has occurred" msgid "An error has occurred"
msgstr "Произошла ошибка" msgstr "Произошла ошибка"
msgid "Big: 248 bytes"
msgstr "Большой: 248 байт"
msgid "Check type" msgid "Check type"
msgstr "Тип проверки" msgstr "Тип проверки"
msgid "Checking Internet availability." msgid "Checking Internet availability."
msgstr "Проверка доступности Интернет." msgstr "Проверка доступности Интернет."
msgid "Collecting data..."
msgstr "Сбор данных..."
msgid "Command failed" msgid "Command failed"
msgstr "Команда не выполнена" msgstr "Команда не выполнена"
@@ -39,23 +59,29 @@ msgstr "Попытки подключения"
msgid "Connection timeout" msgid "Connection timeout"
msgstr "Таймаут соединения" msgstr "Таймаут соединения"
msgid "Connections"
msgstr "Подключения"
msgid "Contents have been saved." msgid "Contents have been saved."
msgstr "Содержимое сохранено." msgstr "Содержимое сохранено."
msgid "Dead interval" msgid "Dead interval"
msgstr "Интервал при отключении" msgstr "Интервал при отключении"
msgid "Default port value for TCP connections" msgid "Dead period"
msgstr "Стандартное значение порта для TCP-подключений" msgstr "Период после отключения"
msgid "Default port value for TCP connections."
msgstr "Стандартное значение порта для TCP-подключений."
msgid "Device will be rebooted when the Internet is disconnected."
msgstr "Устройство будет перезагружено при отключении Интернет."
msgid "Disable forced reboot"
msgstr "Отключить принудительную перезагрузку"
msgid "Disabled" msgid "Disabled"
msgstr "Отключен" msgstr "Отключен"
msgid "Disabled: detector is completely off" msgid "Disabled: detector is completely off."
msgstr "Отключен: детектор полностью выключен" msgstr "Отключен: детектор полностью выключен."
msgid "Disconnected" msgid "Disconnected"
msgstr "Отключен" msgstr "Отключен"
@@ -69,53 +95,69 @@ msgstr "Изменить"
msgid "Edit down-script" msgid "Edit down-script"
msgstr "Изменить down-script" msgstr "Изменить down-script"
msgid "Edit run-script"
msgstr "Изменить run-script"
msgid "Edit up-script" msgid "Edit up-script"
msgstr "Изменить up-script" msgstr "Изменить up-script"
msgid "Enable down-script" msgid "Email notification"
msgstr "Включить down-script" msgstr "Уведомление по email"
msgid "Email address of the recipient."
msgstr "Email-адрес получателя."
msgid "Email address of the sender."
msgstr "Email-адрес отправителя."
msgid "Enable"
msgstr "Включить"
msgid "Enable logging" msgid "Enable logging"
msgstr "Включить запись событий в лог" msgstr "Включить запись событий в лог"
msgid "Enable run-script"
msgstr "Включить run-script"
msgid "Enable up-script"
msgstr "Включить up-script"
msgid "Enabled" msgid "Enabled"
msgstr "Включен" msgstr "Включен"
msgid "Execute commands every time the Internet is checked for availability" msgid "Expecting:"
msgstr "Выполнение команд при каждой проверке доступности Интернет" msgstr "Ожидается:"
msgid "Execute commands when the Internet is connected"
msgstr "Выполнение команд при подключении к Интернет"
msgid "Execute commands when the Internet is disconnected"
msgstr "Выполнение команд при отключении от Интернет"
msgid "Failed to get %s init status: %s" msgid "Failed to get %s init status: %s"
msgstr "Не удалось получить статус инициализации %s: %s" msgstr "Не удалось получить статус инициализации %s: %s"
msgid "Host availability check type" msgid "Forced reboot delay"
msgstr "Тип проверки доступности хоста" msgstr "Задержка принудительной перезагрузки"
msgid "Host alias"
msgstr "Псевдоним хоста"
msgid "Host availability check type."
msgstr "Тип проверки доступности хоста."
msgid "Host identifier in messages. If not specified, hostname will be used."
msgstr "Идентификатор хоста в сообщениях. Если не указан, будет использовано имя хоста."
msgid "Hostname/IP address of the SMTP server."
msgstr "Имя хоста/IP-адрес SMTP-сервера."
msgid "Hosts" msgid "Hosts"
msgstr "Хосты" msgstr "Хосты"
msgid "Hosts polling interval when the Internet is down" msgid "Hosts polling interval when the Internet is down."
msgstr "Интервал опроса хостов если Интернет не доступен" msgstr "Интервал опроса хостов если Интернет не доступен."
msgid "Hosts polling interval when the Internet is up" msgid "Hosts polling interval when the Internet is up."
msgstr "Интервал опроса хостов если Интернет доступен" msgstr "Интервал опроса хостов если Интернет доступен."
msgid "Hosts to check Internet availability. Hosts are polled (in list order) until at least one of them responds" msgid ""
msgstr "Хосты для проверки доступности Интернет. Хосты опрашиваются (в порядке списка) до тех пор, пока хотя бы один из них не ответит" "Hosts to check Internet availability. Hosts are polled (in list order) until "
"at least one of them responds."
msgstr ""
"Хосты для проверки доступности Интернет. Хосты опрашиваются (в порядке "
"списка) до тех пор, пока хотя бы один из них не ответит."
msgid "Huge: 1492 bytes"
msgstr "Огромный: 1492 байта"
msgid "Interface"
msgstr "Интерфейс"
msgid "Internet" msgid "Internet"
msgstr "Интернет" msgstr "Интернет"
@@ -129,36 +171,169 @@ msgstr "Режим интернет-детектора"
msgid "Internet status" msgid "Internet status"
msgstr "Статус Интернет" msgstr "Статус Интернет"
msgid "Jumbo: 9000 bytes"
msgstr "Гигантский: 9000 байт"
msgid "LED control"
msgstr "Управление LED"
msgid "Loading" msgid "Loading"
msgstr "Загрузка" msgstr "Загрузка"
msgid ""
"Longest period of time after connecting to Internet before \"up-script\" "
"runs."
msgstr ""
"Максимальный промежуток времени после подключения к Интернет перед запуском "
"\"up-script\"."
msgid ""
"Longest period of time after connecting to the Internet before sending a "
"message."
msgstr "Максимальный промежуток времени после отключения Интернет перед отправкой сообщения."
msgid ""
"Longest period of time after disconnecting from Internet before \"down-script"
"\" runs."
msgstr ""
"Максимальный промежуток времени после отключения Интернет перед запуском "
"\"down-script\"."
msgid "Longest period of time without Internet access before modem restart."
msgstr ""
"Максимальное время отсутствия доступа в Интренет перед перезапуском модема."
msgid "Longest period of time without Internet access before network restart."
msgstr ""
"Максимальное время отсутствия доступа в Интренет перед перезапуском сети."
msgid ""
"Longest period of time without Internet access until the device is rebooted."
msgstr ""
"Максимальное время отсутствия доступа в Интренет перед перезагрузкой "
"устройства."
msgid "Mailsend is not available..."
msgstr "Mailsend недоступен..."
msgid "Main settings" msgid "Main settings"
msgstr "Основные настройки" msgstr "Основные настройки"
msgid "Maximum timeout for waiting for a response from the host" msgid "Maximum number of attempts to connect to each host."
msgstr "Маскимальный таймаут ожидания ответа от хоста" msgstr "Максимальное количество попыток подключения к каждому хосту."
msgid "Maximum number of attempts to connect to each host" msgid ""
msgstr "Максимальное количество попыток подключения к каждому хосту" "Maximum number of network restart attempts before Internet access is "
"available."
msgstr ""
"Максимальное количество попыток перезапуска сети до появления доступа в "
"Интренет."
msgid "Maximum timeout for waiting for a response from the host."
msgstr "Максимальный таймаут ожидания ответа от хоста."
msgid "Modem will be restarted when the Internet is disconnected."
msgstr "Модем будет перезапущен при отключении Интернет."
msgid "ModemManager is not available..."
msgstr "ModemManager недоступен..."
msgid ""
"ModemManger interface. If specified, it will be restarted after restarting "
"ModemManager."
msgstr ""
"Интерфейс ModemManager. Если задан, то будет перезапущен после перезапуска "
"ModemManger."
msgid ""
"Network interface for Internet access. If not specified, the default "
"interface is used."
msgstr ""
"Сетевой интерфейс для доступа в Интернет. Если не указан, используется "
"интерфейс по умолчанию."
msgid ""
"Network interface to restart. If not specified, then the network service is restarted."
msgstr ""
"Сетевой интерфейс для перезапуска. Если не задан, то будет перезапущена сетевая "
"служба."
msgid "Network will be restarted when the Internet is disconnected."
msgstr "Сеть будет перезапущена при отключении Интернет."
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
msgstr "Нет доступных <abbr title=\"Светодиод\">LED</abbr>..."
msgid "One of the following:"
msgstr "Одно из следующих значений:"
msgid "Password"
msgstr "Пароль"
msgid "Password for SMTP authentication."
msgstr "Пароль для SMTP-аутентификации."
msgid ""
"Performing actions when connecting and disconnecting the Internet (available "
"in the \"Service\" mode)."
msgstr ""
"Выполнение действий при подключении и отключении Интернет (доступно в режиме "
"\"Служба\")."
msgid "Ping host" msgid "Ping host"
msgstr "Пинг хоста" msgstr "Пинг хоста"
msgid "Ping packet size"
msgstr "Размер пакета Ping"
msgid "Reboot device"
msgstr "Перезагрузка устройства"
msgid "Recipient"
msgstr "Получатель"
msgid "Restart" msgid "Restart"
msgstr "Перезапуск" msgstr "Перезапуск"
msgid "Restart attempts"
msgstr "Попытки перезапуска"
msgid "Restart modem"
msgstr "Перезапуск модема"
msgid "Restart network"
msgstr "Перезапуск сети"
msgid "Restart service" msgid "Restart service"
msgstr "Перезапуск службы" msgstr "Перезапуск службы"
msgid "Restart timeout"
msgstr "Таймаут перезапуска"
msgid "Run service at startup" msgid "Run service at startup"
msgstr "Запуск службы при старте" msgstr "Запуск службы при старте"
msgid "Running" msgid "Running"
msgstr "Выполняется" msgstr "Выполняется"
msgid "SMTP server"
msgstr "SMTP-сервер"
msgid "SMTP server port"
msgstr "Порт SMTP-сервера"
msgid "SSL: SMTP over SSL."
msgstr "SSL: SMTP поверх SSL."
msgid "Save" msgid "Save"
msgstr "Сохранить" msgstr "Сохранить"
msgid "Security"
msgstr "Безопасность"
msgid "Sender"
msgstr "Отправитель"
msgid "Service" msgid "Service"
msgstr "Служба" msgstr "Служба"
@@ -168,17 +343,29 @@ msgstr "Не удалось выполнить действие службы \"%
msgid "Service configuration" msgid "Service configuration"
msgstr "Конфигурация службы" msgstr "Конфигурация службы"
msgid "Service: detector always runs as a system service" msgid "Service modules"
msgstr "Служба: детектор работает постоянно, как системная служба" msgstr "Модули службы"
msgid "Shell commands that are executed every time the Internet is checked for availability" msgid "Service: detector always runs as a system service."
msgstr "Команды shell выполняемые при каждой проверке доступности Интернет" msgstr "Служба: детектор работает постоянно, как системная служба."
msgid "Shell commands that run when connected to the Internet" msgid "Set the modem to be allowed to use any band."
msgstr "Команды shell выполняемые при подключении к Интернет" msgstr "Разрешить модему использование любой частоты."
msgid "Shell commands to run when disconnected from the Internet" msgid "Shell commands that run when connected to the Internet."
msgstr "Команды shell выполняемые при отключении от Интернет" msgstr "Команды shell выполняемые при подключении к Интернет."
msgid "Shell commands to run when connected or disconnected from the Internet."
msgstr "Команды shell выполняемые при подключении или отключении Интернет."
msgid "Shell commands to run when disconnected from the Internet."
msgstr "Команды shell выполняемые при отключении от Интернет."
msgid "Small: 1 byte"
msgstr "Маленький: 1 байт"
msgid "Standard: 56 bytes"
msgstr "Стандартный: 56 байт"
msgid "Stopped" msgid "Stopped"
msgstr "Остановлена" msgstr "Остановлена"
@@ -189,6 +376,15 @@ msgstr "TCP-порт"
msgid "TCP port connection" msgid "TCP port connection"
msgstr "Подключение к TCP-порту" msgstr "Подключение к TCP-порту"
msgid "TLS: use STARTTLS if the server supports it."
msgstr "TLS: использовать STARTTLS если сервер поддерживает."
msgid "Timeout between stopping and starting the interface."
msgstr "Таймаут между остановкой и запуском интерфейса."
msgid "Type a time string"
msgstr "Введите строку времени"
msgid "UI detector configuration" msgid "UI detector configuration"
msgstr "Конфигурация UI детектора" msgstr "Конфигурация UI детектора"
@@ -201,41 +397,57 @@ msgstr "Невозможно сохранить содержимое"
msgid "Undefined" msgid "Undefined"
msgstr "Неопределён" msgstr "Неопределён"
msgid "Unlock modem bands"
msgstr "Освободить частоты модема"
msgid "User"
msgstr "Пользователь"
msgid "User scripts"
msgstr "Пользовательские скрипты"
msgid "Username for SMTP authentication."
msgstr "Имя пользователя для SMTP-аутентификации."
msgid "Waiting for a reboot to complete before performing a forced reboot."
msgstr ""
"Ожидание завершения перезагрузки перед выполнением принудительной "
"перезагрузки."
msgid "Web UI only" msgid "Web UI only"
msgstr "Только web-интерфейс" msgstr "Только web-интерфейс"
msgid "Web UI only: detector works only when the Web UI is open (UI detector)" msgid "Web UI only: detector works only when the Web UI is open (UI detector)."
msgstr "Только web-интерфейс: детектор работает только в web-интерфейсе (UI детектор)" msgstr ""
"Только web-интерфейс: детектор работает только в web-интерфейсе (UI "
"детектор)."
msgid "Write messages to the system log" msgid "Windows: 32 bytes"
msgstr "Записывать сообщения в системный журнал" msgstr "Windows: 32 байта"
msgid "Write messages to the system log."
msgstr "Записывать сообщения в системный журнал."
msgid "down-script" msgid "down-script"
msgstr "" msgstr "down-script"
msgid "hour"
msgstr "час"
msgid "hours"
msgstr "часы"
msgid "min" msgid "min"
msgstr "мин" msgstr "мин"
msgid "run-script" msgid "minutes"
msgstr "" msgstr "минуты"
msgid "sec" msgid "sec"
msgstr "сек" msgstr "сек"
msgid "seconds"
msgstr "секунды"
msgid "up-script" msgid "up-script"
msgstr "" msgstr "up-script"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr "Управление <abbr title=\"Светодиод\">LED</abbr>"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is available."
msgstr "<abbr title=\"Светодиод\">LED</abbr> включен если Интернет доступен."
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
msgstr "Имя <abbr title=\"Светодиод\">LED</abbr>"
msgid "Enable <abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr "Включить управление <abbr title=\"Светодиод\">LED</abbr>"
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
msgstr "Нет доступных <abbr title=\"Светодиод\">LED</abbr>..."

View File

@@ -1,21 +1,40 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
msgstr ""
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr ""
msgid ""
"<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is "
"available."
msgstr ""
msgid "Alive interval" msgid "Alive interval"
msgstr "" msgstr ""
msgid "Alive period"
msgstr ""
msgid ""
"An email will be sent when the internet connection is restored after being "
"disconnected."
msgstr ""
msgid "An error has occurred" msgid "An error has occurred"
msgstr "" msgstr ""
msgid "Big: 248 bytes"
msgstr ""
msgid "Check type" msgid "Check type"
msgstr "" msgstr ""
msgid "Checking Internet availability." msgid "Checking Internet availability."
msgstr "" msgstr ""
msgid "Collecting data..."
msgstr ""
msgid "Command failed" msgid "Command failed"
msgstr "" msgstr ""
@@ -28,22 +47,28 @@ msgstr ""
msgid "Connection timeout" msgid "Connection timeout"
msgstr "" msgstr ""
msgid "Connections"
msgstr ""
msgid "Contents have been saved." msgid "Contents have been saved."
msgstr "" msgstr ""
msgid "Dead interval" msgid "Dead interval"
msgstr "" msgstr ""
msgid "Default port value for TCP connections" msgid "Dead period"
msgstr ""
msgid "Default port value for TCP connections."
msgstr ""
msgid "Device will be rebooted when the Internet is disconnected."
msgstr ""
msgid "Disable forced reboot"
msgstr "" msgstr ""
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
msgid "Disabled: detector is completely off" msgid "Disabled: detector is completely off."
msgstr "" msgstr ""
msgid "Disconnected" msgid "Disconnected"
@@ -58,52 +83,66 @@ msgstr ""
msgid "Edit down-script" msgid "Edit down-script"
msgstr "" msgstr ""
msgid "Edit run-script"
msgstr ""
msgid "Edit up-script" msgid "Edit up-script"
msgstr "" msgstr ""
msgid "Enable down-script" msgid "Email notification"
msgstr ""
msgid "Email address of the recipient."
msgstr ""
msgid "Email address of the sender."
msgstr ""
msgid "Enable"
msgstr "" msgstr ""
msgid "Enable logging" msgid "Enable logging"
msgstr "" msgstr ""
msgid "Enable run-script"
msgstr ""
msgid "Enable up-script"
msgstr ""
msgid "Enabled" msgid "Enabled"
msgstr "" msgstr ""
msgid "Execute commands every time the Internet is checked for availability" msgid "Expecting:"
msgstr ""
msgid "Execute commands when the Internet is connected"
msgstr ""
msgid "Execute commands when the Internet is disconnected"
msgstr "" msgstr ""
msgid "Failed to get %s init status: %s" msgid "Failed to get %s init status: %s"
msgstr "" msgstr ""
msgid "Host availability check type" msgid "Forced reboot delay"
msgstr ""
msgid "Host alias"
msgstr ""
msgid "Host availability check type."
msgstr ""
msgid "Host identifier in messages. If not specified, hostname will be used."
msgstr ""
msgid "Hostname/IP address of the SMTP server."
msgstr "" msgstr ""
msgid "Hosts" msgid "Hosts"
msgstr "" msgstr ""
msgid "Hosts polling interval when the Internet is down" msgid "Hosts polling interval when the Internet is down."
msgstr "" msgstr ""
msgid "Hosts polling interval when the Internet is up" msgid "Hosts polling interval when the Internet is up."
msgstr "" msgstr ""
msgid "Hosts to check Internet availability. Hosts are polled (in list order) until at least one of them responds" msgid ""
"Hosts to check Internet availability. Hosts are polled (in list order) until "
"at least one of them responds."
msgstr ""
msgid "Huge: 1492 bytes"
msgstr ""
msgid "Interface"
msgstr "" msgstr ""
msgid "Internet" msgid "Internet"
@@ -118,33 +157,151 @@ msgstr ""
msgid "Internet status" msgid "Internet status"
msgstr "" msgstr ""
msgid "Jumbo: 9000 bytes"
msgstr ""
msgid "LED control"
msgstr ""
msgid "Loading" msgid "Loading"
msgstr "" msgstr ""
msgid ""
"Longest period of time after connecting to Internet before \"up-script\" "
"runs."
msgstr ""
msgid ""
"Longest period of time after connecting to the Internet before sending a "
"message."
msgstr ""
msgid ""
"Longest period of time after disconnecting from Internet before \"down-script"
"\" runs."
msgstr ""
msgid "Longest period of time without Internet access before modem restart."
msgstr ""
msgid "Longest period of time without Internet access before network restart."
msgstr ""
msgid ""
"Longest period of time without Internet access until the device is rebooted."
msgstr ""
msgid "Mailsend is not available..."
msgstr ""
msgid "Main settings" msgid "Main settings"
msgstr "" msgstr ""
msgid "Maximum timeout for waiting for a response from the host" msgid "Maximum number of attempts to connect to each host."
msgstr "" msgstr ""
msgid "Maximum number of attempts to connect to each host" msgid ""
"Maximum number of network restart attempts before Internet access is "
"available."
msgstr ""
msgid "Maximum timeout for waiting for a response from the host."
msgstr ""
msgid "Modem will be restarted when the Internet is disconnected."
msgstr ""
msgid "ModemManager is not available..."
msgstr ""
msgid ""
"ModemManger interface. If specified, it will be restarted after restarting "
"ModemManager."
msgstr ""
msgid ""
"Network interface for Internet access. If not specified, the default "
"interface is used."
msgstr ""
msgid ""
"Network interface to restart. If not specified, then the network service is restarted."
msgstr ""
msgid "Network will be restarted when the Internet is disconnected."
msgstr ""
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
msgstr ""
msgid "One of the following:"
msgstr ""
msgid "Password"
msgstr ""
msgid "Password for SMTP authentication."
msgstr ""
msgid ""
"Performing actions when connecting and disconnecting the Internet (available "
"in the \"Service\" mode)."
msgstr "" msgstr ""
msgid "Ping host" msgid "Ping host"
msgstr "" msgstr ""
msgid "Ping packet size"
msgstr ""
msgid "Reboot device"
msgstr ""
msgid "Recipient"
msgstr ""
msgid "Restart" msgid "Restart"
msgstr "" msgstr ""
msgid "Restart attempts"
msgstr ""
msgid "Restart modem"
msgstr ""
msgid "Restart network"
msgstr ""
msgid "Restart service" msgid "Restart service"
msgstr "" msgstr ""
msgid "Restart timeout"
msgstr ""
msgid "Run service at startup" msgid "Run service at startup"
msgstr "" msgstr ""
msgid "Running" msgid "Running"
msgstr "" msgstr ""
msgid "SMTP server"
msgstr ""
msgid "SMTP server port"
msgstr ""
msgid "SSL: SMTP over SSL."
msgstr ""
msgid "Save"
msgstr ""
msgid "Security"
msgstr ""
msgid "Sender"
msgstr ""
msgid "Service" msgid "Service"
msgstr "" msgstr ""
@@ -154,16 +311,28 @@ msgstr ""
msgid "Service configuration" msgid "Service configuration"
msgstr "" msgstr ""
msgid "Service: detector always runs as a system service" msgid "Service modules"
msgstr "" msgstr ""
msgid "Shell commands that are executed every time the Internet is checked for availability" msgid "Service: detector always runs as a system service."
msgstr "" msgstr ""
msgid "Shell commands that run when connected to the Internet" msgid "Set the modem to be allowed to use any band."
msgstr "" msgstr ""
msgid "Shell commands to run when disconnected from the Internet" msgid "Shell commands that run when connected to the Internet."
msgstr ""
msgid "Shell commands to run when connected or disconnected from the Internet."
msgstr ""
msgid "Shell commands to run when disconnected from the Internet."
msgstr ""
msgid "Small: 1 byte"
msgstr ""
msgid "Standard: 56 bytes"
msgstr "" msgstr ""
msgid "Stopped" msgid "Stopped"
@@ -175,6 +344,15 @@ msgstr ""
msgid "TCP port connection" msgid "TCP port connection"
msgstr "" msgstr ""
msgid "TLS: use STARTTLS if the server supports it."
msgstr ""
msgid "Timeout between stopping and starting the interface."
msgstr ""
msgid "Type a time string"
msgstr ""
msgid "UI detector configuration" msgid "UI detector configuration"
msgstr "" msgstr ""
@@ -187,41 +365,53 @@ msgstr ""
msgid "Undefined" msgid "Undefined"
msgstr "" msgstr ""
msgid "Unlock modem bands"
msgstr ""
msgid "User"
msgstr ""
msgid "User scripts"
msgstr ""
msgid "Username for SMTP authentication."
msgstr ""
msgid "Waiting for a reboot to complete before performing a forced reboot."
msgstr ""
msgid "Web UI only" msgid "Web UI only"
msgstr "" msgstr ""
msgid "Web UI only: detector works only when the Web UI is open (UI detector)" msgid "Web UI only: detector works only when the Web UI is open (UI detector)."
msgstr "" msgstr ""
msgid "Write messages to the system log" msgid "Windows: 32 bytes"
msgstr ""
msgid "Write messages to the system log."
msgstr "" msgstr ""
msgid "down-script" msgid "down-script"
msgstr "" msgstr ""
msgid "hour"
msgstr ""
msgid "hours"
msgstr ""
msgid "min" msgid "min"
msgstr "" msgstr ""
msgid "run-script" msgid "minutes"
msgstr "" msgstr ""
msgid "sec" msgid "sec"
msgstr "" msgstr ""
msgid "seconds"
msgstr ""
msgid "up-script" msgid "up-script"
msgstr "" msgstr ""
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr ""
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is available."
msgstr ""
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
msgstr ""
msgid "Enable <abbr title=\"Light Emitting Diode\">LED</abbr> control"
msgstr ""
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
msgstr ""

View File

@@ -10,7 +10,8 @@
"acl": [ "luci-app-internet-detector" ], "acl": [ "luci-app-internet-detector" ],
"fs": { "fs": {
"/usr/bin/internet-detector": "executable" "/usr/bin/internet-detector": "executable"
} },
"uci": { "internet-detector": true }
} }
} }
} }

View File

@@ -6,8 +6,8 @@
"/sys/class/leds": [ "list" ], "/sys/class/leds": [ "list" ],
"/etc/internet-detector/up-script": [ "read" ], "/etc/internet-detector/up-script": [ "read" ],
"/etc/internet-detector/down-script": [ "read" ], "/etc/internet-detector/down-script": [ "read" ],
"/etc/internet-detector/run-script": [ "read" ], "/usr/bin/internet-detector*": [ "exec" ],
"/usr/bin/internet-detector*": [ "exec" ] "/usr/bin/mailsend": [ "exec" ]
}, },
"uci": [ "internet-detector" ], "uci": [ "internet-detector" ],
"ubus": { "ubus": {
@@ -17,8 +17,7 @@
"write": { "write": {
"file": { "file": {
"/etc/internet-detector/up-script": [ "write" ], "/etc/internet-detector/up-script": [ "write" ],
"/etc/internet-detector/down-script": [ "write" ], "/etc/internet-detector/down-script": [ "write" ]
"/etc/internet-detector/run-script": [ "write" ]
}, },
"uci": [ "internet-detector" ] "uci": [ "internet-detector" ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB