feat(ups): monitoring de l'onduleur #97

Merged
thubrecht merged 6 commits from lbailly/infrastructure:ups into main 2024-04-21 23:20:24 +02:00
Showing only changes of commit b8d3b34122 - Show all commits

View file

@ -1,4 +1,4 @@
# { pkgs, ... }:
{ pkgs, ... }:
lbailly marked this conversation as resolved Outdated
{ config, lib, pkgs, ...}:

Le lib c'est pour le getExe d'ensuite

``` { config, lib, pkgs, ...}: ``` Le `lib` c'est pour le `getExe` d'ensuite
{
power.ups = {
enable = true;
@ -7,17 +7,61 @@
port = "auto";
};
upsmon.enable = false;
# users."eatonMon" = {
# passwordFile = (pkgs.writeTextFile {
# name = "pass";
# text = "YFEAee2%9PuPcEKf$7vW$3a&wdvNJME%UkP2Z~RVkk4ZaQHYW^";
# }).outPath;
# upsmon = "primary";
# };
# upsmon.monitor."eaton" = {
# user = "eatonMon";
# };
users."eatonMon" = {
lbailly marked this conversation as resolved Outdated

Y'a pas besoin de quotes pour le username, et les majscules c'est chelou je mettrai eatonmon plutôt

Y'a pas besoin de quotes pour le username, et les majscules c'est chelou je mettrai `eatonmon` plutôt

Perso j'aime bien mettre les clefs des attrsOf en quotes pour bien voir que c'est pas un truc du module mais as you want

Perso j'aime bien mettre les clefs des attrsOf en quotes pour bien voir que c'est pas un truc du module mais as you want
passwordFile =
(pkgs.writeTextFile {
name = "pass";
text = "YFEAee2%9PuPcEKf$7vW$3a&wdvNJME%UkP2Z~RVkk4ZaQHYW^";
lbailly marked this conversation as resolved Outdated

Pareil, pas besoin de quotes pour eaton

Pareil, pas besoin de quotes pour `eaton`
}).outPath;
upsmon = "primary";
};
upsmon.monitor."eaton" = {
user = "eatonMon";
};
schedulerRules =
let
cmdScript = pkgs.writeShellApplication {
name = "upssched-cmd.sh";
runtimeInputs = with pkgs; [ systemd ];
text = ''
case $1 in
shutdown) shutdown now
# TODO : warn
# TODO : warn & log on unknown cmd
esac
mdebray marked this conversation as resolved Outdated

pkgs.writeShellApplication est approprié ici (pour avoir de l'analyse statique du script bash)

`pkgs.writeShellApplication` est approprié ici (pour avoir de l'analyse statique du script bash)
'';
};
mdebray marked this conversation as resolved Outdated

Il me semble que mettre ça dans le state directory de upsmon (/var/lib/upsmon) évite d'avoir besoin des tmpfiles.

Il me semble que mettre ça dans le state directory de upsmon (`/var/lib/upsmon`) évite d'avoir besoin des tmpfiles.

Le dossier existe pas non plus, et pour des raison de sécurité on veut qu'il soit en 0700 (pas sur que la raison s'applique à nixos mais au cas où https://networkupstools.org/docs/man/upssched.conf.html), donc tmpfiles fait bien le taff
Pour l'endroit, j'ai juste pris le dossier qu'il proposait par défaut

Le dossier existe pas non plus, et pour des raison de sécurité on veut qu'il soit en 0700 (pas sur que la raison s'applique à nixos mais au cas où https://networkupstools.org/docs/man/upssched.conf.html), donc tmpfiles fait bien le taff Pour l'endroit, j'ai juste pris le dossier qu'il proposait par défaut

ok

ok
rules = ''
CMDSCRIPT ${cmdScript}/bin/upssched-cmd.sh
lbailly marked this conversation as resolved Outdated

fai+monitoring@dgnum.eu plutôt

`fai+monitoring@dgnum.eu` plutôt
PIPEFN /var/state/ups/upssched/upssched.pipe
LOCKFN /var/state/ups/upssched/upssched.lock
AT LOWBATT * EXECUTE shutdown
AT ONBATT * START-TIMER shutdown 900
AT ONLINE * CANCEL-TIMER shutdown
# TODO : warn admins at COMMBAD NOCOMM BYPASS (and maybe at ONBATT)
'';
in
(pkgs.writeTextFile {
name = "upssched.conf";
text = rules;
}).outPath;
};
lbailly marked this conversation as resolved Outdated
CMDSCRIPT ${lib.getExe cmdScript}
``` CMDSCRIPT ${lib.getExe cmdScript} ```
systemd.tmpfiles.settings."10-upsmon" =
let
root = {
user = "root";
group = "root";
mode = "0600";
};
in
{
"/var/state/ups/upssched".d = root // {
mode = "0700";
};
"/var/state/ups/upssched/upssched.pipe".p = root;
};
thubrecht marked this conversation as resolved Outdated

Tu peux inline les rules je pense, et le outPath n'est pas nécessaire

Tu peux inline les rules je pense, et le `outPath` n'est pas nécessaire

le outPath n'est pas nécessaire

il est nécessaire car sinon ça évalue pas à cause de power.ups.schedulerRules qui demande un string et pas un path, donc la dérivation se transforme pas auto dans le bon type

> le `outPath` n'est pas nécessaire il est nécessaire car sinon ça évalue pas à cause de [`power.ups.schedulerRules`](https://search.nixos.org/options?channel=unstable&show=power.ups.schedulerRules&from=0&size=50&sort=relevance&type=packages&query=power.ups) qui demande un string et pas un path, donc la dérivation se transforme pas auto dans le bon type
services.prometheus.exporters.nut = {
enable = true;
listenAddress = "100.80.255.180";