130 lines
3.0 KiB
Lua
130 lines
3.0 KiB
Lua
do
|
|
local socket = require("socket")
|
|
local cronned = load_from_file('data/isup.lua')
|
|
|
|
local function save_cron(msg, url, delete)
|
|
local origin = get_receiver(msg)
|
|
if not cronned[origin] then
|
|
cronned[origin] = {}
|
|
end
|
|
if not delete then
|
|
table.insert(cronned[origin], url)
|
|
else
|
|
for k,v in pairs(cronned[origin]) do
|
|
if v == url then
|
|
table.remove(cronned[origin], k)
|
|
end
|
|
end
|
|
end
|
|
serialize_to_file(cronned, 'data/isup.lua')
|
|
return 'Gespeichert!'
|
|
end
|
|
|
|
local function is_up_socket(ip, port)
|
|
print('Connect to', ip, port)
|
|
local c = socket.try(socket.tcp())
|
|
c:settimeout(3)
|
|
local conn = c:connect(ip, port)
|
|
if not conn then
|
|
return false
|
|
else
|
|
c:close()
|
|
return true
|
|
end
|
|
end
|
|
|
|
local function is_up_http(url)
|
|
-- Parse URL from input, default to http
|
|
local parsed_url = URL.parse(url, { scheme = 'http', authority = '' })
|
|
-- Fix URLs without subdomain not parsed properly
|
|
if not parsed_url.host and parsed_url.path then
|
|
parsed_url.host = parsed_url.path
|
|
parsed_url.path = ""
|
|
end
|
|
-- Re-build URL
|
|
local url = URL.build(parsed_url)
|
|
|
|
local protocols = {
|
|
["https"] = https,
|
|
["http"] = http
|
|
}
|
|
local options = {
|
|
url = url,
|
|
redirect = false,
|
|
method = "GET"
|
|
}
|
|
local response = { protocols[parsed_url.scheme].request(options) }
|
|
local code = tonumber(response[2])
|
|
if code == nil or code >= 400 then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
local function isup(url)
|
|
local pattern = '^(%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?):?(%d?%d?%d?%d?%d?)$'
|
|
local ip,port = string.match(url, pattern)
|
|
local result = nil
|
|
|
|
-- !isup 8.8.8.8:53
|
|
if ip then
|
|
port = port or '80'
|
|
result = is_up_socket(ip, port)
|
|
else
|
|
result = is_up_http(url)
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
local function cron()
|
|
for chan, urls in pairs(cronned) do
|
|
for k,url in pairs(urls) do
|
|
print('Checking', url)
|
|
if not isup(url) then
|
|
local text = url..' scheint DOWN zu sein'
|
|
send_msg(chan, text, ok_cb, false)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function run(msg, matches)
|
|
if matches[1] == 'remove' then
|
|
if not is_sudo(msg) then
|
|
return 'Du darfst diesen Befehl nicht nutzen!'
|
|
end
|
|
return save_cron(msg, matches[2], true)
|
|
|
|
elseif matches[1] == 'save' then
|
|
if not is_sudo(msg) then
|
|
return 'Du darfst diesen Befehl nicht nutzen!'
|
|
end
|
|
return save_cron(msg, matches[2])
|
|
|
|
elseif isup(matches[1]) then
|
|
return matches[1]..' ist UP'
|
|
else
|
|
return matches[1]..' scheint DOWN zu sein'
|
|
end
|
|
end
|
|
|
|
return {
|
|
description = "Check if a website or server is up.",
|
|
usage = {
|
|
"/isup [host]: Performs a HTTP request or Socket (ip:port) connexion",
|
|
"/isup save [host]: Every 5mins check if host is up. (Requires privileged user)",
|
|
"/isup remove [host]: Disable checking that host."
|
|
},
|
|
patterns = {
|
|
"^/isup (remove) (.*)$",
|
|
"^/isup (save) (.*)$",
|
|
"^/isup (.*)$",
|
|
"^/ping (.*)$",
|
|
"^/ping (remove) (.*)$",
|
|
"^/ping (save) (.*)$"
|
|
},
|
|
run = run
|
|
}
|
|
|
|
end |