commit a78bc9450b3653f3c68f6a858514744acc7f3b2f Author: Maƫl Gramain Date: Sat Aug 19 23:38:21 2023 +0200 upload script diff --git a/autogre.sh b/autogre.sh new file mode 100755 index 0000000..db33c3f --- /dev/null +++ b/autogre.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +# This script is used to automatically generate the GRE tunnel between two hosts based on FQDN + +# CONSTANTS +# If not defined in the environment, the following variables will be used + +if [[ -z $GRE_TUNNEL_NAME ]]; then + GRE_TUNNEL_NAME="gre1" + GRE_TUNNEL_NAME="gre1" + GRE_LOCAL_IP="45.13.XX.XX" + GRE_LAN_IP_4="192.168.100.1/24" + GRE_LAN_IP_6="2a0e:fd45:2a0c::1/64" +fi + +FQDN=$1 # The remote host FQDN + +# FUNCTIONS +function usage() { + echo "Usage: $0 " + exit 1 +} + +function check_root() { + if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root" + exit 1 + fi +} + + +function check_fqdn() { + if [[ -z $FQDN ]]; then + echo "Please provide the remote host FQDN" + usage + fi +} + +function get_current_ip() { + # Get the dst IP on the GRE tunnel + CURRENT_IP=$(ip addr show $GRE_TUNNEL_NAME | grep -Po 'peer \K[\d.]+') + if [[ -z $CURRENT_IP ]]; then + echo "GRE tunnel is down or not configured" + # Create the GRE tunnel + CURRENT_IP="" + fi +} + +function get_remote_ip() { + # Get the remote IP on the GRE tunnel + REMOTE_IP=$(dig +short $FQDN | tail -n1) + if [[ -z $REMOTE_IP ]]; then + echo "Failed to resolve the remote host FQDN ($FQDN)" + exit 1 + fi +} + +function check_gre_tunnel() { + # Check if the GRE tunnel is up + if [[ -z $CURRENT_IP ]]; then + echo "GRE tunnel is down or not configured" + # Return 1 to indicate that the GRE tunnel is down + return 1 + fi +} + +function configure_gre_tunnel() { + # Configure the GRE tunnel + # Delete the GRE tunnel if it exists + echo "LOG - $(date) - REMOTE IP: $REMOTE_IP" + echo "ip link del $GRE_TUNNEL_NAME" + ip link del $GRE_TUNNEL_NAME + # Create the GRE tunnel + echo "ip link add $GRE_TUNNEL_NAME type gre remote $REMOTE_IP local $GRE_LOCAL_IP ttl 255" + ip link add $GRE_TUNNEL_NAME type gre remote $REMOTE_IP local $GRE_LOCAL_IP ttl 255 + echo "ip link set $GRE_TUNNEL_NAME up" + ip link set $GRE_TUNNEL_NAME up + echo "ip addr add $GRE_LAN_IP_4 dev $GRE_TUNNEL_NAME" + ip addr add $GRE_LAN_IP_4 dev $GRE_TUNNEL_NAME + echo "ip addr add $GRE_LAN_IP_6 dev $GRE_TUNNEL_NAME" + ip addr add $GRE_LAN_IP_6 dev $GRE_TUNNEL_NAME +} + +function check_remote_ip() { + # Check if the remote IP is the same as the one configured on the GRE tunnel + if [[ $REMOTE_IP == $CURRENT_IP ]]; then + echo "GRE tunnel is already configured with the right remote IP" + # Return 0 to indicate that the GRE tunnel is already configured + exit 0 + else + echo "GRE tunnel is configured with the wrong remote IP" + configure_gre_tunnel + echo "Updated GRE tunnel with the right remote IP" + exit 0 + fi +} + +# MAIN +function main() { + check_root + check_fqdn + + echo "LOG - $(date) - Starting autogre.sh" + echo "LOG - $(date) - FQDN: $FQDN" + echo "LOG - $(date) - GRE_TUNNEL_NAME: $GRE_TUNNEL_NAME" + echo "LOG - $(date) - GRE_LOCAL_IP: $GRE_LOCAL_IP" + echo "LOG - $(date) - GRE_LAN_IP_4: $GRE_LAN_IP_4" + echo "LOG - $(date) - GRE_LAN_IP_6: $GRE_LAN_IP_6" + + echo "LOG - $(date) - Checking if the GRE tunnel is configured" + get_current_ip + + echo "LOG - $(date) - Checking if the remote IP is the same as the one configured on the GRE tunnel" + get_remote_ip + + echo "LOG - $(date) - Checking if the GRE tunnel is up" + if check_gre_tunnel ; then + echo "LOG - $(date) - GRE tunnel is up" + check_remote_ip + echo "LOG - $(date) - GRE tunnel is configured with the right remote IP" + else + echo "LOG - $(date) - GRE tunnel is down" + configure_gre_tunnel + echo "LOG - $(date) - Updated GRE tunnel with the right remote IP" + fi +} + +main