view 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 source

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