about summary refs log tree commit diff
path: root/pkgs/by-name/rc
diff options
context:
space:
mode:
authorOPNA2608 <opna2608@protonmail.com>2024-03-28 09:46:37 +0100
committerOPNA2608 <opna2608@protonmail.com>2024-03-28 09:46:37 +0100
commita0cfe5691b3a05570675f8ff3a0cd8d7ce27947a (patch)
tree3ae38349f452be0802d7637fe30be78b9532d5ff /pkgs/by-name/rc
parenta1ed4e06b1eae24f0f5de87884e0bb2ffeb75f36 (diff)
rcu: init at 2024.001n
Diffstat (limited to 'pkgs/by-name/rc')
-rw-r--r--pkgs/by-name/rc/rcu/Port-to-paramiko-3.x.patch104
-rw-r--r--pkgs/by-name/rc/rcu/package.nix152
2 files changed, 256 insertions, 0 deletions
diff --git a/pkgs/by-name/rc/rcu/Port-to-paramiko-3.x.patch b/pkgs/by-name/rc/rcu/Port-to-paramiko-3.x.patch
new file mode 100644
index 0000000000000..760d23cea18d3
--- /dev/null
+++ b/pkgs/by-name/rc/rcu/Port-to-paramiko-3.x.patch
@@ -0,0 +1,104 @@
+From aad61b320d65953fddec10b019a186fc67f57a5d Mon Sep 17 00:00:00 2001
+From: OPNA2608 <opna2608@protonmail.com>
+Date: Sat, 10 Feb 2024 12:20:29 +0100
+Subject: [PATCH] src/model/transport.py: Port to paramiko 3.x
+
+---
+ src/model/transport.py | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+diff --git a/src/model/transport.py b/src/model/transport.py
+index 0c2ee16..5a2bd22 100644
+--- a/src/model/transport.py
++++ b/src/model/transport.py
+@@ -117,7 +117,6 @@ from paramiko.kex_gss import KexGSSGex, KexGSSGroup1, KexGSSGroup14
+ from paramiko.message import Message
+ from paramiko.packet import Packetizer, NeedRekeyException
+ from paramiko.primes import ModulusPack
+-from paramiko.py3compat import string_types, long, byte_ord, b, input, PY2
+ from paramiko.rsakey import RSAKey
+ from paramiko.ecdsakey import ECDSAKey
+ from paramiko.server import ServerInterface
+@@ -128,7 +127,7 @@ from paramiko.ssh_exception import (
+     ChannelException,
+     ProxyCommandFailure,
+ )
+-from paramiko.util import retry_on_signal, ClosingContextManager, clamp_value
++from paramiko.util import ClosingContextManager, clamp_value
+ 
+ 
+ # for thread cleanup
+@@ -396,7 +395,7 @@ class Transport(threading.Thread, ClosingContextManager):
+         self.active = False
+         self.hostname = None
+ 
+-        if isinstance(sock, string_types):
++        if isinstance(sock, str):
+             # convert "host:port" into (host, port)
+             hl = sock.split(":", 1)
+             self.hostname = hl[0]
+@@ -419,7 +418,7 @@ class Transport(threading.Thread, ClosingContextManager):
+                     sock = socket.socket(af, socket.SOCK_STREAM)
+                     sock.settimeout(1)
+                     try:
+-                        retry_on_signal(lambda: sock.connect((hostname, port)))
++                        sock.connect((hostname, port))
+                     except socket.error as e:
+                         reason = str(e)
+                     else:
+@@ -542,7 +541,7 @@ class Transport(threading.Thread, ClosingContextManager):
+         """
+         Returns a string representation of this object, for debugging.
+         """
+-        id_ = hex(long(id(self)) & xffffffff)
++        id_ = hex(int(id(self)) & xffffffff)
+         out = "<paramiko.Transport at {}".format(id_)
+         if not self.active:
+             out += " (unconnected)"
+@@ -1123,7 +1122,7 @@ class Transport(threading.Thread, ClosingContextManager):
+         m = Message()
+         m.add_byte(cMSG_IGNORE)
+         if byte_count is None:
+-            byte_count = (byte_ord(os.urandom(1)) % 32) + 10
++            byte_count = (os.urandom(1) % 32) + 10
+         m.add_bytes(os.urandom(byte_count))
+         self._send_user_message(m)
+ 
+@@ -1802,7 +1801,7 @@ class Transport(threading.Thread, ClosingContextManager):
+     def stop_thread(self):
+         self.active = False
+         self.packetizer.close()
+-        if PY2:
++        if False:
+             # Original join logic; #520 doesn't appear commonly present under
+             # Python 2.
+             while self.is_alive() and self is not threading.current_thread():
+@@ -1909,7 +1908,7 @@ class Transport(threading.Thread, ClosingContextManager):
+         m = Message()
+         m.add_mpint(self.K)
+         m.add_bytes(self.H)
+-        m.add_byte(b(id))
++        m.add_byte(id.encode("utf8"))
+         m.add_bytes(self.session_id)
+         # Fallback to SHA1 for kex engines that fail to specify a hex
+         # algorithm, or for e.g. transport tests that don't run kexinit.
+@@ -2037,14 +2036,14 @@ class Transport(threading.Thread, ClosingContextManager):
+ 
+         # active=True occurs before the thread is launched, to avoid a race
+         _active_threads.append(self)
+-        tid = hex(long(id(self)) & xffffffff)
++        tid = hex(int(id(self)) & xffffffff)
+         if self.server_mode:
+             self._log(DEBUG, "starting thread (server mode): {}".format(tid))
+         else:
+             self._log(DEBUG, "starting thread (client mode): {}".format(tid))
+         try:
+             try:
+-                self.packetizer.write_all(b(self.local_version + "\r\n"))
++                self.packetizer.write_all((self.local_version + "\r\n").encode("utf8"))
+                 self._log(
+                     DEBUG,
+                     "Local version/idstring: {}".format(self.local_version),
+-- 
+2.42.0
+
diff --git a/pkgs/by-name/rc/rcu/package.nix b/pkgs/by-name/rc/rcu/package.nix
new file mode 100644
index 0000000000000..915113f44d131
--- /dev/null
+++ b/pkgs/by-name/rc/rcu/package.nix
@@ -0,0 +1,152 @@
+{ stdenv
+, lib
+, requireFile
+, fetchpatch
+, runCommand
+, rcu
+, testers
+, copyDesktopItems
+, desktopToDarwinBundle
+, libsForQt5
+, makeDesktopItem
+, python3Packages
+, system-config-printer
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "rcu";
+  version = "2024.001n";
+
+  format = "other";
+
+  src = let
+    src-tarball = requireFile {
+      name = "rcu-d${version}-source.tar.gz";
+      sha256 = "1snmf2cr242k946q6fh5b5fqdyafdbs8gbbdzchjhm7n9r1kxyca";
+      url = "http://www.davisr.me/projects/rcu/";
+    };
+  in runCommand "${src-tarball.name}-unpacked" {} ''
+    gunzip -ck ${src-tarball} | tar -xvf-
+    mv rcu $out
+  '';
+
+  patches = [
+    ./Port-to-paramiko-3.x.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace src/main.py \
+      --replace-fail "ui_basepath = '.'" "ui_basepath = '$out/share/rcu'"
+
+    substituteInPlace package_support/gnulinux/50-remarkable.rules \
+      --replace-fail 'GROUP="yourgroup"' 'GROUP="users"'
+  '';
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    libsForQt5.wrapQtAppsHook
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    desktopToDarwinBundle
+  ];
+
+  buildInputs = [
+    libsForQt5.qtbase
+    libsForQt5.qtwayland
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    certifi
+    packaging
+    paramiko
+    pdfminer-six
+    pikepdf
+    pillow
+    protobuf
+    pyside2
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "rcu";
+      desktopName = "reMarkable Connection Utility";
+      comment = "All-in-one offline/local management software for reMarkable e-paper tablets";
+      icon = "rcu";
+      exec = "rcu";
+    })
+  ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  # No tests
+  doCheck = false;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{bin,share}
+    cp -r src $out/share/rcu
+
+  '' + lib.optionalString stdenv.hostPlatform.isLinux ''
+    install -Dm644 package_support/gnulinux/50-remarkable.rules $out/etc/udev/rules.d/50-remarkable.rules
+  '' + ''
+
+    # Keep source from being GC'd by linking into it
+
+    for icondir in $(find icons -type d -name '[0-9]*x[0-9]*'); do
+      iconsize=$(basename $icondir)
+      mkdir -p $out/share/icons/hicolor/$iconsize/apps
+      ln -s ${src}/icons/$iconsize/rcu-icon-$iconsize.png $out/share/icons/hicolor/$iconsize/apps/rcu.png
+    done
+
+    mkdir -p $out/share/icons/hicolor/scalable/apps
+    ln -s ${src}/icons/64x64/rcu-icon-64x64.svg $out/share/icons/hicolor/scalable/apps/rcu.svg
+
+    mkdir -p $out/share/doc/rcu
+    for docfile in {COPYING,manual.pdf}; do
+      ln -s ${src}/manual/$docfile $out/share/doc/rcu/$docfile
+    done
+
+    mkdir -p $out/share/licenses/rcu
+    ln -s ${src}/COPYING $out/share/licenses/rcu/COPYING
+
+    runHook postInstall
+  '';
+
+  # Manually creating wrapper, hook struggles with lack of shebang & symlink
+  dontWrapPythonPrograms = true;
+
+  preFixup = ''
+    makeWrapperArgs+=(
+      "''${qtWrapperArgs[@]}"
+  '' + lib.optionalString stdenv.hostPlatform.isLinux ''
+      --prefix PATH : ${lib.makeBinPath [ system-config-printer ]}
+  '' + ''
+    )
+  '';
+
+  postFixup = ''
+    makeWrapper ${lib.getExe python3Packages.python} $out/bin/rcu \
+      ''${makeWrapperArgs[@]} \
+      --prefix PYTHONPATH : ${python3Packages.makePythonPath (propagatedBuildInputs ++ [(placeholder "out")])} \
+      --add-flags $out/share/rcu/main.py
+  '';
+
+  passthru = {
+    tests.version = testers.testVersion {
+      package = rcu;
+      version = let
+        versionSuffixPos = (lib.strings.stringLength rcu.version) - 1;
+      in
+        "d${lib.strings.substring 0 versionSuffixPos rcu.version}(${lib.strings.substring versionSuffixPos 1 rcu.version})";
+    };
+  };
+
+  meta = with lib; {
+    mainProgram = "rcu";
+    description = "All-in-one offline/local management software for reMarkable e-paper tablets";
+    homepage = "http://www.davisr.me/projects/rcu/";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ OPNA2608 ];
+  };
+}