diff --git a/nixosModules/clanCore/packages.nix b/nixosModules/clanCore/packages.nix index 1e8579da4..e8fe4d553 100644 --- a/nixosModules/clanCore/packages.nix +++ b/nixosModules/clanCore/packages.nix @@ -1,13 +1,23 @@ -{ pkgs, ... }: { - environment.systemPackages = [ - # essential debugging tools for networked services - pkgs.dnsutils - pkgs.tcpdump - pkgs.curl - pkgs.jq - pkgs.htop - # needed to deploy via `clan machines update` if the flake has a git input - pkgs.gitMinimal - ]; + pkgs, + lib, + config, + ... +}: +{ + environment.systemPackages = + [ + # essential debugging tools for networked services + pkgs.dnsutils + pkgs.tcpdump + pkgs.curl + pkgs.jq + pkgs.htop + + pkgs.nixos-facter # for `clan machines update-hardware-config --backend nixos-facter` + ] + ++ lib.optional (lib.versionAtLeast config.nix.package.version "2.24") + # needed to deploy via `clan machines update` if the flake has a git input + # newer version of nix do have `libgit2` + pkgs.gitMinimal; } diff --git a/pkgs/clan-cli/clan_cli/cmd.py b/pkgs/clan-cli/clan_cli/cmd.py index 70b31ec73..e070172eb 100644 --- a/pkgs/clan-cli/clan_cli/cmd.py +++ b/pkgs/clan-cli/clan_cli/cmd.py @@ -9,7 +9,7 @@ import sys import timeit import weakref from collections.abc import Iterator -from contextlib import contextmanager +from contextlib import ExitStack, contextmanager from enum import Enum from pathlib import Path from typing import IO, Any @@ -86,6 +86,23 @@ def terminate_process_group(process: subprocess.Popen) -> Iterator[None]: pass +@contextmanager +def terminate_process(process: subprocess.Popen) -> Iterator[None]: + try: + yield + finally: + try: + process.terminate() + try: + with contextlib.suppress(subprocess.TimeoutExpired): + # give the process time to terminate + process.wait(3) + finally: + process.kill() + except ProcessLookupError: + pass + + class TimeTable: """ This class is used to store the time taken by each command @@ -146,20 +163,24 @@ def run( logger.debug(f"$: {shlex.join(cmd)} \nCaller: {get_caller()}") start = timeit.default_timer() - # Start the subprocess - with ( - subprocess.Popen( - cmd, - cwd=str(cwd), - env=env, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - start_new_session=not needs_user_terminal, - ) as process, - terminate_process_group(process) - if not needs_user_terminal - else contextlib.suppress(), # NOQA: B022 - ): + with ExitStack() as stack: + process = stack.enter_context( + subprocess.Popen( + cmd, + cwd=str(cwd), + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + start_new_session=not needs_user_terminal, + ) + ) + + if needs_user_terminal: + # we didn't allocat a new session, so we can't terminate the process group + stack.enter_context(terminate_process(process)) + else: + stack.enter_context(terminate_process_group(process)) + stdout_buf, stderr_buf = handle_output(process, log) if input: diff --git a/pkgs/flake-module.nix b/pkgs/flake-module.nix index 713062ae3..07e855938 100644 --- a/pkgs/flake-module.nix +++ b/pkgs/flake-module.nix @@ -1,4 +1,4 @@ -{ inputs, lib, ... }: +{ inputs, ... }: { imports = [ @@ -22,20 +22,16 @@ perSystem = { config, pkgs, ... }: { - packages = - { - tea-create-pr = pkgs.callPackage ./tea-create-pr { formatter = config.treefmt.build.wrapper; }; - zerotier-members = pkgs.callPackage ./zerotier-members { }; - zt-tcp-relay = pkgs.callPackage ./zt-tcp-relay { }; - moonlight-sunshine-accept = pkgs.callPackage ./moonlight-sunshine-accept { }; - merge-after-ci = pkgs.callPackage ./merge-after-ci { inherit (config.packages) tea-create-pr; }; - pending-reviews = pkgs.callPackage ./pending-reviews { }; - editor = pkgs.callPackage ./editor/clan-edit-codium.nix { }; - classgen = pkgs.callPackage ./classgen { }; - zerotierone = pkgs.callPackage ./zerotierone { }; - } - // lib.optionalAttrs pkgs.stdenv.isLinux { - nixos-facter = pkgs.callPackage ./nixos-facter { }; - }; + packages = { + tea-create-pr = pkgs.callPackage ./tea-create-pr { formatter = config.treefmt.build.wrapper; }; + zerotier-members = pkgs.callPackage ./zerotier-members { }; + zt-tcp-relay = pkgs.callPackage ./zt-tcp-relay { }; + moonlight-sunshine-accept = pkgs.callPackage ./moonlight-sunshine-accept { }; + merge-after-ci = pkgs.callPackage ./merge-after-ci { inherit (config.packages) tea-create-pr; }; + pending-reviews = pkgs.callPackage ./pending-reviews { }; + editor = pkgs.callPackage ./editor/clan-edit-codium.nix { }; + classgen = pkgs.callPackage ./classgen { }; + zerotierone = pkgs.callPackage ./zerotierone { }; + }; }; } diff --git a/pkgs/nixos-facter/default.nix b/pkgs/nixos-facter/default.nix deleted file mode 100644 index 935f7241a..000000000 --- a/pkgs/nixos-facter/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ - buildGoModule, - hwinfo, - libusb1, - util-linux, - pciutils, - pkg-config, - lib, - fetchFromGitHub, - stdenv, -}: -let - hwinfo' = hwinfo.overrideAttrs { - src = fetchFromGitHub { - owner = "numtide"; - repo = "hwinfo"; - rev = "6944732764aecd701f807cd746ff605d2b749549"; - hash = "sha256-onJQPVp12hJig56KoXTvps7DzO/7/VBbD5auzxMLNTY="; - }; - }; -in -buildGoModule rec { - pname = "nixos-facter"; - version = "0-unstable-2024-08-26"; - - src = fetchFromGitHub { - owner = "numtide"; - repo = "nixos-facter"; - rev = "30a01d3771d4d3d7f44e3f33d589f2c389ebcc63"; - hash = "sha256-mbfYJbrqCASsNW6mMtyf4aIpzME9jgaNToWyI0OlPt8="; - }; - - vendorHash = "sha256-8yQO7topYvXL6bP0oSVN1rApiPjse4Q2bjFNM5jVl8c="; - - buildInputs = [ - libusb1 - hwinfo' - ]; - - nativeBuildInputs = [ pkg-config ]; - - runtimeInputs = [ - libusb1 - util-linux - pciutils - ]; - - ldflags = [ - "-s" - "-w" - "-X github.com/numtide/nixos-facter/pkg/build.Name=nixos-facter" - "-X github.com/numtide/nixos-facter/pkg/build.Version=v${version}" - "-X github.com/numtide/nixos-facter/pkg/build.System=${stdenv.hostPlatform.system}" - ]; - - meta = with lib; { - description = "nixos-facter: declarative nixos-generate-config"; - homepage = "https://github.com/numtide/nixos-facter"; - license = licenses.mit; - platforms = platforms.linux; - mainProgram = "nixos-facter"; - }; -}