Transform CIDR IP ranges to route add rules

#!/bin/bash

# Input file containing IP ranges in CIDR notation
INPUT_FILE="ip_ranges.txt"
# Gateway to use in route commands
GATEWAY="192.168.0.1"

# Function to convert CIDR to range and generate route commands
generate_routes() {
local cidr=$1
local gateway=$2

# Extract the base IP and prefix from CIDR
local base_ip=$(echo "$cidr" | cut -d'/' -f1)
local prefix=$(echo "$cidr" | cut -d'/' -f2)

# Calculate the subnet mask
local mask=$(( 0xFFFFFFFF ^ ((1 << (32 - prefix)) - 1) ))
local netmask="$(( (mask >> 24) & 255 )).$(( (mask >> 16) & 255 )).$(( (mask >> 8) & 255 )).$(( mask & 255 ))"

echo "route add -net $base_ip netmask $netmask gw $gateway"
}

# Read input file and process each CIDR block
while read -r line; do
[[ -z "$line" || "$line" =~ ^# ]] && continue # Skip empty lines and comments
generate_routes "$line" "$GATEWAY"
done < "$INPUT_FILE"