mirror of
https://github.com/andsyrovatko/s4k-admin-toolbox.git
synced 2026-04-21 21:58:54 +02:00
feat(network): add juniper-net-toggle.sh v1.0.0b
- add support for both interface addresses and static routes - implement dynamic CIDR mask handling (/24 to /32) - add bash strict mode for better reliability - include local README with quick start examples
This commit is contained in:
@@ -0,0 +1,41 @@
|
|||||||
|
# 🛠 Juniper Network Toggle Too
|
||||||
|
|
||||||
|
This script automates the activate / deactivate operations on Juniper JunOS devices via SSH. It intelligently distinguishes between interface addresses and static routes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🚀 Key Features
|
||||||
|
* **Dual Mode:** Detects if the target is an interface (`address`) or a static route (`route`).
|
||||||
|
* **Dynamic CIDR:** Supports masks from `/24` up to `/32`.
|
||||||
|
* **Safety First:** Runs in Bash Strict Mode (`set -uo pipefail`).
|
||||||
|
* **Dry Run Ready:** Includes a debug echo of the command before execution.
|
||||||
|
|
||||||
|
### ⚙️ Prerequisites
|
||||||
|
* **Packages:** `ipcalc`, `openssh-client`.
|
||||||
|
* **Access:** Passwordless SSH access to the Juniper host.
|
||||||
|
* **Config:** A `juniper-net-manager.conf` file defining `JUNIPER_USER`.
|
||||||
|
|
||||||
|
### 🏃 Quick Start
|
||||||
|
```bash
|
||||||
|
# Deactivate a network (Interface)
|
||||||
|
./juniper-net-toggle.sh 10.10.1.1 192.168.50.0/30 OFF
|
||||||
|
|
||||||
|
# Activate a static route
|
||||||
|
./juniper-net-toggle.sh core-router-01 185.65.200.0/24 ON
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔧 Parameters
|
||||||
|
| Argument | Description |
|
||||||
|
| :--- | :--- |
|
||||||
|
| `HOSTNAME` | Target Juniper IP or FQDN. |
|
||||||
|
| `NETWORK` | Network with CIDR (e.g., 1.1.1.0/24). |
|
||||||
|
| `ACTION` | ON (activate) or OFF (deactivate). |
|
||||||
|
|
||||||
|
### ⚠️ Troubleshooting
|
||||||
|
* **Error: Not found:** Ensure the IP and Mask match the Juniper configuration exactly as seen in show configuration.
|
||||||
|
* **Unbound variable:** Ensure all 3 arguments are provided.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ⚖️ License
|
||||||
|
MIT [LICENSE](https://github.com/andsyrovatko/s4k-admin-toolbox/blob/main/LICENSE). Free to use and modify.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# ip_manager.conf - Configuration for IPSET Management Script
|
||||||
|
|
||||||
|
# --- CREDENTIALS ---
|
||||||
|
JUNIPER_USER="your_ssh_user_here"
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# =============================================================================
|
||||||
|
# Script Name : juniper-net-toggle.sh
|
||||||
|
# Description : Activate/Deactivate Juniper network interfaces or static routes via SSH.
|
||||||
|
# Usage: : ./juniper-net-toggle.sh <HOSTNAME/HOST-IP> <NETWORK/CIDR> <ACTIONS>
|
||||||
|
# For details - see README.md
|
||||||
|
# Author : syr4ok (Andrii Syrovatko)
|
||||||
|
# Version : 1.0.0b
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# --- STRICT MODE ---
|
||||||
|
set -uo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
if [[ $# -lt 3 ]]; then
|
||||||
|
{
|
||||||
|
echo "[ERROR]: Not enough arguments!"
|
||||||
|
echo "Usage: $0 <HOSTNAME/HOST-IP> <NETWORK/CIDR> <ACTIONS>"
|
||||||
|
echo "Actions: OFF (deactivate), ON (activate)"
|
||||||
|
}
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration Loader
|
||||||
|
CONFIG_FILE="$(dirname "$0")/juniper-net-toggle.conf"
|
||||||
|
|
||||||
|
if [[ -f "$CONFIG_FILE" ]]; then
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
source "$CONFIG_FILE"
|
||||||
|
else
|
||||||
|
echo "[Error]: Configuration file not found. Create ip_manager.conf from example."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Received variables
|
||||||
|
JUNIPER_HOST="$1"
|
||||||
|
NET_TO_DISABLE="$2"
|
||||||
|
ACT="$3"
|
||||||
|
|
||||||
|
# Environment & Tools
|
||||||
|
SSH_BIN=$(which ssh 2>/dev/null || true)
|
||||||
|
IPCALC_BIN=$(command -v ipcalc)
|
||||||
|
|
||||||
|
if [[ -z "$IPCALC_BIN" ]]; then
|
||||||
|
echo "[Error]: 'ipcalc' is not installed. Run: sudo apt install ipcalc"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Logic for Dynamic Masks
|
||||||
|
# Extract CIDR mask (e.g., from 192.168.1.0/24 it gets 24)
|
||||||
|
MASK=$(echo "$NET_TO_DISABLE" | cut -d'/' -f2)
|
||||||
|
# If no mask provided, default to 32
|
||||||
|
if [[ "$NET_TO_DISABLE" == "$MASK" ]]; then
|
||||||
|
MASK=32
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clear network for static routes
|
||||||
|
NET_ONLY=$(echo "$NET_TO_DISABLE" | cut -d'/' -f1)
|
||||||
|
|
||||||
|
# Get the network/gateway address
|
||||||
|
# For /32 it's just the IP, for others it's the HostMin
|
||||||
|
if [[ "$MASK" -eq 32 ]]; then
|
||||||
|
net_to_gw_cvrt=$(echo "$NET_TO_DISABLE" | cut -d'/' -f1)
|
||||||
|
else
|
||||||
|
net_to_gw_cvrt=$($IPCALC_BIN -b "$NET_TO_DISABLE" | grep HostMin | awk '{print $NF}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[INFO]: Searching for $NET_ONLY (interface or route) on ${JUNIPER_HOST}..."
|
||||||
|
|
||||||
|
# Get config line via SSH
|
||||||
|
config_line=$($SSH_BIN -o ConnectTimeout=5 ${JUNIPER_USER}@${JUNIPER_HOST} "show configuration | display set | match \"address ${net_to_gw_cvrt}/${MASK}\"" | head -n1)
|
||||||
|
if [ -z "$config_line" ]; then
|
||||||
|
# If static route
|
||||||
|
config_line=$($SSH_BIN -o ConnectTimeout=5 "${JUNIPER_USER}@${JUNIPER_HOST}" \
|
||||||
|
"show configuration | display set | match \"route $NET_ONLY/${MASK}\"" | head -n1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$config_line" ]; then
|
||||||
|
echo "[Error]: Address for network ${NET_TO_DISABLE} not found on Juniper."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prepare commands
|
||||||
|
deactivate_cmd="${config_line/set/deactivate}"
|
||||||
|
activate_cmd="${config_line/set/activate}"
|
||||||
|
|
||||||
|
case "${ACT^^}" in # Convert to uppercase for robustness
|
||||||
|
"DELETE"|"REJECT"|"RESTRICT"|"OFF")
|
||||||
|
echo "[INFO]: Deactivating network (${NET_TO_DISABLE})..."
|
||||||
|
COMMAND="$deactivate_cmd"
|
||||||
|
MSG="Address ${NET_TO_DISABLE} deactivated!"
|
||||||
|
;;
|
||||||
|
"NEW"|"RESUME"|"ON")
|
||||||
|
echo "[INFO]: Activating network (${NET_TO_DISABLE})..."
|
||||||
|
COMMAND="$activate_cmd"
|
||||||
|
MSG="Address ${NET_TO_DISABLE} activated!"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "[!] Unsupported or unknown ACT value (${ACT})"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "$COMMAND" # DEBUG
|
||||||
|
|
||||||
|
# Execute on Juniper
|
||||||
|
ssh -tt ${JUNIPER_USER}@${JUNIPER_HOST} << EOF
|
||||||
|
configure
|
||||||
|
$COMMAND
|
||||||
|
commit
|
||||||
|
exit
|
||||||
|
exit
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "[SUCCESS] $MSG"
|
||||||
|
|
||||||
|
exit 0
|
||||||
Reference in New Issue
Block a user