Skip to content

Commit

Permalink
nixos/services.mpd: remove with lib;
Browse files Browse the repository at this point in the history
  • Loading branch information
Stunkymonkey committed Sep 10, 2024
1 parent 1f34eeb commit 674e5ad
Showing 1 changed file with 53 additions and 56 deletions.
109 changes: 53 additions & 56 deletions nixos/modules/services/audio/mpd.nix
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
{ config, lib, pkgs, ... }:

with lib;

let

name = "mpd";
Expand All @@ -12,11 +9,11 @@ let

credentialsPlaceholder = (creds:
let
placeholders = (imap0
(i: c: ''password "{{password-${toString i}}}@${concatStringsSep "," c.permissions}"'')
placeholders = (lib.imap0
(i: c: ''password "{{password-${toString i}}}@${lib.concatStringsSep "," c.permissions}"'')
creds);
in
concatStringsSep "\n" placeholders);
lib.concatStringsSep "\n" placeholders);

mpdConf = pkgs.writeText "mpd.conf" ''
# This file was automatically generated by NixOS. Edit mpd's configuration
Expand All @@ -31,16 +28,16 @@ let
state_file "${cfg.dataDir}/state"
sticker_file "${cfg.dataDir}/sticker.sql"
${optionalString (cfg.network.listenAddress != "any") ''bind_to_address "${cfg.network.listenAddress}"''}
${optionalString (cfg.network.port != 6600) ''port "${toString cfg.network.port}"''}
${optionalString (cfg.fluidsynth) ''
${lib.optionalString (cfg.network.listenAddress != "any") ''bind_to_address "${cfg.network.listenAddress}"''}
${lib.optionalString (cfg.network.port != 6600) ''port "${toString cfg.network.port}"''}
${lib.optionalString (cfg.fluidsynth) ''
decoder {
plugin "fluidsynth"
soundfont "${pkgs.soundfont-fluid}/share/soundfonts/FluidR3_GM2-2.sf2"
}
''}
${optionalString (cfg.credentials != []) (credentialsPlaceholder cfg.credentials)}
${lib.optionalString (cfg.credentials != []) (credentialsPlaceholder cfg.credentials)}
${cfg.extraConfig}
'';
Expand All @@ -53,16 +50,16 @@ in {

services.mpd = {

enable = mkOption {
type = types.bool;
enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to enable MPD, the music player daemon.
'';
};

startWhenNeeded = mkOption {
type = types.bool;
startWhenNeeded = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
If set, {command}`mpd` is socket-activated; that
Expand All @@ -71,10 +68,10 @@ in {
'';
};

musicDirectory = mkOption {
type = with types; either path (strMatching "(http|https|nfs|smb)://.+");
musicDirectory = lib.mkOption {
type = with lib.types; either path (strMatching "(http|https|nfs|smb)://.+");
default = "${cfg.dataDir}/music";
defaultText = literalExpression ''"''${dataDir}/music"'';
defaultText = lib.literalExpression ''"''${dataDir}/music"'';
description = ''
The directory or NFS/SMB network share where MPD reads music from. If left
as the default value this directory will automatically be created before
Expand All @@ -83,10 +80,10 @@ in {
'';
};

playlistDirectory = mkOption {
type = types.path;
playlistDirectory = lib.mkOption {
type = lib.types.path;
default = "${cfg.dataDir}/playlists";
defaultText = literalExpression ''"''${dataDir}/playlists"'';
defaultText = lib.literalExpression ''"''${dataDir}/playlists"'';
description = ''
The directory where MPD stores playlists. If left as the default value
this directory will automatically be created before the MPD server starts,
Expand All @@ -95,8 +92,8 @@ in {
'';
};

extraConfig = mkOption {
type = types.lines;
extraConfig = lib.mkOption {
type = lib.types.lines;
default = "";
description = ''
Extra directives added to to the end of MPD's configuration file,
Expand All @@ -106,8 +103,8 @@ in {
'';
};

dataDir = mkOption {
type = types.path;
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/${name}";
description = ''
The directory where MPD stores its state, tag cache, playlists etc. If
Expand All @@ -117,22 +114,22 @@ in {
'';
};

user = mkOption {
type = types.str;
user = lib.mkOption {
type = lib.types.str;
default = name;
description = "User account under which MPD runs.";
};

group = mkOption {
type = types.str;
group = lib.mkOption {
type = lib.types.str;
default = name;
description = "Group account under which MPD runs.";
};

network = {

listenAddress = mkOption {
type = types.str;
listenAddress = lib.mkOption {
type = lib.types.str;
default = "127.0.0.1";
example = "any";
description = ''
Expand All @@ -141,8 +138,8 @@ in {
'';
};

port = mkOption {
type = types.port;
port = lib.mkOption {
type = lib.types.port;
default = 6600;
description = ''
This setting is the TCP port that is desired for the daemon to get assigned
Expand All @@ -152,33 +149,33 @@ in {

};

dbFile = mkOption {
type = types.nullOr types.str;
dbFile = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = "${cfg.dataDir}/tag_cache";
defaultText = literalExpression ''"''${dataDir}/tag_cache"'';
defaultText = lib.literalExpression ''"''${dataDir}/tag_cache"'';
description = ''
The path to MPD's database. If set to `null` the
parameter is omitted from the configuration.
'';
};

credentials = mkOption {
type = types.listOf (types.submodule {
credentials = lib.mkOption {
type = lib.types.listOf (lib.types.submodule {
options = {
passwordFile = mkOption {
type = types.path;
passwordFile = lib.mkOption {
type = lib.types.path;
description = ''
Path to file containing the password.
'';
};
permissions = let
perms = ["read" "add" "control" "admin"];
in mkOption {
type = types.listOf (types.enum perms);
in lib.mkOption {
type = lib.types.listOf (lib.types.enum perms);
default = [ "read" ];
description = ''
List of permissions that are granted with this password.
Permissions can be "${concatStringsSep "\", \"" perms}".
Permissions can be "${lib.concatStringsSep "\", \"" perms}".
'';
};
};
Expand All @@ -193,8 +190,8 @@ in {
];
};

fluidsynth = mkOption {
type = types.bool;
fluidsynth = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
If set, add fluidsynth soundfont and configure the plugin.
Expand All @@ -207,31 +204,31 @@ in {

###### implementation

config = mkIf cfg.enable {
config = lib.mkIf cfg.enable {

# install mpd units
systemd.packages = [ pkgs.mpd ];

systemd.sockets.mpd = mkIf cfg.startWhenNeeded {
systemd.sockets.mpd = lib.mkIf cfg.startWhenNeeded {
wantedBy = [ "sockets.target" ];
listenStreams = [
"" # Note: this is needed to override the upstream unit
(if pkgs.lib.hasPrefix "/" cfg.network.listenAddress
then cfg.network.listenAddress
else "${optionalString (cfg.network.listenAddress != "any") "${cfg.network.listenAddress}:"}${toString cfg.network.port}")
else "${lib.optionalString (cfg.network.listenAddress != "any") "${cfg.network.listenAddress}:"}${toString cfg.network.port}")
];
};

systemd.services.mpd = {
wantedBy = optional (!cfg.startWhenNeeded) "multi-user.target";
wantedBy = lib.optional (!cfg.startWhenNeeded) "multi-user.target";

preStart =
''
set -euo pipefail
install -m 600 ${mpdConf} /run/mpd/mpd.conf
'' + optionalString (cfg.credentials != [])
(concatStringsSep "\n"
(imap0
'' + lib.optionalString (cfg.credentials != [])
(lib.concatStringsSep "\n"
(lib.imap0
(i: c: ''${pkgs.replace-secret}/bin/replace-secret '{{password-${toString i}}}' '${c.passwordFile}' /run/mpd/mpd.conf'')
cfg.credentials));

Expand All @@ -242,13 +239,13 @@ in {
ExecStart = [ "" "${pkgs.mpd}/bin/mpd --systemd /run/mpd/mpd.conf" ];
RuntimeDirectory = "mpd";
StateDirectory = []
++ optionals (cfg.dataDir == "/var/lib/${name}") [ name ]
++ optionals (cfg.playlistDirectory == "/var/lib/${name}/playlists") [ name "${name}/playlists" ]
++ optionals (cfg.musicDirectory == "/var/lib/${name}/music") [ name "${name}/music" ];
++ lib.optionals (cfg.dataDir == "/var/lib/${name}") [ name ]
++ lib.optionals (cfg.playlistDirectory == "/var/lib/${name}/playlists") [ name "${name}/playlists" ]
++ lib.optionals (cfg.musicDirectory == "/var/lib/${name}/music") [ name "${name}/music" ];
};
};

users.users = optionalAttrs (cfg.user == name) {
users.users = lib.optionalAttrs (cfg.user == name) {
${name} = {
inherit uid;
group = cfg.group;
Expand All @@ -258,7 +255,7 @@ in {
};
};

users.groups = optionalAttrs (cfg.group == name) {
users.groups = lib.optionalAttrs (cfg.group == name) {
${name}.gid = gid;
};
};
Expand Down

0 comments on commit 674e5ad

Please sign in to comment.