diff --git a/modules/module-list.nix b/modules/module-list.nix index 52b98e8bc09..fcbedaa9d9d 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -117,6 +117,7 @@ ./services/misc/rogue.nix ./services/misc/svnserve.nix ./services/misc/synergy.nix + ./services/monitoring/apcupsd.nix ./services/monitoring/dd-agent.nix ./services/monitoring/monit.nix ./services/monitoring/nagios/default.nix diff --git a/modules/services/monitoring/apcupsd.nix b/modules/services/monitoring/apcupsd.nix new file mode 100644 index 00000000000..5541fb92fe1 --- /dev/null +++ b/modules/services/monitoring/apcupsd.nix @@ -0,0 +1,83 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let cfg = config.services.apcupsd; + configFile = pkgs.writeText "apcupsd.conf" '' + ## apcupsd.conf v1.1 ## + # apcupsd complains if the first line is not like above. + ${cfg.configText} + ''; +in + +{ + + ###### interface + + options = { + + services.apcupsd = { + + enable = mkOption { + default = false; + type = types.uniq types.bool; + description = '' + Whether to enable the APC UPS daemon. apcupsd monitors your UPS and + permits orderly shutdown of your computer in the event of a power + failure. User manual: http://www.apcupsd.com/manual/manual.html. + Note that apcupsd runs as root (to allow shutdown of computer). + You can check the status of your UPS with the "apcaccess" command. + ''; + }; + + configText = mkOption { + default = '' + UPSTYPE usb + NISIP 127.0.0.1 + BATTERYLEVEL 50 + MINUTES 5 + ''; + type = types.string; + description = '' + Contents of the runtime configuration file, apcupsd.conf. The default + settings makes apcupsd autodetect USB UPSes, limit network access to + localhost and shutdown the system when the battery level is below 50 + percent, or when the UPS has calculated that it has 5 minutes or less + of remaining power-on time. See man apcupsd.conf for details. + ''; + }; + + }; + + }; + + + ###### implementation + + config = mkIf cfg.enable { + + # Give users access to the "apcaccess" tool + environment.systemPackages = [ pkgs.apcupsd ]; + + # NOTE 1: apcupsd runs as root because it needs permission to run + # "shutdown" + # + # NOTE 2: When apcupsd calls "wall", it prints an error because stdout is + # not connected to a tty (it is connected to the journal): + # wall: cannot get tty name: Inappropriate ioctl for device + # The message still gets through. + # + # TODO: apcupsd calls "mail" on powerfail etc. events, how should we + # handle that? A configurable mail package or let the event logic be + # configured from nix expressions? + systemd.services.apcupsd = { + description = "UPS daemon"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = "${pkgs.apcupsd}/bin/apcupsd -b -f ${configFile} -d1"; + }; + }; + + }; + +}