diff host/admin/src/private/lib/monitor.luan @ 1995:301a6561fb6b

add host/admin
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 04 Jul 2025 10:25:38 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/host/admin/src/private/lib/monitor.luan	Fri Jul 04 10:25:38 2025 -0600
@@ -0,0 +1,82 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Io = require "luan:Io.luan"
+local uri = Io.uri or error()
+local String = require "luan:String.luan"
+local trim = String.trim or error()
+local Time = require "luan:Time.luan"
+local Thread = require "luan:Thread.luan"
+local Http = require "luan:http/Http.luan"
+local Config = require "site:/private/Config.luan"
+local Utils = require "site:/private/lib/Utils.luan"
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "monitor"
+
+
+local who_monitors_who = {
+	-- ["admin.me.luan.software"] = "admin.me.luan.software"
+	["admin.s1.luan.software"] = "admin.s2.luan.software"
+	["admin.s2.luan.software"] = "admin.s1.luan.software"
+}
+local frequency = Time.period{minutes=2}
+
+--[[  -- for development
+--who_monitors_who["admin.me.luan.software"] = "admin.me.luan.software"
+frequency = Time.period{seconds=20}
+Config.email_to = "fschmidt@gmail.com"
+--]]
+
+
+
+local domain = who_monitors_who[Utils.domain]
+
+if domain == nil then
+	logger.info "nothing to monitor"
+	return true
+end
+
+local url = "https://"..domain.."/hi"
+local options = { time_out = Time.period{seconds=20} }
+
+local function init_check()
+	local fails = 0
+
+	return function()
+		try
+			local page = uri(url,options).read_text()
+			fails = 0
+			logger.info(domain.." is okay")
+		catch e
+			logger.error("Error connecting to "..domain..": "..e.get_message())
+			fails = fails + 1
+			if fails < 2 then return end
+			try
+				local s = Utils.ssh(domain,"/Users/administrator/luan/host/restart.sh monitoring")
+				if trim(s) == "stopped with stop script" then
+					logger.info("stopped with stop script")
+				else
+					logger.error("restart successful\n"..s)
+					Utils.send_mail {
+						Subject = domain.." restarted"
+						body = s
+					}
+				end
+				fails = 0
+			catch e
+				logger.error("restart failed: "..e.get_message())
+				if fails < 5 then
+					Utils.send_mail {
+						Subject = domain.." restart failed"
+						body = e.get_message()
+					}
+				end
+			end
+		end
+	end
+end
+
+Thread.schedule_closure(init_check,{repeating_delay=frequency})
+
+logger.info("monitoring "..domain)
+
+return true