94 lines
2.2 KiB
Nix
94 lines
2.2 KiB
Nix
{ config, lib, ... }:
|
|
with lib;
|
|
let
|
|
cfg = config.services.xin-monitoring;
|
|
inherit (builtins)
|
|
readFile
|
|
concatStringsSep
|
|
attrValues
|
|
mapAttrs
|
|
replaceStrings
|
|
;
|
|
|
|
nginxCfg = config.services.nginx;
|
|
buildFSChecker =
|
|
fsList:
|
|
(concatStringsSep "\n" (
|
|
attrValues (
|
|
mapAttrs
|
|
(
|
|
f: v:
|
|
if v.fsType != "sshfs" then
|
|
''
|
|
check filesystem ${replaceStrings [ "/" ] [ "_" ] f} with path ${f}
|
|
if space usage > 90% then alert
|
|
if inode usage > 90% then alert
|
|
''
|
|
else
|
|
""
|
|
)
|
|
fsList
|
|
)
|
|
));
|
|
buildNginxChecker =
|
|
vhostList:
|
|
(concatStringsSep "\n" (
|
|
attrValues (
|
|
mapAttrs
|
|
(f: v: ''
|
|
check host ${f} with address ${f}
|
|
if failed port 80 protocol http then alert
|
|
${if v.enableACME then "if failed port 443 protocol https then alert" else ""}
|
|
'')
|
|
vhostList
|
|
)
|
|
));
|
|
nginxChecks =
|
|
if nginxCfg.enable then
|
|
if config.networking.hostName == "h" then (buildNginxChecker nginxCfg.virtualHosts) else ""
|
|
else
|
|
"";
|
|
in
|
|
{
|
|
options = {
|
|
services.xin-monitoring = {
|
|
enable = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = "Enable Monitoring";
|
|
};
|
|
fs = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
Create monitoring entry points from `config.fileSystems`.
|
|
'';
|
|
};
|
|
nginx = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Create monitoring entry points from `services.nginx.virtualHosts`.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
config = mkIf cfg.enable {
|
|
sops.secrets = {
|
|
monit_cfg = {
|
|
sopsFile = config.xin-secrets.deploy;
|
|
owner = "root";
|
|
mode = "400";
|
|
};
|
|
};
|
|
services.monit = {
|
|
enable = true;
|
|
config = concatStrings [
|
|
(readFile ./monitrc)
|
|
(optionalString cfg.fs (buildFSChecker config.fileSystems))
|
|
(optionalString cfg.nginx nginxChecks)
|
|
];
|
|
};
|
|
};
|
|
}
|