#!/bin/bash
fail() {
local _red="\\033[1;31m"
local _normal="\\033[0;39m"
[ -n "$*" ] && printf "${_red}$*${_normal}\n"
exit 1
}
print_message() {
printf "%s\n" "${1}"
}
success() {
print_message "$*"
exit 0
}
SYSTEMD_NETWORK_CONF_DIR="/etc/systemd/network"
[ $# -ne 1 ] && fail "Incorrect args: ifup <ifname>"
interface=$1
print_message "Make sure the interface is down or not assigned any IP"
output=`ip addr show $interface`
#check if the interface is up
echo $output | grep -o "state UP"
isupret=$?
echo $output | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
hasip=$?
[ $isupret -eq 0 -a $hasip -eq 0 ] && success "The interface is already up and assigned an IP"
print_message "$interface is DOWN or not assigned an IP. Bringnig $interface up..."
manualfilename=`ls ${SYSTEMD_NETWORK_CONF_DIR}/*$interface*.network.manual 2>/dev/null`
if [[ -z $manualfilename ]] ; then
print_message "Can not find the manual filename, let us search for the auto filename"
filename=`ls ${SYSTEMD_NETWORK_CONF_DIR}/*$interface*.network 2>/dev/null`
[[ -z $filename ]] && fail "Can not find network interface file"
else
filename=$manualfilename
fi
# Trying to parse the address from the file
while read line
do
key=`echo $line | cut -d'=' -f1`
if [ "$key" = "Address" ]
then
address=`echo $line | cut -d'=' -f2 | cut -d'/' -f1`
fi
done < $filename
[[ -z $address ]] && print_message "Did not find address in the configuration file, may be it's dhcp, will not check for duplicates"
#flush the adress
ip addr flush $interface || fail "Cannot flush IP address for $interface"
#Bring the interface up
ip link set dev $interface up || fail "Cannot bring $interface up"
if [[ -n $address ]] ; then
if [[ $address =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "Performing duplicate address check for IPv4 address $address"
arping -D -q -I $interface -c 2 $address
retval=$?
[ $retval -eq 1 ] && fail "Error: IP already exists in the network"
[ $retval -eq 2 ] && fail "Cannot procceed. $interface is down"
[ $retval -ne 0 ] && fail "Unknown error!"
else
echo "Skipping duplicate address check for IPv6 address $address"
fi
fi
print_message "Everything is good, IP is not assigned elsewhere, will restart systemd-networkd"
if [[ -n $manualfilename ]] ; then
autofilename="${manualfilename%.*}"
print_message "The interface is set to manual, will rename $manualfilename to $autofilename"
mv $manualfilename $autofilename
print_message "Restarting systemd-networkd"
systemctl restart systemd-networkd
retval=$?
print_message "Rename back from $manualfilename to $autofilename"
mv $autofilename $manualfilename
[ $retval -eq 0 ] || fail "Failed to restart systemd-networkd"
else
systemctl restart systemd-networkd || fail "Failed to restart systemd-networkd"
fi
exit 0