diff --git a/default.nix b/default.nix index aca46ca..c7ef162 100644 --- a/default.nix +++ b/default.nix @@ -12,6 +12,8 @@ in rec { snipe-it = callPackage ./pkgs/snipe-it { }; + ykoath-tools = callPackage ./pkgs/ykoath-tools { }; + } // optionalAttrs (pkgs.system == "x86_64-linux") rec { ryzen_smu = callPackage ./pkgs/ryzen_smu { kernel = pkgs.linux; }; diff --git a/flake.nix b/flake.nix index 3be7781..651c2c8 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,7 @@ pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; }; }; }); - overlay = next: prev: + overlay = next: prev: let localPkgs = import ./. { pkgs = next; }; in { inherit (localPkgs) diff --git a/pkgs/ykoath-tools/default.nix b/pkgs/ykoath-tools/default.nix new file mode 100644 index 0000000..7233ebe --- /dev/null +++ b/pkgs/ykoath-tools/default.nix @@ -0,0 +1,42 @@ +{ stdenv, lib, writeScript, xclip, wl-clipboard, yubikey-manager }: + +let + ykoath = writeScript "ykoath" '' + #!${stdenv.shell} + ${lib.getBin yubikey-manager}/bin/ykman oath accounts code $@ + ''; + ykclip = writeScript "ykclip" '' + #!${stdenv.shell} + X_SELECTION=''${YKCLIP_SELECTION:-clipboard} + if [ -n "$WAYLAND_DISPLAY" ]; then + cmd="${lib.getBin wl-clipboard}/bin/wl-copy" + if [ "$X_SELECTION" = primary ]; then + cmd="$cmd --primary" + fi + elif [ -n "$DISPLAY" ]; then + cmd="${lib.getBin xclip}/bin/xclip -selection '$X_SELECTION'" + else + echo "Error: No graphical session detected"; exit 1 + fi + otp=$(${lib.getBin yubikey-manager}/bin/ykman oath accounts code -s $@) + rv=$? + if [ "$rv" -eq 0 ] && [ -n "$otp" ]; then + printf "%s" "$otp" | $cmd + else + echo "Error: Receiving OTP"; exit 1 + fi + ''; +in stdenv.mkDerivation { + pname = "ykoath-tools"; + version = "1"; + buildCommand = '' + mkdir -p "$out/bin" + ln -s ${ykoath} "$out/bin/ykoath" + ln -s ${ykclip} "$out/bin/ykclip" + ''; + meta = with lib; { + description = "Make using OATH with yubikeys from the command-line easier."; + maintainers = [ maintainers.spacefrogg ]; + license = licenses.gpl3; + }; +}