push sheeet
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s

This commit is contained in:
Dark Steveneq
2025-10-09 14:15:47 +02:00
commit 646b892680
49168 changed files with 5897842 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
{
lib,
buildGoModule,
fetchFromGitHub,
installShellFiles,
stdenv,
versionCheckHook,
writableTmpDirAsHomeHook,
nix-update-script,
}:
buildGoModule (finalAttrs: {
pname = "az-pim-cli";
version = "1.7.0";
src = fetchFromGitHub {
owner = "netr0m";
repo = "az-pim-cli";
tag = "v${finalAttrs.version}";
hash = "sha256-X7+/2pXbpHFm22lwWy6LvyjIy6sxmYSiMrYV3faAZl4=";
};
patches = [
# removes info we don't have from version command
./version-build-info.patch
];
vendorHash = "sha256-PHrpUlAG/PBe3NKUGBQ1U7dCcqkSlErWX2dp9ZPB3+8=";
nativeBuildInputs = [
installShellFiles
];
env.CGO_ENABLED = 0;
ldflags = [
"-s"
"-X github.com/netr0m/az-pim-cli/cmd.version=v${finalAttrs.version}"
];
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
installShellCompletion --cmd az-pim-cli \
--bash <($out/bin/az-pim-cli completion bash) \
--fish <($out/bin/az-pim-cli completion fish) \
--zsh <($out/bin/az-pim-cli completion zsh)
'';
doInstallCheck = true;
nativeInstallCheckInputs = [
writableTmpDirAsHomeHook
versionCheckHook
];
versionCheckProgramArg = "version";
versionCheckKeepEnvironment = [ "HOME" ];
passthru.updateScript = nix-update-script { };
meta = {
description = "List and activate Azure Entra ID Privileged Identity Management roles from the CLI";
homepage = "https://github.com/netr0m/az-pim-cli";
changelog = "https://github.com/netr0m/az-pim-cli/releases/tag/v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.awwpotato ];
mainProgram = "az-pim-cli";
};
})

View File

@@ -0,0 +1,24 @@
diff --git a/cmd/version.go b/cmd/version.go
index 816f044..ef107be 100644
--- a/cmd/version.go
+++ b/cmd/version.go
@@ -31,8 +31,7 @@ type BuildInfo struct {
}
func (b BuildInfo) String() string {
- return fmt.Sprintf("az-pim-cli version %s (built with %s from %s on %s)",
- b.Version, b.GoVersion, b.Commit, b.Date)
+ return fmt.Sprintf("az-pim-cli version %s", b.Version)
}
func printVersion(w io.Writer, info BuildInfo) {
@@ -47,8 +46,8 @@ func createBuildInfo() BuildInfo {
Date: date,
}
- buildInfo, available := debug.ReadBuildInfo()
- if !available {
+ buildInfo, _ := debug.ReadBuildInfo()
+ if true {
return info
}

View File

@@ -0,0 +1,33 @@
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 66cbbd52ed..a8b9d41e4e 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -230,13 +230,8 @@
)
target_link_libraries(zstd_seekable PUBLIC libzstd_static)
- target_link_libraries(libzstd_static INTERFACE zstd_seekable)
-
- add_library(zstd ALIAS libzstd_static)
-
- install(TARGETS zstd_seekable
- EXPORT zstdExports
- )
+ add_library(zstd INTERFACE)
+ target_link_libraries(zstd INTERFACE libzstd_static zstd_seekable)
endif()
# ENet
diff --git a/src/common/zstd_compression.cpp b/src/common/zstd_compression.cpp
index 1e38877a1c..ac85ea1978 100644
--- a/src/common/zstd_compression.cpp
+++ b/src/common/zstd_compression.cpp
@@ -13,7 +13,7 @@
#include <mutex>
#include <sstream>
#include <zstd.h>
-#include <zstd/contrib/seekable_format/zstd_seekable.h>
+#include <zstd_seekable.h>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/unique_ptr.hpp>

View File

@@ -0,0 +1,167 @@
{
boost,
catch2_3,
cmake,
cryptopp,
cpp-jwt,
doxygen,
dynarmic,
enet,
fetchzip,
fmt,
ffmpeg_6-headless,
glslang,
httplib,
inih,
lib,
libGL,
libunwind,
libusb1,
moltenvk,
nlohmann_json,
openal,
openssl,
pipewire,
pkg-config,
portaudio,
python3,
robin-map,
SDL2,
soundtouch,
stdenv,
vulkan-headers,
xbyak,
xorg,
enableQtTranslations ? true,
qt6,
enableCubeb ? true,
cubeb,
useDiscordRichPresence ? true,
rapidjson,
enableSSE42 ? true, # Disable if your hardware doesn't support SSE 4.2 (mainly CPUs before 2011)
gamemode,
enableGamemode ? lib.meta.availableOn stdenv.hostPlatform gamemode,
nix-update-script,
darwinMinVersionHook,
apple-sdk_12,
}:
let
inherit (lib)
optionals
optionalString
cmakeBool
getLib
;
in
stdenv.mkDerivation (finalAttrs: {
pname = "azahar";
version = "2123.2";
src = fetchzip {
url = "https://github.com/azahar-emu/azahar/releases/download/${finalAttrs.version}/azahar-unified-source-${finalAttrs.version}.tar.xz";
hash = "sha256-T0oVWYedap3BfMvnzKWEoW3+y3f3ld0RKp3z49LJIds=";
};
patches = [
# https://github.com/azahar-emu/azahar/pull/1305
./fix-zstd-seekable-include.patch
];
strictDeps = true;
nativeBuildInputs = [
cmake
doxygen
python3
pkg-config
qt6.wrapQtAppsHook
];
buildInputs = [
boost
catch2_3
cryptopp
cpp-jwt
dynarmic
enet
fmt
ffmpeg_6-headless
glslang
httplib
inih
libGL
libunwind
libusb1
nlohmann_json
openal
openssl
portaudio
robin-map
qt6.qtbase
qt6.qtmultimedia
qt6.qttools
soundtouch
SDL2
vulkan-headers
xbyak
# https://github.com/azahar-emu/azahar/pull/1281
# spirv-tools
# Azahar uses zstd_seekable which is not currently packaged in nixpkgs
# zstd
]
++ optionals enableQtTranslations [ qt6.qttools ]
++ optionals enableCubeb [ cubeb ]
++ optionals useDiscordRichPresence [ rapidjson ]
++ optionals stdenv.hostPlatform.isLinux [
pipewire
qt6.qtwayland
xorg.libX11
xorg.libxcb
xorg.libXext
]
++ optionals stdenv.hostPlatform.isDarwin [
moltenvk
# error: 'lowPowerModeEnabled' is unavailable: not available on macOS
apple-sdk_12
(darwinMinVersionHook "12.0")
];
postPatch = ''
# We already know the submodules are present
substituteInPlace CMakeLists.txt \
--replace-fail "check_submodules_present()" ""
''
# Add gamemode
+ optionalString enableGamemode ''
substituteInPlace externals/gamemode/include/gamemode_client.h \
--replace-fail "libgamemode.so.0" "${getLib gamemode}/lib/libgamemode.so.0"
'';
cmakeFlags = [
(cmakeBool "USE_SYSTEM_LIBS" true)
(cmakeBool "DISABLE_SYSTEM_LODEPNG" true)
(cmakeBool "DISABLE_SYSTEM_VMA" true)
(cmakeBool "DISABLE_SYSTEM_ZSTD" true)
(cmakeBool "DISABLE_SYSTEM_SPIRV_HEADERS" true)
(cmakeBool "ENABLE_QT_TRANSLATION" enableQtTranslations)
(cmakeBool "ENABLE_CUBEB" enableCubeb)
(cmakeBool "USE_DISCORD_PRESENCE" useDiscordRichPresence)
(cmakeBool "ENABLE_SSE42" enableSSE42)
];
passthru.updateScript = nix-update-script { };
meta = {
description = "Open-source 3DS emulator project based on Citra";
homepage = "https://github.com/azahar-emu/azahar";
license = lib.licenses.gpl2Only;
maintainers = with lib.maintainers; [
arthsmn
marcin-serwin
];
mainProgram = "azahar";
platforms = with lib.platforms; linux ++ darwin;
};
})

View File

@@ -0,0 +1,43 @@
{
lib,
stdenvNoCC,
fetchFromGitHub,
}:
stdenvNoCC.mkDerivation {
pname = "azeret-mono";
version = "1.0";
src = fetchFromGitHub {
owner = "displaay";
repo = "Azeret";
rev = "3d45a6c3e094f08bfc70551b525bd2037cac51ba";
hash = "sha256-WC5a2O+/hdX+lLz81obcmq64wYpX48ZxsYPEaZUbFaY=";
};
installPhase = ''
runHook preInstall
install -Dm644 fonts/ttf/*.ttf -t $out/share/fonts/truetype
runHook postInstall
'';
meta = with lib; {
description = "Azeret Mono";
longDescription = ''
The story of the typeface began with a draft that was driven by an exploration of OCR fonts, past and futuristic operating systems, various interfaces and the nineties. The final result is more based on a desire to achieve an appearance of the typeface that could serve in operating systems. Thus the overall character is a conjunction of everything described with details that evoke a specific personality.
Azeret is a sans-serif typeface with a mono-linear character. Dont go looking for too much contrast in the strokes! The circular parts of the letters do not have a smooth connection to the stems. The x-height is higher than usual and thus the ascenders and descenders are short. Alternates are also available which open the possibility of creating different moods. A number of them hint at a nineties aesthetic.
The monospaced sub-family is available for free and is also on Google Fonts. If you would like to explore Azeret more you can do it on our micro-site which we developed with Martin Ehrlich.
Designer: Martin Vácha, Daniel Quisek
Production: Renegade Fonts (Jan Charvát, Zuzana Konečná)
'';
homepage = "https://displaay.net/typeface/azeret/azeret-mono/";
license = licenses.ofl;
platforms = platforms.all;
maintainers = with maintainers; [ _21eleven ];
};
}

View File

@@ -0,0 +1,63 @@
{
lib,
stdenv,
fetchFromGitHub,
libGL,
SDL,
which,
installTool ? false,
}:
stdenv.mkDerivation rec {
pname = "azimuth";
version = "1.0.3";
src = fetchFromGitHub {
owner = "mdsteele";
repo = "azimuth";
rev = "v${version}";
sha256 = "1znfvpmqiixd977jv748glk5zc4cmhw5813zp81waj07r9b0828r";
};
nativeBuildInputs = [ which ];
buildInputs = [
libGL
SDL
];
env.NIX_CFLAGS_COMPILE = toString [ "-Wno-error=maybe-uninitialized" ];
preConfigure = ''
substituteInPlace data/azimuth.desktop \
--replace Exec=azimuth "Exec=$out/bin/azimuth" \
--replace "Version=%AZ_VERSION_NUMBER" "Version=${version}"
'';
makeFlags = [
"BUILDTYPE=release"
"INSTALLDIR=$(out)"
]
++ (if installTool then [ "INSTALLTOOL=true" ] else [ "INSTALLTOOL=false" ]);
enableParallelBuilding = true;
meta = {
description = "Metroidvania game using only vectorial graphic";
mainProgram = "azimuth";
longDescription = ''
Azimuth is a metroidvania game, and something of an homage to the previous
greats of the genre (Super Metroid in particular). You will need to pilot
your ship, explore the inside of the planet, fight enemies, overcome
obstacles, and uncover the storyline piece by piece. Azimuth features a
huge game world to explore, lots of little puzzles to solve, dozens of
weapons and upgrades to find and use, and a wide variety of enemies and
bosses to tangle with.
'';
license = lib.licenses.gpl3Plus;
homepage = "https://mdsteele.games/azimuth/index.html";
maintainers = with lib.maintainers; [ marius851000 ];
platforms = lib.platforms.linux;
};
}

View File

@@ -0,0 +1,49 @@
{
lib,
stdenv,
fetchFromGitHub,
boost183,
cmake,
ninja,
zeromq,
catch2,
unstableGitUpdater,
}:
stdenv.mkDerivation {
pname = "azmq";
version = "1.0.3-unstable-2025-01-19";
src = fetchFromGitHub {
owner = "zeromq";
repo = "azmq";
rev = "4e8f18bf3ac60f5c8126db61e48927ea19a88195";
hash = "sha256-0TYZvQefoW77RXhQ57niXs3Kcz2YHW9cBDNGFU47BBs=";
};
nativeBuildInputs = [
cmake
ninja
];
buildInputs = [
boost183
catch2
zeromq
];
# Broken for some reason on this platform.
doCheck = !(stdenv.hostPlatform.isAarch64 && stdenv.hostPlatform.isLinux);
passthru.updateScript = unstableGitUpdater {
tagPrefix = "v";
};
meta = with lib; {
homepage = "https://github.com/zeromq/azmq";
license = licenses.boost;
description = "C++ language binding library integrating ZeroMQ with Boost Asio";
maintainers = [ ];
platforms = platforms.unix;
};
}

View File

@@ -0,0 +1,72 @@
{
lib,
stdenv,
fetchFromGitLab,
desktop-file-utils,
desktopToDarwinBundle,
shared-mime-info,
ninja,
pkg-config,
libiconv,
libX11,
libXcursor,
libXext,
libXi,
freetype,
fontconfig,
libjpeg,
libpng,
libtiff,
libwebp,
zlib,
}:
stdenv.mkDerivation rec {
pname = "azpainter";
version = "3.0.12";
src = fetchFromGitLab {
owner = "azelpg";
repo = "azpainter";
rev = "v${version}";
hash = "sha256-cUq1UmS0k5eib0aJI1zOJbJRzErezfAAXOOIFrgUS6E=";
};
nativeBuildInputs = [
desktop-file-utils # for update-desktop-database
shared-mime-info # for update-mime-info
ninja
pkg-config
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ desktopToDarwinBundle ];
buildInputs = [
libX11
libXcursor
libXext
libXi
freetype
fontconfig
libjpeg
libpng
libtiff
libwebp
zlib
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv ];
preBuild = ''
cd build
'';
enableParallelBuilding = true;
meta = with lib; {
description = "Full color painting software for illustration drawing";
homepage = "http://azsky2.html.xdomain.jp/soft/azpainter.html";
license = licenses.gpl3Plus;
maintainers = with maintainers; [ dtzWill ];
platforms = with platforms; linux ++ darwin;
mainProgram = "azpainter";
};
}

View File

@@ -0,0 +1,78 @@
{
lib,
stdenvNoCC,
fetchzip,
}:
let
fonts = [
{
name = "azuki";
downloadVersion = "121";
hash = "sha256-AMpEJDD8lN0qWJ5C0y4V+/2JE/pKQrUHGfKHcnV+dhA=";
}
{
name = "azuki-b";
downloadVersion = "B120";
hash = "sha256-GoXnDX9H6D1X0QEgrD2jmQp7ek081PpO+xR3OdIY8Ck=";
}
{
name = "azuki-l";
downloadVersion = "L120";
hash = "sha256-rvWvSuvLnK3m2+iyKPQyIB1UGjg8dAW5oygjsLCQZ48=";
}
{
name = "azuki-lb";
downloadVersion = "LB100";
hash = "sha256-zpGomVshCe2W2Z2C5UGtVrJ2k7F//MftndSHPHmG290=";
}
{
name = "azuki-lp";
downloadVersion = "LP100";
hash = "sha256-Q/ND3dv8q7WTQx4oYVY5pTiGl4Ht89oA+tuCyfPOLUk=";
}
{
name = "azuki-p";
downloadVersion = "P100";
hash = "sha256-s4uodxyXP5R7jwkzjmg6qJZCllJ/MtgkkVOeELI8hLI=";
}
];
in
stdenvNoCC.mkDerivation {
pname = "azuki";
version = "0-unstable-2021-07-02";
sourceRoot = "azuki";
srcs = map (
{
name,
downloadVersion,
hash,
}:
fetchzip {
url = "https://azukifont.com/font/azukifont${downloadVersion}.zip";
stripRoot = false;
inherit name hash;
}
) fonts;
installPhase = ''
runHook preInstall
for font in $srcs; do
install -Dm644 $font/azukifont*/*.ttf -t $out/share/fonts/truetype
done
runHook postInstall
'';
meta = {
homepage = "http://azukifont.com/font/azuki.html";
description = "Azuki Font";
license = lib.licenses.unfree;
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [ nyadiia ];
};
}

View File

@@ -0,0 +1,476 @@
[
{
"pname": "Castle.Core",
"version": "5.1.1",
"hash": "sha256-oVkQB+ON7S6Q27OhXrTLaxTL0kWB58HZaFFuiw4iTrE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/castle.core/5.1.1/castle.core.5.1.1.nupkg"
},
{
"pname": "FluentAssertions",
"version": "5.9.0",
"hash": "sha256-HV33Gw4fNoJsJkrqhWvzAlHb8qhkhmXosV5kpQy1t4Y=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/fluentassertions/5.9.0/fluentassertions.5.9.0.nupkg"
},
{
"pname": "Microsoft.ApplicationInsights",
"version": "2.22.0",
"hash": "sha256-mUQ63atpT00r49ca50uZu2YCiLg3yd6r3HzTryqcuEA=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.applicationinsights/2.22.0/microsoft.applicationinsights.2.22.0.nupkg"
},
{
"pname": "Microsoft.Build.Tasks.Git",
"version": "1.0.0-beta2-19554-01",
"hash": "sha256-iFiNU39SAPMfjk/TjTv7AaVIPuermvM68y1ubqfax+c=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.build.tasks.git/1.0.0-beta2-19554-01/microsoft.build.tasks.git.1.0.0-beta2-19554-01.nupkg"
},
{
"pname": "Microsoft.CodeCoverage",
"version": "17.13.0",
"hash": "sha256-GKrIxeyQo5Az1mztfQgea1kGtJwonnNOrXK/0ULfu8o=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.codecoverage/17.13.0/microsoft.codecoverage.17.13.0.nupkg"
},
{
"pname": "Microsoft.DiaSymReader",
"version": "2.0.0",
"hash": "sha256-8hotZmh8Rb6Q6oD9Meb74SvAdbDo39Y/1m8h43HHjjw=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.diasymreader/2.0.0/microsoft.diasymreader.2.0.0.nupkg"
},
{
"pname": "Microsoft.Extensions.DependencyInjection",
"version": "6.0.0",
"hash": "sha256-gZuMaunMJVyvvepuzNodGPRc6eqKH//bks3957dYkPI=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.dependencyinjection/6.0.0/microsoft.extensions.dependencyinjection.6.0.0.nupkg"
},
{
"pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
"version": "6.0.0",
"hash": "sha256-SZke0jNKIqJvvukdta+MgIlGsrP2EdPkkS8lfLg7Ju4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.dependencyinjection.abstractions/6.0.0/microsoft.extensions.dependencyinjection.abstractions.6.0.0.nupkg"
},
{
"pname": "Microsoft.Extensions.DependencyModel",
"version": "6.0.1",
"hash": "sha256-ArXJ7mfSywrfif29cfkeaXL1s0soZSi+RZgAimukqNw=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.dependencymodel/6.0.1/microsoft.extensions.dependencymodel.6.0.1.nupkg"
},
{
"pname": "Microsoft.Extensions.Logging",
"version": "6.0.0",
"hash": "sha256-8WsZKRGfXW5MsXkMmNVf6slrkw+cR005czkOP2KUqTk=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.logging/6.0.0/microsoft.extensions.logging.6.0.0.nupkg"
},
{
"pname": "Microsoft.Extensions.Logging.Abstractions",
"version": "6.0.3",
"hash": "sha256-7M4sSypxNc5s2Py1JrCmkIsCtQ2rnK7lvfs3q/g6+dI=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.logging.abstractions/6.0.3/microsoft.extensions.logging.abstractions.6.0.3.nupkg"
},
{
"pname": "Microsoft.Extensions.Options",
"version": "6.0.0",
"hash": "sha256-DxnEgGiCXpkrxFkxXtOXqwaiAtoIjA8VSSWCcsW0FwE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.options/6.0.0/microsoft.extensions.options.6.0.0.nupkg"
},
{
"pname": "Microsoft.Extensions.Primitives",
"version": "6.0.0",
"hash": "sha256-AgvysszpQ11AiTBJFkvSy8JnwIWTj15Pfek7T7ThUc4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.extensions.primitives/6.0.0/microsoft.extensions.primitives.6.0.0.nupkg"
},
{
"pname": "Microsoft.Identity.Client",
"version": "4.64.0",
"hash": "sha256-VsB72O+EJaxCrc5K2w2XdxThVhIDPVmZw3l86w6O1PU=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.identity.client/4.64.0/microsoft.identity.client.4.64.0.nupkg"
},
{
"pname": "Microsoft.Identity.Client.Broker",
"version": "4.64.0",
"hash": "sha256-FdShbdlstMuT3CPL4J2+1Qym1aPz+H86SHyS/hi5+iM=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.identity.client.broker/4.64.0/microsoft.identity.client.broker.4.64.0.nupkg"
},
{
"pname": "Microsoft.Identity.Client.Extensions.Msal",
"version": "4.64.0",
"hash": "sha256-dDYIEbSuV4ijb9fn3diOaz+TEs8cJMP1Tb5/mD+DAGg=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.identity.client.extensions.msal/4.64.0/microsoft.identity.client.extensions.msal.4.64.0.nupkg"
},
{
"pname": "Microsoft.Identity.Client.NativeInterop",
"version": "0.16.2",
"hash": "sha256-hlLFLp6a+vnQT1urt3GlIo94G3AoawczYgooaCkvfNU=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.identity.client.nativeinterop/0.16.2/microsoft.identity.client.nativeinterop.0.16.2.nupkg"
},
{
"pname": "Microsoft.IdentityModel.Abstractions",
"version": "6.35.0",
"hash": "sha256-bxyYu6/QgaA4TQYBr5d+bzICL+ktlkdy/tb/1fBu00Q=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.identitymodel.abstractions/6.35.0/microsoft.identitymodel.abstractions.6.35.0.nupkg"
},
{
"pname": "Microsoft.NET.Test.Sdk",
"version": "17.13.0",
"hash": "sha256-sc2wvyV8cGm1FrNP2GGHEI584RCvRPu15erYCsgw5QY=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.net.test.sdk/17.13.0/microsoft.net.test.sdk.17.13.0.nupkg"
},
{
"pname": "Microsoft.NETCore.Platforms",
"version": "1.1.0",
"hash": "sha256-FeM40ktcObQJk4nMYShB61H/E8B7tIKfl9ObJ0IOcCM=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.netcore.platforms/1.1.0/microsoft.netcore.platforms.1.1.0.nupkg"
},
{
"pname": "Microsoft.SourceLink.Common",
"version": "1.0.0-beta2-19554-01",
"hash": "sha256-luDgxsHIlnI3udJ9Ieil/RkWehRJdwH5ZZ3ugmRh55E=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.sourcelink.common/1.0.0-beta2-19554-01/microsoft.sourcelink.common.1.0.0-beta2-19554-01.nupkg"
},
{
"pname": "Microsoft.SourceLink.GitHub",
"version": "1.0.0-beta2-19554-01",
"hash": "sha256-Pia4AX5rM1LDSQP9RLiBv147M+/KNaSh/WneJILx7C4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.sourcelink.github/1.0.0-beta2-19554-01/microsoft.sourcelink.github.1.0.0-beta2-19554-01.nupkg"
},
{
"pname": "Microsoft.Testing.Extensions.CodeCoverage",
"version": "17.13.1",
"hash": "sha256-m74V71udgx4OZScpfyVeA0Oj5JKIvdU1W5wzXyeUHLQ=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.extensions.codecoverage/17.13.1/microsoft.testing.extensions.codecoverage.17.13.1.nupkg"
},
{
"pname": "Microsoft.Testing.Extensions.Telemetry",
"version": "1.6.2",
"hash": "sha256-GZYUH+0vWAif5p4S81Oo9Tsez68ylsLjEQWhI2rgcik=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.extensions.telemetry/1.6.2/microsoft.testing.extensions.telemetry.1.6.2.nupkg"
},
{
"pname": "Microsoft.Testing.Extensions.TrxReport",
"version": "1.6.2",
"hash": "sha256-21x7FSFGVGXS8fkOQyr3jxsemxU8+7ugkVzo+mOP0Ic=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.extensions.trxreport/1.6.2/microsoft.testing.extensions.trxreport.1.6.2.nupkg"
},
{
"pname": "Microsoft.Testing.Extensions.TrxReport.Abstractions",
"version": "1.6.2",
"hash": "sha256-UOpDBbW3xgahofRjqdw3wUj63zXVdkIAfUE7dA4uI4Y=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.extensions.trxreport.abstractions/1.6.2/microsoft.testing.extensions.trxreport.abstractions.1.6.2.nupkg"
},
{
"pname": "Microsoft.Testing.Extensions.VSTestBridge",
"version": "1.6.2",
"hash": "sha256-SWaSPgc2PQNqsz7ea/SQsmqOX6le6dmrDbwCHfbppZo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.extensions.vstestbridge/1.6.2/microsoft.testing.extensions.vstestbridge.1.6.2.nupkg"
},
{
"pname": "Microsoft.Testing.Platform",
"version": "1.4.3",
"hash": "sha256-KqB3+uBGl0edpaGl6Qykubb3OrVTs6IcPWc59UQ/Iww=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.platform/1.4.3/microsoft.testing.platform.1.4.3.nupkg"
},
{
"pname": "Microsoft.Testing.Platform",
"version": "1.6.2",
"hash": "sha256-RfdgATa3aTYLpGfv8ORI5uEP8dH87L5/gBDkxAG6ho4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.platform/1.6.2/microsoft.testing.platform.1.6.2.nupkg"
},
{
"pname": "Microsoft.Testing.Platform.MSBuild",
"version": "1.6.2",
"hash": "sha256-bzlz10QeFrCAR+1og0gXbxSbpO64wCFrwAhBUwAp0nI=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testing.platform.msbuild/1.6.2/microsoft.testing.platform.msbuild.1.6.2.nupkg"
},
{
"pname": "Microsoft.TestPlatform.ObjectModel",
"version": "17.13.0",
"hash": "sha256-6S0fjfj8vA+h6dJVNwLi6oZhYDO/I/6hBZaq2VTW+Uk=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testplatform.objectmodel/17.13.0/microsoft.testplatform.objectmodel.17.13.0.nupkg"
},
{
"pname": "Microsoft.TestPlatform.TestHost",
"version": "17.13.0",
"hash": "sha256-L/CJzou7dhmShUgXq3aXL3CaLTJll17Q+JY2DBdUUpo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.testplatform.testhost/17.13.0/microsoft.testplatform.testhost.17.13.0.nupkg"
},
{
"pname": "Microsoft.VisualStudioEng.MicroBuild.Core",
"version": "1.0.0",
"hash": "sha256-0PcuPQ/x6TUXHP5nwRmYcDiRRxvjsqm93kV2YCX2+EQ=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.visualstudioeng.microbuild.core/1.0.0/microsoft.visualstudioeng.microbuild.core.1.0.0.nupkg"
},
{
"pname": "Microsoft.Win32.SystemEvents",
"version": "6.0.0",
"hash": "sha256-N9EVZbl5w1VnMywGXyaVWzT9lh84iaJ3aD48hIBk1zA=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/microsoft.win32.systemevents/6.0.0/microsoft.win32.systemevents.6.0.0.nupkg"
},
{
"pname": "Moq",
"version": "4.18.4",
"hash": "sha256-JOmYlcTJdQOthRxnT0jAD6WG+NVLMmIV2BM9rNhNg3Q=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/moq/4.18.4/moq.4.18.4.nupkg"
},
{
"pname": "MSTest",
"version": "3.8.2",
"hash": "sha256-k6M9buNaP/y+e4/4dsSWxsFWMmocWocDh3LW1jL97/A=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/mstest/3.8.2/mstest.3.8.2.nupkg"
},
{
"pname": "MSTest.Analyzers",
"version": "3.8.2",
"hash": "sha256-r+JAxw77n/PQpQviXn8j1M+ccb9GVHTNuPWwffacVkg=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/mstest.analyzers/3.8.2/mstest.analyzers.3.8.2.nupkg"
},
{
"pname": "MSTest.TestAdapter",
"version": "3.8.2",
"hash": "sha256-z5fZWSvyxvohB8Vl6gtb8nsAGt/9saXLZRckuzfVg/Y=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/mstest.testadapter/3.8.2/mstest.testadapter.3.8.2.nupkg"
},
{
"pname": "MSTest.TestFramework",
"version": "3.8.2",
"hash": "sha256-NjQ1XU3vMRdFZSE6Ju2ASopCPZFpFZaPAQdRudqAf5c=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/mstest.testframework/3.8.2/mstest.testframework.3.8.2.nupkg"
},
{
"pname": "NETStandard.Library",
"version": "2.0.3",
"hash": "sha256-Prh2RPebz/s8AzHb2sPHg3Jl8s31inv9k+Qxd293ybo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/netstandard.library/2.0.3/netstandard.library.2.0.3.nupkg"
},
{
"pname": "Newtonsoft.Json",
"version": "13.0.3",
"hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg"
},
{
"pname": "NuGet.Common",
"version": "6.7.1",
"hash": "sha256-tT/cPycNmd922tJgxcFaSMGb1/1DLANkcfWvecViVHE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.common/6.7.1/nuget.common.6.7.1.nupkg"
},
{
"pname": "NuGet.Configuration",
"version": "6.7.1",
"hash": "sha256-AC8U1AGOOjdurvRojCYYcvlRFFPvNoq6MpDYCPphJcY=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.configuration/6.7.1/nuget.configuration.6.7.1.nupkg"
},
{
"pname": "NuGet.Frameworks",
"version": "6.7.1",
"hash": "sha256-fUz6jD/5Z233gWhk5AUGmi4OLvaF8G/CYfzHKWJIluc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.frameworks/6.7.1/nuget.frameworks.6.7.1.nupkg"
},
{
"pname": "NuGet.Packaging",
"version": "6.7.1",
"hash": "sha256-Dj7ueW+wDq75H/ArDZywEADTY8ubA7k2Bdi8YxPkluo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.packaging/6.7.1/nuget.packaging.6.7.1.nupkg"
},
{
"pname": "NuGet.Protocol",
"version": "6.7.1",
"hash": "sha256-XA9xoymLSlXbqHv+aaheg2KabyvWJskk+nlTEu6btD8=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.protocol/6.7.1/nuget.protocol.6.7.1.nupkg"
},
{
"pname": "NuGet.Versioning",
"version": "6.7.1",
"hash": "sha256-tpGqYtuaH8pdC2GYGAec+7db3DfsAxq1o5xzRx33uaQ=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/nuget.versioning/6.7.1/nuget.versioning.6.7.1.nupkg"
},
{
"pname": "PowerArgs",
"version": "3.6.0",
"hash": "sha256-EOh5M64sOT8lzlIJLmgoIE6grq7FMjh0TU5d0iUlq+c=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/powerargs/3.6.0/powerargs.3.6.0.nupkg"
},
{
"pname": "ReferenceTrimmer",
"version": "3.3.11",
"hash": "sha256-r+7dehH64aAzicFT/BkLMZcuSEtaS3g/nFmjvv0OJXc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/referencetrimmer/3.3.11/referencetrimmer.3.3.11.nupkg"
},
{
"pname": "System.Buffers",
"version": "4.4.0",
"hash": "sha256-KTxAhYawFG2V5VX1jw3pzx3IrQXRgn1TsvgjPgxAbqA=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.buffers/4.4.0/system.buffers.4.4.0.nupkg"
},
{
"pname": "System.Buffers",
"version": "4.5.1",
"hash": "sha256-wws90sfi9M7kuCPWkv1CEYMJtCqx9QB/kj0ymlsNaxI=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.buffers/4.5.1/system.buffers.4.5.1.nupkg"
},
{
"pname": "System.Collections.Immutable",
"version": "8.0.0",
"hash": "sha256-F7OVjKNwpqbUh8lTidbqJWYi476nsq9n+6k0+QVRo3w=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.collections.immutable/8.0.0/system.collections.immutable.8.0.0.nupkg"
},
{
"pname": "System.Configuration.ConfigurationManager",
"version": "6.0.0",
"hash": "sha256-fPV668Cfi+8pNWrvGAarF4fewdPVEDwlJWvJk0y+Cms=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.configuration.configurationmanager/6.0.0/system.configuration.configurationmanager.6.0.0.nupkg"
},
{
"pname": "System.Diagnostics.DiagnosticSource",
"version": "5.0.0",
"hash": "sha256-6mW3N6FvcdNH/pB58pl+pFSCGWgyaP4hfVtC/SMWDV4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.diagnostics.diagnosticsource/5.0.0/system.diagnostics.diagnosticsource.5.0.0.nupkg"
},
{
"pname": "System.Diagnostics.DiagnosticSource",
"version": "6.0.0",
"hash": "sha256-RY9uWSPdK2fgSwlj1OHBGBVo3ZvGQgBJNzAsS5OGMWc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.diagnostics.diagnosticsource/6.0.0/system.diagnostics.diagnosticsource.6.0.0.nupkg"
},
{
"pname": "System.Diagnostics.DiagnosticSource",
"version": "6.0.1",
"hash": "sha256-Xi8wrUjVlioz//TPQjFHqcV/QGhTqnTfUcltsNlcCJ4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.diagnostics.diagnosticsource/6.0.1/system.diagnostics.diagnosticsource.6.0.1.nupkg"
},
{
"pname": "System.Diagnostics.EventLog",
"version": "6.0.0",
"hash": "sha256-zUXIQtAFKbiUMKCrXzO4mOTD5EUphZzghBYKXprowSM=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.diagnostics.eventlog/6.0.0/system.diagnostics.eventlog.6.0.0.nupkg"
},
{
"pname": "System.Drawing.Common",
"version": "6.0.0",
"hash": "sha256-/9EaAbEeOjELRSMZaImS1O8FmUe8j4WuFUw1VOrPyAo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.drawing.common/6.0.0/system.drawing.common.6.0.0.nupkg"
},
{
"pname": "System.Formats.Asn1",
"version": "6.0.1",
"hash": "sha256-gfGxcaWpVO92BJrl24pXi09KSgW2rSy3HGv0+V8hGgo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.formats.asn1/6.0.1/system.formats.asn1.6.0.1.nupkg"
},
{
"pname": "System.IO.FileSystem.AccessControl",
"version": "5.0.0",
"hash": "sha256-c9MlDKJfj63YRvl7brRBNs59olrmbL+G1A6oTS8ytEc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.io.filesystem.accesscontrol/5.0.0/system.io.filesystem.accesscontrol.5.0.0.nupkg"
},
{
"pname": "System.Memory",
"version": "4.5.0",
"hash": "sha256-YOz1pCR4RpP1ywYoJsgXnVlzsWtC2uYKQJTg0NnFXtE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.memory/4.5.0/system.memory.4.5.0.nupkg"
},
{
"pname": "System.Memory",
"version": "4.5.4",
"hash": "sha256-3sCEfzO4gj5CYGctl9ZXQRRhwAraMQfse7yzKoRe65E=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.memory/4.5.4/system.memory.4.5.4.nupkg"
},
{
"pname": "System.Numerics.Vectors",
"version": "4.4.0",
"hash": "sha256-auXQK2flL/JpnB/rEcAcUm4vYMCYMEMiWOCAlIaqu2U=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.numerics.vectors/4.4.0/system.numerics.vectors.4.4.0.nupkg"
},
{
"pname": "System.Reflection.Metadata",
"version": "1.6.0",
"hash": "sha256-JJfgaPav7UfEh4yRAQdGhLZF1brr0tUWPl6qmfNWq/E=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.reflection.metadata/1.6.0/system.reflection.metadata.1.6.0.nupkg"
},
{
"pname": "System.Reflection.Metadata",
"version": "8.0.0",
"hash": "sha256-dQGC30JauIDWNWXMrSNOJncVa1umR1sijazYwUDdSIE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.reflection.metadata/8.0.0/system.reflection.metadata.8.0.0.nupkg"
},
{
"pname": "System.Runtime.CompilerServices.Unsafe",
"version": "4.5.0",
"hash": "sha256-g9jIdQtXSAhY+ezQtYNgHEUoQR3HzznHs3JMzD9bip4=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.runtime.compilerservices.unsafe/4.5.0/system.runtime.compilerservices.unsafe.4.5.0.nupkg"
},
{
"pname": "System.Runtime.CompilerServices.Unsafe",
"version": "4.5.3",
"hash": "sha256-lnZMUqRO4RYRUeSO8HSJ9yBHqFHLVbmenwHWkIU20ak=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.runtime.compilerservices.unsafe/4.5.3/system.runtime.compilerservices.unsafe.4.5.3.nupkg"
},
{
"pname": "System.Runtime.CompilerServices.Unsafe",
"version": "6.0.0",
"hash": "sha256-bEG1PnDp7uKYz/OgLOWs3RWwQSVYm+AnPwVmAmcgp2I=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg"
},
{
"pname": "System.Security.AccessControl",
"version": "5.0.0",
"hash": "sha256-ueSG+Yn82evxyGBnE49N4D+ngODDXgornlBtQ3Omw54=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.accesscontrol/5.0.0/system.security.accesscontrol.5.0.0.nupkg"
},
{
"pname": "System.Security.AccessControl",
"version": "6.0.0",
"hash": "sha256-qOyWEBbNr3EjyS+etFG8/zMbuPjA+O+di717JP9Cxyg=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.accesscontrol/6.0.0/system.security.accesscontrol.6.0.0.nupkg"
},
{
"pname": "System.Security.Cryptography.Pkcs",
"version": "6.0.4",
"hash": "sha256-2e0aRybote+OR66bHaNiYpF//4fCiaO3zbR2e9GABUI=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.cryptography.pkcs/6.0.4/system.security.cryptography.pkcs.6.0.4.nupkg"
},
{
"pname": "System.Security.Cryptography.ProtectedData",
"version": "4.4.0",
"hash": "sha256-Ri53QmFX8I8UH0x4PikQ1ZA07ZSnBUXStd5rBfGWFOE=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.cryptography.protecteddata/4.4.0/system.security.cryptography.protecteddata.4.4.0.nupkg"
},
{
"pname": "System.Security.Cryptography.ProtectedData",
"version": "4.5.0",
"hash": "sha256-Z+X1Z2lErLL7Ynt2jFszku6/IgrngO3V1bSfZTBiFIc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.cryptography.protecteddata/4.5.0/system.security.cryptography.protecteddata.4.5.0.nupkg"
},
{
"pname": "System.Security.Cryptography.ProtectedData",
"version": "6.0.0",
"hash": "sha256-Wi9I9NbZlpQDXgS7Kl06RIFxY/9674S7hKiYw5EabRY=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.cryptography.protecteddata/6.0.0/system.security.cryptography.protecteddata.6.0.0.nupkg"
},
{
"pname": "System.Security.Permissions",
"version": "6.0.0",
"hash": "sha256-/MMvtFWGN/vOQfjXdOhet1gsnMgh6lh5DCHimVsnVEs=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.permissions/6.0.0/system.security.permissions.6.0.0.nupkg"
},
{
"pname": "System.Security.Principal.Windows",
"version": "5.0.0",
"hash": "sha256-CBOQwl9veFkrKK2oU8JFFEiKIh/p+aJO+q9Tc2Q/89Y=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.security.principal.windows/5.0.0/system.security.principal.windows.5.0.0.nupkg"
},
{
"pname": "System.Text.Encodings.Web",
"version": "6.0.0",
"hash": "sha256-UemDHGFoQIG7ObQwRluhVf6AgtQikfHEoPLC6gbFyRo=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.text.encodings.web/6.0.0/system.text.encodings.web.6.0.0.nupkg"
},
{
"pname": "System.Text.Json",
"version": "6.0.10",
"hash": "sha256-UijYh0dxFjFinMPSTJob96oaRkNm+Wsa+7Ffg6mRnsc=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.text.json/6.0.10/system.text.json.6.0.10.nupkg"
},
{
"pname": "System.Windows.Extensions",
"version": "6.0.0",
"hash": "sha256-N+qg1E6FDJ9A9L50wmVt3xPQV8ZxlG1xeXgFuxO+yfM=",
"url": "https://pkgs.dev.azure.com/mseng/c86767d8-af79-4303-a7e6-21da0ba435e2/_packaging/a319f538-6c19-4e2e-9df3-0222939da271/nuget/v3/flat2/system.windows.extensions/6.0.0/system.windows.extensions.6.0.0.nupkg"
}
]

View File

@@ -0,0 +1,34 @@
{
lib,
buildDotnetModule,
dotnetCorePackages,
fetchFromGitHub,
nix-update-script,
}:
buildDotnetModule rec {
dotnet-sdk = dotnetCorePackages.sdk_8_0;
dotnet-runtime = dotnetCorePackages.runtime_8_0;
version = "1.4.1";
src = fetchFromGitHub {
owner = "microsoft";
repo = "artifacts-credprovider";
rev = "v${version}";
sha256 = "sha256-MYOl+UfRExeZsozcPJynWbx5JpYL0dxTADycAt6Wm7o=";
};
pname = "azure-artifacts-credprovider";
projectFile = "CredentialProvider.Microsoft/CredentialProvider.Microsoft.csproj";
testProjectFile = "CredentialProvider.Microsoft.Tests/CredentialProvider.Microsoft.Tests.csproj";
nugetDeps = ./deps.json;
passthru.updateScript = nix-update-script { };
patchPhase = ''
sed -i 's|<TargetFrameworks>.*</TargetFrameworks>|<TargetFramework>net8.0</TargetFramework>|' Build.props
'';
meta = {
homepage = "https://github.com/microsoft/artifacts-credprovider";
description = "Azure Artifacts Credential Provider";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ anpin ];
mainProgram = "CredentialProvider.Microsoft";
platforms = [ "x86_64-linux" ];
};
}

View File

@@ -0,0 +1,98 @@
From c12adfdefd8a091e1fa870305a3cc61de6426914 Mon Sep 17 00:00:00 2001
From: Paul Meyer <49727155+katexochen@users.noreply.github.com>
Date: Thu, 14 Dec 2023 21:16:20 +0100
Subject: [PATCH] optional immutable configuration dir
Adding the possibility to configure an immutable configuration dir via
env variable `AZURE_IMMUTABLE_DIR`. This path is used for the files
that configure the dynamic behavior of the CLI code.
An immutable session is used for these files to ensure we don't try to
write to them.
Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
---
azure/cli/core/__init__.py | 5 +++--
azure/cli/core/_session.py | 19 ++++++++++++++++---
.../cli/core/extension/dynamic_install.py | 3 ++-
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/azure/cli/core/__init__.py b/azure/cli/core/__init__.py
index d112633ec..20b6d045b 100644
--- a/azure/cli/core/__init__.py
+++ b/azure/cli/core/__init__.py
@@ -75,12 +75,13 @@ class AzCli(CLI):
self.data['query_active'] = False
azure_folder = self.config.config_dir
+ azure_immutable_folder = os.environ.get('AZURE_IMMUTABLE_DIR', azure_folder)
ensure_dir(azure_folder)
ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json'))
CONFIG.load(os.path.join(azure_folder, 'az.json'))
SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600)
- INDEX.load(os.path.join(azure_folder, 'commandIndex.json'))
- VERSIONS.load(os.path.join(azure_folder, 'versionCheck.json'))
+ INDEX.load(os.path.join(azure_immutable_folder, 'commandIndex.json'))
+ VERSIONS.load(os.path.join(azure_immutable_folder, 'versionCheck.json'))
handle_version_update()
self.cloud = get_active_cloud(self)
diff --git a/azure/cli/core/_session.py b/azure/cli/core/_session.py
index 471a0344c..acaef6fb8 100644
--- a/azure/cli/core/_session.py
+++ b/azure/cli/core/_session.py
@@ -85,6 +85,19 @@ class Session(MutableMapping):
return len(self.data)
+class ImmutableSession(Session):
+ """
+ A session that is backed by an immutable JSON file. This session is read-only.
+ """
+ def save(self):
+ if os.getenv('AZURE_IMMUTABLE_DIR'):
+ get_logger(__name__).log(logging.DEBUG,
+ "Skipping update of file %s due to immutable directory.",
+ self.filename)
+ return
+ super().save()
+
+
# ACCOUNT contains subscriptions information
ACCOUNT = Session()
@@ -95,16 +108,16 @@ CONFIG = Session()
SESSION = Session()
# INDEX contains {top-level command: [command_modules and extensions]} mapping index
-INDEX = Session()
+INDEX = ImmutableSession()
# VERSIONS provides local versions and pypi versions.
# DO NOT USE it to get the current version of azure-cli,
# it could be lagged behind and can be used to check whether
# an upgrade of azure-cli happens
-VERSIONS = Session()
+VERSIONS = ImmutableSession()
# EXT_CMD_TREE provides command to extension name mapping
-EXT_CMD_TREE = Session()
+EXT_CMD_TREE = ImmutableSession()
# CLOUD_ENDPOINTS provides endpoints/suffixes of clouds
CLOUD_ENDPOINTS = Session()
diff --git a/azure/cli/core/extension/dynamic_install.py b/azure/cli/core/extension/dynamic_install.py
index cb03980a0..29279be2b 100644
--- a/azure/cli/core/extension/dynamic_install.py
+++ b/azure/cli/core/extension/dynamic_install.py
@@ -17,7 +17,8 @@ def _get_extension_command_tree(cli_ctx):
VALID_SECOND = 3600 * 24 * 10
if not cli_ctx:
return None
- EXT_CMD_TREE.load(os.path.join(cli_ctx.config.config_dir, 'extensionCommandTree.json'), VALID_SECOND)
+ azure_immutable_folder = os.environ.get('AZURE_IMMUTABLE_DIR', cli_ctx.config.config_dir)
+ EXT_CMD_TREE.load(os.path.join(azure_immutable_folder, 'extensionCommandTree.json'), VALID_SECOND)
if not EXT_CMD_TREE.data:
import posixpath
import requests
--
2.42.0

View File

@@ -0,0 +1,121 @@
# Azure CLI
## Updating the CLI
- Update `version` and `src.hash` in package.nix
- Check out the changes made to the azure-cli [setup.py](https://github.com/Azure/azure-cli/blob/dev/src/azure-cli/setup.py) since the last release
- Try build the CLI, will likely fail with `ModuleNotFoundError`, for example
```
ModuleNotFoundError: No module named 'azure.mgmt.storage.v2023_05_01'
```
Sometimes it will also fail with other import errors.
- Check the referenced module (`azure-mgmt-storage`) in the setup.py
- Find the actual version required, for example
```
'azure-mgmt-storage==21.2.0',
```
- Update version and hash of this dependency in python-packages.nix
- Repeat until it builds
## Extensions
There are two sets of extensions:
- `extensions-generated.nix` are extensions with no external requirements, which can be regenerated running:
> nix run .#azure-cli.passthru.generate-extensions
- `extensions-manual.nix` are extensions with requirements, which need to be manually packaged and maintained.
### Adding an extension to `extensions-manual.nix`
To manually add a missing extension, first query its metadata from the extension index.
Use the following command, use the current version of azure-cli in nixpkgs as `cli-version`
and the name of the extension you want to package as `extension`:
```sh
nix run .#azure-cli.extension-tool -- \
--cli-version=2.61.0 \
--extension=azure-devops \
--init
```
The output should look something like this:
```json
{
"pname": "azure-devops",
"version": "1.0.2",
"url": "https://github.com/Azure/azure-devops-cli-extension/releases/download/20250624.2/azure_devops-1.0.2-py2.py3-none-any.whl",
"hash": "sha256-4rDeAqOnRRKMP26MJxG4u9vBuos6/SQIoVgfNbBpulk=",
"description": "Tools for managing Azure DevOps",
"license": "MIT",
"requirements": [
"distro (>=1.6.0)"
]
}
```
Based on this, you can add an attribute to `extensions-manual.nix`:
```nix
{
azure-devops = mkAzExtension {
pname = "azure-devops";
version = "1.0.2";
url = "https://github.com/Azure/azure-devops-cli-extension/releases/download/20250624.2/azure_devops-${version}-py2.py3-none-any.whl";
hash = "sha256-4rDeAqOnRRKMP26MJxG4u9vBuos6/SQIoVgfNbBpulk=";
description = "Tools for managing Azure DevOps";
propagatedBuildInputs = with python3Packages; [ distro ];
meta.maintainers = with lib.maintainers; [ katexochen ];
};
}
```
* The attribute name should be the same as `pname`.
* Replace the version in `url` with `${version}`.
* The json output `requirements` must be transformed into package `requirements`.
* If `license` is `"MIT"`, it can be left out in the nix expression, as the builder defaults to that license.
* Add yourself as maintainer in `meta.maintainers`.
### Testing extensions
You can build azure-cli with an extension on the command line by running the following command at the root of this repository:
```sh
nix build --impure --expr 'with (import ./. {}); azure-cli.withExtensions [ azure-cli.extensions.azure-devops ]'
```
Check if the desired functionality was added.
You can check if the extensions were recognized by running:
```sh
./result/bin/az extension list
```
The output should show the extension like this:
```sh
[
{
"experimental": false,
"extensionType": "whl",
"name": "azure-devops",
"path": "/nix/store/azbgnpg5nh5rb8wfvp0r9bmcx83mqrj5-azure-cli-extensions/azure-devops",
"preview": false,
"version": "1.0.0"
}
]
```
### Removing an extension
If extensions are removed upstream, an alias is added to the end of `extensions-manual.nix`
(see `# Removed extensions`). This alias should throw an error and be of similar structure as
this example:
```nix
{
blockchain = throw "The 'blockchain' extension for azure-cli was deprecated upstream"; # Added 2024-04-26
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,168 @@
# Manually packaged extensions for azure-cli
#
# Checkout ./README.md for more information.
{
config,
lib,
mkAzExtension,
mycli,
python3Packages,
autoPatchelfHook,
python3,
openssl_1_1,
}:
{
application-insights = mkAzExtension rec {
pname = "application-insights";
version = "2.0.0b1";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/application_insights-${version}-py2.py3-none-any.whl";
hash = "sha256-4akS+zbaKxFrs0x0uKP/xX28WyK5KLduOkgZaBYeANM=";
description = "Support for managing Application Insights components and querying metrics, events, and logs from such components";
propagatedBuildInputs = with python3Packages; [ isodate ];
meta.maintainers = with lib.maintainers; [ andreasvoss ];
};
azure-devops = mkAzExtension rec {
pname = "azure-devops";
version = "1.0.2";
url = "https://github.com/Azure/azure-cli-extensions/releases/download/azure-devops-${version}/azure_devops-${version}-py2.py3-none-any.whl";
hash = "sha256-4rDeAqOnRRKMP26MJxG4u9vBuos6/SQIoVgfNbBpulk=";
description = "Tools for managing Azure DevOps";
propagatedBuildInputs = with python3Packages; [ distro ];
meta.maintainers = with lib.maintainers; [ katexochen ];
};
azure-iot = mkAzExtension rec {
pname = "azure-iot";
description = "Azure IoT extension for Azure CLI";
version = "0.25.0";
url = "https://github.com/Azure/azure-iot-cli-extension/releases/download/v${version}/azure_iot-${version}-py3-none-any.whl";
hash = "sha256-fbS8B2Z++oRyUT2eEh+yVR/K6uaCVce8B2itQXfBscY=";
propagatedBuildInputs = (
with python3Packages;
[
azure-core
azure-identity
azure-iot-device
azure-mgmt-core
azure-storage-blob
jsonschema
msrest
msrestazure
packaging
tomli
tomli-w
tqdm
treelib
]
);
meta.maintainers = with lib.maintainers; [ mikut ];
};
confcom = mkAzExtension rec {
pname = "confcom";
version = "1.2.6";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/confcom-${version}-py3-none-any.whl";
hash = "sha256-kyJ4AkPcpP/10nf4whJiuraC7hn0E6iBkhRIn43E9J0=";
description = "Microsoft Azure Command-Line Tools Confidential Container Security Policy Generator Extension";
nativeBuildInputs = [ autoPatchelfHook ];
buildInputs = [ openssl_1_1 ];
propagatedBuildInputs = with python3Packages; [
pyyaml
deepdiff
docker
tqdm
];
postInstall = ''
chmod +x $out/${python3.sitePackages}/azext_confcom/bin/genpolicy-linux
'';
meta.maintainers = with lib.maintainers; [ miampf ];
};
containerapp = mkAzExtension rec {
pname = "containerapp";
version = "1.2.0b3";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/containerapp-${version}-py2.py3-none-any.whl";
hash = "sha256-UK7fbWI7NoW8sBo3OEafXX3DolFNQXhFDMHUoE1h/qA=";
description = "Microsoft Azure Command-Line Tools Containerapp Extension";
propagatedBuildInputs = with python3Packages; [
docker
pycomposefile
kubernetes
];
meta.maintainers = with lib.maintainers; [ giggio ];
};
rdbms-connect = mkAzExtension rec {
pname = "rdbms-connect";
version = "1.0.7";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/rdbms_connect-${version}-py2.py3-none-any.whl";
hash = "sha256-66mX1K1azQvbuApyKBwvVuiKCbLaqezCDdrv0lhvVD0=";
description = "Support for testing connection to Azure Database for MySQL & PostgreSQL servers";
propagatedBuildInputs =
(with python3Packages; [
pgcli
psycopg2
pymysql
setproctitle
])
++ [ mycli ];
meta.maintainers = with lib.maintainers; [ obreitwi ];
};
ssh = mkAzExtension rec {
pname = "ssh";
version = "2.0.6";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/ssh-${version}-py3-none-any.whl";
hash = "sha256-PSIGtOa91WxpzFCauZ5d5tx/ZtCRsBhbejtVfY3Bgss=";
description = "SSH into Azure VMs using RBAC and AAD OpenSSH Certificates";
propagatedBuildInputs = with python3Packages; [
oras
oschmod
];
meta = {
maintainers = with lib.maintainers; [ gordon-bp ];
changelog = "https://github.com/Azure/azure-cli-extensions/blob/ssh-${version}/src/ssh/HISTORY.md";
};
};
storage-preview = mkAzExtension rec {
pname = "storage-preview";
version = "1.0.0b7";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/storage_preview-${version}-py2.py3-none-any.whl";
hash = "sha256-wtf+4TBDzpWO55w5VXnoERAbksP2QaSc29FHL3MNOBo=";
description = "Provides a preview for upcoming storage features";
propagatedBuildInputs = with python3Packages; [ azure-core ];
meta.maintainers = with lib.maintainers; [ katexochen ];
};
vm-repair = mkAzExtension rec {
pname = "vm-repair";
version = "2.1.2";
url = "https://azcliprod.blob.core.windows.net/cli-extensions/vm_repair-${version}-py2.py3-none-any.whl";
hash = "sha256-DOuH7BG4WrhP7SQH3GInFh7DHT0qN3JhSG76EXmNn24=";
description = "Support for repairing Azure Virtual Machines";
propagatedBuildInputs = with python3Packages; [ opencensus ];
meta.maintainers = [ ];
};
}
// lib.optionalAttrs config.allowAliases {
# Removed extensions
adp = throw "The 'adp' extension for azure-cli was deprecated upstream"; # Added 2024-11-02, https://github.com/Azure/azure-cli-extensions/pull/8038
akshybrid = throw "The 'akshybrid' extension for azure-cli was removed upstream"; # https://github.com/Azure/azure-cli-extensions/pull/8955
azurestackhci = throw "The 'azurestackhci' extension for azure-cli was deprecated upstream"; # Added 2025-07-01, https://github.com/Azure/azure-cli-extensions/pull/8898
blockchain = throw "The 'blockchain' extension for azure-cli was deprecated upstream"; # Added 2024-04-26, https://github.com/Azure/azure-cli-extensions/pull/7370
compute-diagnostic-rp = throw "The 'compute-diagnostic-rp' extension for azure-cli was deprecated upstream"; # Added 2024-11-12, https://github.com/Azure/azure-cli-extensions/pull/8240
connection-monitor-preview = throw "The 'connection-monitor-preview' extension for azure-cli was deprecated upstream"; # Added 2024-11-02, https://github.com/Azure/azure-cli-extensions/pull/8194
csvmware = throw "The 'csvmware' extension for azure-cli was removed upstream"; # https://github.com/Azure/azure-cli-extensions/pull/8931
deidservice = throw "The 'deidservice' extension for azure-cli was moved under healthcareapis"; # Added 2024-11-19, https://github.com/Azure/azure-cli-extensions/pull/8224
hdinsightonaks = throw "The 'hdinsightonaks' extension for azure-cli was removed upstream"; # https://github.com/Azure/azure-cli-extensions/pull/8956
logz = throw "The 'logz' extension for azure-cli was deprecated upstream"; # Added 2024-11-02, https://github.com/Azure/azure-cli-extensions/pull/8459
pinecone = throw "The 'pinecone' extension for azure-cli was removed upstream"; # Added 2025-06-03, https://github.com/Azure/azure-cli-extensions/pull/8763
sap-hana = throw "The 'sap-hana' extension for azure-cli was deprecated upstream"; # Added 2025-07-01, https://github.com/Azure/azure-cli-extensions/pull/8904
spring = throw "The 'spring' extension for azure-cli was deprecated upstream"; # Added 2025-05-07, https://github.com/Azure/azure-cli-extensions/pull/8652
spring-cloud = throw "The 'spring-cloud' extension for azure-cli was deprecated upstream"; # Added 2025-07-01 https://github.com/Azure/azure-cli-extensions/pull/8897
weights-and-biases = throw "The 'weights-and-biases' was removed upstream"; # Added 2025-06-03, https://github.com/Azure/azure-cli-extensions/pull/8764
}

View File

@@ -0,0 +1,515 @@
#!/usr/bin/env python
import argparse
import base64
import datetime
import json
import logging
import os
import subprocess
import sys
from collections.abc import Callable
from dataclasses import asdict, dataclass, replace
from pathlib import Path
from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
from urllib.request import Request, urlopen
import git
from packaging.version import Version, parse
INDEX_URL = "https://azcliextensionsync.blob.core.windows.net/index1/index.json"
logger = logging.getLogger(__name__)
@dataclass(frozen=True)
class Ext:
pname: str
version: Version
url: str
hash: str
description: str
def _read_cached_index(path: Path) -> Tuple[datetime.datetime, Any]:
with open(path, "r") as f:
data = f.read()
j = json.loads(data)
cache_date_str = j["cache_date"]
if cache_date_str:
cache_date = datetime.datetime.fromisoformat(cache_date_str)
else:
cache_date = datetime.datetime.min
return cache_date, data
def _write_index_to_cache(data: Any, path: Path) -> None:
j = json.loads(data)
j["cache_date"] = datetime.datetime.now().isoformat()
with open(path, "w") as f:
json.dump(j, f, indent=2)
def _fetch_remote_index() -> Any:
r = Request(INDEX_URL)
with urlopen(r) as resp:
return resp.read()
def get_extension_index(cache_dir: Path) -> Any:
index_file = cache_dir / "index.json"
os.makedirs(cache_dir, exist_ok=True)
try:
index_cache_date, index_data = _read_cached_index(index_file)
except FileNotFoundError:
logger.info("index has not been cached, downloading from source")
logger.info("creating index cache in %s", index_file)
_write_index_to_cache(_fetch_remote_index(), index_file)
return get_extension_index(cache_dir)
if (
index_cache_date
and datetime.datetime.now() - index_cache_date > datetime.timedelta(days=1)
):
logger.info(
"cache is outdated (%s), refreshing",
datetime.datetime.now() - index_cache_date,
)
_write_index_to_cache(_fetch_remote_index(), index_file)
return get_extension_index(cache_dir)
logger.info("using index cache from %s", index_file)
return json.loads(index_data)
def _read_extension_set(extensions_generated: Path) -> Set[Ext]:
with open(extensions_generated, "r") as f:
data = f.read()
parsed_exts = {Ext(**json_ext) for _pname, json_ext in json.loads(data).items()}
parsed_exts_with_ver = set()
for ext in parsed_exts:
ext2 = replace(ext, version=parse(ext.version))
parsed_exts_with_ver.add(ext2)
return parsed_exts_with_ver
def _write_extension_set(extensions_generated: Path, extensions: Set[Ext]) -> None:
set_without_ver = {replace(ext, version=str(ext.version)) for ext in extensions}
ls = list(set_without_ver)
ls.sort(key=lambda e: e.pname)
with open(extensions_generated, "w") as f:
json.dump({ext.pname: asdict(ext) for ext in ls}, f, indent=2)
f.write("\n")
def _convert_hash_digest_from_hex_to_b64_sri(s: str) -> str:
try:
b = bytes.fromhex(s)
except ValueError as err:
logger.error("not a hex value: %s", str(err))
raise err
return f"sha256-{base64.b64encode(b).decode('utf-8')}"
def _commit(repo: git.Repo, message: str, files: List[Path], actor: git.Actor) -> None:
repo.index.add([str(f.resolve()) for f in files])
if repo.index.diff("HEAD"):
logger.info(f'committing to nixpkgs "{message}"')
repo.index.commit(message, author=actor, committer=actor)
else:
logger.warning("no changes in working tree to commit")
def _filter_invalid(o: Dict[str, Any]) -> bool:
if "metadata" not in o:
logger.warning("extension without metadata")
return False
metadata = o["metadata"]
if "name" not in metadata:
logger.warning("extension without name")
return False
if "version" not in metadata:
logger.warning(f"{metadata['name']} without version")
return False
if "azext.minCliCoreVersion" not in metadata:
logger.warning(
f"{metadata['name']} {metadata['version']} does not have azext.minCliCoreVersion"
)
return False
if "summary" not in metadata:
logger.info(f"{metadata['name']} {metadata['version']} without summary")
return False
if "downloadUrl" not in o:
logger.warning(f"{metadata['name']} {metadata['version']} without downloadUrl")
return False
if "sha256Digest" not in o:
logger.warning(f"{metadata['name']} {metadata['version']} without sha256Digest")
return False
return True
def _filter_compatible(o: Dict[str, Any], cli_version: Version) -> bool:
minCliVersion = parse(o["metadata"]["azext.minCliCoreVersion"])
return bool(cli_version >= minCliVersion)
def _transform_dict_to_obj(o: Dict[str, Any]) -> Ext:
m = o["metadata"]
return Ext(
pname=m["name"],
version=parse(m["version"]),
url=o["downloadUrl"],
hash=_convert_hash_digest_from_hex_to_b64_sri(o["sha256Digest"]),
description=m["summary"].rstrip("."),
)
def _get_latest_version(versions: dict) -> dict:
return max(versions, key=lambda e: parse(e["metadata"]["version"]), default=None)
def find_extension_version(
extVersions: dict,
cli_version: Version,
ext_name: Optional[str] = None,
requirements: bool = False,
) -> Optional[Dict[str, Any]]:
versions = filter(_filter_invalid, extVersions)
versions = filter(lambda v: _filter_compatible(v, cli_version), versions)
latest = _get_latest_version(versions)
if not latest:
return None
if ext_name and latest["metadata"]["name"] != ext_name:
return None
if not requirements and "run_requires" in latest["metadata"]:
return None
return latest
def find_and_transform_extension_version(
extVersions: dict,
cli_version: Version,
ext_name: Optional[str] = None,
requirements: bool = False,
) -> Optional[Ext]:
latest = find_extension_version(extVersions, cli_version, ext_name, requirements)
if not latest:
return None
return _transform_dict_to_obj(latest)
def _diff_sets(
set_local: Set[Ext], set_remote: Set[Ext]
) -> Tuple[Set[Ext], Set[Ext], Set[Tuple[Ext, Ext]]]:
local_exts = {ext.pname: ext for ext in set_local}
remote_exts = {ext.pname: ext for ext in set_remote}
only_local = local_exts.keys() - remote_exts.keys()
only_remote = remote_exts.keys() - local_exts.keys()
both = remote_exts.keys() & local_exts.keys()
return (
{local_exts[pname] for pname in only_local},
{remote_exts[pname] for pname in only_remote},
{(local_exts[pname], remote_exts[pname]) for pname in both},
)
def _filter_updated(e: Tuple[Ext, Ext]) -> bool:
prev, new = e
return prev != new
@dataclass(frozen=True)
class AttrPos:
file: str
line: int
column: int
def nix_get_value(attr_path: str) -> Optional[str]:
try:
output = (
subprocess.run(
[
"nix-instantiate",
"--eval",
"--strict",
"--json",
"-E",
f"with import ./. {{ }}; {attr_path}",
],
stdout=subprocess.PIPE,
text=True,
check=True,
)
.stdout.rstrip()
.strip('"')
)
except subprocess.CalledProcessError as e:
logger.error("failed to nix-instantiate: %s", e)
return None
return output
def nix_unsafe_get_attr_pos(attr: str, attr_path: str) -> Optional[AttrPos]:
try:
output = subprocess.run(
[
"nix-instantiate",
"--eval",
"--strict",
"--json",
"-E",
f'with import ./. {{ }}; (builtins.unsafeGetAttrPos "{attr}" {attr_path})',
],
stdout=subprocess.PIPE,
text=True,
check=True,
).stdout.rstrip()
except subprocess.CalledProcessError as e:
logger.error("failed to unsafeGetAttrPos: %s", e)
return None
if output == "null":
logger.error("failed to unsafeGetAttrPos: nix-instantiate returned 'null'")
return None
pos = json.loads(output)
return AttrPos(pos["file"], pos["line"] - 1, pos["column"])
def edit_file(file: str, rewrite: Callable[[str], str]) -> None:
with open(file, "r") as f:
lines = f.readlines()
lines = [rewrite(line) for line in lines]
with open(file, "w") as f:
f.writelines(lines)
def edit_file_at_pos(pos: AttrPos, rewrite: Callable[[str], str]) -> None:
with open(pos.file, "r") as f:
lines = f.readlines()
lines[pos.line] = rewrite(lines[pos.line])
with open(pos.file, "w") as f:
f.writelines(lines)
def read_value_at_pos(pos: AttrPos) -> str:
with open(pos.file, "r") as f:
lines = f.readlines()
return value_from_nix_line(lines[pos.line])
def value_from_nix_line(line: str) -> str:
return line.split("=")[1].strip().strip(";").strip('"')
def replace_value_in_nix_line(new: str) -> Callable[[str], str]:
return lambda line: line.replace(value_from_nix_line(line), new)
def main() -> None:
sh = logging.StreamHandler(sys.stderr)
sh.setFormatter(
logging.Formatter(
"[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(lineno)s)",
"%Y-%m-%d %H:%M:%S",
)
)
logging.basicConfig(level=logging.INFO, handlers=[sh])
parser = argparse.ArgumentParser(
prog="azure-cli.extensions-tool",
description="Script to handle Azure CLI extension updates",
)
parser.add_argument(
"--cli-version", type=str, help="version of azure-cli (required)"
)
parser.add_argument("--extension", type=str, help="name of extension to query")
parser.add_argument(
"--cache-dir",
type=Path,
help="path where to cache the extension index",
default=Path(os.getenv("XDG_CACHE_HOME", Path.home() / ".cache"))
/ "azure-cli-extensions-tool",
)
parser.add_argument(
"--requirements",
action=argparse.BooleanOptionalAction,
help="whether to list extensions that have requirements",
)
parser.add_argument(
"--commit",
action=argparse.BooleanOptionalAction,
help="whether to commit changes to git",
)
parser.add_argument(
"--init",
action=argparse.BooleanOptionalAction,
help="whether you want to init a new extension",
)
args = parser.parse_args()
cli_version = parse(args.cli_version)
repo = git.Repo(Path(".").resolve(), search_parent_directories=True)
# Workaround for https://github.com/gitpython-developers/GitPython/issues/1923
author = repo.config_reader().get_value("user", "name").lstrip('"').rstrip('"')
email = repo.config_reader().get_value("user", "email").lstrip('"').rstrip('"')
actor = git.Actor(author, email)
index = get_extension_index(args.cache_dir)
assert index["formatVersion"] == "1" # only support formatVersion 1
extensions_remote = index["extensions"]
# init just prints the json of the extension version that matches the cli version.
if args.init:
if not args.extension:
logger.error("extension name is required for --init")
exit(1)
for ext_name, ext_versions in extensions_remote.items():
if ext_name != args.extension:
continue
ext = find_extension_version(
ext_versions,
cli_version,
args.extension,
requirements=True,
)
break
if not ext:
logger.error(f"Extension {args.extension} not found in index")
exit(1)
ext_translated = {
"pname": ext["metadata"]["name"],
"version": ext["metadata"]["version"],
"url": ext["downloadUrl"],
"hash": _convert_hash_digest_from_hex_to_b64_sri(ext["sha256Digest"]),
"description": ext["metadata"]["summary"].rstrip("."),
"license": ext["metadata"]["license"],
"requirements": ext["metadata"]["run_requires"][0]["requires"],
}
print(json.dumps(ext_translated, indent=2))
return
if args.extension:
logger.info(f"updating extension: {args.extension}")
ext = Optional[Ext]
for _ext_name, extension in extensions_remote.items():
extension = find_and_transform_extension_version(
extension, cli_version, args.extension, requirements=True
)
if extension:
ext = extension
break
if not ext:
logger.error(f"Extension {args.extension} not found in index")
exit(1)
version_pos = nix_unsafe_get_attr_pos(
"version", f"azure-cli-extensions.{ext.pname}"
)
if not version_pos:
logger.error(
f"no position for attribute 'version' found on attribute path {ext.pname}"
)
exit(1)
version = read_value_at_pos(version_pos)
current_version = parse(version)
if ext.version == current_version:
logger.info(
f"no update needed for {ext.pname}, latest version is {ext.version}"
)
return
logger.info("updated extensions:")
logger.info(f" {ext.pname} {current_version} -> {ext.version}")
edit_file_at_pos(version_pos, replace_value_in_nix_line(str(ext.version)))
current_hash = nix_get_value(f"azure-cli-extensions.{ext.pname}.src.outputHash")
if not current_hash:
logger.error(
f"no attribute 'src.outputHash' found on attribute path {ext.pname}"
)
exit(1)
edit_file(version_pos.file, lambda line: line.replace(current_hash, ext.hash))
if args.commit:
commit_msg = (
f"azure-cli-extensions.{ext.pname}: {current_version} -> {ext.version}"
)
_commit(repo, commit_msg, [Path(version_pos.file)], actor)
return
logger.info("updating generated extension set")
extensions_remote_filtered = set()
for _ext_name, extension in extensions_remote.items():
extension = find_and_transform_extension_version(
extension, cli_version, args.extension
)
if extension:
extensions_remote_filtered.add(extension)
extension_file = (
Path(repo.working_dir) / "pkgs/by-name/az/azure-cli/extensions-generated.json"
)
extensions_local = _read_extension_set(extension_file)
extensions_local_filtered = set()
if args.extension:
extensions_local_filtered = filter(
lambda ext: args.extension == ext.pname, extensions_local
)
else:
extensions_local_filtered = extensions_local
removed, init, updated = _diff_sets(
extensions_local_filtered, extensions_remote_filtered
)
updated = set(filter(_filter_updated, updated))
logger.info("initialized extensions:")
for ext in init:
logger.info(f" {ext.pname} {ext.version}")
logger.info("removed extensions:")
for ext in removed:
logger.info(f" {ext.pname} {ext.version}")
logger.info("updated extensions:")
for prev, new in updated:
logger.info(f" {prev.pname} {prev.version} -> {new.version}")
for ext in init:
extensions_local.add(ext)
commit_msg = f"azure-cli-extensions.{ext.pname}: init at {ext.version}"
_write_extension_set(extension_file, extensions_local)
if args.commit:
_commit(repo, commit_msg, [extension_file], actor)
for prev, new in updated:
extensions_local.remove(prev)
extensions_local.add(new)
commit_msg = (
f"azure-cli-extensions.{prev.pname}: {prev.version} -> {new.version}"
)
_write_extension_set(extension_file, extensions_local)
if args.commit:
_commit(repo, commit_msg, [extension_file], actor)
for ext in removed:
extensions_local.remove(ext)
# TODO: Add additional check why this is removed
# TODO: Add an alias to extensions manual?
commit_msg = f"azure-cli-extensions.{ext.pname}: remove"
_write_extension_set(extension_file, extensions_local)
if args.commit:
_commit(repo, commit_msg, [extension_file], actor)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,486 @@
{
lib,
callPackage,
callPackages,
stdenvNoCC,
fetchurl,
fetchFromGitHub,
runCommand,
installShellFiles,
python3,
writeShellScriptBin,
black,
isort,
mypy,
makeWrapper,
# Whether to include patches that enable placing certain behavior-defining
# configuration files in the Nix store.
withImmutableConfig ? true,
# List of extensions/plugins to include.
withExtensions ? [ ],
azure-cli,
}:
let
version = "2.77.0";
src = fetchFromGitHub {
name = "azure-cli-${version}-src";
owner = "Azure";
repo = "azure-cli";
tag = "azure-cli-${version}";
hash = "sha256-+AvfZIeGxQ+27gpg1y3fMMN7fBP4ATXr7By+dJpux3k=";
};
# put packages that needs to be overridden in the py package scope
py = callPackage ./python-packages.nix { inherit src version python3; };
# Builder for Azure CLI extensions. Extensions are Python wheels that
# outside of nix would be fetched by the CLI itself from various sources.
mkAzExtension =
{
pname,
version,
url,
hash,
description,
...
}@args:
let
self = python3.pkgs.buildPythonPackage (
{
format = "wheel";
src = fetchurl { inherit url hash; };
passthru = {
updateScript = extensionUpdateScript { inherit pname; };
tests.azWithExtension = testAzWithExts [ self ];
}
// args.passthru or { };
meta = {
inherit description;
inherit (azure-cli.meta) platforms maintainers;
homepage = "https://github.com/Azure/azure-cli-extensions";
changelog = "https://github.com/Azure/azure-cli-extensions/blob/main/src/${pname}/HISTORY.rst";
license = lib.licenses.mit;
sourceProvenance = [ lib.sourceTypes.fromSource ];
}
// args.meta or { };
}
// (removeAttrs args [
"url"
"hash"
"description"
"passthru"
"meta"
])
);
in
self;
# Update script for azure cli extensions. Currently only works for manual extensions.
extensionUpdateScript =
{ pname }:
[
"${lib.getExe azure-cli.extensions-tool}"
"--cli-version"
"${azure-cli.version}"
"--extension"
"${pname}"
];
# Test that the Azure CLI can be built with the given extensions, and that
# the extensions are recognized by the CLI and listed in the output.
testAzWithExts =
extensions:
let
extensionNames = map (ext: ext.pname) extensions;
az = (azure-cli.withExtensions extensions);
in
runCommand "test-az-with-extensions" { } ''
export HOME=$TMPDIR
${lib.getExe az} extension list > $out
for ext in ${lib.concatStringsSep " " extensionNames}; do
if ! grep -q $ext $out; then
echo "Extension $ext not found in list"
exit 1
fi
done
'';
extensions-generated = lib.mapAttrs (
name: ext: mkAzExtension (ext // { passthru.updateScript = [ ]; })
) (builtins.fromJSON (builtins.readFile ./extensions-generated.json));
extensions-manual = callPackages ./extensions-manual.nix {
inherit mkAzExtension;
python3Packages = python3.pkgs;
};
extensions = extensions-generated // extensions-manual;
extensionDir = stdenvNoCC.mkDerivation {
name = "azure-cli-extensions";
dontUnpack = true;
installPhase =
let
namePaths = map (p: "${p.pname},${p}/${python3.sitePackages}") withExtensions;
in
''
for line in ${lib.concatStringsSep " " namePaths}; do
name=$(echo $line | cut -d',' -f1)
path=$(echo $line | cut -d',' -f2)
mkdir -p $out/$name
for f in $(ls $path); do
ln -s $path/$f $out/$name/$f
done
done
'';
};
in
py.pkgs.toPythonApplication (
py.pkgs.buildAzureCliPackage rec {
pname = "azure-cli";
inherit version src;
format = "setuptools";
sourceRoot = "${src.name}/src/azure-cli";
nativeBuildInputs = [
installShellFiles
py.pkgs.argcomplete
];
# Dependencies from:
# https://github.com/Azure/azure-cli/blob/azure-cli-2.77.0/src/azure-cli/setup.py#L52
# Please, keep ordered by upstream file order. It facilitates reviews.
propagatedBuildInputs =
with py.pkgs;
[
antlr4-python3-runtime
azure-appconfiguration
azure-batch
azure-cli-core
azure-cosmos
azure-data-tables
azure-datalake-store
azure-keyvault-administration
azure-keyvault-certificates
azure-keyvault-keys
azure-keyvault-secrets
azure-keyvault-securitydomain
azure-mgmt-advisor
azure-mgmt-apimanagement
azure-mgmt-appconfiguration
azure-mgmt-appcontainers
azure-mgmt-applicationinsights
azure-mgmt-authorization
azure-mgmt-batchai
azure-mgmt-batch
azure-mgmt-billing
azure-mgmt-botservice
azure-mgmt-cdn
azure-mgmt-cognitiveservices
azure-mgmt-compute
azure-mgmt-containerinstance
azure-mgmt-containerregistry
azure-mgmt-containerservice
azure-mgmt-cosmosdb
azure-mgmt-datalake-store
azure-mgmt-datamigration
azure-mgmt-eventgrid
azure-mgmt-eventhub
azure-mgmt-extendedlocation
azure-mgmt-hdinsight
azure-mgmt-imagebuilder
azure-mgmt-iotcentral
azure-mgmt-iothub
azure-mgmt-iothubprovisioningservices
azure-mgmt-keyvault
azure-mgmt-loganalytics
azure-mgmt-managementgroups
azure-mgmt-maps
azure-mgmt-marketplaceordering
azure-mgmt-media
azure-mgmt-monitor
azure-mgmt-msi
azure-mgmt-netapp
azure-mgmt-policyinsights
azure-mgmt-postgresqlflexibleservers
azure-mgmt-privatedns
azure-mgmt-rdbms
azure-mgmt-mysqlflexibleservers
azure-mgmt-recoveryservicesbackup
azure-mgmt-recoveryservices
azure-mgmt-redhatopenshift
azure-mgmt-redis
azure-mgmt-resource-all
# Added through azure-mgmt-resource-all package
# azure-mgmt-resource
# azure-mgmt-resource-deployments
# azure-mgmt-resource-deploymentscripts
# azure-mgmt-resource-deploymentstacks
# azure-mgmt-resource-templatespecs
azure-mgmt-search
azure-mgmt-security
azure-mgmt-servicebus
azure-mgmt-servicefabricmanagedclusters
azure-mgmt-servicelinker
azure-mgmt-servicefabric
azure-mgmt-signalr
azure-mgmt-sqlvirtualmachine
azure-mgmt-sql
azure-mgmt-storage
azure-mgmt-synapse
azure-mgmt-trafficmanager
azure-mgmt-web
azure-monitor-query
azure-multiapi-storage
azure-storage-common
azure-synapse-accesscontrol
azure-synapse-artifacts
azure-synapse-managedprivateendpoints
azure-synapse-spark
chardet
colorama
]
++ lib.optional stdenv.hostPlatform.isLinux distro
++ [
fabric
javaproperties
jsondiff
packaging
paramiko
pycomposefile
pygithub
pynacl
scp
semver
six
sshtunnel
tabulate
urllib3
websocket-client
xmltodict
# Other dependencies
pyopenssl # Used at: https://github.com/Azure/azure-cli/blob/azure-cli-2.62.0/src/azure-cli/azure/cli/command_modules/servicefabric/custom.py#L11
setuptools # ModuleNotFoundError: No module named 'pkg_resources'
]
++ lib.optionals (!withImmutableConfig) [
# pip is required to install extensions locally, but it's not needed if
# we're using the default immutable configuration.
pip
]
++ lib.concatMap (extension: extension.propagatedBuildInputs) withExtensions;
postInstall =
lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) ''
installShellCompletion --cmd az \
--bash <(register-python-argcomplete az --shell bash) \
--zsh <(register-python-argcomplete az --shell zsh) \
--fish <(register-python-argcomplete az --shell fish)
''
+ lib.optionalString withImmutableConfig ''
export HOME=$TMPDIR
$out/bin/az --version
mkdir -p $out/etc/azure
mv $TMPDIR/.azure/commandIndex.json $out/etc/azure/commandIndex.json
mv $TMPDIR/.azure/versionCheck.json $out/etc/azure/versionCheck.json
''
+ ''
# remove garbage
rm $out/bin/az.bat
rm $out/bin/az.completion.sh
rm $out/bin/azps.ps1
'';
# wrap the executable so that the python packages are available
# it's just a shebang script which calls `python -m azure.cli "$@"`
postFixup = ''
wrapProgram $out/bin/az \
''
+ lib.optionalString withImmutableConfig ''
--set AZURE_IMMUTABLE_DIR $out/etc/azure \
''
+ lib.optionalString (withExtensions != [ ]) ''
--set AZURE_EXTENSION_DIR ${extensionDir} \
''
+ ''
--set PYTHONPATH "${python3.pkgs.makePythonPath propagatedBuildInputs}:$out/${python3.sitePackages}"
'';
doInstallCheck = true;
installCheckPhase = ''
export HOME=$TMPDIR
$out/bin/az --version
$out/bin/az self-test
'';
# ensure these namespaces are able to be accessed
pythonImportsCheck = [
"azure.batch"
"azure.cli.core"
"azure.cli.telemetry"
"azure.cosmos"
"azure.datalake.store"
"azure.keyvault"
"azure.mgmt.advisor"
"azure.mgmt.apimanagement"
"azure.mgmt.applicationinsights"
"azure.mgmt.appconfiguration"
"azure.mgmt.appcontainers"
"azure.mgmt.authorization"
"azure.mgmt.batch"
"azure.mgmt.batchai"
"azure.mgmt.billing"
"azure.mgmt.botservice"
"azure.mgmt.cdn"
"azure.mgmt.cognitiveservices"
"azure.mgmt.compute"
"azure.mgmt.containerinstance"
"azure.mgmt.containerregistry"
"azure.mgmt.containerservice"
"azure.mgmt.cosmosdb"
"azure.mgmt.datamigration"
"azure.mgmt.eventgrid"
"azure.mgmt.eventhub"
"azure.mgmt.hdinsight"
"azure.mgmt.imagebuilder"
"azure.mgmt.iotcentral"
"azure.mgmt.iothub"
"azure.mgmt.iothubprovisioningservices"
"azure.mgmt.keyvault"
"azure.mgmt.loganalytics"
"azure.mgmt.managementgroups"
"azure.mgmt.maps"
"azure.mgmt.marketplaceordering"
"azure.mgmt.media"
"azure.mgmt.monitor"
"azure.mgmt.msi"
"azure.mgmt.netapp"
"azure.mgmt.policyinsights"
"azure.mgmt.privatedns"
"azure.mgmt.rdbms"
"azure.mgmt.recoveryservices"
"azure.mgmt.recoveryservicesbackup"
"azure.mgmt.redis"
"azure.mgmt.resource"
"azure.mgmt.resource.deployments"
"azure.mgmt.resource.deployments.models"
"azure.mgmt.search"
"azure.mgmt.security"
"azure.mgmt.servicebus"
"azure.mgmt.servicefabric"
"azure.mgmt.signalr"
"azure.mgmt.sql"
"azure.mgmt.sqlvirtualmachine"
"azure.mgmt.storage"
"azure.mgmt.trafficmanager"
"azure.mgmt.web"
"azure.monitor.query"
"azure.storage.common"
];
passthru = {
inherit extensions;
withExtensions = extensions: azure-cli.override { withExtensions = extensions; };
tests = {
azWithExtensions = testAzWithExts (
with azure-cli.extensions;
[
aks-preview
azure-devops
rdbms-connect
]
);
# Test the package builds with mutable config.
# TODO: Maybe we can install an extension from local python wheel to
# check mutable extension install still works.
azWithMutableConfig =
let
az = azure-cli.override { withImmutableConfig = false; };
in
runCommand "test-az-with-immutable-config" { } ''
export HOME=$TMPDIR
${lib.getExe az} --version || exit 1
touch $out
'';
# Ensure the extensions-tool builds.
inherit (azure-cli) extensions-tool;
};
generate-extensions = writeShellScriptBin "${pname}-update-extensions" ''
${lib.getExe azure-cli.extensions-tool} --cli-version ${azure-cli.version} --commit
'';
extensions-tool =
runCommand "azure-cli-extensions-tool"
{
src = ./extensions-tool.py;
nativeBuildInputs = [
black
isort
makeWrapper
mypy
python3
];
meta.mainProgram = "extensions-tool";
}
''
black --check --diff $src
isort --profile=black --check --diff $src
install -Dm755 $src $out/bin/extensions-tool
patchShebangs --build $out
wrapProgram $out/bin/extensions-tool \
--set PYTHONPATH "${
python3.pkgs.makePythonPath (
with python3.pkgs;
[
packaging
semver
gitpython
]
)
}"
'';
};
meta = {
homepage = "https://github.com/Azure/azure-cli";
description = "Next generation multi-platform command line experience for Azure";
downloadPage = "https://github.com/Azure/azure-cli/releases/tag/azure-cli-${version}";
longDescription = ''
The Azure Command-Line Interface (CLI) is a cross-platform
command-line tool to connect to Azure and execute administrative
commands on Azure resources. It allows the execution of commands
through a terminal using interactive command-line prompts or a script.
`azure-cli` has extension support. For example, to install the `aks-preview` extension, use
```nix
environment.systemPackages = [
(azure-cli.withExtensions [ azure-cli.extensions.aks-preview ])
];
```
To make the `azure-cli` immutable and prevent clashes in case `azure-cli` is also installed via other package managers,
some configuration files were moved into the derivation. This can be disabled by overriding `withImmutableConfig = false`
when building `azure-cli`.
'';
changelog = "https://github.com/MicrosoftDocs/azure-docs-cli/blob/main/docs-ref-conceptual/release-notes-azure-cli.md";
sourceProvenance = [ lib.sourceTypes.fromSource ];
license = lib.licenses.mit;
mainProgram = "az";
maintainers = with lib.maintainers; [ katexochen ];
teams = [ lib.teams.stridtech ];
platforms = lib.platforms.all;
};
}
)

View File

@@ -0,0 +1,265 @@
{
lib,
stdenv,
python3,
fetchPypi,
src,
version,
}:
let
buildAzureCliPackage = with py.pkgs; buildPythonPackage;
overrideAzureMgmtPackage =
package: version: extension: hash:
package.overridePythonAttrs (oldAttrs: {
inherit version;
src = fetchPypi {
inherit (oldAttrs) pname;
inherit version hash extension;
};
});
py = python3.override {
self = py;
packageOverrides = self: super: {
inherit buildAzureCliPackage;
# core and the actual application are highly coupled
azure-cli-core = buildAzureCliPackage {
pname = "azure-cli-core";
format = "setuptools";
inherit version src;
sourceRoot = "${src.name}/src/azure-cli-core";
patches = [
# Adding the possibility to configure an immutable configuration dir via `AZURE_IMMUTABLE_DIR`.
# This enables us to place configuration files that alter the behavior of the CLI in the Nix store.
#
# This is a downstream patch without an commit or PR upstream.
# There is an issue to discuss possible solutions upstream:
# https://github.com/Azure/azure-cli/issues/28093
./0001-optional-immutable-configuration-dir.patch
];
propagatedBuildInputs =
with self;
[
argcomplete
azure-cli-telemetry
azure-common
azure-mgmt-core
cryptography
distro
humanfriendly
jmespath
knack
microsoft-security-utilities-secret-masker
msal-extensions
msal
msrestazure
packaging
paramiko
pkginfo
psutil
py-deviceid
pyjwt
pyopenssl
requests
]
++ requests.optional-dependencies.socks;
nativeCheckInputs = with self; [ pytest ];
doCheck = stdenv.hostPlatform.isLinux;
# ignore tests that does network call, or assume powershell
checkPhase = ''
python -c 'import azure.common; print(azure.common)'
PYTHONPATH=$PWD:${src}/src/azure-cli-testsdk:$PYTHONPATH HOME=$TMPDIR pytest \
azure/cli/core/tests \
--ignore=azure/cli/core/tests/test_profile.py \
--ignore=azure/cli/core/tests/test_generic_update.py \
--ignore=azure/cli/core/tests/test_cloud.py \
--ignore=azure/cli/core/tests/test_extension.py \
--ignore=azure/cli/core/tests/test_util.py \
--ignore=azure/cli/core/tests/test_argcomplete.py \
-k 'not metadata_url and not test_send_raw_requests and not test_format_styled_text_legacy_powershell'
'';
pythonImportsCheck = [
"azure.cli.telemetry"
"azure.cli.core"
];
meta.downloadPage = "https://github.com/Azure/azure-cli/tree/azure-cli-${version}/src/azure-cli-core/";
};
azure-cli-telemetry = buildAzureCliPackage {
pname = "azure-cli-telemetry";
version = "1.1.0";
format = "setuptools";
inherit src;
sourceRoot = "${src.name}/src/azure-cli-telemetry";
propagatedBuildInputs = with self; [
applicationinsights
portalocker
];
nativeCheckInputs = with self; [ pytest ];
# ignore flaky test
checkPhase = ''
cd azure
HOME=$TMPDIR pytest -k 'not test_create_telemetry_note_file_from_scratch'
'';
meta.downloadPage = "https://github.com/Azure/azure-cli/blob/azure-cli-${version}/src/azure-cli-telemetry/";
};
# Error loading command module 'batch': No module named 'azure.batch._model_base'
azure-batch = super.azure-batch.overridePythonAttrs (attrs: rec {
version = "15.0.0b1";
src = fetchPypi {
pname = "azure_batch"; # Different from src.pname in the original package.
inherit version;
hash = "sha256-373dFY/63lIZPj5NhsmW6nI2/9JpWkNzT65eBal04u0=";
};
});
azure-mgmt-billing =
(overrideAzureMgmtPackage super.azure-mgmt-billing "6.0.0" "zip"
"sha256-1PXFpBiKRW/h6zK2xF9VyiBpx0vkHrdpIYQLOfL1wH8="
).overridePythonAttrs
(attrs: {
propagatedBuildInputs = attrs.propagatedBuildInputs or [ ] ++ [
self.msrest
self.msrestazure
];
});
# AttributeError: type object 'CustomDomainsOperations' has no attribute 'disable_custom_https'
azure-mgmt-cdn =
overrideAzureMgmtPackage super.azure-mgmt-cdn "12.0.0" "zip"
"sha256-t8PuIYkjS0r1Gs4pJJJ8X9cz8950imQtbVBABnyMnd0=";
# ImportError: cannot import name 'ConfigMap' from 'azure.mgmt.containerinstance.models'
azure-mgmt-containerinstance = super.azure-mgmt-containerinstance.overridePythonAttrs (attrs: rec {
version = "10.2.0b1";
src = fetchPypi {
pname = "azure_mgmt_containerinstance"; # Different from src.pname in the original package.
inherit version;
hash = "sha256-v0u3e9ZoEnDdCnM6o6fD7N+suo5hbTqMO5jM6cSMx8A=";
};
});
# ImportError: cannot import name 'ResourceSku' from 'azure.mgmt.eventgrid.models'
azure-mgmt-eventgrid =
overrideAzureMgmtPackage super.azure-mgmt-eventgrid "10.2.0b2" "zip"
"sha256-QcHY1wCwQyVOEdUi06/wEa4dqJH5Ccd33gJ1Sju0qZA=";
# ValueError: The operation 'azure.mgmt.hdinsight.operations#ExtensionsOperations.get_azure_monitor_agent_status' is invalid.
azure-mgmt-hdinsight =
overrideAzureMgmtPackage super.azure-mgmt-hdinsight "9.0.0b3" "tar.gz"
"sha256-clSeCP8+7T1uI4Nec+zhzDK980C9+JGeeJFsNSwgD2Q=";
# ValueError: The operation 'azure.mgmt.media.operations#MediaservicesOperations.create_or_update' is invalid.
azure-mgmt-media =
overrideAzureMgmtPackage super.azure-mgmt-media "9.0.0" "zip"
"sha256-TI7l8sSQ2QUgPqiE3Cu/F67Wna+KHbQS3fuIjOb95ZM=";
# ModuleNotFoundError: No module named 'azure.mgmt.monitor.operations'
azure-mgmt-monitor = super.azure-mgmt-monitor.overridePythonAttrs (attrs: rec {
version = "7.0.0b1";
src = fetchPypi {
pname = "azure_mgmt_monitor"; # Different from src.pname in the original package.
inherit version;
hash = "sha256-WR4YZMw4njklpARkujsRnd6nwTZ8M5vXFcy9AfL9oj4=";
};
});
# AttributeError: module 'azure.mgmt.rdbms.postgresql_flexibleservers.operations' has no attribute 'BackupsOperations'
azure-mgmt-rdbms =
overrideAzureMgmtPackage super.azure-mgmt-rdbms "10.2.0b17" "tar.gz"
"sha256-1nnRkyr4Im79B7DDqGz/FOrPAToFaGhE+a7r5bZMuOQ=";
# ModuleNotFoundError: No module named 'azure.mgmt.redhatopenshift.v2023_11_22'
azure-mgmt-redhatopenshift =
overrideAzureMgmtPackage super.azure-mgmt-redhatopenshift "1.5.0" "tar.gz"
"sha256-Uft0KcOciKzJ+ic9n4nxkwNSBmKZam19jhEiqY9fJSc=";
# azure.mgmt.resource will shadow the other azure.mgmt.resource.* packages unless we merge them together
azure-mgmt-resource-all = py.pkgs.buildPythonPackage {
pname = "azure-mgmt-resource-all";
inherit version;
format = "other"; # we're not building from sdist/wheel
src = py.pkgs.azure-mgmt-resource.src;
# No real build, just symlink all site-packages into one dir
installPhase = ''
runHook preInstall
mkdir -p $out/${py.sitePackages}
for pkg in ${
lib.concatStringsSep " " (
map (p: "${p}") [
py.pkgs.azure-mgmt-resource
py.pkgs.azure-mgmt-resource-deployments
py.pkgs.azure-mgmt-resource-deploymentscripts
py.pkgs.azure-mgmt-resource-deploymentstacks
py.pkgs.azure-mgmt-resource-templatespecs
]
)
}; do
# Copy recursively, keep symlinks, skip duplicates silently
cp -rs --no-preserve=mode "$pkg/${py.sitePackages}/." "$out/${py.sitePackages}/" || true
done
runHook postInstall
'';
doCheck = false;
};
# ImportError: cannot import name 'IPRule' from 'azure.mgmt.signalr.models'
azure-mgmt-signalr =
overrideAzureMgmtPackage super.azure-mgmt-signalr "2.0.0b2" "tar.gz"
"sha256-05PUV8ouAKq/xhGxVEWIzDop0a7WDTV5mGVSC4sv9P4=";
# ImportError: cannot import name 'AdvancedThreatProtectionName' from 'azure.mgmt.sql.models'
azure-mgmt-sql = super.azure-mgmt-sql.overridePythonAttrs (attrs: rec {
version = "4.0.0b20";
src = fetchPypi {
pname = "azure_mgmt_sql"; # Different from src.pname in the original package.
inherit version;
hash = "sha256-mphqHUet4AhmL8aUoRbrGOjbookCHR3Ex+unpOq7aQM=";
};
});
# ValueError: The operation 'azure.mgmt.sqlvirtualmachine.operations#SqlVirtualMachinesOperations.begin_create_or_update' is invalid.
azure-mgmt-sqlvirtualmachine =
overrideAzureMgmtPackage super.azure-mgmt-sqlvirtualmachine "1.0.0b5" "zip"
"sha256-ZFgJflgynRSxo+B+Vso4eX1JheWlDQjfJ9QmupXypMc=";
# ModuleNotFoundError: No module named 'azure.mgmt.synapse.operations._kusto_pool_attached_database_configurations_operations'
azure-mgmt-synapse =
overrideAzureMgmtPackage super.azure-mgmt-synapse "2.1.0b5" "zip"
"sha256-5E6Yf1GgNyNVjd+SeFDbhDxnOA6fOAG6oojxtCP4m+k=";
# Observed error during runtime:
# AttributeError: Can't get attribute 'NormalizedResponse' on <module 'msal.throttled_http_client' from
# '/nix/store/xxx-python3.12-msal-1.32.0/lib/python3.12/site-packages/msal/throttled_http_client.py'>.
# Did you mean: '_msal_public_app_kwargs'?
msal =
overrideAzureMgmtPackage super.msal "1.32.3" "tar.gz"
"sha256-XuoDhonHilpwyo7L4SRUWLVahXvQlu+2mJxpuhWYXTU=";
};
};
in
py

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,61 @@
{
lib,
stdenv,
fetchFromGitHub,
buildDotnetModule,
buildGoModule,
dotnetCorePackages,
versionCheckHook,
}:
let
version = "4.0.7030";
src = fetchFromGitHub {
owner = "Azure";
repo = "azure-functions-core-tools";
tag = version;
hash = "sha256-ibbXUg2VHN2yJk6qwLwDbxcO0XArFFb7XMUCfKH0Tkw=";
};
gozip = buildGoModule {
pname = "gozip";
inherit version;
src = src + "/tools/go/gozip";
vendorHash = null;
};
in
buildDotnetModule {
pname = "azure-functions-core-tools";
inherit src version;
dotnet-sdk = dotnetCorePackages.sdk_8_0;
dotnet-runtime = dotnetCorePackages.sdk_8_0;
dotnetFlags = [ "-p:TargetFramework=net8.0" ];
nugetDeps = ./deps.json;
useDotnetFromEnv = true;
executables = [ "func" ];
postPatch = ''
substituteInPlace src/Azure.Functions.Cli/Common/CommandChecker.cs \
--replace-fail "CheckExitCode(\"/bin/bash" "CheckExitCode(\"${stdenv.shell}"
'';
postInstall = ''
mkdir -p $out/bin
ln -s ${gozip}/bin/gozip $out/bin/gozip
'';
meta = {
homepage = "https://github.com/Azure/azure-functions-core-tools";
description = "Command line tools for Azure Functions";
mainProgram = "func";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
mdarocha
detegr
];
platforms = [
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
};
}

View File

@@ -0,0 +1,102 @@
{
lib,
stdenv,
fetchurl,
autoPatchelfHook,
curl,
icu70,
libkrb5,
lttng-ust,
openssl,
zlib,
azure-static-sites-client,
# "latest", "stable" or "backup"
versionFlavor ? "stable",
}:
let
versions = lib.importJSON ./versions.json;
flavor = lib.head (lib.filter (x: x.version == versionFlavor) versions);
fetchBinary =
runtimeId:
fetchurl {
url = flavor.files.${runtimeId}.url;
sha256 = flavor.files.${runtimeId}.sha;
};
sources = {
"x86_64-linux" = fetchBinary "linux-x64";
"x86_64-darwin" = fetchBinary "osx-x64";
};
in
stdenv.mkDerivation {
pname = "StaticSitesClient-${versionFlavor}";
version = flavor.buildId;
src =
sources.${stdenv.hostPlatform.system}
or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
nativeBuildInputs = [
autoPatchelfHook
];
buildInputs = [
curl
icu70
libkrb5
lttng-ust
openssl
(lib.getLib stdenv.cc.cc)
zlib
];
dontUnpack = true;
dontBuild = true;
installPhase = ''
runHook preInstall
install -m755 "$src" -D "$out/bin/StaticSitesClient"
for icu_lib in 'icui18n' 'icuuc' 'icudata'; do
patchelf --add-needed "lib''${icu_lib}.so.${lib.head (lib.splitVersion (lib.getVersion icu70.name))}" "$out/bin/StaticSitesClient"
done
patchelf --add-needed 'libgssapi_krb5.so' \
--add-needed 'liblttng-ust.so' \
--add-needed 'libssl.so.3' \
"$out/bin/StaticSitesClient"
runHook postInstall
'';
# Stripping kills the binary
dontStrip = true;
# Just make sure the binary executes successfully
doInstallCheck = true;
installCheckPhase = ''
runHook preInstallCheck
$out/bin/StaticSitesClient version
runHook postInstallCheck
'';
passthru = {
# Create tests for all flavors
tests = lib.genAttrs (map (x: x.version) versions) (
versionFlavor: azure-static-sites-client.override { inherit versionFlavor; }
);
updateScript = ./update.sh;
};
meta = {
description = "Azure static sites client";
homepage = "https://github.com/Azure/static-web-apps-cli";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.unfree;
mainProgram = "StaticSitesClient";
maintainers = with lib.maintainers; [ veehaitch ];
platforms = [ "x86_64-linux" ];
};
}

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl
set -euo pipefail
dirname="$(dirname "$0")"
curl -O --silent --output-dir "$dirname" 'https://swalocaldeploy.azureedge.net/downloads/versions.json'
echo "" >> "$dirname/versions.json"

View File

@@ -0,0 +1,60 @@
[
{
"version": "latest",
"buildId": "694f9b1be52be00b1b4cde5deb5bb4994154f9b6",
"publishDate": "2025-07-21T07:21:52.0658686Z",
"files": {
"linux-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/linux/StaticSitesClient",
"sha": "3fdeaa74fff3e8136fa95f994761559b48900f094214dc81c98f825de506a398"
},
"win-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/windows/StaticSitesClient.exe",
"sha": "f55f0efd65b1b401b4ee0197143da4e16c87ff7f541b2bf5b094fcc8e3443dfe"
},
"osx-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/macOS/StaticSitesClient",
"sha": "0412544daa8522aafeaa495e03fad3a6530b5e121959624de4c115f76018cae9"
}
}
},
{
"version": "stable",
"buildId": "694f9b1be52be00b1b4cde5deb5bb4994154f9b6",
"publishDate": "2025-07-21T07:21:52.0658686Z",
"files": {
"linux-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/linux/StaticSitesClient",
"sha": "3fdeaa74fff3e8136fa95f994761559b48900f094214dc81c98f825de506a398"
},
"win-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/windows/StaticSitesClient.exe",
"sha": "f55f0efd65b1b401b4ee0197143da4e16c87ff7f541b2bf5b094fcc8e3443dfe"
},
"osx-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/694f9b1be52be00b1b4cde5deb5bb4994154f9b6/macOS/StaticSitesClient",
"sha": "0412544daa8522aafeaa495e03fad3a6530b5e121959624de4c115f76018cae9"
}
}
},
{
"version": "backup",
"buildId": "53b7d0e07fe5c34bf68929fab92f87ce910288dc",
"publishDate": "2024-10-24T20:43:23.5850191Z",
"files": {
"linux-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/53b7d0e07fe5c34bf68929fab92f87ce910288dc/linux/StaticSitesClient",
"sha": "66fca4b42cbc64d451097931ca4ed75649233bd818f97f0c3f6d1d75cff61413"
},
"win-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/53b7d0e07fe5c34bf68929fab92f87ce910288dc/windows/StaticSitesClient.exe",
"sha": "fc949fb19d29cce1e8b74cf1e2c31706426d46b3e03d830d601524cee63faa0b"
},
"osx-x64": {
"url": "https://swalocaldeployv2-bndtgugjgqc3dhdx.b01.azurefd.net/downloads/53b7d0e07fe5c34bf68929fab92f87ce910288dc/macOS/StaticSitesClient",
"sha": "89ec4fe61217325e89ed849a564ffe4cc51b61c325abdca82e8e441a4959ec92"
}
}
}
]

View File

@@ -0,0 +1,35 @@
{
lib,
fetchFromGitHub,
buildGoModule,
}:
buildGoModule rec {
pname = "azure-storage-azcopy";
version = "10.30.1";
src = fetchFromGitHub {
owner = "Azure";
repo = "azure-storage-azcopy";
tag = "v${version}";
hash = "sha256-lHgOQ9Ff3RSi49peDETx98QMnLrANfBvkAx8c+ubiG0=";
};
subPackages = [ "." ];
vendorHash = "sha256-WTsngwFA4J1CuAePKwPew/FZNrHJ9IoDCQFv63WAlzo=";
doCheck = false;
postInstall = ''
ln -rs "$out/bin/azure-storage-azcopy" "$out/bin/azcopy"
'';
meta = {
description = "New Azure Storage data transfer utility - AzCopy v10";
homepage = "https://github.com/Azure/azure-storage-azcopy";
changelog = "https://github.com/Azure/azure-storage-azcopy/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ kashw2 ];
};
}

View File

@@ -0,0 +1,223 @@
{
stdenv,
lib,
fetchurl,
copyDesktopItems,
makeDesktopItem,
makeWrapper,
alsa-lib,
at-spi2-atk,
at-spi2-core,
cairo,
cups,
curl,
dbus,
expat,
gdk-pixbuf,
glib,
gnutar,
gtk3,
icu,
libdrm,
libunwind,
libuuid,
libxkbcommon,
libgbm,
nspr,
nss,
openssl,
pango,
systemd,
wrapGAppsHook3,
xorg,
zlib,
}:
# from justinwoo/azuredatastudio-nix
# https://github.com/justinwoo/azuredatastudio-nix/blob/537c48aa3981cd1a82d5d6e508ab7e7393b3d7c8/default.nix
let
desktopItem = makeDesktopItem {
name = "azuredatastudio";
desktopName = "Azure Data Studio";
comment = "Data Management Tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.";
genericName = "Text Editor";
exec = "azuredatastudio --no-sandbox --unity-launch %F";
icon = "azuredatastudio";
startupNotify = true;
startupWMClass = "azuredatastudio";
categories = [
"Utility"
"TextEditor"
"Development"
"IDE"
];
mimeTypes = [
"text/plain"
"inode/directory"
"application/x-azuredatastudio-workspace"
];
keywords = [ "azuredatastudio" ];
actions.new-empty-window = {
name = "New Empty Window";
exec = "azuredatastudio --no-sandbox --new-window %F";
icon = "azuredatastudio";
};
};
urlHandlerDesktopItem = makeDesktopItem {
name = "azuredatastudio-url-handler";
desktopName = "Azure Data Studio - URL Handler";
comment = "Azure Data Studio";
genericName = "Text Editor";
exec = "azuredatastudio --no-sandbox --open-url %U";
icon = "azuredatastudio";
startupNotify = true;
startupWMClass = "azuredatastudio";
categories = [
"Utility"
"TextEditor"
"Development"
"IDE"
];
mimeTypes = [ "x-scheme-handler/azuredatastudio" ];
keywords = [ "azuredatastudio" ];
noDisplay = true;
};
in
stdenv.mkDerivation rec {
pname = "azuredatastudio";
version = "1.49.1";
desktopItems = [
desktopItem
urlHandlerDesktopItem
];
src = fetchurl {
name = "${pname}-${version}.tar.gz";
# Url can be found at: https://github.com/microsoft/azuredatastudio/releases
# In the downloads table for Linux .tar.gz
# This will give a go.microsoft redirect link, I think it's better to use the direct link to which the redirect points.
# You can do so by using curl: curl -I <go.microsoft link>
url = "https://download.microsoft.com/download/7/8/3/783c2037-8607-43c4-a593-0936e965d38b/azuredatastudio-linux-1.49.1.tar.gz";
sha256 = "sha256-0LCrRUTTe8UEDgtGLvxVQL8pA5dwA6SvZEZSDILr7jo=";
};
nativeBuildInputs = [
makeWrapper
copyDesktopItems
wrapGAppsHook3
];
buildInputs = [
libuuid
at-spi2-core
at-spi2-atk
];
installPhase = ''
runHook preInstall
mkdir -p $out/share/pixmaps
cp ${targetPath}/resources/app/resources/linux/code.png $out/share/pixmaps/azuredatastudio.png
runHook postInstall
'';
# change this to azuredatastudio-insiders for insiders releases
edition = "azuredatastudio";
targetPath = "$out/${edition}";
unpackPhase = ''
mkdir -p ${targetPath}
${gnutar}/bin/tar xf $src --strip 1 -C ${targetPath}
'';
sqltoolsserviceRpath = lib.makeLibraryPath [
stdenv.cc.cc
libunwind
libuuid
icu
openssl
zlib
curl
];
# this will most likely need to be updated when azuredatastudio's version changes
sqltoolsservicePath = "${targetPath}/resources/app/extensions/mssql/sqltoolsservice/Linux/5.0.20240724.1";
rpath = lib.concatStringsSep ":" [
(lib.makeLibraryPath [
alsa-lib
at-spi2-atk
cairo
cups
dbus
expat
gdk-pixbuf
glib
gtk3
libgbm
nss
nspr
libdrm
xorg.libX11
xorg.libxcb
xorg.libXcomposite
xorg.libXdamage
xorg.libXext
xorg.libXfixes
xorg.libXrandr
xorg.libxshmfence
libxkbcommon
xorg.libxkbfile
pango
stdenv.cc.cc
systemd
])
targetPath
sqltoolsserviceRpath
];
preFixup = ''
fix_sqltoolsservice()
{
mv ${sqltoolsservicePath}/$1 ${sqltoolsservicePath}/$1_old
patchelf \
--set-interpreter "${stdenv.cc.bintools.dynamicLinker}" \
${sqltoolsservicePath}/$1_old
makeWrapper \
${sqltoolsservicePath}/$1_old \
${sqltoolsservicePath}/$1 \
--set LD_LIBRARY_PATH ${sqltoolsserviceRpath}
}
fix_sqltoolsservice MicrosoftSqlToolsServiceLayer
fix_sqltoolsservice MicrosoftSqlToolsCredentials
fix_sqltoolsservice SqlToolsResourceProviderService
patchelf \
--set-interpreter "${stdenv.cc.bintools.dynamicLinker}" \
${targetPath}/${edition}
mkdir -p $out/bin
makeWrapper \
${targetPath}/bin/${edition} \
$out/bin/azuredatastudio \
--set LD_LIBRARY_PATH ${rpath}
'';
meta = {
maintainers = with lib.maintainers; [ xavierzwirtz ];
description = "Data management tool that enables working with SQL Server, Azure SQL DB and SQL DW";
homepage = "https://docs.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.unfreeRedistributable;
platforms = [ "x86_64-linux" ];
mainProgram = "azuredatastudio";
};
}

View File

@@ -0,0 +1,43 @@
{
lib,
stdenv,
buildGoModule,
fetchFromGitHub,
versionCheckHook,
}:
buildGoModule rec {
pname = "azurehound";
version = "2.7.1";
src = fetchFromGitHub {
owner = "SpecterOps";
repo = "AzureHound";
tag = "v${version}";
hash = "sha256-fCs9C86IO1aTzBFZiA7SaVlk0Zdm/ItWtLhE8Ii2W0A=";
};
vendorHash = "sha256-ScFHEIarDvxd9R6eUONdECmtK+5aZRdo71khljLz8c4=";
nativeInstallCheckInputs = [ versionCheckHook ];
ldflags = [
"-s"
"-w"
"-X=github.com/bloodhoundad/azurehound/v2/constants.Version=${version}"
];
doInstallCheck = true;
versionCheckProgramArg = "--version";
meta = {
description = "Azure Data Exporter for BloodHound";
homepage = "https://github.com/SpecterOps/AzureHound";
changelog = "https://github.com/SpecterOps/AzureHound/releases/tag/v${version}";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "azurehound";
broken = stdenv.hostPlatform.isDarwin;
};
}

View File

@@ -0,0 +1,44 @@
{
lib,
stdenv,
buildNpmPackage,
clang_20,
fetchFromGitHub,
libsecret,
nodejs,
pkg-config,
}:
buildNpmPackage (finalAttrs: {
pname = "azurite";
version = "3.35.0";
src = fetchFromGitHub {
owner = "Azure";
repo = "Azurite";
rev = "v${finalAttrs.version}";
hash = "sha256-sVYiHQJ3nR5vM+oPAHzr/MjuNBMY14afqCHpw32WCiQ=";
};
npmDepsHash = "sha256-UBHjb65Ud7IANsR30DokbI/16+dVjDEtfhqRPAQhGUw=";
nativeBuildInputs = [
pkg-config
nodejs.python
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ clang_20 ]; # clang_21 breaks @vscode/vsce's optional dependency keytar
buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
libsecret
];
meta = {
description = "Lightweight server clone of Azure Storage that simulates most of the commands supported by it with minimal dependencies";
homepage = "https://github.com/Azure/Azurite";
license = lib.licenses.mit;
mainProgram = "azurite";
maintainers = with lib.maintainers; [
danielalvsaaker
];
};
})