Unverified Commit f3e80c71 authored by Pol Dellaiera's avatar Pol Dellaiera Committed by GitHub
Browse files

winbox4: add MacOS aarch64 support (#384296)

parents aaf817bb 39a54582
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
{
  pname,
  version,
  hash,
  fetchurl,
  stdenvNoCC,
  undmg,
  metaCommon ? { },
}:

stdenvNoCC.mkDerivation (finalAttrs: {
  inherit pname version;

  src = fetchurl {
    name = "WinBox-${finalAttrs.version}.dmg";
    url = "https://download.mikrotik.com/routeros/winbox/${finalAttrs.version}/WinBox.dmg";
    inherit hash;
  };

  sourceRoot = ".";

  nativeBuildInputs = [ undmg ];

  installPhase = ''
    runHook preInstall

    mkdir -p $out/{bin,Applications}
    cp -R "WinBox.app" "$out/Applications/WinBox.app"
    ln -s "$out/Applications/WinBox.app/Contents/MacOS/WinBox" "$out/bin/WinBox"

    runHook postInstall
  '';

  meta = metaCommon // {
    platforms = [ "aarch64-darwin" ];
  };
})
+119 −0
Original line number Diff line number Diff line
{
  pname,
  version,
  hash,
  autoPatchelfHook,
  copyDesktopItems,
  fetchurl,
  fontconfig,
  freetype,
  lib,
  libGL,
  libxkbcommon,
  makeDesktopItem,
  makeWrapper,
  stdenvNoCC,
  unzip,
  writeShellApplication,
  xorg,
  zlib,
  metaCommon ? { },
}:

stdenvNoCC.mkDerivation (finalAttrs: {
  inherit pname version;

  src = fetchurl {
    name = "WinBox_Linux-${finalAttrs.version}.zip";
    url = "https://download.mikrotik.com/routeros/winbox/${finalAttrs.version}/WinBox_Linux.zip";
    inherit hash;
  };

  sourceRoot = ".";

  nativeBuildInputs = [
    autoPatchelfHook
    copyDesktopItems
    # makeBinaryWrapper does not support --run
    makeWrapper
    unzip
  ];

  buildInputs = [
    fontconfig
    freetype
    libGL
    libxkbcommon
    xorg.libxcb
    xorg.xcbutilimage
    xorg.xcbutilkeysyms
    xorg.xcbutilrenderutil
    xorg.xcbutilwm
    zlib
  ];

  installPhase = ''
    runHook preInstall

    install -Dm644 "assets/img/winbox.png" "$out/share/pixmaps/winbox.png"
    install -Dm755 "WinBox" "$out/bin/WinBox"

    wrapProgram "$out/bin/WinBox" --run "${lib.getExe finalAttrs.migrationScript}"

    runHook postInstall
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "winbox";
      desktopName = "WinBox";
      comment = "GUI administration for Mikrotik RouterOS";
      exec = "WinBox";
      icon = "winbox";
      categories = [ "Utility" ];
    })
  ];

  migrationScript = writeShellApplication {
    name = "winbox-migrate";
    text = ''
      XDG_DATA_HOME=''${XDG_DATA_HOME:-$HOME/.local/share}
      targetFile="$XDG_DATA_HOME/MikroTik/WinBox/Addresses.cdb"

      if [ -f "$targetFile" ]; then
        echo "NixOS: WinBox 4 data already present at $(dirname "$targetFile"). Skipping automatic migration."
        exit 0
      fi

      # cover both wine prefix variants
      # latter was used until https://github.com/NixOS/nixpkgs/pull/329626 was merged on 2024/07/24
      winePrefixes=(
        "''${WINEPREFIX:-$HOME/.wine}"
        "''${WINBOX_HOME:-$XDG_DATA_HOME/winbox}/wine"
      )
      sourceFilePathSuffix="drive_c/users/$USER/AppData/Roaming/Mikrotik/Winbox/Addresses.cdb"
      selectedSourceFile=""

      for prefix in "''${winePrefixes[@]}"
      do
        echo "NixOS: Probing WinBox 3 data path at $prefix..."
        if [ -f "$prefix/$sourceFilePathSuffix" ]; then
          selectedSourceFile="$prefix/$sourceFilePathSuffix"
          break
        fi
      done

      if [ -z "$selectedSourceFile" ]; then
        echo "NixOS: WinBox 3 data not found. Skipping automatic migration."
        exit 0
      fi

      echo "NixOS: Automatically migrating WinBox 3 data..."
      install -Dvm644 "$selectedSourceFile" "$targetFile"
    '';
  };

  meta = metaCommon // {
    platforms = [ "x86_64-linux" ];
  };
})
+21 −108
Original line number Diff line number Diff line
{
  autoPatchelfHook,
  copyDesktopItems,
  fetchurl,
  fontconfig,
  freetype,
  lib,
  libGL,
  libxkbcommon,
  makeDesktopItem,
  makeWrapper,
  callPackage,
  stdenvNoCC,
  unzip,
  writeShellApplication,
  xorg,
  zlib,
}:

stdenvNoCC.mkDerivation (finalAttrs: {
let
  pname = "winbox";
  version = "4.0beta20";

  src = fetchurl {
    name = "WinBox_Linux-${finalAttrs.version}.zip";
    url = "https://download.mikrotik.com/routeros/winbox/${finalAttrs.version}/WinBox_Linux.zip";
    hash = "sha256-mU+z7yRYKXnGAXHB5LS5SVUgIzRlR9nV2FzXispntF0=";
  };

  sourceRoot = ".";

  nativeBuildInputs = [
    autoPatchelfHook
    copyDesktopItems
    # makeBinaryWrapper does not support --run
    makeWrapper
    unzip
  ];

  buildInputs = [
    fontconfig
    freetype
    libGL
    libxkbcommon
    xorg.libxcb
    xorg.xcbutilimage
    xorg.xcbutilkeysyms
    xorg.xcbutilrenderutil
    xorg.xcbutilwm
    zlib
  ];

  installPhase = ''
    runHook preInstall

    install -Dm644 "assets/img/winbox.png" "$out/share/pixmaps/winbox.png"
    install -Dm755 "WinBox" "$out/bin/WinBox"

    wrapProgram "$out/bin/WinBox" --run "${lib.getExe finalAttrs.migrationScript}"

    runHook postInstall
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "winbox";
      desktopName = "Winbox";
      comment = "GUI administration for Mikrotik RouterOS";
      exec = "WinBox";
      icon = "winbox";
      categories = [ "Utility" ];
    })
  ];

  migrationScript = writeShellApplication {
    name = "winbox-migrate";
    text = ''
      XDG_DATA_HOME=''${XDG_DATA_HOME:-$HOME/.local/share}
      targetFile="$XDG_DATA_HOME/MikroTik/WinBox/Addresses.cdb"

      if [ -f "$targetFile" ]; then
        echo "NixOS: WinBox 4 data already present at $(dirname "$targetFile"). Skipping automatic migration."
        exit 0
      fi

      # cover both wine prefix variants
      # latter was used until https://github.com/NixOS/nixpkgs/pull/329626 was merged on 2024/07/24
      winePrefixes=(
        "''${WINEPREFIX:-$HOME/.wine}"
        "''${WINBOX_HOME:-$XDG_DATA_HOME/winbox}/wine"
      )
      sourceFilePathSuffix="drive_c/users/$USER/AppData/Roaming/Mikrotik/Winbox/Addresses.cdb"
      selectedSourceFile=""

      for prefix in "''${winePrefixes[@]}"
      do
        echo "NixOS: Probing WinBox 3 data path at $prefix..."
        if [ -f "$prefix/$sourceFilePathSuffix" ]; then
          selectedSourceFile="$prefix/$sourceFilePathSuffix"
          break
        fi
      done

      if [ -z "$selectedSourceFile" ]; then
        echo "NixOS: WinBox 3 data not found. Skipping automatic migration."
        exit 0
      fi

      echo "NixOS: Automatically migrating WinBox 3 data..."
      install -Dvm644 "$selectedSourceFile" "$targetFile"
    '';
  };

  meta = {
  metaCommon = {
    description = "Graphical configuration utility for RouterOS-based devices";
    homepage = "https://mikrotik.com";
    downloadPage = "https://mikrotik.com/download";
    changelog = "https://download.mikrotik.com/routeros/winbox/${finalAttrs.version}/CHANGELOG";
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    license = lib.licenses.unfree;
    platforms = [ "x86_64-linux" ];
    mainProgram = "WinBox";
    maintainers = with lib.maintainers; [
      Scrumplex
@@ -125,4 +20,22 @@ stdenvNoCC.mkDerivation (finalAttrs: {
      savalet
    ];
  };
  x86_64-zip = callPackage ./build-from-zip.nix {
    inherit pname version metaCommon;

    hash = "sha256-mU+z7yRYKXnGAXHB5LS5SVUgIzRlR9nV2FzXispntF0=";
  };

  x86_64-dmg = callPackage ./build-from-dmg.nix {
    inherit pname version metaCommon;

    hash = "sha256-tLsreK6YsqsbMaY4dil34eiHxAG7GrZYyll6BX9dsx8=";
  };
in
(if stdenvNoCC.hostPlatform.isDarwin then x86_64-dmg else x86_64-zip).overrideAttrs (oldAttrs: {
  meta = oldAttrs.meta // {
    platforms = x86_64-zip.meta.platforms ++ x86_64-dmg.meta.platforms;
    mainProgram = "WinBox";
    changelog = "https://download.mikrotik.com/routeros/winbox/${oldAttrs.version}/CHANGELOG";
  };
})