From 82fc0c6e96d98857323ded85505461b5e8a0c365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Vitor=20de=20Lima=20Matos?= Date: Thu, 13 Jul 2023 22:10:42 -0300 Subject: [PATCH] pritunl-client: refactor, add service and electron app --- .../networking/pritunl-client/default.nix | 132 ++++++++++++++++-- 1 file changed, 120 insertions(+), 12 deletions(-) diff --git a/pkgs/tools/networking/pritunl-client/default.nix b/pkgs/tools/networking/pritunl-client/default.nix index 4dfdebf30a68..0ba02d84e6de 100644 --- a/pkgs/tools/networking/pritunl-client/default.nix +++ b/pkgs/tools/networking/pritunl-client/default.nix @@ -1,9 +1,22 @@ -{ lib, buildGoModule, fetchFromGitHub, installShellFiles }: - -buildGoModule rec { - pname = "pritunl-client"; +{ lib +, stdenv +, fetchFromGitHub +, runtimeShell +, runCommand +, makeWrapper +, installShellFiles +, buildGoModule +, coreutils +, which +, gnugrep +, gnused +, openresolv +, systemd +, iproute2 +, openvpn +, electron +}: let version = "1.3.3584.5"; - src = fetchFromGitHub { owner = "pritunl"; repo = "pritunl-client-electron"; @@ -11,25 +24,120 @@ buildGoModule rec { sha256 = "sha256-wWpP2u+oQSESjkRvAn5by7efvssYtKBYg2E+FZ/+tg0="; }; - modRoot = "cli"; - vendorHash = "sha256-miwGLWpoaavg/xcw/0pNBYCdovBnvjP5kdaaGPcRuWk="; + cli = buildGoModule { + pname = "pritunl-cli"; + inherit version src; + + modRoot = "cli"; + vendorHash = "sha256-miwGLWpoaavg/xcw/0pNBYCdovBnvjP5kdaaGPcRuWk="; + + postInstall = '' + mv $out/bin/cli $out/bin/pritunl-client + ''; + }; + + service = buildGoModule { + pname = "pritunl-client-service"; + inherit version src; + + modRoot = "service"; + vendorHash = "sha256-9Fv8m3eWlxv4WWDSdI0VMavgy+0OSIVZ98dkDBwm4Gc="; + + nativeBuildInputs = [ makeWrapper ]; + + postPatch = '' + sed -Ei service/profile/scripts.go \ + -e 's|#!\s*(/usr)?/bin/(env )?bash\b|#! ${runtimeShell}|g' + '' + lib.optionalString stdenv.isLinux '' + sed -Ei service/profile/scripts.go \ + -e 's|(/usr)?/s?bin/busctl\b|busctl|g' \ + -e 's|(/usr)?/s?bin/resolvectl\b|resolvectl|g' \ + -e 's|(/usr)?/s?bin/ip\b|ip|g' + ''; + + postInstall = '' + mv $out/bin/service $out/bin/pritunl-client-service + '' + lib.optionalString stdenv.isLinux '' + mkdir -p $out/lib/systemd/system/ + cp $src/resources_linux/pritunl-client.service $out/lib/systemd/system/ + substituteInPlace $out/lib/systemd/system/pritunl-client.service \ + --replace "/usr" "$out" + ''; + + postFixup = let + hookScriptsDeps = [ + coreutils + which + gnused + gnugrep + ] ++ lib.optionals stdenv.isLinux [ + openresolv + systemd + iproute2 + ]; + openvpn-wrapped = runCommand "openvpn-wrapped" { + nativeBuildInputs = [ makeWrapper ]; + } '' + mkdir -p $out/bin + makeWrapper ${openvpn}/bin/openvpn $out/bin/openvpn \ + --prefix PATH : ${lib.makeBinPath hookScriptsDeps} \ + --add-flags "--setenv PATH \$PATH" + ''; + in lib.optionalString stdenv.isLinux '' + wrapProgram $out/bin/pritunl-client-service \ + --prefix PATH : "${lib.makeBinPath ([ openvpn-wrapped ])}" + ''; + }; +in stdenv.mkDerivation { + pname = "pritunl-client"; + inherit version src; + + dontBuild = true; + dontConfigure = true; nativeBuildInputs = [ + makeWrapper installShellFiles ]; - postInstall = '' - mv $out/bin/cli $out/bin/pritunl-client + installPhase = '' + runHook preInstall + + mkdir -p $out/bin/ + ln -s ${cli}/bin/pritunl-client $out/bin/ + ln -s ${service}/bin/pritunl-client-service $out/bin/ + + mkdir -p $out/lib/ + cp -r client $out/lib/pritunl_client_electron + + makeWrapper ${electron}/bin/electron $out/bin/pritunl-client-electron \ + --add-flags $out/lib/pritunl_client_electron + + '' + lib.optionalString stdenv.isLinux '' + mkdir -p $out/lib/systemd/system/ + ln -s ${service}/lib/systemd/system/pritunl-client.service $out/lib/systemd/system/ + + mkdir -p $out/share/icons/ + cp -r resources_linux/icons $out/share/icons/hicolor + + mkdir -p $out/share/applications/ + cp resources_linux/pritunl-client-electron.desktop $out/share/applications/ + substituteInPlace $out/share/applications/pritunl-client-electron.desktop \ + --replace "/usr/lib/pritunl_client_electron/Pritunl" "$out/bin/pritunl-client-electron" + '' + '' + # install shell completions for pritunl-client installShellCompletion --cmd pritunl-client \ --bash <($out/bin/pritunl-client completion bash) \ --fish <($out/bin/pritunl-client completion fish) \ --zsh <($out/bin/pritunl-client completion zsh) + + runHook postInstall ''; meta = with lib; { - description = "Pritunl OpenVPN client CLI"; - homepage = "https://github.com/pritunl/pritunl-client-electron/tree/master/cli"; + description = "Pritunl OpenVPN client"; + homepage = "https://client.pritunl.com/"; license = licenses.unfree; - maintainers = with maintainers; [ minizilla ]; + maintainers = with maintainers; [ minizilla andrevmatos ]; }; }