vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / web-apps / honk.nix
blobe6a446192122473c90ccaa94bc99664732d44be4
1 { config
2 , lib
3 , pkgs
4 , ...
5 }:
6 let
7   cfg = config.services.honk;
9   honk-initdb-script = cfg: pkgs.writeShellApplication {
10     name = "honk-initdb-script";
12     runtimeInputs = with pkgs; [ coreutils ];
14     text = ''
15       PW=$(cat "$CREDENTIALS_DIRECTORY/honk_passwordFile")
17       echo -e "${cfg.username}\n''$PW\n${cfg.host}:${toString cfg.port}\n${cfg.servername}" | ${lib.getExe cfg.package} -datadir "$STATE_DIRECTORY" init
18     '';
19   };
22   options = {
23     services.honk = {
24       enable = lib.mkEnableOption "the Honk server";
25       package = lib.mkPackageOption pkgs "honk" { };
27       host = lib.mkOption {
28         default = "127.0.0.1";
29         description = ''
30           The host name or IP address the server should listen to.
31         '';
32         type = lib.types.str;
33       };
35       port = lib.mkOption {
36         default = 8080;
37         description = ''
38           The port the server should listen to.
39         '';
40         type = lib.types.port;
41       };
43       username = lib.mkOption {
44         description = ''
45           The admin account username.
46         '';
47         type = lib.types.str;
48       };
50       passwordFile = lib.mkOption {
51         description = ''
52           Password for admin account.
53           NOTE: Should be string not a store path, to prevent the password from being world readable
54         '';
55         type = lib.types.path;
56       };
58       servername = lib.mkOption {
59         description = ''
60           The server name.
61         '';
62         type = lib.types.str;
63       };
65       extraJS = lib.mkOption {
66         default = null;
67         description = ''
68           An extra JavaScript file to be loaded by the client.
69         '';
70         type = lib.types.nullOr lib.types.path;
71       };
73       extraCSS = lib.mkOption {
74         default = null;
75         description = ''
76           An extra CSS file to be loaded by the client.
77         '';
78         type = lib.types.nullOr lib.types.path;
79       };
80     };
81   };
83   config = lib.mkIf cfg.enable {
84     assertions = [
85       {
86         assertion = cfg.username or "" != "";
87         message = ''
88           You have to define a username for Honk (`services.honk.username`).
89         '';
90       }
91       {
92         assertion = cfg.servername or "" != "";
93         message = ''
94           You have to define a servername for Honk (`services.honk.servername`).
95         '';
96       }
97     ];
99     systemd.services.honk-initdb = {
100       description = "Honk server database setup";
101       requiredBy = [ "honk.service" ];
102       before = [ "honk.service" ];
104       serviceConfig = {
105         LoadCredential = [
106           "honk_passwordFile:${cfg.passwordFile}"
107         ];
108         Type = "oneshot";
109         StateDirectory = "honk";
110         DynamicUser = true;
111         RemainAfterExit = true;
112         ExecStart = lib.getExe (honk-initdb-script cfg);
113         PrivateTmp = true;
114       };
116       unitConfig = {
117         ConditionPathExists = [
118           # Skip this service if the database already exists
119           "!%S/honk/honk.db"
120         ];
121       };
122     };
124     systemd.services.honk = {
125       description = "Honk server";
126       wantedBy = [ "multi-user.target" ];
127       after = [ "network.target" ];
128       bindsTo = [ "honk-initdb.service" ];
129       preStart = ''
130         mkdir -p $STATE_DIRECTORY/views
131         ${lib.optionalString (cfg.extraJS != null) "ln -fs ${cfg.extraJS} $STATE_DIRECTORY/views/local.js"}
132         ${lib.optionalString (cfg.extraCSS != null) "ln -fs ${cfg.extraCSS} $STATE_DIRECTORY/views/local.css"}
133         ${lib.getExe cfg.package} -datadir $STATE_DIRECTORY -viewdir ${cfg.package}/share/honk backup $STATE_DIRECTORY/backup
134         ${lib.getExe cfg.package} -datadir $STATE_DIRECTORY -viewdir ${cfg.package}/share/honk upgrade
135         ${lib.getExe cfg.package} -datadir $STATE_DIRECTORY -viewdir ${cfg.package}/share/honk cleanup
136       '';
137       serviceConfig = {
138         ExecStart = ''
139           ${lib.getExe cfg.package} -datadir $STATE_DIRECTORY -viewdir ${cfg.package}/share/honk
140         '';
141         StateDirectory = "honk";
142         DynamicUser = true;
143         PrivateTmp = "yes";
144         Restart = "on-failure";
145       };
146     };
147   };
149   meta = {
150     maintainers = with lib.maintainers; [ drupol ];
151     doc = ./honk.md;
152   };