grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / headphones.nix
blobb56322b0cbccf2bd0bba378ace7603ea929c5468
1 { config, lib, options, pkgs, ... }:
2 let
4   name = "headphones";
6   cfg = config.services.headphones;
7   opt = options.services.headphones;
9 in
13   ###### interface
15   options = {
16     services.headphones = {
17       enable = lib.mkOption {
18         type = lib.types.bool;
19         default = false;
20         description = "Whether to enable the headphones server.";
21       };
22       dataDir = lib.mkOption {
23         type = lib.types.path;
24         default = "/var/lib/${name}";
25         description = "Path where to store data files.";
26       };
27       configFile = lib.mkOption {
28         type = lib.types.path;
29         default = "${cfg.dataDir}/config.ini";
30         defaultText = lib.literalExpression ''"''${config.${opt.dataDir}}/config.ini"'';
31         description = "Path to config file.";
32       };
33       host = lib.mkOption {
34         type = lib.types.str;
35         default = "localhost";
36         description = "Host to listen on.";
37       };
38       port = lib.mkOption {
39         type = lib.types.ints.u16;
40         default = 8181;
41         description = "Port to bind to.";
42       };
43       user = lib.mkOption {
44         type = lib.types.str;
45         default = name;
46         description = "User to run the service as";
47       };
48       group = lib.mkOption {
49         type = lib.types.str;
50         default = name;
51         description = "Group to run the service as";
52       };
53     };
54   };
57   ###### implementation
59   config = lib.mkIf cfg.enable {
61     users.users = lib.optionalAttrs (cfg.user == name) {
62       ${name} = {
63         uid = config.ids.uids.headphones;
64         group = cfg.group;
65         description = "headphones user";
66         home = cfg.dataDir;
67         createHome = true;
68       };
69     };
71     users.groups = lib.optionalAttrs (cfg.group == name) {
72       ${name}.gid = config.ids.gids.headphones;
73     };
75     systemd.services.headphones = {
76         description = "Headphones Server";
77         wantedBy    = [ "multi-user.target" ];
78         after = [ "network.target" ];
79         serviceConfig = {
80           User = cfg.user;
81           Group = cfg.group;
82           ExecStart = "${pkgs.headphones}/bin/headphones --datadir ${cfg.dataDir} --config ${cfg.configFile} --host ${cfg.host} --port ${toString cfg.port}";
83         };
84     };
85   };