Loading nixos/modules/services/audio/slimserver.nix +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ in { serviceConfig = { User = "slimserver"; # Issue 40589: Disable broken image/video support (audio still works!) ExecStart = "${cfg.package}/slimserver.pl --logdir ${cfg.dataDir}/logs --prefsdir ${cfg.dataDir}/prefs --cachedir ${cfg.dataDir}/cache --noimage --novideo"; ExecStart = "${lib.getExe cfg.package} --logdir ${cfg.dataDir}/logs --prefsdir ${cfg.dataDir}/prefs --cachedir ${cfg.dataDir}/cache --noimage --novideo"; }; }; Loading nixos/tests/all-tests.nix +1 −0 Original line number Diff line number Diff line Loading @@ -750,6 +750,7 @@ in { signal-desktop = handleTest ./signal-desktop.nix {}; simple = handleTest ./simple.nix {}; sing-box = handleTest ./sing-box.nix {}; slimserver = handleTest ./slimserver.nix {}; slurm = handleTest ./slurm.nix {}; smokeping = handleTest ./smokeping.nix {}; snapcast = handleTest ./snapcast.nix {}; Loading nixos/tests/slimserver.nix 0 → 100644 +47 −0 Original line number Diff line number Diff line import ./make-test-python.nix ({ pkgs, ...} : { name = "slimserver"; meta.maintainers = with pkgs.lib.maintainers; [ adamcstephens ]; nodes.machine = { ... }: { services.slimserver.enable = true; services.squeezelite = { enable = true; extraArguments = "-s 127.0.0.1 -d slimproto=info"; }; sound.enable = true; boot.initrd.kernelModules = ["snd-dummy"]; }; testScript = '' import json rpc_get_player = { "id": 1, "method": "slim.request", "params":[0,["player", "id", "0", "?"]] } with subtest("slimserver is started"): machine.wait_for_unit("slimserver.service") # give slimserver a moment to report errors machine.sleep(2) with subtest('slimserver module errors are not reported'): machine.fail("journalctl -u slimserver.service | grep 'throw_exception'") machine.fail("journalctl -u slimserver.service | grep 'not installed'") machine.fail("journalctl -u slimserver.service | grep 'not found'") machine.fail("journalctl -u slimserver.service | grep 'The following CPAN modules were found but cannot work with Logitech Media Server'") machine.fail("journalctl -u slimserver.service | grep 'please use the buildme.sh'") with subtest('slimserver is ready'): machine.wait_for_open_port(9000) machine.wait_until_succeeds("journalctl -u slimserver.service | grep 'Completed dbOptimize Scan'") with subtest("squeezelite player successfully connects to slimserver"): machine.wait_for_unit("squeezelite.service") machine.wait_until_succeeds("journalctl -u squeezelite.service | grep 'slimproto:937 connected'") player_mac = machine.wait_until_succeeds("journalctl -eu squeezelite.service | grep 'sendHELO:148 mac:'").strip().split(" ")[-1] player_id = machine.succeed(f"curl http://localhost:9000/jsonrpc.js -g -X POST -d '{json.dumps(rpc_get_player)}'") assert player_mac == json.loads(player_id)["result"]["_id"], "squeezelite player not found" ''; }) pkgs/applications/audio/squeezelite/default.nix +5 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ , openssl , portaudioSupport ? stdenv.isDarwin , portaudio , slimserver , AudioToolbox , AudioUnit , Carbon Loading Loading @@ -95,7 +96,10 @@ stdenv.mkDerivation { runHook postInstall ''; passthru.updateScript = ./update.sh; passthru = { inherit (slimserver) tests; updateScript = ./update.sh; }; meta = with lib; { description = "Lightweight headless squeezebox client emulator"; Loading pkgs/servers/slimserver/default.nix +107 −5 Original line number Diff line number Diff line Loading @@ -5,13 +5,18 @@ , lib , makeWrapper , monkeysAudio , perlPackages , nixosTests , perl538Packages , sox , stdenv , wavpack , zlib , enableUnfreeFirmware ? false }: let perlPackages = perl538Packages; in perlPackages.buildPerlPackage rec { pname = "slimserver"; version = "8.3.1"; Loading @@ -25,10 +30,99 @@ perlPackages.buildPerlPackage rec { nativeBuildInputs = [ makeWrapper ]; buildInputs = [ perlPackages.CryptOpenSSLRSA perlPackages.IOSocketSSL ]; buildInputs = with perlPackages; [ AnyEvent ArchiveZip AsyncUtil AudioScan CarpClan CGI ClassAccessor ClassAccessorChained ClassC3 # ClassC3Componentised # Error: DBIx::Class::Row::throw_exception(): DBIx::Class::Relationship::BelongsTo::belongs_to(): Can't infer join condition for track ClassDataInheritable ClassInspector ClassISA ClassMember ClassSingleton ClassVirtual ClassXSAccessor CompressRawZlib CryptOpenSSLRSA DataDump DataPage DataURIEncode DBDSQLite DBI # DBIxClass # https://github.com/Logitech/slimserver/issues/138 DigestSHA1 EncodeDetect EV ExporterLite FileBOM FileCopyRecursive FileNext FileReadBackwards FileSlurp FileWhich HTMLParser HTTPCookies HTTPDaemon HTTPMessage ImageScale IOAIO IOInterface IOSocketSSL IOString JSONXS JSONXSVersionOneAndTwo # LogLog4perl # Internal error: Root Logger not initialized. LWP LWPProtocolHttps MP3CutGapless NetHTTP NetHTTPSNB PathClass ProcBackground # SQLAbstract # DBI Exception: DBD::SQLite::db prepare_cached failed: no such function: ARRAY SQLAbstractLimit SubName TemplateToolkit TextUnidecode TieCacheLRU TieCacheLRUExpires TieRegexpHash TimeDate URI URIFind UUIDTiny XMLParser XMLSimple YAMLLibYAML ] # ++ (lib.optional stdenv.isDarwin perlPackages.MacFSEvents) ++ (lib.optional stdenv.isLinux perlPackages.LinuxInotify2); prePatch = '' # remove vendored binaries rm -rf Bin # remove most vendored modules, keeping necessary ones mkdir -p CPAN_used/Class/C3/ CPAN_used/SQL rm -r CPAN/SQL/Abstract/Limit.pm cp -rv CPAN/Class/C3/Componentised.pm CPAN_used/Class/C3/ cp -rv CPAN/DBIx CPAN_used/ cp -rv CPAN/Log CPAN_used/ cp -rv CPAN/SQL/* CPAN_used/SQL/ rm -r CPAN mv CPAN_used CPAN ${lib.optionalString (!enableUnfreeFirmware) '' # remove unfree firmware rm -rf Firmware ''} touch Makefile.PL ''; Loading @@ -38,18 +132,26 @@ perlPackages.buildPerlPackage rec { cp -r . $out wrapProgram $out/slimserver.pl \ --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ zlib stdenv.cc.cc.lib ]}" \ --prefix PATH : "${lib.makeBinPath [ lame flac faad2 sox monkeysAudio wavpack ]}" --prefix PATH : "${lib.makeBinPath ([ lame flac faad2 sox wavpack ] ++ (lib.optional stdenv.isLinux monkeysAudio))}" mkdir $out/bin ln -s $out/slimserver.pl $out/bin/slimserver ''; outputs = [ "out" ]; passthru.tests = { inherit (nixosTests) slimserver; }; meta = with lib; { homepage = "https://github.com/Logitech/slimserver"; description = "Server for Logitech Squeezebox players. This server is also called Logitech Media Server"; # the firmware is not under a free license! # the firmware is not under a free license, but not included in the default package # https://github.com/Logitech/slimserver/blob/public/8.3/License.txt license = licenses.unfree; license = if enableUnfreeFirmware then licenses.unfree else licenses.gpl2Only; mainProgram = "slimserver"; maintainers = with maintainers; [ adamcstephens jecaro ]; platforms = platforms.unix; broken = stdenv.isDarwin; }; } Loading
nixos/modules/services/audio/slimserver.nix +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ in { serviceConfig = { User = "slimserver"; # Issue 40589: Disable broken image/video support (audio still works!) ExecStart = "${cfg.package}/slimserver.pl --logdir ${cfg.dataDir}/logs --prefsdir ${cfg.dataDir}/prefs --cachedir ${cfg.dataDir}/cache --noimage --novideo"; ExecStart = "${lib.getExe cfg.package} --logdir ${cfg.dataDir}/logs --prefsdir ${cfg.dataDir}/prefs --cachedir ${cfg.dataDir}/cache --noimage --novideo"; }; }; Loading
nixos/tests/all-tests.nix +1 −0 Original line number Diff line number Diff line Loading @@ -750,6 +750,7 @@ in { signal-desktop = handleTest ./signal-desktop.nix {}; simple = handleTest ./simple.nix {}; sing-box = handleTest ./sing-box.nix {}; slimserver = handleTest ./slimserver.nix {}; slurm = handleTest ./slurm.nix {}; smokeping = handleTest ./smokeping.nix {}; snapcast = handleTest ./snapcast.nix {}; Loading
nixos/tests/slimserver.nix 0 → 100644 +47 −0 Original line number Diff line number Diff line import ./make-test-python.nix ({ pkgs, ...} : { name = "slimserver"; meta.maintainers = with pkgs.lib.maintainers; [ adamcstephens ]; nodes.machine = { ... }: { services.slimserver.enable = true; services.squeezelite = { enable = true; extraArguments = "-s 127.0.0.1 -d slimproto=info"; }; sound.enable = true; boot.initrd.kernelModules = ["snd-dummy"]; }; testScript = '' import json rpc_get_player = { "id": 1, "method": "slim.request", "params":[0,["player", "id", "0", "?"]] } with subtest("slimserver is started"): machine.wait_for_unit("slimserver.service") # give slimserver a moment to report errors machine.sleep(2) with subtest('slimserver module errors are not reported'): machine.fail("journalctl -u slimserver.service | grep 'throw_exception'") machine.fail("journalctl -u slimserver.service | grep 'not installed'") machine.fail("journalctl -u slimserver.service | grep 'not found'") machine.fail("journalctl -u slimserver.service | grep 'The following CPAN modules were found but cannot work with Logitech Media Server'") machine.fail("journalctl -u slimserver.service | grep 'please use the buildme.sh'") with subtest('slimserver is ready'): machine.wait_for_open_port(9000) machine.wait_until_succeeds("journalctl -u slimserver.service | grep 'Completed dbOptimize Scan'") with subtest("squeezelite player successfully connects to slimserver"): machine.wait_for_unit("squeezelite.service") machine.wait_until_succeeds("journalctl -u squeezelite.service | grep 'slimproto:937 connected'") player_mac = machine.wait_until_succeeds("journalctl -eu squeezelite.service | grep 'sendHELO:148 mac:'").strip().split(" ")[-1] player_id = machine.succeed(f"curl http://localhost:9000/jsonrpc.js -g -X POST -d '{json.dumps(rpc_get_player)}'") assert player_mac == json.loads(player_id)["result"]["_id"], "squeezelite player not found" ''; })
pkgs/applications/audio/squeezelite/default.nix +5 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ , openssl , portaudioSupport ? stdenv.isDarwin , portaudio , slimserver , AudioToolbox , AudioUnit , Carbon Loading Loading @@ -95,7 +96,10 @@ stdenv.mkDerivation { runHook postInstall ''; passthru.updateScript = ./update.sh; passthru = { inherit (slimserver) tests; updateScript = ./update.sh; }; meta = with lib; { description = "Lightweight headless squeezebox client emulator"; Loading
pkgs/servers/slimserver/default.nix +107 −5 Original line number Diff line number Diff line Loading @@ -5,13 +5,18 @@ , lib , makeWrapper , monkeysAudio , perlPackages , nixosTests , perl538Packages , sox , stdenv , wavpack , zlib , enableUnfreeFirmware ? false }: let perlPackages = perl538Packages; in perlPackages.buildPerlPackage rec { pname = "slimserver"; version = "8.3.1"; Loading @@ -25,10 +30,99 @@ perlPackages.buildPerlPackage rec { nativeBuildInputs = [ makeWrapper ]; buildInputs = [ perlPackages.CryptOpenSSLRSA perlPackages.IOSocketSSL ]; buildInputs = with perlPackages; [ AnyEvent ArchiveZip AsyncUtil AudioScan CarpClan CGI ClassAccessor ClassAccessorChained ClassC3 # ClassC3Componentised # Error: DBIx::Class::Row::throw_exception(): DBIx::Class::Relationship::BelongsTo::belongs_to(): Can't infer join condition for track ClassDataInheritable ClassInspector ClassISA ClassMember ClassSingleton ClassVirtual ClassXSAccessor CompressRawZlib CryptOpenSSLRSA DataDump DataPage DataURIEncode DBDSQLite DBI # DBIxClass # https://github.com/Logitech/slimserver/issues/138 DigestSHA1 EncodeDetect EV ExporterLite FileBOM FileCopyRecursive FileNext FileReadBackwards FileSlurp FileWhich HTMLParser HTTPCookies HTTPDaemon HTTPMessage ImageScale IOAIO IOInterface IOSocketSSL IOString JSONXS JSONXSVersionOneAndTwo # LogLog4perl # Internal error: Root Logger not initialized. LWP LWPProtocolHttps MP3CutGapless NetHTTP NetHTTPSNB PathClass ProcBackground # SQLAbstract # DBI Exception: DBD::SQLite::db prepare_cached failed: no such function: ARRAY SQLAbstractLimit SubName TemplateToolkit TextUnidecode TieCacheLRU TieCacheLRUExpires TieRegexpHash TimeDate URI URIFind UUIDTiny XMLParser XMLSimple YAMLLibYAML ] # ++ (lib.optional stdenv.isDarwin perlPackages.MacFSEvents) ++ (lib.optional stdenv.isLinux perlPackages.LinuxInotify2); prePatch = '' # remove vendored binaries rm -rf Bin # remove most vendored modules, keeping necessary ones mkdir -p CPAN_used/Class/C3/ CPAN_used/SQL rm -r CPAN/SQL/Abstract/Limit.pm cp -rv CPAN/Class/C3/Componentised.pm CPAN_used/Class/C3/ cp -rv CPAN/DBIx CPAN_used/ cp -rv CPAN/Log CPAN_used/ cp -rv CPAN/SQL/* CPAN_used/SQL/ rm -r CPAN mv CPAN_used CPAN ${lib.optionalString (!enableUnfreeFirmware) '' # remove unfree firmware rm -rf Firmware ''} touch Makefile.PL ''; Loading @@ -38,18 +132,26 @@ perlPackages.buildPerlPackage rec { cp -r . $out wrapProgram $out/slimserver.pl \ --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ zlib stdenv.cc.cc.lib ]}" \ --prefix PATH : "${lib.makeBinPath [ lame flac faad2 sox monkeysAudio wavpack ]}" --prefix PATH : "${lib.makeBinPath ([ lame flac faad2 sox wavpack ] ++ (lib.optional stdenv.isLinux monkeysAudio))}" mkdir $out/bin ln -s $out/slimserver.pl $out/bin/slimserver ''; outputs = [ "out" ]; passthru.tests = { inherit (nixosTests) slimserver; }; meta = with lib; { homepage = "https://github.com/Logitech/slimserver"; description = "Server for Logitech Squeezebox players. This server is also called Logitech Media Server"; # the firmware is not under a free license! # the firmware is not under a free license, but not included in the default package # https://github.com/Logitech/slimserver/blob/public/8.3/License.txt license = licenses.unfree; license = if enableUnfreeFirmware then licenses.unfree else licenses.gpl2Only; mainProgram = "slimserver"; maintainers = with maintainers; [ adamcstephens jecaro ]; platforms = platforms.unix; broken = stdenv.isDarwin; }; }