From a6fa6bc4763bf5f7f17c7890124a038946aedb89 Mon Sep 17 00:00:00 2001 From: Janis Date: Fri, 1 Aug 2025 00:52:44 +0200 Subject: [PATCH] update nordvpn-rofi script and dotfiles --- pkgs/dotfiles.nix | 2 +- pkgs/nordvpn-rofi.nix | 197 ++++-------------------------------------- 2 files changed, 19 insertions(+), 180 deletions(-) diff --git a/pkgs/dotfiles.nix b/pkgs/dotfiles.nix index 82e278c..0ace73b 100644 --- a/pkgs/dotfiles.nix +++ b/pkgs/dotfiles.nix @@ -4,7 +4,7 @@ src = builtins.fetchGit { url = "git@git.nirgendwo.xyz:janis/dotfiles.git"; - rev = "1af2254ee4d278305d9a8b9d6eb28a4bfc79162c"; + rev = "56cf6dd4efac92527f465a864b2b155833b364ee"; ref = "main"; }; diff --git a/pkgs/nordvpn-rofi.nix b/pkgs/nordvpn-rofi.nix index 9e5cf7d..393bcf8 100644 --- a/pkgs/nordvpn-rofi.nix +++ b/pkgs/nordvpn-rofi.nix @@ -1,181 +1,20 @@ -{lib, makeWrapper, stdenv, writeShellScriptBin, jq, rofi, nordvpn, ...}: let -nordvpn-rofi = writeShellScriptBin "nordvpn-rofi" '' -#! /bin/env bash +{writeShellApplication, dotfiles, bash, jq, rofi, nordvpn, coreutils, ...}: +writeShellApplication { + name = "nordvpn-rofi"; -is_vpn_active() { - nordvpn status | grep -e "Status: Disconnected" -} - -prettify() { - echo "$1"|sed 's/_/ /g' -} - -main="$@" -is_active=$(is_vpn_active) - -list_countries() { - nordvpn countries | tr -d '\r,-' | tr -s "[:blank:]" "\n" | sed '/^\s*$/d' | sort -} - -list_cities() { - nordvpn cities "$1" | tr -d '\r,-' | tr -s "[:blank:]" "\n" | sed '/^\s*$/d' | sort -} - -list_countries_with_cities() { - IFS=$'\n' - local countries - countries=( $(list_countries) ) - local with_cities - for c in "''${countries[@]}" - do - with_cities+=($c) - with_cities+=($(list_cities $c)) - done - - echo $with_cities -} - -print_country() { - echo -en "$(prettify $1)\0info\x1f$1\n" -} - -# $1 -> city, $2 -> country -print_city() { - echo -en "$(prettify $1)\0meta\x1f$2\x1finfo\x1f$1\n" -} - -print_countries() { - local countries - IFS=$'\n' - countries=( $(list_countries) ) - - for cunt in "''${countries[@]}" - do - print_country $cunt - done -} - -print_all() { - local countries - IFS=$'\n' - countries=( $(list_countries) ) - - for c in "''${countries[@]}" - do - print_country $c - local cities=( $(list_cities $c) ) - for b in "''${cities[@]}" - do - print_city $b $c - done - done -} - -init() { - echo -en "\0prompt\x1fNordVPN\n" - - echo -en "Show Cities\0info\x1fCITIES\n" - echo -en "Disconnect\0info\x1fDISCONNECT\n" - - print_countries -} - - -selected() { - local countries - IFS=$'\n' - countries=( $(list_countries) ) - - - case $ROFI_INFO in - "CITIES") - echo -en "\0prompt\x1fNordVPN\n" - - print_all - ;; - "DISCONNECT") - coproc( nordvpn disconnect > /dev/null 2>&1 || notify-send "NordVPN" "Failed to disconnect vpn." ) - ;; - *) - echo -en "\0prompt\x1fConnecting to $@..\n" - - - coproc ( if nordvpn connect $ROFI_INFO > /dev/null 2>&1; then notify-send "NordVPN" "Connected to $ROFI_INFO"; else notify-send "NordVPN" "Failed to connect to $ROFI_INFO"; fi; pkill -SIGRTMIN+8 waybar ) - exit 0 - ;; - esac -} - -input=$@ - -case $input in - "--connected") - $( nordvpn status | sed -rne "s/Status: ([a-z,A-Z]*)/\1/p" | grep -qe "Connected" ) - exit $? - ;; - "--status") - if $( nordvpn status | sed -rne "s/Status: ([a-z,A-Z]*)/\1/p" | grep -qe "Connected" ); - then - echo "$( nordvpn status | sed -nr -e 's/Country: ([a-z,A-Z]*)/\1/p' -e 's/City: ([a-z,A-Z]*)/\1/p' | paste - - -d / )" - else - echo "Disconnected" - fi - - exit 0 - ;; - "--status-json") - vpn_status=$(nordvpn status | sed -Ee 's/.*(Status:.*)/\1/' | sed -n '/Status.*/,$p') - tooltip=$(echo "$vpn_status" | sed -Ee \ - 's/Transfer: (.*) received, (.*) sent/Transer: \1  \2 /' | \ - sed -Ee 's/(.*): (.*)/\1:<\/b> \2/') - - (echo "$vpn_status" | sed -rne "s/Status: ([a-z,A-Z]*)/\1/p" | grep -qe "Connected") - - if [[ $? == 0 ]]; - then - text="$( echo "$vpn_status" | \ - sed -nr -e 's/Country: ([a-z,A-Z]*)/\1/p' -e 's/City: ([a-z,A-Z]*)/\1/p' | \ - paste - - -d / )" - class="connected" - jq -c -j -n --arg text "$text" --arg tooltip "$tooltip" \ - --arg class "$class" '{$text, $tooltip, $class}' - else - text="Disconnected" - class="disconnected" - jq -c -j -n --arg text "$text" --arg tooltip "$tooltip" \ - --arg class "$class" '{$text, $tooltip, $class}' - fi - - exit 0 - ;; -esac - -case $ROFI_RETV in - 0) init ;; - 1) selected $input ;; -esac -''; -in stdenv.mkDerivation { - pname = "nordvpn-rofi"; - version = "1.0"; - buildInputs = [ jq rofi nordvpn ]; - nativeBuildInputs = [ makeWrapper ]; - - src = "${nordvpn-rofi}"; - - installPhase = '' - mkdir -p $out/bin - cp ${nordvpn-rofi}/bin/nordvpn-rofi $out/bin/nordvpn-rofi - chmod +x $out/bin/nordvpn-rofi - wrapProgram $out/bin/nordvpn-rofi \ ---prefix PATH : ${jq}/bin \ ---prefix PATH : ${rofi}/bin \ ---prefix PATH : ${nordvpn}/bin - ''; - - meta = { - description = "A utility script for NordVPN and Rofi"; - license = lib.licenses.mit; - platforms = lib.platforms.linux; - }; + runtimeInputs = [ jq rofi nordvpn coreutils bash ]; + + # shellcheck errors or warnings that should be ignored: + excludeShellChecks = [ + "SC2015" # we use && true || false superfluously, but correctly. + "SC2016" # we use single quotes specifically to avoid variable expansion. + ]; + + # don't set errexit, as this script needs functions to be able to error out + bashOptions = [ + "pipefail" + "nounset" + ]; + + text = builtins.readFile "${dotfiles}/.local/bin/nordvpn-rofi.sh"; }