Unverified Commit 4b8d7d81 authored by Adam C. Stephens's avatar Adam C. Stephens Committed by GitHub
Browse files

Merge pull request #265556 from adamcstephens/slimserver/fix

slimserver: fix broken package
parents 82ab4ebb ecbaf12b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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";
      };
    };

+1 −0
Original line number Diff line number Diff line
@@ -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 {};
+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"
    '';
})
+5 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
, openssl
, portaudioSupport ? stdenv.isDarwin
, portaudio
, slimserver
, AudioToolbox
, AudioUnit
, Carbon
@@ -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";
+107 −5
Original line number Diff line number Diff line
@@ -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";
@@ -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
  '';

@@ -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