update 2025-04-06 20:37:35

This commit is contained in:
kenzok8 2025-04-06 20:37:35 +08:00
parent d98a542b8d
commit 7be29399c8
26 changed files with 396 additions and 23 deletions

View File

@ -10,27 +10,29 @@ Internet-detector is an application for checking the availability of the Interne
- Sending email notification when Internet access is restored (internet-detector-mod-email).
- The daemon is written entirely in Lua using the luaposix library.
**OpenWrt >= 21.02.**
**Dependences:** lua, luaposix, libuci-lua.
## Installation notes (OpenWrt >= 21.02)
## Installation notes:
opkg update
wget --no-check-certificate -O /tmp/internet-detector_1.4.4-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.4.4-r1_all.ipk
opkg install /tmp/internet-detector_1.4.4-r1_all.ipk
rm /tmp/internet-detector_1.4.4-r1_all.ipk
wget --no-check-certificate -O /tmp/internet-detector_1.4.5-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.4.5-r1_all.ipk
opkg install /tmp/internet-detector_1.4.5-r1_all.ipk
rm /tmp/internet-detector_1.4.5-r1_all.ipk
service internet-detector start
service internet-detector enable
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.4.4-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.4.4-r1_all.ipk
opkg install /tmp/luci-app-internet-detector_1.4.4-r1_all.ipk
rm /tmp/luci-app-internet-detector_1.4.4-r1_all.ipk
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.4.5-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.4.5-r1_all.ipk
opkg install /tmp/luci-app-internet-detector_1.4.5-r1_all.ipk
rm /tmp/luci-app-internet-detector_1.4.5-r1_all.ipk
service rpcd restart
i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.4.4-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.4.4-r1_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_1.4.4-r1_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_1.4.4-r1_all.ipk
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.4.5-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.4.5-r1_all.ipk
opkg install /tmp/luci-i18n-internet-detector-ru_1.4.5-r1_all.ipk
rm /tmp/luci-i18n-internet-detector-ru_1.4.5-r1_all.ipk
## Screenshots:
@ -42,9 +44,9 @@ i18n-ru:
**Dependences:** modemmanager.
wget --no-check-certificate -O /tmp/internet-detector-mod-modem-restart_1.4.4-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector-mod-modem-restart_1.4.4-r1_all.ipk
opkg install /tmp/internet-detector-mod-modem-restart_1.4.4-r1_all.ipk
rm /tmp/internet-detector-mod-modem-restart_1.4.4-r1_all.ipk
wget --no-check-certificate -O /tmp/internet-detector-mod-modem-restart_1.4.5-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector-mod-modem-restart_1.4.5-r1_all.ipk
opkg install /tmp/internet-detector-mod-modem-restart_1.4.5-r1_all.ipk
rm /tmp/internet-detector-mod-modem-restart_1.4.5-r1_all.ipk
service internet-detector restart
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/04.jpg)
@ -53,9 +55,9 @@ i18n-ru:
**Dependences:** mailsend.
wget --no-check-certificate -O /tmp/internet-detector-mod-email_1.4.4-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector-mod-email_1.4.4-r1_all.ipk
opkg install /tmp/internet-detector-mod-email_1.4.4-r1_all.ipk
rm /tmp/internet-detector-mod-email_1.4.4-r1_all.ipk
wget --no-check-certificate -O /tmp/internet-detector-mod-email_1.4.5-r1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector-mod-email_1.4.5-r1_all.ipk
opkg install /tmp/internet-detector-mod-email_1.4.5-r1_all.ipk
rm /tmp/internet-detector-mod-email_1.4.5-r1_all.ipk
service internet-detector restart
![](https://github.com/gSpotx2f/luci-app-internet-detector/blob/master/screenshots/05.jpg)

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector-mod-email
PKG_VERSION:=1.4.4
PKG_VERSION:=1.4.5
PKG_RELEASE:=1
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>

View File

@ -189,4 +189,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector-mod-modem-restart
PKG_VERSION:=1.4.4
PKG_VERSION:=1.4.5
PKG_RELEASE:=1
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>

View File

@ -99,4 +99,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=internet-detector
PKG_VERSION:=1.4.4
PKG_VERSION:=1.4.5
PKG_RELEASE:=1
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>

View File

@ -593,6 +593,10 @@ function InternetDetector:run()
self:mainLoop()
for _, e in ipairs(self.modules) do
e:onExit()
end
self:removeProcessFiles()
if self.enableLogger then
self:writeLogMessage("info", "stoped")

View File

@ -39,6 +39,13 @@ function Module:setLedAttrs(t)
t.ledBrightnessFile = string.format("%s/brightness", t.ledDir)
t.ledMaxBrightness = self.readValue(t.ledMaxBrightnessFile) or 1
t.ledTriggerFile = string.format("%s/trigger", t.ledDir)
t.ledPrevState = {
brightness = self.readValue(t.ledBrightnessFile),
trigger = self.readValue(t.ledTriggerFile),
}
if t.ledPrevState.trigger then
t.ledPrevState.trigger = t.ledPrevState.trigger:match("%[%w+%]"):gsub("[%]%[]", "")
end
end
function Module:checkLed(t)
@ -53,8 +60,6 @@ function Module:init(t)
end
if t.led1_name then
self._enabled = true
-- Reset all LEDs
--self:resetLeds()
else
return
end
@ -155,4 +160,17 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
self._counter = self._counter + timeDiff
end
function Module:onExit()
for _, l in ipairs(self._leds) do
if l.ledPrevState then
if l.ledPrevState.brightness then
self.writeValue(l.ledBrightnessFile, l.ledPrevState.brightness)
end
if l.ledPrevState.trigger then
self.writeValue(l.ledTriggerFile, l.ledPrevState.trigger)
end
end
end
end
return Module

View File

@ -141,4 +141,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -419,4 +419,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
self._counter = self._counter + timeDiff
end
function Module:onExit()
return true
end
return Module

View File

@ -52,4 +52,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -59,4 +59,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -66,4 +66,8 @@ function Module:run(currentStatus, lastStatus, timeDiff, timeNow, inetChecked)
end
end
function Module:onExit()
return true
end
return Module

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-internet-detector
PKG_VERSION:=1.4.4
PKG_VERSION:=1.4.5
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for internet-detector
LUCI_DEPENDS:=+internet-detector

View File

@ -2,7 +2,7 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.6-20240822
PKG_VERSION:=1.0.6-20250406
PKG_RELEASE:=
LUCI_TITLE:=LuCI support for 1Panel

View File

@ -18,6 +18,13 @@ do_install() {
echo "config path is empty!"
exit 1
fi
if [[ "$config" == "/mnt/*" ]]; then
echo "The config path is $config, check ok"
else
echo "The config path does not start with /mnt, not supported"
sleep 5
exit 2
fi
[ -z "$port" ] && port=10086
[ -z "$ver" ] && ver='v1.10.10-lts'

View File

@ -0,0 +1,24 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.0-20250406
PKG_RELEASE:=
LUCI_TITLE:=LuCI support for UptimeKuma
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+lsblk +zoneinfo-asia +docker +dockerd +luci-lib-taskd +luci-lib-docker
define Package/luci-app-uptimekuma/conffiles
/etc/config/uptimekuma
endef
define Package/luci-app-uptimekuma/prerm
#!/bin/sh
/usr/libexec/istorec/uptimekuma.sh stop
exit 0
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,7 @@
module("luci.controller.uptimekuma", package.seeall)
function index()
entry({"admin", "services", "uptimekuma"}, alias("admin", "services", "uptimekuma", "config"), _("UptimeKuma"), 30).dependent = true
entry({"admin", "services", "uptimekuma", "config"}, cbi("uptimekuma"))
end

View File

@ -0,0 +1,59 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local docker = require "luci.docker"
local uptimekuma_model = require "luci.model.uptimekuma"
local m, s, o
m = taskd.docker_map("uptimekuma", "uptimekuma", "/usr/libexec/istorec/uptimekuma.sh",
translate("UptimeKuma"),
translate("Uptime Kuma is an easy-to-use self-hosted monitoring tool.")
.. translate("Official website:") .. ' <a href=\"https://uptime.kuma.pet/\" target=\"_blank\">https://uptime.kuma.pet/</a>')
local dk = docker.new({socket_path="/var/run/docker.sock"})
local dockerd_running = dk:_ping().code == 200
local docker_info = dockerd_running and dk:info().body or {}
local docker_aspace = 0
if docker_info.DockerRootDir then
local statvfs = nixio.fs.statvfs(docker_info.DockerRootDir)
docker_aspace = statvfs and (statvfs.bavail * statvfs.bsize) or 0
end
s = m:section(SimpleSection, translate("Service Status"), translate("UptimeKuma status:"))
s:append(Template("uptimekuma/status"))
s = m:section(TypedSection, "main", translate("Setup"),
(docker_aspace < 2147483648 and
(translate("The free space of Docker is less than 2GB, which may cause the installation to fail.")
.. "<br>") or "") .. translate("The following parameters will only take effect during installation or upgrade:"))
s.addremove=false
s.anonymous=true
o = s:option(Value, "port", translate("Port").."<b>*</b>")
o.default = "3005"
o.datatype = "port"
o:depends("hostnet", 0)
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("louislam/uptime-kuma:1", "louislam/uptime-kuma:1")
o:value("louislam/uptime-kuma:beta", "louislam/uptime-kuma:beta")
o.default = "louislam/uptime-kuma:1"
local blocks = uptimekuma_model.blocks()
local home = uptimekuma_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = uptimekuma_model.find_paths(blocks, home, "Configs")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
return m

View File

@ -0,0 +1,55 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local uptimekuma = {}
uptimekuma.blocks = function()
local f = io.popen("lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json", "r")
local vals = {}
if f then
local ret = f:read("*all")
f:close()
local obj = jsonc.parse(ret)
for _, val in pairs(obj["blockdevices"]) do
local fsize = val["fssize"]
if fsize ~= nil and string.len(fsize) > 10 and val["mountpoint"] then
-- fsize > 1G
vals[#vals+1] = val["mountpoint"]
end
end
end
return vals
end
uptimekuma.home = function()
local uci = require "luci.model.uci".cursor()
local home_dirs = {}
home_dirs["main_dir"] = uci:get_first("quickstart", "main", "main_dir", "/root")
home_dirs["Configs"] = uci:get_first("quickstart", "main", "conf_dir", home_dirs["main_dir"].."/Configs")
home_dirs["Public"] = uci:get_first("quickstart", "main", "pub_dir", home_dirs["main_dir"].."/Public")
home_dirs["Downloads"] = uci:get_first("quickstart", "main", "dl_dir", home_dirs["Public"].."/Downloads")
home_dirs["Caches"] = uci:get_first("quickstart", "main", "tmp_dir", home_dirs["main_dir"].."/Caches")
return home_dirs
end
uptimekuma.find_paths = function(blocks, home_dirs, path_name)
local default_path = ''
local configs = {}
default_path = home_dirs[path_name] .. "/UptimeKuma"
if #blocks == 0 then
table.insert(configs, default_path)
else
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. "/UptimeKuma")
end
local without_conf_dir = "/root/" .. path_name .. "/UptimeKuma"
if default_path == without_conf_dir then
default_path = configs[1]
end
end
return configs, default_path
end
return uptimekuma

View File

@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/uptimekuma.sh status"))
local container_install = (string.len(container_status) > 0)
local container_running = container_status == "running"
-%>
<div class="cbi-value">
<label class="cbi-value-title"><%:Status%></label>
<div class="cbi-value-field">
<% if container_running then %>
<button class="cbi-button cbi-button-success" disabled="true"><%:UptimeKuma is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:UptimeKuma is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/uptimekuma.sh port"))
if port == "" then
port="3001"
end
-%>
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title">&nbsp;</label>
<div class="cbi-value-field">
<input type="button" class="btn cbi-button cbi-button-apply" name="start" value="<%:Open UptimeKuma%>" onclick="window.open('http://'+location.hostname+':<%=port%>/', '_blank')">
</div>
</div>
<% end %>

View File

@ -0,0 +1,44 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Uptime Kuma is an easy-to-use self-hosted monitoring tool."
msgstr "Uptime Kuma 是一款易于使用的自托管监控工具。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Port"
msgstr "端口"
msgid "Service Status"
msgstr "服务状态"
msgid "UptimeKuma status:"
msgstr "UptimeKuma 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "UptimeKuma is running"
msgstr "UptimeKuma 运行中"
msgid "UptimeKuma is not running"
msgstr "UptimeKuma 未运行"
msgid "Open UptimeKuma"
msgstr "打开 UptimeKuma"
msgid "The free space of Docker is less than 2GB, which may cause the installation to fail."
msgstr "Docker 可用空间已不足2GB可能导致安装失败。"
msgid "Please make sure there has enough space"
msgstr "请确保有足够空间"

View File

@ -0,0 +1 @@
zh-cn

View File

@ -0,0 +1,4 @@
config main
option 'port' '3001'
# option 'config_path' ''

View File

@ -0,0 +1,78 @@
#!/bin/sh
# Author Xiaobao(xiaobao@linkease.com)
ACTION=${1}
shift 1
do_install() {
local port=`uci get uptimekuma.@main[0].port 2>/dev/null`
local image_name=`uci get uptimekuma.@main[0].image_name 2>/dev/null`
local config=`uci get uptimekuma.@main[0].config_path 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
[ -z "$port" ] && port=3001
[ -z "$image_name" ] && image_name="louislam/uptime-kuma:1"
echo "docker pull ${image_name}"
docker pull ${image_name}
RET=$?
if [ ! "$RET" = "0" ]; then
echo "download failed"
exit 1
fi
docker rm -f uptimekuma
local cmd="docker run --restart=unless-stopped -d -h UptimeKumaServer \
-p $port:3001 \
-v \"$config:/app/data\" "
cmd="$cmd\
--dns=172.17.0.1 \
--dns=223.5.5.5 "
local tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`"
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz"
cmd="$cmd --name uptimekuma \"$image_name\""
echo "$cmd"
eval "$cmd"
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the uptimekuma"
echo " upgrade Upgrade the uptimekuma"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the uptimekuma"
echo " status UptimeKuma status"
echo " port UptimeKuma port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f uptimekuma
;;
"start" | "stop" | "restart")
docker ${ACTION} uptimekuma
;;
"status")
docker ps --all -f 'name=^/uptimekuma$' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=^/htreader$' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*->9060/tcp' | sed 's/0.0.0.0:\([0-9]*\)->.*/\1/'
;;
*)
usage
exit 1
;;
esac

View File

@ -0,0 +1,11 @@
{
"luci-app-uptimekuma": {
"description": "Grant UCI access for luci-app-uptimekuma",
"read": {
"uci": [ "uptimekuma" ]
},
"write": {
"uci": [ "uptimekuma" ]
}
}
}