v1.2. UI detector refactoring

This commit is contained in:
gSpot
2024-01-20 19:08:49 +03:00
parent be0912d7ae
commit 9364dabe0a
18 changed files with 601 additions and 640 deletions

View File

@@ -19,15 +19,15 @@ Internet-detector is an application for checking the availability of the Interne
**OpenWrt >= 21.02:**
opkg update
wget --no-check-certificate -O /tmp/internet-detector_1.1-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.1-0_all.ipk
opkg install /tmp/internet-detector_1.1-0_all.ipk
rm /tmp/internet-detector_1.1-0_all.ipk
wget --no-check-certificate -O /tmp/internet-detector_1.2-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.2-0_all.ipk
opkg install /tmp/internet-detector_1.2-0_all.ipk
rm /tmp/internet-detector_1.2-0_all.ipk
/etc/init.d/internet-detector start
/etc/init.d/internet-detector enable
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.1-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.1-0_all.ipk
opkg install /tmp/luci-app-internet-detector_1.1-0_all.ipk
rm /tmp/luci-app-internet-detector_1.1-0_all.ipk
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.2-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.2-0_all.ipk
opkg install /tmp/luci-app-internet-detector_1.2-0_all.ipk
rm /tmp/luci-app-internet-detector_1.2-0_all.ipk
/etc/init.d/rpcd restart
Email notification:
@@ -36,9 +36,9 @@ Email notification:
i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.1-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.1-0_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_1.1-0_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_1.1-0_all.ipk
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.2-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.2-0_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_1.2-0_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_1.2-0_all.ipk
**[OpenWrt 19.07](https://github.com/gSpotx2f/luci-app-internet-detector/tree/19.07)**
@@ -47,4 +47,3 @@ i18n-ru:
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/01.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/03.jpg)
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/04.jpg)

View File

@@ -1,11 +1,11 @@
#
# (с) 2023 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
# (с) 2024 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
#
include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector
PKG_VERSION:=1.1
PKG_VERSION:=1.2
PKG_RELEASE:=0
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>

View File

@@ -2,16 +2,6 @@ config main 'config'
option mode '1'
option enable_logger '1'
config ui 'ui'
list hosts '8.8.8.8'
list hosts '1.1.1.1'
option check_type '0'
option tcp_port '53'
option interval_up '6'
option interval_down '1'
option connection_attempts '1'
option connection_timeout '1'
config instance 'internet'
option enabled '1'
list hosts '8.8.8.8'

View File

@@ -3,9 +3,9 @@
START=97
STOP=01
PROG=/usr/bin/internet-detector
PROG="/usr/bin/internet-detector"
config_app() {
run_instance() {
config_get enabled "$1" enabled "0"
if [ $enabled = "1" ]; then
$PROG service "$1"
@@ -16,7 +16,7 @@ start() {
config_load internet-detector
config_get mode "config" mode "0"
if [ $mode = "1" ]; then
config_foreach config_app "instance"
config_foreach run_instance "instance"
fi
}

View File

@@ -8,7 +8,7 @@
luaposix
libuci-lua
(с) 2023 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
(с) 2024 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
--]]
-- Importing packages
@@ -26,15 +26,18 @@ local uci = require("uci")
-- Default settings
local InternetDetector = {
mode = 0,
enableLogger = true,
hostname = "OpenWrt",
appName = "internet-detector",
commonDir = "/tmp/run",
pingCmd = "/bin/ping",
pingParams = "-c 1",
debug = false,
serviceConfig = {
mode = 0, -- 0: disabled, 1: Service, 2: UI detector
enableLogger = true,
hostname = "OpenWrt",
appName = "internet-detector",
commonDir = "/tmp/run",
pingCmd = "/bin/ping",
pingParams = "-c 1",
uiRunTime = 30,
noModules = false,
uiAvailModules = { mod_public_ip = true },
debug = false,
serviceConfig = {
hosts = {
[1] = "8.8.8.8",
[2] = "1.1.1.1",
@@ -49,13 +52,15 @@ local InternetDetector = {
iface = nil,
instance = nil,
},
modules = {},
parsedHosts = {},
modules = {},
parsedHosts = {},
uiCounter = 0,
}
InternetDetector.configDir = string.format("/etc/%s", InternetDetector.appName)
InternetDetector.modulesDir = string.format("/usr/lib/%s", InternetDetector.appName)
-- Loading settings from UCI
local uciCursor = uci.cursor()
InternetDetector.mode = tonumber(
uciCursor:get(InternetDetector.appName, "config", "mode"))
@@ -161,22 +166,25 @@ function InternetDetector:loadModules()
if ok then
for item in modulesDir do
if item:match("^mod_") then
local modName = item:gsub("%.lua$", "")
local modConfig = {}
for k, v in pairs(self.serviceConfig) do
if k:match("^" .. modName) then
modConfig[k:gsub("^" .. modName .. "_", "")] = v
local modName = item:gsub("%.lua$", "")
if self.noModules and not self.uiAvailModules[modName] then
else
local modConfig = {}
for k, v in pairs(self.serviceConfig) do
if k:match("^" .. modName) then
modConfig[k:gsub("^" .. modName .. "_", "")] = v
end
end
end
if modConfig.enabled == 1 then
local m = self:prequire(modName)
if m then
m.config = self
m.syslog = function(level, msg) self:writeLogMessage(level, msg) end
m.writeValue = function(filePath, str) return self:writeValueToFile(filePath, str) end
m.readValue = function(filePath) return self:readValueFromFile(filePath) end
m:init(modConfig)
self.modules[#self.modules + 1] = m
if modConfig.enabled == 1 then
local m = self:prequire(modName)
if m then
m.config = self
m.syslog = function(level, msg) self:writeLogMessage(level, msg) end
m.writeValue = function(filePath, str) return self:writeValueToFile(filePath, str) end
m.readValue = function(filePath) return self:readValueFromFile(filePath) end
m:init(modConfig)
self.modules[#self.modules + 1] = m
end
end
end
end
@@ -213,7 +221,6 @@ function InternetDetector:pingHost(host)
)
local retCode = os.execute(ping)
-- Debug
if self.debug then
io.stdout:write(string.format(
"--- Ping ---\ntime = %s\n%s\nretCode = %s\n", os.time(), ping, retCode)
@@ -329,15 +336,20 @@ function InternetDetector:breakMain(signo)
RUNNING = false
end
function InternetDetector:resetUiCounter(signo)
self.uiCounter = 0
end
function InternetDetector:main()
signal.signal(signal.SIGTERM, function(signo) self:breakMain(signo) end)
signal.signal(signal.SIGINT, function(signo) self:breakMain(signo) end)
signal.signal(signal.SIGQUIT, function(signo) self:breakMain(signo) end)
signal.signal(signal.SIGUSR1, function(signo) self:resetUiCounter(signo) end)
local lastStatus, currentStatus, timeNow, timeDiff, lastTime
local interval = self.serviceConfig.interval_up
local counter = 0
local onStart = true
local lastStatus, currentStatus, mTimeNow, mTimeDiff, mLastTime, uiTimeNow, uiLastTime
local interval = self.serviceConfig.interval_up
local counter = 0
local onStart = true
RUNNING = true
while RUNNING do
if counter == 0 or counter >= interval then
@@ -367,16 +379,16 @@ function InternetDetector:main()
counter = 0
end
timeDiff = 0
mTimeDiff = 0
for _, e in ipairs(self.modules) do
timeNow = time.clock_gettime(time.CLOCK_MONOTONIC).tv_sec
if lastTime then
timeDiff = timeDiff + timeNow - lastTime
mTimeNow = time.clock_gettime(time.CLOCK_MONOTONIC).tv_sec
if mLastTime then
mTimeDiff = mTimeDiff + mTimeNow - mLastTime
else
timeDiff = 1
mTimeDiff = 1
end
lastTime = timeNow
e:run(currentStatus, lastStatus, timeDiff)
mLastTime = mTimeNow
e:run(currentStatus, lastStatus, mTimeDiff)
end
local modulesStatus = {}
@@ -392,7 +404,20 @@ function InternetDetector:main()
lastStatus = currentStatus
unistd.sleep(1)
counter = counter + 1
counter = counter + 1
if self.mode == 2 then
uiTimeNow = time.clock_gettime(time.CLOCK_MONOTONIC).tv_sec
if uiLastTime then
self.uiCounter = self.uiCounter + uiTimeNow - uiLastTime
else
self.uiCounter = self.uiCounter + 1
end
uiLastTime = uiTimeNow
if self.uiCounter >= self.uiRunTime then
self:breakMain(signal.SIGTERM)
end
end
end
end
@@ -490,13 +515,27 @@ function InternetDetector:stop()
break
end
end
end
function InternetDetector:setSIGUSR()
local appName = self.appName:gsub("-", "%%-")
local ok, commonDir = pcall(dirent.files, self.commonDir)
if ok then
for item in commonDir do
if item:match("^" .. appName .. ".-%.pid$") then
pidValue = self:readValueFromFile(string.format("%s/%s", self.commonDir, item))
if pidValue then
signal.kill(tonumber(pidValue), signal.SIGUSR1)
end
end
end
end
end
function InternetDetector:preRun()
-- Exit if internet-detector mode != 1(Service)
if self.mode ~= 1 then
io.stderr:write(string.format('Start failed, mode != 1\n', self.appName))
-- Exit if internet-detector mode != (1 or 2)
if self.mode ~= 1 and self.mode ~= 2 then
io.stderr:write(string.format('Start failed, mode != (1 or 2)\n', self.appName))
os.exit(0)
end
if stat.stat(self.pidFile) then
@@ -528,7 +567,6 @@ function InternetDetector:run()
)
end
-- Debug
if self.debug then
local function inspectTable()
local tables = {}, f
@@ -597,6 +635,10 @@ end
function InternetDetector:setServiceConfig(instance)
if self:loadUCIConfig("instance", instance) then
self:parseHosts()
if self.mode == 2 then
self.enableLogger = false
self.noModules = true
end
return true
end
end
@@ -605,12 +647,12 @@ end
local function help()
return string.format(
"Usage: %s service <UCI instance> | nodaemon <UCI instance> | debug <UCI instance> | stop | status | inet-status | poll [<attempts num>] [<timeout sec>] | --help",
"Usage: %s service <UCI instance> | nodaemon <UCI instance> | debug <UCI instance> | stop | status | inet-status | uipoll | --help",
arg[0]
)
end
local helpArgs = { ["-h"] = true, ["--help"] = true, ["help"] = true }
local helpArgs = { ["-h"] = true, ["--help"] = true, help = true }
if arg[1] == "service" then
if arg[2] then
if InternetDetector:setServiceConfig(arg[2]) then
@@ -651,20 +693,12 @@ elseif arg[1] == "status" then
print(InternetDetector:status())
elseif arg[1] == "inet-status" then
print(InternetDetector:inetStatus())
elseif arg[1] == "poll" then
if InternetDetector:loadUCIConfig("ui", "ui") then
InternetDetector:parseHosts()
if arg[2] and arg[2]:match("[0-9]+") then
InternetDetector.serviceConfig.connection_attempts = tonumber(arg[2])
if arg[3] and arg[3]:match("[0-9]+") then
InternetDetector.serviceConfig.connection_timeout = tonumber(arg[3])
end
end
print(InternetDetector:poll())
else
elseif arg[1] == "uipoll" then
if InternetDetector:status() == "stoped" then
os.exit(126)
else
InternetDetector:setSIGUSR()
print(InternetDetector:inetStatus())
end
elseif helpArgs[arg[1]] then
print(help())

View File

@@ -12,8 +12,8 @@ local Module = {
runInterval = 5,
sysLedsDir = "/sys/class/leds",
ledName = nil,
ledAction1 = 2,
ledAction2 = 1,
ledAction1 = 2, -- 1: off, 2: on, 3: blink
ledAction2 = 1, -- 1: off, 2: on, 3: blink
status = nil,
_enabled = false,
_ledDir = nil,

View File

@@ -7,7 +7,8 @@ local Module = {
name = "mod_public_ip",
runPrio = 50,
config = {
debug = false,
noModules = false,
debug = false,
serviceConfig = {
iface = nil,
},
@@ -65,7 +66,7 @@ local Module = {
}
function Module:runIpScript()
if self.enableIpScript and unistd.access(self.ipScript, "r") then
if not self.config.noModules and self.enableIpScript and unistd.access(self.ipScript, "r") then
stdlib.setenv("PUBLIC_IP", self.status)
os.execute(string.format('/bin/sh "%s" &', self.ipScript))
end
@@ -247,8 +248,8 @@ function Module:decodeMessage(message)
local questionSectionStarts = 25
local questionParts = self:parseParts(message, questionSectionStarts, {})
local qtypeStarts = questionSectionStarts + (#table.concat(questionParts)) + (#questionParts * 2) + 1
local qclassStarts = qtypeStarts + 4
local qtypeStarts = questionSectionStarts + (#table.concat(questionParts)) + (#questionParts * 2) + 1
local qclassStarts = qtypeStarts + 4
local answerSectionStarts = qclassStarts + 4
local numAnswers = math.max(

View File

@@ -1,10 +1,10 @@
#
# (с) 2023 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
# (с) 2024 gSpot (https://github.com/gSpotx2f/luci-app-internet-detector)
#
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.1-0
PKG_VERSION:=1.2-0
LUCI_TITLE:=LuCI support for internet-detector
LUCI_DEPENDS:=+internet-detector
LUCI_PKGARCH:=all

View File

@@ -1,6 +1,7 @@
'use strict';
'require baseclass';
'require fs';
'require rpc';
'require uci';
document.head.append(E('style', {'type': 'text/css'},
@@ -57,14 +58,22 @@ return baseclass.extend({
title : _('Internet'),
appName : 'internet-detector',
execPath : '/usr/bin/internet-detector',
uiCheckIntervalUp : null,
uiCheckIntervalDown : null,
currentAppMode : null,
inetStatus : null,
uiState : null,
counter : 0,
inetStatusFromJson : function(res) {
callUIPoll: rpc.declare({
object: 'luci.internet-detector',
method: 'UIPoll',
expect: { '': {} }
}),
getUIPoll() {
return this.callUIPoll().then(data => {
return data;
});
},
inetStatusFromJson(res) {
let inetStatData = null;
if(res.code === 0) {
try {
@@ -74,50 +83,38 @@ return baseclass.extend({
return inetStatData;
},
load: async function() {
if(!(this.uiCheckIntervalUp && this.uiCheckIntervalDown && this.currentAppMode)) {
async load() {
if(!this.currentAppMode) {
await uci.load(this.appName).then(data => {
this.uiCheckIntervalUp = Number(uci.get(this.appName, 'ui', 'interval_up'));
this.uiCheckIntervalDown = Number(uci.get(this.appName, 'ui', 'interval_down'));
this.currentAppMode = uci.get(this.appName, 'config', 'mode');
this.currentAppMode = uci.get(this.appName, 'config', 'mode');
}).catch(e => {});
};
if(this.currentAppMode === '2') {
this.counter++;
if((this.uiState === 0 && this.counter % this.uiCheckIntervalUp) ||
(this.uiState === 1 && this.counter % this.uiCheckIntervalDown)
) {
return;
};
this.counter = 0;
return L.resolveDefault(fs.exec(this.execPath, [ 'poll' ]), null);
return this.getUIPoll();
}
else if(this.currentAppMode === '1') {
return L.resolveDefault(fs.exec(this.execPath, [ 'inet-status' ]), null);
};
},
render: function(data) {
render(data) {
if(this.currentAppMode === '0') {
return;
}
else if(this.currentAppMode === '1' && data) {
data = this.inetStatusFromJson(data);
};
if(data) {
this.inetStatus = this.inetStatusFromJson(data);
if(this.currentAppMode === '2') {
this.uiState = this.inetStatus.instances[0].inet;
};
};
this.inetStatus = data;
let inetStatusArea = E('div', {});
if(!this.inetStatus || !this.inetStatus.instances || this.inetStatus.instances.length === 0) {
inetStatusArea.append(
E('span', { 'class': 'id-label-status id-undefined' }, _('Undefined'))
);
let label = E('span', { 'class': 'id-label-status id-undefined' }, _('Undefined'));
if(this.currentAppMode === '2') {
label.classList.add('spinning');
};
inetStatusArea.append(label);
} else {
this.inetStatus.instances.sort((a, b) => a.num > b.num);
@@ -139,8 +136,7 @@ return baseclass.extend({
inetStatusArea.append(
E('span', { 'class': className }, '%s%s%s'.format(
(this.currentAppMode === '1') ? i.instance + ': ' : '',
status, publicIp)
i.instance + ': ', status, publicIp)
)
);
};

View File

@@ -434,9 +434,6 @@ msgstr "Таймаут между остановкой и запуском ин
msgid "Type a time string"
msgstr "Введите строку времени"
msgid "UI detector configuration"
msgstr "Конфигурация UI детектора"
msgid "Unable to read the contents"
msgstr "Невозможно прочитать содержимое"

View File

@@ -404,9 +404,6 @@ msgstr ""
msgid "Type a time string"
msgstr ""
msgid "UI detector configuration"
msgstr ""
msgid "Unable to read the contents"
msgstr ""

View File

@@ -0,0 +1,46 @@
#!/bin/sh
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
readonly ID_EXEC="/usr/bin/internet-detector"
run_instance() {
config_get enabled "$1" enabled "0"
if [ $enabled = "1" ]; then
$ID_EXEC service "$1" > /dev/null 2>&1
fi
}
start_ui_instances() {
config_load internet-detector
config_get mode "config" mode "0"
if [ $mode = "2" ]; then
config_foreach run_instance "instance"
fi
}
ui_poll() {
$ID_EXEC uipoll
if [ $? -eq 126 ]; then
start_ui_instances
$ID_EXEC inet-status
fi
}
case "$1" in
list)
json_init
json_add_object "UIPoll"
json_close_object
json_dump
json_cleanup
;;
call)
case "$2" in
UIPoll)
ui_poll
;;
esac
;;
esac

View File

@@ -12,7 +12,8 @@
},
"uci": [ "internet-detector" ],
"ubus": {
"luci": [ "getInitList", "setInitAction" ]
"luci": [ "getInitList", "setInitAction" ],
"luci.internet-detector": [ "UIPoll" ]
}
},
"write": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB