summary refs log tree commit diff
path: root/nixos/modules/services/audio/mpd.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/services/audio/mpd.nix')
-rw-r--r--nixos/modules/services/audio/mpd.nix89
1 files changed, 65 insertions, 24 deletions
diff --git a/nixos/modules/services/audio/mpd.nix b/nixos/modules/services/audio/mpd.nix
index 53542e34b14..d9b5bf7b5e6 100644
--- a/nixos/modules/services/audio/mpd.nix
+++ b/nixos/modules/services/audio/mpd.nix
@@ -15,53 +15,87 @@ let
     state_file          "${cfg.dataDir}/state"
     sticker_file        "${cfg.dataDir}/sticker.sql"
     log_file            "syslog"
-    user                "mpd"
+    user                "${cfg.user}"
+    group               "${cfg.group}"
+
+    ${optionalString (cfg.network.host != "any") ''bind_to_address "${cfg.network.host}"''}
+    ${optionalString (cfg.network.port != 6600)  ''port "${toString cfg.network.port}"''}
+
     ${cfg.extraConfig}
-  ''; 
+  '';
 
 in {
 
   ###### interface
 
-  options = { 
+  options = {
 
-    services.mpd = { 
+    services.mpd = {
 
       enable = mkOption {
         default = false;
         description = ''
           Whether to enable MPD, the music player daemon.
-        ''; 
-      };  
+        '';
+      };
 
       musicDirectory = mkOption {
         default = "${cfg.dataDir}/music";
         description = ''
-          Extra configuration added to the end of MPD's
-          configuration file, mpd.conf.
-        ''; 
-      };  
+          The directory where mpd reads music from.
+        '';
+      };
 
       extraConfig = mkOption {
-        default = ""; 
+        default = "";
         description = ''
           Extra directives added to to the end of MPD's configuration file,
           mpd.conf. Basic configuration like file location and uid/gid
           is added automatically to the beginning of the file.
-        ''; 
-      };  
+        '';
+      };
 
       dataDir = mkOption {
         default = "/var/lib/mpd";
         description = ''
           The directory where MPD stores its state, tag cache,
           playlists etc.
-        ''; 
-      };  
-
-    };  
+        '';
+      };
+
+      user = mkOption {
+        default = "mpd";
+        description = "User account under which MPD runs.";
+      };
+
+      group = mkOption {
+        default = "mpd";
+        description = "Group account under which MPD runs.";
+      };
+
+      network = {
+
+        host = mkOption {
+          default = "any";
+          description = ''
+            This setting sets the address for the daemon to listen on. Careful attention
+            should be paid if this is assigned to anything other then the default, any.
+            This setting can deny access to control of the daemon.
+          '';
+        };
+
+        port = mkOption {
+          default = 6600;
+          description = ''
+            This setting is the TCP port that is desired for the daemon to get assigned
+            to.
+          '';
+        };
+
+      };
+    };
 
-  };  
+  };
 
 
   ###### implementation
@@ -73,20 +107,27 @@ in {
       description = "Music Player Daemon";
       wantedBy = [ "multi-user.target" ];
       path = [ pkgs.mpd ];
-      preStart = "mkdir -p ${cfg.dataDir} && chown -R mpd:mpd  ${cfg.dataDir}";
+      preStart = "mkdir -p ${cfg.dataDir} && chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir}";
       script = "exec mpd --no-daemon ${mpdConf}";
+      serviceConfig = {
+        User = "mpd";
+        PermissionsStartOnly = true;
+      };
     };
 
-    users.extraUsers.mpd = {
+    users.extraUsers = optionalAttrs (cfg.user == "mpd") (singleton {
       inherit uid;
-      group = "mpd";
+      name = "mpd";
+      group = cfg.group;
       extraGroups = [ "audio" ];
       description = "Music Player Daemon user";
       home = "${cfg.dataDir}";
-    };
-
-    users.extraGroups.mpd.gid = gid;
+    });
 
+    users.extraGroups = optionalAttrs (cfg.group == "mpd") (singleton {
+      name = "mpd";
+      gid = gid;
+    });
   };
 
 }