anchor.diff:    ###### implementation
   
     config = mkIf cfg.enable {
  +
  +    assertions = [ {
  +      assertion = let hooknames = builtins.attrNames cfg.hooks; in all (x: elem x eventList) hooknames;
  +      message = ''
  +        One (or more) attribute names in services.apcupsd.hooks are invalid.
  +        Current attribute names: ${toString (builtins.attrNames cfg.hooks)}
  +        Valid attribute names  : ${toString eventList}
  +      '';
  +    } ];
   
       # Give users access to the "apcaccess" tool
       environment.systemPackages = [ pkgs.apcupsd ];
  
positive.code:     # 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" ];
  
negative.code: 
  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}
      SCRIPTDIR ${toString scriptDir}
    '';
  
    # List of events from "man apccontrol"
    eventList = [
      "annoyme"
      "battattach"
      "battdetach"
      "changeme"
      "commfailure"
      "commok"
      "doreboot"
      "doshutdown"
      "emergency"
      "failing"
      "killpower"
      "loadlimit"
      "mainsback"
      "onbattery"
      "offbattery"
      "powerout"
      "remotedown"
      "runlimit"
      "timeout"
      "startselftest"
      "endselftest"
    ];
  
    shellCmdsForEventScript = eventname: commands: ''
      echo "#!${pkgs.stdenv.shell}" > "$out/${eventname}"
      echo "${commands}" >> "$out/${eventname}"
      chmod a+x "$out/${eventname}"
    '';
  
    eventToShellCmds = event: if builtins.hasAttr event cfg.hooks then (shellCmdsForEventScript event (builtins.getAttr event cfg.hooks)) else "";
  
    scriptDir = pkgs.runCommand "apcupsd-scriptdir" {} (''
      mkdir "$out"
      # Copy SCRIPTDIR from apcupsd package
      cp -r ${pkgs.apcupsd}/etc/apcupsd/* "$out"/
      # Make the files writeable (nix will unset the write bits afterwards)
      chmod u+w "$out"/*
      # Remove the sample event notification scripts, because they don't work
      # anyways (they try to send mail to "root" with the "mail" command)
      (cd "$out" && rm changeme commok commfailure onbattery offbattery)
      # Remove the sample apcupsd.conf file (we're generating our own)
      rm "$out/apcupsd.conf"
      # Set the SCRIPTDIR= line in apccontrol to the dir we're creating now
      sed -i -e "s|^SCRIPTDIR=.*|SCRIPTDIR=$out|" "$out/apccontrol"
      '' + concatStringsSep "\n" (map eventToShellCmds eventList)
  
    );
  
  in
  
  {
  