147 lines
3.2 KiB
Bash
Executable File
147 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
USAGE="alias_sdn.sh up(default)|down|check"
|
|
[ "$1" == "-h" ] && echo "$USAGE" && exit
|
|
|
|
[ -z "$1" ] && echo "Task not found" && exit 1
|
|
TASK="$1"
|
|
IP_LIST=$2
|
|
[ -z "$2" ] && echo "IP List not found" && exit 1
|
|
SETUP_MODE=${SETUP_MODE:-alias}
|
|
INTERFACE=${INTERFACE:-eth2:1}
|
|
DEV_INTERFACE=${DEV_INTERFACE:-eth2}
|
|
NETMASK=${NETMASK:-255.255.255.0}
|
|
|
|
ROOT_INTERFACES=${ROOT_INTERFACES:-/etc/network/interfaces}
|
|
BACKUP_INTERFACES=${BACKUP_INTERFACES:-/etc/network/_interfaces}
|
|
|
|
_ping_ip_host() {
|
|
[ -z "$1" ] && return 1
|
|
local str_wait=""
|
|
case $(uname -s) in
|
|
Darwin|darwin) str_wait="" ;;
|
|
*) str_wait="-w2"
|
|
esac
|
|
ping "$1" -c2 -q $str_wait >/dev/null 2>/dev/null
|
|
}
|
|
_add_interface() {
|
|
echo "
|
|
auto $INTERFACE
|
|
iface $INTERFACE inet static
|
|
address $IP
|
|
netmask $NETMASK
|
|
" >> "$ROOT_INTERFACES"
|
|
}
|
|
_add_as_alias() {
|
|
if _ping_ip_host "$IP" ; then
|
|
echo "$IP is alive"
|
|
return
|
|
fi
|
|
ip addr add "$IP"/24 dev "$DEV_INTERFACE" label "$INTERFACE"
|
|
}
|
|
_remove_as_alias() {
|
|
if ! _ping_ip_host "$IP" ; then
|
|
echo "$IP is not alive"
|
|
return
|
|
fi
|
|
ip addr delete "$IP"/24 dev "$DEV_INTERFACE" label "$INTERFACE"
|
|
}
|
|
_add_as_system() {
|
|
if _ping_ip_host "$IP" ; then
|
|
echo "$IP is alive"
|
|
return
|
|
fi
|
|
local has_ip=""
|
|
has_ip=$(grep "$IP" "$ROOT_INTERFACES")
|
|
if [ -z "$has_ip" ] ; then
|
|
[ ! -r "$BACKUP_INTERFACES" ] && cp "$ROOT_INTERFACES" "$BACKUP_INTERFACES"
|
|
_add_interface
|
|
fi
|
|
}
|
|
_remove_as_system() {
|
|
local has_ip=""
|
|
has_ip=$(grep "$IP" "$ROOT_INTERFACES")
|
|
if [ -n "$has_ip" ] ; then
|
|
[ -r "$BACKUP_INTERFACES" ] && cp "$BACKUP_INTERFACES" "$ROOT_INTERFACES"
|
|
has_ip=$(grep "$IP" "$ROOT_INTERFACES")
|
|
[ -n "$has_ip" ] && echo "Unable to remove $IP from $$ROOT_INTERFACES" && exit 1
|
|
fi
|
|
}
|
|
|
|
_check_interface() {
|
|
local ip_a
|
|
#ifaces_data=$(ip a | grep "inet " | grep dynamic | sed 's/inet //g' | awk '{print $7":"$1}' | grep "$INTERFACE")
|
|
ip_a=$(ip a | grep "inet " | grep "$INTERFACE" | awk '{print $2}' | cut -f1 -d"/" | grep "$IP")
|
|
if [ "$IP" != "$ip_a" ] ; then
|
|
echo "$IP for $INTERFACE not found"
|
|
IP_ACTIVE=""
|
|
else
|
|
echo "$IP active on $INTERFACE"
|
|
IP_ACTIVE="on"
|
|
fi
|
|
if _ping_ip_host "$IP" ; then
|
|
echo "$IP is alive"
|
|
fi
|
|
}
|
|
|
|
_restart_networking() {
|
|
systemctl restart networing
|
|
}
|
|
|
|
_on_ip() {
|
|
IP_ACTIVE=""
|
|
_check_interface
|
|
|
|
case "$TASK" in
|
|
up|u) [ -n "$IP_ACTIVE" ] && return
|
|
TASK="up"
|
|
;;
|
|
down|d) [ -z "$IP_ACTIVE" ] && return
|
|
TASK="down"
|
|
;;
|
|
check|c|status|s)
|
|
return
|
|
;;
|
|
ping|p|resp|r)
|
|
if _ping_ip_host "$IP" ; then
|
|
echo "$IP responding"
|
|
else
|
|
echo "$IP not responding"
|
|
fi
|
|
return
|
|
;;
|
|
*) echo "Option $TASK unknown"
|
|
exit 1
|
|
esac
|
|
|
|
case "$SETUP_MODE" in
|
|
system|sys)
|
|
if [ "$TASK" == "up" ] ; then
|
|
_add_as_system
|
|
else
|
|
_remove_as_system
|
|
fi
|
|
_restart_networking
|
|
_check_interface
|
|
;;
|
|
alias|a)
|
|
if [ "$TASK" == "up" ] ; then
|
|
_add_as_alias
|
|
else
|
|
_remove_as_alias
|
|
fi
|
|
_check_interface
|
|
;;
|
|
esac
|
|
}
|
|
|
|
if [ -r "$IP_LIST" ] ; then
|
|
TARGET_IPS=$(grep -v "^#" "$IP_LIST")
|
|
else
|
|
TARGET_IPS=$IP_LIST
|
|
fi
|
|
for it in $TARGET_IPS
|
|
do
|
|
IP="$it"
|
|
_on_ip
|
|
done
|