diff --git a/README.md b/README.md new file mode 100644 index 0000000..64e9b7e --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Leitstelle config management + +To deploy, run `./deploy.sh switch `, where the host is nuc or bemmer. diff --git a/common/default.nix b/common/default.nix index f8638ea..73f681d 100644 --- a/common/default.nix +++ b/common/default.nix @@ -38,6 +38,7 @@ vim wget jq + lsof ]; programs.bash.shellAliases = { diff --git a/deploy.sh b/deploy.sh index 065eb2b..46240ad 100755 --- a/deploy.sh +++ b/deploy.sh @@ -6,7 +6,7 @@ cd "$(dirname "$0")" if ! command -v nix-build &> /dev/null then echo "Nix installation could not be found. Please follow the instructions linked below." - echo "https://nixos.org/manual/nix/unstable/installation/installing-binary.html#multi-user-installation" + echo "https://nixos.org/manual/nix/unstable/installation/installing-binary.html" exit fi @@ -24,13 +24,12 @@ fi echo "deploying $host to $target" sleep 1 -tmp=$(mktemp -d) -trap 'rm -rf "$tmp"' EXIT -sources="$tmp/sources" -cp -r $(nix-build nix/sources-dir.nix --no-out-link) $tmp/sources - set -x -system_drv=$(nix-instantiate "" -A config.system.build.toplevel -I $sources -I "nixos-config=$PWD/hosts/$host/configuration.nix") +system_drv=$( + nix-instantiate "" -A config.system.build.toplevel \ + -I "$(nix-build nix/sources-dir.nix --no-out-link)" \ + -I "nixos-config=$PWD/hosts/$host/configuration.nix" +) nix-copy-closure --to $target $system_drv system=$(ssh $target "nix-store --realise $system_drv") ssh $target "sudo nix-env -p /nix/var/nix/profiles/system -i $system && sudo /nix/var/nix/profiles/system/bin/switch-to-configuration $mode" diff --git a/modules/spotifyd.nix b/modules/spotifyd.nix new file mode 100644 index 0000000..2e72596 --- /dev/null +++ b/modules/spotifyd.nix @@ -0,0 +1,68 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.spotifyd; + toml = pkgs.formats.toml {}; + warnConfig = + if cfg.config != "" + then lib.trace "Using the stringly typed .config attribute is discouraged. Use the TOML typed .settings attribute instead." + else id; + spotifydConf = + if cfg.settings != {} + then toml.generate "spotify.conf" cfg.settings + else warnConfig (pkgs.writeText "spotifyd.conf" cfg.config); +in +{ + options = { + services.spotifyd = { + enable = mkEnableOption "spotifyd, a Spotify playing daemon"; + + config = mkOption { + default = ""; + type = types.lines; + description = '' + (Deprecated) Configuration for Spotifyd. For syntax and directives, see + . + ''; + }; + + settings = mkOption { + default = {}; + type = toml.type; + example = { global.bitrate = 320; }; + description = '' + Configuration for Spotifyd. For syntax and directives, see + . + ''; + }; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + { + assertion = cfg.config == "" || cfg.settings == {}; + message = "At most one of the .config attribute and the .settings attribute may be set"; + } + ]; + + systemd.services.spotifyd = { + wantedBy = [ "multi-user.target" ]; + after = [ "network-online.target" "sound.target" ]; + description = "spotifyd, a Spotify playing daemon"; + environment.SHELL = "/bin/sh"; + serviceConfig = { + ExecStart = "${pkgs.spotifyd}/bin/spotifyd --no-daemon --config-path ${spotifydConf}"; + Restart = "always"; + RestartSec = 12; + DynamicUser = true; + CacheDirectory = "spotifyd"; + SupplementaryGroups = ["audio"]; + }; + }; + }; + + meta.maintainers = [ maintainers.anderslundstedt ]; +} \ No newline at end of file diff --git a/nix/sources-dir.nix b/nix/sources-dir.nix index 223fc00..e5fa9bf 100644 --- a/nix/sources-dir.nix +++ b/nix/sources-dir.nix @@ -9,6 +9,6 @@ in lib.concatStringsSep "\n" ([ "mkdir $out" ] - ++ lib.mapAttrsToList (name: source: "ln -s ${source.outPath} $out/${name}") sources + ++ lib.mapAttrsToList (name: source: "cp -r --reflink=auto ${source.outPath} $out/${name}") sources ) ) diff --git a/nix/sources.json b/nix/sources.json index f739c0f..2b7fc09 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -5,10 +5,10 @@ "homepage": "https://github.com/nmattia/niv", "owner": "nmattia", "repo": "niv", - "rev": "e0ca65c81a2d7a4d82a189f1e23a48d59ad42070", - "sha256": "1pq9nh1d8nn3xvbdny8fafzw87mj7gsmp6pxkdl65w2g18rmcmzx", + "rev": "5830a4dd348d77e39a0f3c4c762ff2663b602d4c", + "sha256": "1d3lsrqvci4qz2hwjrcnd8h5vfkg8aypq3sjd4g3izbc8frwz5sm", "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/e0ca65c81a2d7a4d82a189f1e23a48d59ad42070.tar.gz", + "url": "https://github.com/nmattia/niv/archive/5830a4dd348d77e39a0f3c4c762ff2663b602d4c.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "nixos-hardware": { @@ -17,10 +17,10 @@ "homepage": "", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "3aabf78bfcae62f5f99474f2ebbbe418f1c6e54f", - "sha256": "10g240brgjz7qi20adwajxwqrqb5zxc79ii1mc20fasgqlf2a8sx", + "rev": "2a7063461c3751d83869a2a0a8ebc59e34bec5b2", + "sha256": "173ms858wni43l2p7vqjarm2bnjdhpii0zgn46750nyfff1f2184", "type": "tarball", - "url": "https://github.com/NixOS/nixos-hardware/archive/3aabf78bfcae62f5f99474f2ebbbe418f1c6e54f.tar.gz", + "url": "https://github.com/NixOS/nixos-hardware/archive/2a7063461c3751d83869a2a0a8ebc59e34bec5b2.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "nixpkgs": { @@ -29,10 +29,10 @@ "homepage": "", "owner": "NixOS", "repo": "nixpkgs", - "rev": "34ad3ffe08adfca17fcb4e4a47bb5f3b113687be", - "sha256": "02li241rz5668nfyp88zfjilxf0mr9yansa93fbl38hjwkhf3ix6", + "rev": "581d2d6c9cd5c289002203581d8aa0861963a933", + "sha256": "1qpmqj075pppa6ihmkacf491lhq7rpxlcm8cm6h18raardsr3irr", "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/34ad3ffe08adfca17fcb4e4a47bb5f3b113687be.tar.gz", + "url": "https://github.com/NixOS/nixpkgs/archive/581d2d6c9cd5c289002203581d8aa0861963a933.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/shared-services/spotifyd.nix b/shared-services/spotifyd.nix index 801c835..c3ce6c4 100644 --- a/shared-services/spotifyd.nix +++ b/shared-services/spotifyd.nix @@ -1,11 +1,36 @@ -{ config, ... }: +{ config, pkgs, ... }: { + disabledModules = [ "services/audio/spotifyd.nix" ]; + imports = [ ../modules/spotifyd.nix ]; + + services.spotifyd = { enable = true; - settings.zeroconf_port = 18572; + settings.global = { + bitrate = 320; + zeroconf_port = 18572; + }; }; - networking.firewall.allowedTCPPorts = [ 4070 config.services.spotifyd.settings.zeroconf_port ]; + networking.firewall.allowedTCPPorts = [ 4070 config.services.spotifyd.settings.global.zeroconf_port ]; networking.firewall.allowedUDPPorts = [ 5353 ]; + + systemd.services.restart-spotifyd = { + serviceConfig.Type = "oneshot"; + script = '' + ${pkgs.systemd}/bin/systemctl restart spotifyd.service + ${pkgs.systemd}/bin/systemctl restart pulseaudio.service + ''; + }; + + systemd.timers.restart-spotifyd = { + wantedBy = [ "timers.target" ]; + partOf = [ "restart-spotifyd.service" ]; + timerConfig = { + OnCalendar = "*-*-* 07:00:00"; + Persistent = "True"; + Unit = "restart-spotifyd.service"; + }; + }; }