module.nix
1 self: 2 { 3 lib, 4 config, 5 pkgs, 6 ... 7 }: 8 let 9 settingsFormat = pkgs.formats.toml { }; 10 in 11 { 12 options.services.aocbot = { 13 enable = lib.mkEnableOption "aocbot"; 14 15 package = lib.mkOption { 16 type = lib.types.package; 17 default = self.packages.${pkgs.stdenv.hostPlatform.system}.default; 18 }; 19 20 logLevel = lib.mkOption { 21 type = lib.types.str; 22 default = "info,matrix_sdk=warn"; 23 }; 24 25 settings = lib.mkOption { 26 inherit (settingsFormat) type; 27 default = { }; 28 }; 29 }; 30 31 config = 32 let 33 cfg = config.services.aocbot; 34 35 settings = settingsFormat.generate "config.toml" cfg.settings; 36 37 aocbot-setup = pkgs.writeShellScriptBin "aocbot-setup" '' 38 export CONFIG_PATH=${settings} 39 export RUST_LOG=${lib.escapeShellArg cfg.logLevel} 40 ${lib.getExe pkgs.sudo} --preserve-env=CONFIG_PATH,RUST_LOG -u aocbot ${lib.getExe cfg.package} setup 41 ''; 42 in 43 lib.mkIf cfg.enable { 44 systemd.services.aocbot = { 45 wantedBy = [ "multi-user.target" ]; 46 wants = [ "network-online.target" ]; 47 after = [ "network-online.target" ]; 48 49 serviceConfig = { 50 User = "aocbot"; 51 Group = "aocbot"; 52 StateDirectory = "aocbot"; 53 }; 54 55 environment = { 56 CONFIG_PATH = "${settings}"; 57 RUST_LOG = cfg.logLevel; 58 }; 59 60 script = '' 61 ${lib.getExe cfg.package} run 62 ''; 63 }; 64 65 users.users.aocbot = { 66 isSystemUser = true; 67 group = "aocbot"; 68 }; 69 users.groups.aocbot = { }; 70 71 services.aocbot.settings = { 72 users = lib.mkDefault self.users; 73 matrix.store_path = lib.mkDefault "/var/lib/aocbot/store"; 74 }; 75 76 environment.systemPackages = [ aocbot-setup ]; 77 }; 78 }