#!/usr/bin/lua5.2

local posix = require 'posix'
local aac = require 'aaudit.common'
local aas = require 'aaudit.server'

local pullafter = aas.serverconfig["pull-after"] or 24*60*60
local warnafter = aas.serverconfig["warn-after"] or 4*24*60*60

local function dorepo(repodir)
	-- Check if it's time to update
	local repoconf = aas.loadrepoconfig(repodir)
	local stampfile = ("%s/lastcheck"):format(repodir)
	local mtime = posix.stat(stampfile, "mtime") or 0

	if os.time() > mtime + pullafter then
		-- Pull for changes
		local req = {
			command = "commit",
			target_address = repoconf.address,
			message = "Unexpected configuration change",
			local_change = true,
		}
		local ret, msg = aas.handle(req)
		print(("Updating repository %s -> %s: %s"):format(repodir, repoconf.address, msg))
		mtime = posix.stat(stampfile, "mtime") or 0
	end

	return mtime, repoconf.address
end

local home = os.getenv("HOME")
local outdated = {"List of unreachable monitored hosts:"}
for _, repodir in ipairs(posix.glob(("%s/*.git"):format(home))) do
	local mtime, address = dorepo(repodir)
	if os.time() > mtime + warnafter then
		table.insert(outdated, address)
	end
end

if #outdated > 1 and aas.serverconfig["notify-unreachables"] then
	aas.sendemail {
		to = aas.serverconfig["notify-unreachables"],
		subject = "aaudit report of unreachable hosts",
		message = table.concat(outdated, "\n"),
	}
end