about summary refs log tree commit diff
path: root/ops/nixos/clbot.nix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-08-17T21·03+0100
committertazjin <mail@tazj.in>2020-08-17T21·50+0000
commita7868e4e17a6257b8b82b1714d1493e14e4c5e3f (patch)
tree29b684ba566ba093f2e26ac88cf74d5a57e94768 /ops/nixos/clbot.nix
parent1da8ace6a20c48dcf2f33405d2fecd71ea3229ab (diff)
feat(nixos/clbot): Add ability to post in multiple channels r/1667
Adds the ability to post to multiple channels by simply running
multiple instances of clbot.

We should probably implement support for this in clbot itself, but
right now I can't be bothered to write Go.

Change-Id: I5cffd0dc10a7f6cc19c37c5834c5610166b4ae23
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1771
Tested-by: BuildkiteCI
Reviewed-by: kanepyork <rikingcoding@gmail.com>
Reviewed-by: lukegb <lukegb@tvl.fyi>
Diffstat (limited to 'ops/nixos/clbot.nix')
-rw-r--r--ops/nixos/clbot.nix49
1 files changed, 36 insertions, 13 deletions
diff --git a/ops/nixos/clbot.nix b/ops/nixos/clbot.nix
index adcbebd57fd0..0c45badd2b3e 100644
--- a/ops/nixos/clbot.nix
+++ b/ops/nixos/clbot.nix
@@ -2,26 +2,59 @@
 { config, lib, pkgs, ... }:
 
 let
-  inherit (builtins) concatStringsSep attrValues mapAttrs;
+  inherit (builtins) attrValues concatStringsSep mapAttrs readFile;
+  inherit (pkgs) runCommandNoCC;
+
   inherit (lib)
+    listToAttrs
     mkEnableOption
     mkIf
     mkOption
+    removeSuffix
     types;
 
-  description = "CLBot forwards Gerrit notifications to IRC";
+  description = "Bot to forward CL notifications";
   cfg = config.services.depot.clbot;
 
   mkFlags = flags:
     concatStringsSep " "
       (attrValues (mapAttrs (key: value: "-${key} \"${toString value}\"") flags));
+
+  # Escapes a unit name for use in systemd
+  systemdEscape = name: removeSuffix "\n" (readFile (runCommandNoCC "unit-name" {} ''
+    ${pkgs.systemd}/bin/systemd-escape '${name}' >> $out
+  ''));
+
+  mkUnit = flags: channel: {
+    name = "clbot-${systemdEscape channel}";
+    value = {
+      description = "${description} to ${channel}";
+      wantedBy = [ "multi-user.target" ];
+
+      script = "${config.depot.fun.clbot}/bin/clbot ${mkFlags (cfg.flags // {
+        irc_channel = channel;
+      })} -alsologtostderr";
+
+      serviceConfig = {
+        User = "clbot";
+        EnvironmentFile = "/etc/secrets/clbot";
+        Restart = "always";
+      };
+    };
+  };
 in {
   options.services.depot.clbot = {
     enable = mkEnableOption description;
+
     flags = mkOption {
       type = types.attrsOf types.str;
       description = "Key value pairs for command line flags";
     };
+
+    channels = mkOption {
+      type = with types; listOf str;
+      description = "Channels in which to post (generates one unit per channel)";
+    };
   };
 
   config = mkIf cfg.enable {
@@ -37,16 +70,6 @@ in {
       };
     };
 
-    systemd.services.clbot = {
-      inherit description;
-      script = "${config.depot.fun.clbot}/bin/clbot ${mkFlags cfg.flags} -alsologtostderr";
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        User = "clbot";
-        EnvironmentFile = "/etc/secrets/clbot";
-        Restart = "always";
-      };
-    };
+    systemd.services = listToAttrs (map (mkUnit cfg.flags) cfg.channels);
   };
 }