aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/scripts/default.nix4
-rw-r--r--modules/scripts/vpn-connect.sh27
-rw-r--r--modules/scripts/vpn-disconnect.sh27
3 files changed, 46 insertions, 12 deletions
diff --git a/modules/scripts/default.nix b/modules/scripts/default.nix
index 95d9298..e541f75 100644
--- a/modules/scripts/default.nix
+++ b/modules/scripts/default.nix
@@ -65,6 +65,10 @@ let
SYSTEMD_RESOLVED = "${pkgs.openvpn}/libexec/update-systemd-resolved";
}
);
+
+ vpn-disconnect = lib.mkIf (config.tools.openvpn.enable && config.tools.fzf.enable) (
+ mkScript "vpn-disconnect" ./vpn-disconnect.sh { }
+ );
};
in
{
diff --git a/modules/scripts/vpn-connect.sh b/modules/scripts/vpn-connect.sh
index 885796a..eb7256e 100644
--- a/modules/scripts/vpn-connect.sh
+++ b/modules/scripts/vpn-connect.sh
@@ -1,10 +1,10 @@
-# Define directories
CONF_DIR="$HOME/.config/openvpn"
CREDS_DIR="$CONF_DIR/credentials"
SERVERS_DIR="$CONF_DIR/servers"
CACHE_FILE="$HOME/.cache/openvpn/last_connection"
+PID_FILE="$HOME/.cache/openvpn/vpn.pid"
+LOG_FILE="$HOME/.cache/openvpn/vpn.log"
-# Create directories
mkdir -p "$CREDS_DIR" "$SERVERS_DIR" "$(dirname "$CACHE_FILE")"
REFRESH=false
@@ -12,7 +12,7 @@ if [[ "$1" == "--refresh" || "$1" == "-r" ]]; then
REFRESH=true
fi
-# Try to load from cache
+# Load cache
if [[ "$REFRESH" == false && -f "$CACHE_FILE" ]]; then
source "$CACHE_FILE"
if [[ ! -f "$CRED" || ! -f "$SERVER" ]]; then
@@ -22,7 +22,7 @@ else
REFRESH=true
fi
-# Selection logic
+# Select if needed
if [[ "$REFRESH" == true ]]; then
CRED=$(find "$CREDS_DIR" -type f | "$FZF" --prompt="Select Credentials > ")
[ -z "$CRED" ] && exit 1
@@ -36,22 +36,25 @@ fi
echo "Connecting to $SERVER..."
-# Create a temporary config file that sudo can read
TMP_CONF=$(mktemp /tmp/vpn-config.XXXXXX)
-# Clean the config and save to the temp file
sed -e '/up \/etc\/openvpn\/update-resolv-conf/d' \
-e '/down \/etc\/openvpn\/update-resolv-conf/d' "$SERVER" > "$TMP_CONF"
-# Use a trap to ensure the temp file is deleted when the script exits
-# (even if you Ctrl+C)
-trap 'rm -f "$TMP_CONF"' EXIT
+# Run in background
+sudo -v || exit 1
-# Execute openvpn using the temporary file
-sudo "$OPENVPN" \
+nohup sudo "$OPENVPN" \
--config "$TMP_CONF" \
--auth-user-pass "$CRED" \
--script-security 2 \
--up "$SYSTEMD_RESOLVED" \
--down "$SYSTEMD_RESOLVED" \
- --down-pre
+ --down-pre \
+ > "$LOG_FILE" 2>&1 &
+
+VPN_PID=$!
+
+echo $VPN_PID > "$PID_FILE"
+echo "VPN started in background (PID: $VPN_PID)"
+echo "Logs: $LOG_FILE"
diff --git a/modules/scripts/vpn-disconnect.sh b/modules/scripts/vpn-disconnect.sh
new file mode 100644
index 0000000..ead912c
--- /dev/null
+++ b/modules/scripts/vpn-disconnect.sh
@@ -0,0 +1,27 @@
+PID_FILE="$HOME/.cache/openvpn/vpn.pid"
+
+if [[ ! -f "$PID_FILE" ]]; then
+ echo "No VPN PID file found."
+ exit 1
+fi
+
+PID=$(cat "$PID_FILE")
+
+if ps -p "$PID" > /dev/null 2>&1; then
+ echo "Stopping VPN (PID: $PID)..."
+ sudo kill "$PID"
+
+ # Wait for clean shutdown
+ sleep 2
+
+ if ps -p "$PID" > /dev/null 2>&1; then
+ echo "Force killing VPN..."
+ sudo kill -9 "$PID"
+ fi
+
+ echo "VPN disconnected."
+else
+ echo "VPN process not running."
+fi
+
+rm -f "$PID_FILE"