Unverified Commit 3884721b authored by Felix Bühler's avatar Felix Bühler Committed by GitHub
Browse files

nixos/services.mpd: remove `with lib;` (#339100)

parents c8547dd6 674e5ad6
Loading
Loading
Loading
Loading
+53 −56
Original line number Diff line number Diff line
{ config, lib, pkgs, ... }:

with lib;

let

  name = "mpd";
@@ -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
@@ -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}
  '';
@@ -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
@@ -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
@@ -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,
@@ -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,
@@ -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
@@ -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 = ''
@@ -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
@@ -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}".
              '';
            };
          };
@@ -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.
@@ -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));

@@ -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;
@@ -258,7 +255,7 @@ in {
      };
    };

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