F #227: Refactor loc-10-network
- Use one script loc-10-network for all systems - Deduplicate and cleanup the code - Create a source file with functions - Remove usage of global variables while using shared functions - Add support for different network configuration via new context parameter: CONTEXT_NETCFG_TYPE Signed-off-by: Petr Ospalý <pospaly@opennebula.io>pull/244/head
parent
1e6741b345
commit
688c04e14c
@ -0,0 +1,96 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
||||||
|
# #
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
||||||
|
# not use this file except in compliance with the License. You may obtain #
|
||||||
|
# a copy of the License at #
|
||||||
|
# #
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
||||||
|
# #
|
||||||
|
# Unless required by applicable law or agreed to in writing, software #
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||||||
|
# See the License for the specific language governing permissions and #
|
||||||
|
# limitations under the License. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
. /etc/one-context.d/loc-10-network.d/functions
|
||||||
|
|
||||||
|
ACTION="$1"
|
||||||
|
OS_ID=$(detect_os)
|
||||||
|
|
||||||
|
if [ -z "${ACTION}" ] ; then
|
||||||
|
ACTION="configure"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${CONTEXT_NETCFG_TYPE}" ] ; then
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
CONTEXT_NETCFG_TYPE='interfaces'
|
||||||
|
;;
|
||||||
|
altlinux)
|
||||||
|
CONTEXT_NETCFG_TYPE='networkd'
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
CONTEXT_NETCFG_TYPE='interfaces'
|
||||||
|
;;
|
||||||
|
fedora|centos|rhel|almalinux|ol|rocky)
|
||||||
|
CONTEXT_NETCFG_TYPE='scripts'
|
||||||
|
;;
|
||||||
|
opensuse*)
|
||||||
|
CONTEXT_NETCFG_TYPE='scripts'
|
||||||
|
;;
|
||||||
|
freebsd)
|
||||||
|
CONTEXT_NETCFG_TYPE='bsd'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
CONTEXT_NETCFG_TYPE='none'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${CONTEXT_NETCFG_TYPE}" != 'none' ] ; then
|
||||||
|
_found_valid_netcfg='no'
|
||||||
|
for _cfgtype in ${CONTEXT_NETCFG_TYPE} ; do
|
||||||
|
if [ -e "/etc/one-context.d/loc-10-network.d/netcfg-${_cfgtype}" ] ; then
|
||||||
|
. "/etc/one-context.d/loc-10-network.d/netcfg-${_cfgtype}"
|
||||||
|
else
|
||||||
|
echo "ERROR [!]: Requested network type is not implemented: ${_cfgtype}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if is_network_supported ; then
|
||||||
|
_found_valid_netcfg='yes'
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "${_found_valid_netcfg}" = 'no' ] ; then
|
||||||
|
echo "ERROR [!]: None of the requested network types is supported on: ${OS_ID}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# any action is meaningless without functioning network type
|
||||||
|
ACTION='none'
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$ACTION" in
|
||||||
|
none)
|
||||||
|
echo "INFO: Network will not be configured" >&2
|
||||||
|
;;
|
||||||
|
configure)
|
||||||
|
configure_network
|
||||||
|
;;
|
||||||
|
reconfigure)
|
||||||
|
configure_network
|
||||||
|
reload_network
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR [!]: Unknown ACTION: ${ACTION}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
@ -1,357 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
|
||||||
# #
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
|
||||||
# not use this file except in compliance with the License. You may obtain #
|
|
||||||
# a copy of the License at #
|
|
||||||
# #
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0 #
|
|
||||||
# #
|
|
||||||
# Unless required by applicable law or agreed to in writing, software #
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, #
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
|
||||||
# See the License for the specific language governing permissions and #
|
|
||||||
# limitations under the License. #
|
|
||||||
#--------------------------------------------------------------------------- #
|
|
||||||
|
|
||||||
ACTION=$1
|
|
||||||
|
|
||||||
if [ -z "$ACTION" ]; then
|
|
||||||
ACTION="none"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Gets IP address from a given MAC
|
|
||||||
mac2ip() {
|
|
||||||
mac=$1
|
|
||||||
|
|
||||||
let ip_a=0x`echo $mac | cut -d: -f 3`
|
|
||||||
let ip_b=0x`echo $mac | cut -d: -f 4`
|
|
||||||
let ip_c=0x`echo $mac | cut -d: -f 5`
|
|
||||||
let ip_d=0x`echo $mac | cut -d: -f 6`
|
|
||||||
|
|
||||||
ip="$ip_a.$ip_b.$ip_c.$ip_d"
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network part of an IP
|
|
||||||
get_network() {
|
|
||||||
network=$(get_iface_var "NETWORK")
|
|
||||||
|
|
||||||
if [ -z "$network" ]; then
|
|
||||||
IFS=. read -r i1 i2 i3 i4 <<< "$IP"
|
|
||||||
IFS=. read -r m1 m2 m3 m4 <<< "$(get_mask)"
|
|
||||||
network=$(printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))")
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $network
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network mask
|
|
||||||
get_mask() {
|
|
||||||
mask=$(get_iface_var "MASK")
|
|
||||||
|
|
||||||
if [ -z "$mask" ]; then
|
|
||||||
mask="255.255.255.0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $mask
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets device MTU
|
|
||||||
get_mtu() {
|
|
||||||
mtu=$(get_iface_var "MTU")
|
|
||||||
|
|
||||||
echo $mtu
|
|
||||||
}
|
|
||||||
|
|
||||||
is_gateway() {
|
|
||||||
if [ -z "$GATEWAY_IFACE_NUM" ]; then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
[ "$IFACE_NUM" = "$GATEWAY_IFACE_NUM" ]
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway
|
|
||||||
get_gateway() {
|
|
||||||
if is_gateway; then
|
|
||||||
get_iface_var "GATEWAY"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway6
|
|
||||||
get_gateway6() {
|
|
||||||
if is_gateway; then
|
|
||||||
get_iface_var "GATEWAY6"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_ip() {
|
|
||||||
ip=$(get_iface_var "IP")
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
get_iface_var() {
|
|
||||||
var_name="${UPCASE_DEV}_$1"
|
|
||||||
var=$(eval "echo \"\${$var_name}\"")
|
|
||||||
|
|
||||||
echo $var
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet static
|
|
||||||
address $IP
|
|
||||||
network $NETWORK
|
|
||||||
netmask $MASK
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY" ]; then
|
|
||||||
echo " gateway $GATEWAY"
|
|
||||||
|
|
||||||
if [ -n "$METRIC" ]; then
|
|
||||||
echo " metric $METRIC"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet static
|
|
||||||
address $IP
|
|
||||||
network $NETWORK
|
|
||||||
netmask $MASK
|
|
||||||
EOT
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias6_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6
|
|
||||||
netmask ${IP6_PREFIX_LENGTH:-64}
|
|
||||||
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/autoconf
|
|
||||||
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/accept_ra
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6_ULA
|
|
||||||
netmask 64
|
|
||||||
EOT
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface6_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6
|
|
||||||
netmask ${IP6_PREFIX_LENGTH:-64}
|
|
||||||
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/autoconf
|
|
||||||
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/accept_ra
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY6" ]; then
|
|
||||||
echo " gateway $GATEWAY6"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6_ULA
|
|
||||||
netmask 64
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_mac()
|
|
||||||
{
|
|
||||||
ip link show | awk '/^[0-9]+: [A-Za-z0-9@]+:/ { device=$2; gsub(/:/, "",device); split(device,dev,"@")} /link\/ether/ { print dev[1] " " $2 }'
|
|
||||||
}
|
|
||||||
|
|
||||||
get_context_interfaces()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH[0-9]+_MAC=" | sed 's/_.*$//' | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_alias()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH${INDEX}_ALIAS[0-9]+_MAC=" | cut -d '_' -f 2 | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
get_dev()
|
|
||||||
{
|
|
||||||
list="$1"
|
|
||||||
mac="$2"
|
|
||||||
|
|
||||||
echo "$list" | grep "$mac" | cut -d' ' -f1 | tail -n1
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_network_configuration()
|
|
||||||
{
|
|
||||||
cat <<EOT
|
|
||||||
auto lo
|
|
||||||
iface lo inet loopback
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
INTERFACE_MAC=$(get_interface_mac)
|
|
||||||
CONTEXT_INTERFACES=$(get_context_interfaces)
|
|
||||||
GATEWAY_IFACE_NUM=$(echo "$GATEWAY_IFACE" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
for interface in $CONTEXT_INTERFACES; do
|
|
||||||
UPCASE_DEV=$interface
|
|
||||||
MAC=$(get_iface_var "MAC")
|
|
||||||
DEV=$(get_dev "$INTERFACE_MAC" "$MAC")
|
|
||||||
IFACE_NUM=$(echo "$UPCASE_DEV" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
IP=$(get_ip)
|
|
||||||
NETWORK=$(get_network)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
MTU=$(get_mtu)
|
|
||||||
GATEWAY=$(get_gateway)
|
|
||||||
METRIC=$(get_iface_var "METRIC")
|
|
||||||
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
[[ -z $IP6 ]] && IP6=$(get_iface_var "IPV6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
GATEWAY6=$(get_gateway6)
|
|
||||||
CONTEXT_FORCE_IPV4=$(get_iface_var "CONTEXT_FORCE_IPV4")
|
|
||||||
|
|
||||||
[ -z "${IP}${IP6}" ] && continue
|
|
||||||
[ -z "${DEV}" ] && continue
|
|
||||||
|
|
||||||
echo "auto $DEV"
|
|
||||||
|
|
||||||
[[ -n $IP ]] && gen_iface_conf
|
|
||||||
[[ -n $IP6 ]] && gen_iface6_conf
|
|
||||||
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP=$(get_ip)
|
|
||||||
NETWORK=$(get_network)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
[[ -z $IP6 ]] && IP6=$(get_iface_var "IPV6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
|
|
||||||
EXTERNAL=$(get_iface_var "EXTERNAL")
|
|
||||||
EXTERNAL=${EXTERNAL^^}
|
|
||||||
DETACH=$(get_iface_var "DETACH")
|
|
||||||
|
|
||||||
if [ -z "${DETACH}" ]; then
|
|
||||||
if [ -z "${EXTERNAL}" ] || [ $EXTERNAL = "NO" ]; then
|
|
||||||
[ -n "${IP}" ] && gen_alias_conf
|
|
||||||
[ -n "${IP6}" ] && gen_alias6_conf
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network()
|
|
||||||
{
|
|
||||||
gen_network_configuration > /etc/network/interfaces
|
|
||||||
#echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces
|
|
||||||
}
|
|
||||||
|
|
||||||
deactivate_network()
|
|
||||||
{
|
|
||||||
. /etc/os-release
|
|
||||||
|
|
||||||
case "$ID" in
|
|
||||||
'ubuntu')
|
|
||||||
IFACES=$(/sbin/ifquery --list -a)
|
|
||||||
|
|
||||||
for i in $IFACES; do
|
|
||||||
if [ $i != 'lo' ]; then
|
|
||||||
/sbin/ifdown $i
|
|
||||||
/sbin/ip addr flush dev $i
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
'alpine')
|
|
||||||
service networking stop || true
|
|
||||||
|
|
||||||
#IFACES=$(ip a | \
|
|
||||||
# sed -n 's#^[0-9]\+:[[:space:]]\+\([^:]\+\):[[:space:]].*#\1#p')
|
|
||||||
|
|
||||||
# took from find_ifaces in the networking service
|
|
||||||
IFACES=$(\
|
|
||||||
awk '$1 == "auto" {
|
|
||||||
for (i = 2; i <= NF; i = i + 1) printf("%s ", $i)
|
|
||||||
}' /etc/network/interfaces)
|
|
||||||
|
|
||||||
for i in $IFACES; do
|
|
||||||
if [ $i != 'lo' ]; then
|
|
||||||
/sbin/ip link set dev $i down || true
|
|
||||||
/sbin/ip addr flush dev $i || true
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
service networking stop
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
activate_network()
|
|
||||||
{
|
|
||||||
. /etc/os-release
|
|
||||||
|
|
||||||
case "$ID" in
|
|
||||||
'ubuntu')
|
|
||||||
IFACES=$(/sbin/ifquery --list -a)
|
|
||||||
|
|
||||||
for i in $IFACES; do
|
|
||||||
/sbin/ifup $i
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
'alpine')
|
|
||||||
deactivate_network
|
|
||||||
service networking start
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
service networking stop
|
|
||||||
sleep 1
|
|
||||||
service networking start
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
[ $ACTION == "reconfigure" ] && deactivate_network
|
|
||||||
configure_network
|
|
||||||
[ $ACTION == "reconfigure" ] && activate_network
|
|
||||||
|
|
@ -1,326 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
|
||||||
# #
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
|
||||||
# not use this file except in compliance with the License. You may obtain #
|
|
||||||
# a copy of the License at #
|
|
||||||
# #
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0 #
|
|
||||||
# #
|
|
||||||
# Unless required by applicable law or agreed to in writing, software #
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, #
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
|
||||||
# See the License for the specific language governing permissions and #
|
|
||||||
# limitations under the License. #
|
|
||||||
#--------------------------------------------------------------------------- #
|
|
||||||
|
|
||||||
COMMAND=${1}
|
|
||||||
|
|
||||||
# Gets IP address from a given MAC
|
|
||||||
mac2ip() {
|
|
||||||
mac=$1
|
|
||||||
|
|
||||||
let ip_a=0x`echo $mac | cut -d: -f 3`
|
|
||||||
let ip_b=0x`echo $mac | cut -d: -f 4`
|
|
||||||
let ip_c=0x`echo $mac | cut -d: -f 5`
|
|
||||||
let ip_d=0x`echo $mac | cut -d: -f 6`
|
|
||||||
|
|
||||||
ip="$ip_a.$ip_b.$ip_c.$ip_d"
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network part of an IP
|
|
||||||
get_network() {
|
|
||||||
network=$(get_iface_var "NETWORK")
|
|
||||||
|
|
||||||
if [ -z "$network" ]; then
|
|
||||||
IFS=. read -r i1 i2 i3 i4 <<< "$IP"
|
|
||||||
IFS=. read -r m1 m2 m3 m4 <<< "$(get_mask)"
|
|
||||||
network=$(printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))")
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $network
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network mask
|
|
||||||
get_mask() {
|
|
||||||
mask=$(get_iface_var "MASK")
|
|
||||||
|
|
||||||
if [ -z "$mask" ]; then
|
|
||||||
mask="255.255.255.0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $mask
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets device MTU
|
|
||||||
get_mtu() {
|
|
||||||
mtu=$(get_iface_var "MTU")
|
|
||||||
|
|
||||||
echo $mtu
|
|
||||||
}
|
|
||||||
|
|
||||||
is_gateway() {
|
|
||||||
if [ -z "$GATEWAY_IFACE_NUM" ]; then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
[ "$IFACE_NUM" = "$GATEWAY_IFACE_NUM" ]
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway
|
|
||||||
get_gateway() {
|
|
||||||
if is_gateway; then
|
|
||||||
gateway=$(get_iface_var "GATEWAY")
|
|
||||||
|
|
||||||
echo $gateway
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway6
|
|
||||||
get_gateway6() {
|
|
||||||
if is_gateway; then
|
|
||||||
get_iface_var "GATEWAY6"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_ip() {
|
|
||||||
ip=$(get_iface_var "IP")
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
get_iface_var() {
|
|
||||||
var_name="${UPCASE_DEV}_$1"
|
|
||||||
var=$(eval "echo \"\${$var_name}\"")
|
|
||||||
|
|
||||||
echo $var
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet static
|
|
||||||
address $IP
|
|
||||||
network $NETWORK
|
|
||||||
netmask $MASK
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY" ]; then
|
|
||||||
echo " gateway $GATEWAY"
|
|
||||||
|
|
||||||
if [ -n "$METRIC" ]; then
|
|
||||||
echo " metric $METRIC"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet static
|
|
||||||
address $IP
|
|
||||||
network $NETWORK
|
|
||||||
netmask $MASK
|
|
||||||
EOT
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias6_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6
|
|
||||||
netmask ${IP6_PREFIX_LENGTH:-64}
|
|
||||||
autoconf 0
|
|
||||||
accept_ra 0
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6_ULA
|
|
||||||
netmask 64
|
|
||||||
EOT
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface6_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6
|
|
||||||
netmask ${IP6_PREFIX_LENGTH:-64}
|
|
||||||
autoconf 0
|
|
||||||
accept_ra 0
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY6" ]; then
|
|
||||||
echo " gateway $GATEWAY6"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
iface $DEV inet6 static
|
|
||||||
address $IP6_ULA
|
|
||||||
netmask 64
|
|
||||||
autoconf 0
|
|
||||||
accept_ra 0
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo " mtu $MTU"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_mac()
|
|
||||||
{
|
|
||||||
ip link show | awk '/^[0-9]+: [A-Za-z0-9@]+:/ { device=$2; gsub(/:/, "",device); split(device,dev,"@")} /link\/ether/ { print dev[1] " " $2 }'
|
|
||||||
}
|
|
||||||
|
|
||||||
get_context_interfaces()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH[0-9]+_MAC=" | sed 's/_.*$//' | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get_interface_alias()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH${INDEX}_ALIAS[0-9]+_MAC=" | cut -d '_' -f 2 | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
get_dev()
|
|
||||||
{
|
|
||||||
list="$1"
|
|
||||||
mac="$2"
|
|
||||||
|
|
||||||
echo "$list" | grep "$mac" | cut -d' ' -f1 | tail -n1
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_network_configuration()
|
|
||||||
{
|
|
||||||
cat <<EOT
|
|
||||||
auto lo
|
|
||||||
iface lo inet loopback
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
INTERFACE_MAC=$(get_interface_mac)
|
|
||||||
CONTEXT_INTERFACES=$(get_context_interfaces)
|
|
||||||
GATEWAY_IFACE_NUM=$(echo "$GATEWAY_IFACE" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
for interface in $CONTEXT_INTERFACES; do
|
|
||||||
UPCASE_DEV=$interface
|
|
||||||
MAC=$(get_iface_var "MAC")
|
|
||||||
DEV=$(get_dev "$INTERFACE_MAC" "$MAC")
|
|
||||||
IFACE_NUM=$(echo "$UPCASE_DEV" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
IP=$(get_ip)
|
|
||||||
NETWORK=$(get_network)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
MTU=$(get_mtu)
|
|
||||||
GATEWAY=$(get_gateway)
|
|
||||||
METRIC=$(get_iface_var "METRIC")
|
|
||||||
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
[[ -z $IP6 ]] && IP6=$(get_iface_var "IPV6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
GATEWAY6=$(get_gateway6)
|
|
||||||
|
|
||||||
[ -z "${IP}${IP6}" ] && continue
|
|
||||||
[ -z "${DEV}" ] && continue
|
|
||||||
|
|
||||||
echo "auto $DEV"
|
|
||||||
|
|
||||||
[[ -n $IP ]] && gen_iface_conf
|
|
||||||
[[ -n $IP6 ]] && gen_iface6_conf
|
|
||||||
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP=$(get_ip)
|
|
||||||
NETWORK=$(get_network)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
[[ -z $IP6 ]] && IP6=$(get_iface_var "IPV6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
|
|
||||||
EXTERNAL=$(get_iface_var "EXTERNAL")
|
|
||||||
EXTERNAL=${EXTERNAL^^}
|
|
||||||
DETACH=$(get_iface_var "DETACH")
|
|
||||||
|
|
||||||
if [ -z "${DETACH}" ]; then
|
|
||||||
if [ -z "${EXTERNAL}" ] || [ $EXTERNAL = "NO" ]; then
|
|
||||||
[ -n "${IP}" ] && gen_alias_conf
|
|
||||||
[ -n "${IP6}" ] && gen_alias6_conf
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network()
|
|
||||||
{
|
|
||||||
gen_network_configuration > /etc/network/interfaces
|
|
||||||
echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces
|
|
||||||
}
|
|
||||||
|
|
||||||
deactivate_network()
|
|
||||||
{
|
|
||||||
|
|
||||||
if test -f "/usr/sbin/ifreload"; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFACES=`/sbin/ifquery --list -a`
|
|
||||||
|
|
||||||
for i in $IFACES; do
|
|
||||||
if [ $i != 'lo' ]; then
|
|
||||||
/sbin/ifdown $i
|
|
||||||
/sbin/ip addr flush dev $i
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
activate_network()
|
|
||||||
{
|
|
||||||
|
|
||||||
if test -f "/usr/sbin/ifreload"; then
|
|
||||||
/usr/sbin/ifreload -a
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFACES=`/sbin/ifquery --list -a`
|
|
||||||
|
|
||||||
for i in $IFACES; do
|
|
||||||
/sbin/ifup $i
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -z "$(env | cut -d= -f1 | grep -E '^ETH[0-9]+_IPV*6*')" ] && exit 0
|
|
||||||
|
|
||||||
deactivate_network
|
|
||||||
configure_network
|
|
||||||
activate_network
|
|
@ -1,353 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
|
||||||
# #
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
|
||||||
# not use this file except in compliance with the License. You may obtain #
|
|
||||||
# a copy of the License at #
|
|
||||||
# #
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0 #
|
|
||||||
# #
|
|
||||||
# Unless required by applicable law or agreed to in writing, software #
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, #
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
|
||||||
# See the License for the specific language governing permissions and #
|
|
||||||
# limitations under the License. #
|
|
||||||
#--------------------------------------------------------------------------- #
|
|
||||||
|
|
||||||
COMMAND=${1}
|
|
||||||
|
|
||||||
# Gets IP address from a given MAC
|
|
||||||
mac2ip() {
|
|
||||||
mac=$1
|
|
||||||
|
|
||||||
let ip_a=0x`echo $mac | cut -d: -f 3`
|
|
||||||
let ip_b=0x`echo $mac | cut -d: -f 4`
|
|
||||||
let ip_c=0x`echo $mac | cut -d: -f 5`
|
|
||||||
let ip_d=0x`echo $mac | cut -d: -f 6`
|
|
||||||
|
|
||||||
ip="$ip_a.$ip_b.$ip_c.$ip_d"
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
mask2cidr() {
|
|
||||||
mask=$1
|
|
||||||
nbits=0
|
|
||||||
IFS=.
|
|
||||||
for dec in $mask ; do
|
|
||||||
case $dec in
|
|
||||||
255) let nbits+=8;;
|
|
||||||
254) let nbits+=7 ; break ;;
|
|
||||||
252) let nbits+=6 ; break ;;
|
|
||||||
248) let nbits+=5 ; break ;;
|
|
||||||
240) let nbits+=4 ; break ;;
|
|
||||||
224) let nbits+=3 ; break ;;
|
|
||||||
192) let nbits+=2 ; break ;;
|
|
||||||
128) let nbits+=1 ; break ;;
|
|
||||||
0);;
|
|
||||||
*) echo "Error: $dec is not recognised"; exit 1
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
echo "$nbits"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network part of an IP
|
|
||||||
get_network() {
|
|
||||||
network=$(get_iface_var "NETWORK")
|
|
||||||
|
|
||||||
if [ -z "$network" ]; then
|
|
||||||
IFS=. read -r i1 i2 i3 i4 <<< "$IP"
|
|
||||||
IFS=. read -r m1 m2 m3 m4 <<< "$(get_mask)"
|
|
||||||
network=$(printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))")
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $network
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network mask
|
|
||||||
get_mask() {
|
|
||||||
mask=$(get_iface_var "MASK")
|
|
||||||
|
|
||||||
if [ -z "$mask" ]; then
|
|
||||||
mask="255.255.255.0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $mask
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets device MTU
|
|
||||||
get_mtu() {
|
|
||||||
mtu=$(get_iface_var "MTU")
|
|
||||||
|
|
||||||
echo $mtu
|
|
||||||
}
|
|
||||||
|
|
||||||
is_gateway() {
|
|
||||||
if [ -z "$GATEWAY_IFACE_NUM" ]; then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
[ "$IFACE_NUM" = "$GATEWAY_IFACE_NUM" ]
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway
|
|
||||||
get_gateway() {
|
|
||||||
if is_gateway; then
|
|
||||||
gateway=$(get_iface_var "GATEWAY")
|
|
||||||
|
|
||||||
if [ -z "$gateway" ]; then
|
|
||||||
if [ "$DEV" = "eth0" ]; then
|
|
||||||
net_prefix=$(echo $NETWORK | cut -d'.' -f1,2,3)
|
|
||||||
gateway="${net_prefix}.1"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $gateway
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Gets the network gateway6
|
|
||||||
get_gateway6() {
|
|
||||||
if is_gateway; then
|
|
||||||
get_iface_var "GATEWAY6"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_dns() {
|
|
||||||
dns=$(get_iface_var "DNS")
|
|
||||||
|
|
||||||
echo $dns
|
|
||||||
}
|
|
||||||
|
|
||||||
get_search_domain() {
|
|
||||||
search_domain=$(get_iface_var "SEARCH_DOMAIN")
|
|
||||||
|
|
||||||
echo $search_domain
|
|
||||||
}
|
|
||||||
|
|
||||||
get_ip() {
|
|
||||||
ip=$(get_iface_var "IP")
|
|
||||||
|
|
||||||
echo $ip
|
|
||||||
}
|
|
||||||
|
|
||||||
get_iface_var() {
|
|
||||||
var_name="${UPCASE_DEV}_$1"
|
|
||||||
var=$(eval "echo \"\${$var_name}\"")
|
|
||||||
|
|
||||||
echo $var
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gen_iface_conf() {
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
[Network]
|
|
||||||
Address=$IP/$CIDR
|
|
||||||
EOT
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP=$(get_ip)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
CIDR=$(mask2cidr "$MASK")
|
|
||||||
|
|
||||||
EXTERNAL=$(get_iface_var "EXTERNAL")
|
|
||||||
EXTERNAL=${EXTERNAL^^}
|
|
||||||
DETACH=$(get_iface_var "DETACH")
|
|
||||||
|
|
||||||
if [ -z "${DETACH}" ]; then
|
|
||||||
if [ -z "${EXTERNAL}" ] || [ $EXTERNAL = "NO" ]; then
|
|
||||||
if [ -n "${IP}" ]; then
|
|
||||||
echo "Address=$IP/$CIDR"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -n "$DNS" ]; then
|
|
||||||
for dns_server in $DNS; do
|
|
||||||
echo "DNS=$dns_server"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$SEARCH_DOMAIN" ]; then
|
|
||||||
for domain in $SEARCH_DOMAIN; do
|
|
||||||
echo "Domains=$domain"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
[Route]
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY" ]; then
|
|
||||||
echo "Gateway=$GATEWAY"
|
|
||||||
|
|
||||||
if [ -n "$METRIC" ]; then
|
|
||||||
echo "Metric=$METRIC"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface6_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
[Network]
|
|
||||||
Address=$IP6/${IP6_PREFIX_LENGTH:-64}
|
|
||||||
EOT
|
|
||||||
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
[[ -z $IP6 ]] && IP6=$(get_iface_var "IPV6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
|
|
||||||
EXTERNAL=$(get_iface_var "EXTERNAL")
|
|
||||||
EXTERNAL=${EXTERNAL^^}
|
|
||||||
DETACH=$(get_iface_var "DETACH")
|
|
||||||
|
|
||||||
if [ -z "${DETACH}" ]; then
|
|
||||||
if [ -z "${EXTERNAL}" ] || [ $EXTERNAL = "NO" ]; then
|
|
||||||
if [ -n "${IP6}" ]; then
|
|
||||||
echo "Address=$IP6/${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "IPv6AcceptRA=false"
|
|
||||||
|
|
||||||
if [ -n "$DNS" ]; then
|
|
||||||
for dns_server in $DNS; do
|
|
||||||
echo "DNS=$dns_server"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$SEARCH_DOMAIN" ]; then
|
|
||||||
for domain in $SEARCH_DOMAIN; do
|
|
||||||
echo "Domains=$domain"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
[Route]
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY6" ]; then
|
|
||||||
echo "Gateway=$GATEWAY6"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
[Network]
|
|
||||||
Address=$IP6_ULA/64
|
|
||||||
EOT
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_mac()
|
|
||||||
{
|
|
||||||
ip link show | awk '/^[0-9]+: [A-Za-z0-9@]+:/ { device=$2; gsub(/:/, "",device); split(device,dev,"@")} /link\/ether/ { print dev[1] " " $2 }'
|
|
||||||
}
|
|
||||||
|
|
||||||
get_context_interfaces()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH[0-9]+_MAC=" | sed 's/_.*$//' | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_alias()
|
|
||||||
{
|
|
||||||
env | grep -E "^ETH${INDEX}_ALIAS[0-9]+_MAC=" | cut -d '_' -f 2 | sort
|
|
||||||
}
|
|
||||||
|
|
||||||
get_dev()
|
|
||||||
{
|
|
||||||
list="$1"
|
|
||||||
mac="$2"
|
|
||||||
|
|
||||||
echo "$list" | grep "$mac" | cut -d' ' -f1 | tail -n1
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_network_configuration()
|
|
||||||
{
|
|
||||||
INTERFACE_MAC=$(get_interface_mac)
|
|
||||||
CONTEXT_INTERFACES=$(get_context_interfaces)
|
|
||||||
GATEWAY_IFACE_NUM=$(echo "$GATEWAY_IFACE" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
for interface in $CONTEXT_INTERFACES; do
|
|
||||||
UPCASE_DEV=$interface
|
|
||||||
MAC=$(get_iface_var "MAC")
|
|
||||||
DEV=$(get_dev "$INTERFACE_MAC" "$MAC")
|
|
||||||
IFACE_NUM=$(echo "$UPCASE_DEV" | sed 's/^ETH//')
|
|
||||||
|
|
||||||
IP=$(get_ip)
|
|
||||||
NETWORK=$(get_network)
|
|
||||||
MASK=$(get_mask)
|
|
||||||
CIDR=$(mask2cidr "$MASK")
|
|
||||||
MTU=$(get_mtu)
|
|
||||||
GATEWAY=$(get_gateway)
|
|
||||||
METRIC=$(get_iface_var "METRIC")
|
|
||||||
DNS=$(get_dns)
|
|
||||||
SEARCH_DOMAIN=$(get_search_domain)
|
|
||||||
|
|
||||||
IP6=$(get_iface_var "IP6")
|
|
||||||
IP6_PREFIX_LENGTH=$(get_iface_var "IP6_PREFIX_LENGTH")
|
|
||||||
IP6_ULA=$(get_iface_var "IP6_ULA")
|
|
||||||
GATEWAY6=$(get_gateway6)
|
|
||||||
CONTEXT_FORCE_IPV4=$(get_iface_var "CONTEXT_FORCE_IPV4")
|
|
||||||
|
|
||||||
[ -z "${IP}${IP6}" ] && continue
|
|
||||||
[ -z "${DEV}" ] && continue
|
|
||||||
|
|
||||||
(
|
|
||||||
cat <<EOT
|
|
||||||
[Match]
|
|
||||||
Name=$DEV
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
cat <<EOT
|
|
||||||
[Link]
|
|
||||||
MTUBytes=$MTU
|
|
||||||
EOT
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ -n "$IP" ] || [ -n "$CONTEXT_FORCE_IPV4" ]; then
|
|
||||||
gen_iface_conf
|
|
||||||
fi
|
|
||||||
if [ -n "$IP6" ]; then
|
|
||||||
gen_iface6_conf
|
|
||||||
fi
|
|
||||||
) > /etc/systemd/network/"${DEV}".network
|
|
||||||
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network()
|
|
||||||
{
|
|
||||||
gen_network_configuration
|
|
||||||
|
|
||||||
if [ "${COMMAND}" = 'reconfigure' ]; then
|
|
||||||
systemctl restart systemd-networkd.service
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 2
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -z "$(env | cut -d= -f1 | grep -E '^ETH[0-9]+_IPV*6*')" ] && exit 0
|
|
||||||
|
|
||||||
configure_network
|
|
||||||
|
|
@ -0,0 +1,206 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
||||||
|
# #
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
||||||
|
# not use this file except in compliance with the License. You may obtain #
|
||||||
|
# a copy of the License at #
|
||||||
|
# #
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
||||||
|
# #
|
||||||
|
# Unless required by applicable law or agreed to in writing, software #
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||||||
|
# See the License for the specific language governing permissions and #
|
||||||
|
# limitations under the License. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
#
|
||||||
|
# network module interface
|
||||||
|
#
|
||||||
|
|
||||||
|
is_network_supported()
|
||||||
|
{
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'configure_network' implementation for the network type: ${CONTEXT_NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'stop_network' implementation for the network type: ${CONTEXT_NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'start_network' implementation for the network type: ${CONTEXT_NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'reload_network' implementation for the network type: ${CONTEXT_NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# generic shared functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# return OS ID
|
||||||
|
detect_os()
|
||||||
|
(
|
||||||
|
if [ -f /etc/os-release ] ; then
|
||||||
|
ID=
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
. /etc/os-release
|
||||||
|
echo "$ID" | tr '[:upper:]' '[:lower:]'
|
||||||
|
else
|
||||||
|
uname | tr '[:upper:]' '[:lower:]'
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
|
# args: <iface> <name>
|
||||||
|
get_iface_var()
|
||||||
|
(
|
||||||
|
iface=$(echo "$1" | tr '[:lower:]' '[:upper:]')
|
||||||
|
var_name="${iface}_${2}"
|
||||||
|
eval "echo \"\${${var_name}}\""
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets IP address from a given MAC
|
||||||
|
mac2ip()
|
||||||
|
(
|
||||||
|
mac="$1"
|
||||||
|
|
||||||
|
ip_a=$(echo "$mac" | cut -d: -f 3)
|
||||||
|
ip_b=$(echo "$mac" | cut -d: -f 4)
|
||||||
|
ip_c=$(echo "$mac" | cut -d: -f 5)
|
||||||
|
ip_d=$(echo "$mac" | cut -d: -f 6)
|
||||||
|
|
||||||
|
echo "0x${ip_a}.0x${ip_b}.0x${ip_c}.0x${ip_d}"
|
||||||
|
)
|
||||||
|
|
||||||
|
mask2cidr()
|
||||||
|
(
|
||||||
|
mask="$1"
|
||||||
|
nbits=0
|
||||||
|
IFS=.
|
||||||
|
for dec in $mask ; do
|
||||||
|
case "$dec" in
|
||||||
|
255) nbits=$((nbits + 8)) ;;
|
||||||
|
254) nbits=$((nbits + 7)) ; break ;;
|
||||||
|
252) nbits=$((nbits + 6)) ; break ;;
|
||||||
|
248) nbits=$((nbits + 5)) ; break ;;
|
||||||
|
240) nbits=$((nbits + 4)) ; break ;;
|
||||||
|
224) nbits=$((nbits + 3)) ; break ;;
|
||||||
|
192) nbits=$((nbits + 2)) ; break ;;
|
||||||
|
128) nbits=$((nbits + 1)) ; break ;;
|
||||||
|
0) break ;;
|
||||||
|
*) echo "Error: $dec is not recognised"; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
echo "$nbits"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets the network part of an IP
|
||||||
|
# arg: <iface>
|
||||||
|
get_network()
|
||||||
|
(
|
||||||
|
network=$(get_iface_var "$1" "NETWORK")
|
||||||
|
|
||||||
|
if [ -z "$network" ]; then
|
||||||
|
ip=$(get_ip "$1")
|
||||||
|
mask=$(get_mask "$1")
|
||||||
|
network=$(awk -v ip="$ip" -v mask="$mask" 'END {
|
||||||
|
split(ip, ip_b, "."); split(mask, mask_b, ".");
|
||||||
|
for (i=1; i<=4; ++i) x = x "." and(ip_b[i], mask_b[i]);
|
||||||
|
sub(/^./, "", x); print x; }' </dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$network"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets the network mask
|
||||||
|
# arg: <iface>
|
||||||
|
get_mask()
|
||||||
|
(
|
||||||
|
mask=$(get_iface_var "$1" "MASK")
|
||||||
|
echo "${mask:-255.255.255.0}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets device MTU
|
||||||
|
# arg: <iface>
|
||||||
|
get_mtu()
|
||||||
|
(
|
||||||
|
mtu=$(get_iface_var "$1" "MTU")
|
||||||
|
echo "${mtu:-1500}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets the network gateway
|
||||||
|
# arg: <iface>
|
||||||
|
get_gateway()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "GATEWAY"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets the network gateway6
|
||||||
|
# arg: <iface>
|
||||||
|
get_gateway6()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "GATEWAY6"
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
get_ip()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "IP"
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
get_dns()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "DNS"
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
get_search_domain()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "SEARCH_DOMAIN"
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
get_interface_alias()
|
||||||
|
(
|
||||||
|
env | sed -n "s#^\(${1}_ALIAS[0-9]\+\)_MAC=.*#\1#p" | sort
|
||||||
|
)
|
||||||
|
|
||||||
|
get_context_interfaces()
|
||||||
|
(
|
||||||
|
env | grep -E "^ETH[0-9]+_MAC=" | sed 's/_.*$//' | sort
|
||||||
|
)
|
||||||
|
|
||||||
|
get_pci_interfaces()
|
||||||
|
(
|
||||||
|
env | grep -E "^PCI[0-9]+_MAC=" | sed 's/_.*$//' | sort
|
||||||
|
)
|
||||||
|
|
||||||
|
get_interface_mac()
|
||||||
|
(
|
||||||
|
ip link show | awk '/^[0-9]+: [A-Za-z0-9@]+:/ { device=$2; gsub(/:/, "",device); split(device,dev,"@")} /link\/ether/ { print dev[1] " " $2 }'
|
||||||
|
)
|
||||||
|
|
||||||
|
get_dev()
|
||||||
|
(
|
||||||
|
list="$1"
|
||||||
|
mac="$2"
|
||||||
|
|
||||||
|
echo "$list" | grep "$mac" | cut -d' ' -f1 | tail -n1
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,306 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
||||||
|
# #
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
||||||
|
# not use this file except in compliance with the License. You may obtain #
|
||||||
|
# a copy of the License at #
|
||||||
|
# #
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
||||||
|
# #
|
||||||
|
# Unless required by applicable law or agreed to in writing, software #
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||||||
|
# See the License for the specific language governing permissions and #
|
||||||
|
# limitations under the License. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
#
|
||||||
|
# network module implementation
|
||||||
|
#
|
||||||
|
|
||||||
|
is_network_supported()
|
||||||
|
{
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
gen_network_configuration > /etc/network/interfaces
|
||||||
|
|
||||||
|
case "${OS_ID}" in
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network() {
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
service networking stop || true
|
||||||
|
|
||||||
|
# took from find_ifaces in the networking service
|
||||||
|
IFACES=$(\
|
||||||
|
awk '$1 == "auto" {
|
||||||
|
for (i = 2; i <= NF; i = i + 1) printf("%s ", $i)
|
||||||
|
}' /etc/network/interfaces)
|
||||||
|
|
||||||
|
for i in $IFACES; do
|
||||||
|
if [ "${i}" != 'lo' ]; then
|
||||||
|
/sbin/ip link set dev "${i}" down || true
|
||||||
|
/sbin/ip addr flush dev "${i}" || true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
if [ -f "/usr/sbin/ifreload" ] ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFACES=$(/sbin/ifquery --list -a)
|
||||||
|
|
||||||
|
for i in $IFACES; do
|
||||||
|
if [ "${i}" != 'lo' ] ; then
|
||||||
|
/sbin/ifdown "${i}"
|
||||||
|
/sbin/ip addr flush dev "${i}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network() {
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
service networking start
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
if [ -f "/usr/sbin/ifreload" ] ; then
|
||||||
|
/usr/sbin/ifreload -a
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFACES=$(/sbin/ifquery --list -a)
|
||||||
|
|
||||||
|
for i in $IFACES; do
|
||||||
|
/sbin/ifup "${i}"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network() {
|
||||||
|
stop_network
|
||||||
|
start_network
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet static
|
||||||
|
address $IP
|
||||||
|
network $NETWORK
|
||||||
|
netmask $MASK
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$MTU" ]; then
|
||||||
|
echo " mtu $MTU"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$GATEWAY" ]; then
|
||||||
|
echo " gateway $GATEWAY"
|
||||||
|
|
||||||
|
if [ -n "$METRIC" ]; then
|
||||||
|
echo " metric $METRIC"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet static
|
||||||
|
address $IP
|
||||||
|
network $NETWORK
|
||||||
|
netmask $MASK
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6
|
||||||
|
netmask ${IP6_PREFIX_LENGTH:-64}
|
||||||
|
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/autoconf
|
||||||
|
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/accept_ra
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6
|
||||||
|
netmask ${IP6_PREFIX_LENGTH:-64}
|
||||||
|
autoconf 0
|
||||||
|
accept_ra 0
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -n "$IP6_ULA" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6_ULA
|
||||||
|
netmask 64
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf()
|
||||||
|
{
|
||||||
|
case "${OS_ID}" in
|
||||||
|
alpine)
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6
|
||||||
|
netmask ${IP6_PREFIX_LENGTH:-64}
|
||||||
|
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/autoconf
|
||||||
|
pre-up echo 0 > /proc/sys/net/ipv6/conf/${DEV}/accept_ra
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
cat <<EOT
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6
|
||||||
|
netmask ${IP6_PREFIX_LENGTH:-64}
|
||||||
|
autoconf 0
|
||||||
|
accept_ra 0
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -n "$MTU" ]; then
|
||||||
|
echo " mtu $MTU"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$GATEWAY6" ]; then
|
||||||
|
echo " gateway $GATEWAY6"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$IP6_ULA" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
|
||||||
|
iface $DEV inet6 static
|
||||||
|
address $IP6_ULA
|
||||||
|
netmask 64
|
||||||
|
EOT
|
||||||
|
|
||||||
|
case "${OS_ID}" in
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
cat <<EOT
|
||||||
|
autoconf 0
|
||||||
|
accept_ra 0
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -n "$MTU" ]; then
|
||||||
|
echo " mtu $MTU"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
auto lo
|
||||||
|
iface lo inet loopback
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
INTERFACE_MAC=$(get_interface_mac)
|
||||||
|
CONTEXT_INTERFACES=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for iface in $CONTEXT_INTERFACES; do
|
||||||
|
MAC=$(get_iface_var "$iface" "MAC")
|
||||||
|
DEV=$(get_dev "$INTERFACE_MAC" "$MAC")
|
||||||
|
|
||||||
|
IP=$(get_ip "$iface")
|
||||||
|
NETWORK=$(get_network "$iface")
|
||||||
|
MASK=$(get_mask "$iface")
|
||||||
|
MTU=$(get_mtu "$iface")
|
||||||
|
GATEWAY=$(get_gateway "$iface")
|
||||||
|
METRIC=$(get_iface_var "$iface" "METRIC")
|
||||||
|
|
||||||
|
IP6=$(get_iface_var "$iface" "IP6")
|
||||||
|
[ -z "$IP6" ] && IP6=$(get_iface_var "$iface" "IPV6")
|
||||||
|
IP6_PREFIX_LENGTH=$(get_iface_var "$iface" "IP6_PREFIX_LENGTH")
|
||||||
|
IP6_ULA=$(get_iface_var "$iface" "IP6_ULA")
|
||||||
|
GATEWAY6=$(get_gateway6 "$iface")
|
||||||
|
|
||||||
|
[ -z "${IP}${IP6}" ] && continue
|
||||||
|
[ -z "${DEV}" ] && continue
|
||||||
|
|
||||||
|
echo "auto $DEV"
|
||||||
|
|
||||||
|
[ -n "${IP}" ] && gen_iface_conf
|
||||||
|
[ -n "${IP6}" ] && gen_iface6_conf
|
||||||
|
|
||||||
|
ALIASES=$(get_interface_alias "$iface")
|
||||||
|
|
||||||
|
for nic_alias in $ALIASES ; do
|
||||||
|
IP=$(get_ip "$nic_alias")
|
||||||
|
NETWORK=$(get_network "$nic_alias")
|
||||||
|
MASK=$(get_mask "$nic_alias")
|
||||||
|
|
||||||
|
IP6=$(get_iface_var "$nic_alias" "IP6")
|
||||||
|
[ -z "$IP6" ] && IP6=$(get_iface_var "$nic_alias" "IPV6")
|
||||||
|
IP6_PREFIX_LENGTH=$(get_iface_var "$nic_alias" "IP6_PREFIX_LENGTH")
|
||||||
|
IP6_ULA=$(get_iface_var "$nic_alias" "IP6_ULA")
|
||||||
|
|
||||||
|
EXTERNAL=$(get_iface_var "$nic_alias" "EXTERNAL")
|
||||||
|
EXTERNAL=${EXTERNAL^^}
|
||||||
|
DETACH=$(get_iface_var "$nic_alias" "DETACH")
|
||||||
|
|
||||||
|
if [ -z "${DETACH}" ]; then
|
||||||
|
if [ -z "${EXTERNAL}" ] || [ "${EXTERNAL}" = "NO" ]; then
|
||||||
|
[ -n "${IP}" ] && gen_alias_conf
|
||||||
|
[ -n "${IP6}" ] && gen_alias6_conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,219 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
||||||
|
# #
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
||||||
|
# not use this file except in compliance with the License. You may obtain #
|
||||||
|
# a copy of the License at #
|
||||||
|
# #
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
||||||
|
# #
|
||||||
|
# Unless required by applicable law or agreed to in writing, software #
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||||||
|
# See the License for the specific language governing permissions and #
|
||||||
|
# limitations under the License. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
#
|
||||||
|
# network module implementation
|
||||||
|
#
|
||||||
|
|
||||||
|
is_network_supported()
|
||||||
|
{
|
||||||
|
case "${OS_ID}" in
|
||||||
|
altlinux)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
fedora|centos|rhel|almalinux|ol|rocky)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
opensuse*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
gen_network_configuration
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network() {
|
||||||
|
systemctl stop systemd-networkd.service
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network() {
|
||||||
|
systemctl start systemd-networkd.service
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network() {
|
||||||
|
systemctl restart systemd-networkd.service
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
gen_iface_conf() {
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=${IP}/${CIDR}
|
||||||
|
EOT
|
||||||
|
ALIASES=$(get_interface_alias "$iface")
|
||||||
|
|
||||||
|
for nic_alias in $ALIASES; do
|
||||||
|
IP=$(get_ip "$nic_alias")
|
||||||
|
MASK=$(get_mask "$nic_alias")
|
||||||
|
CIDR=$(mask2cidr "$MASK")
|
||||||
|
|
||||||
|
EXTERNAL=$(get_iface_var "$nic_alias" "EXTERNAL")
|
||||||
|
EXTERNAL=${EXTERNAL^^}
|
||||||
|
DETACH=$(get_iface_var "$nic_alias" "DETACH")
|
||||||
|
|
||||||
|
if [ -z "${DETACH}" ]; then
|
||||||
|
if [ -z "${EXTERNAL}" ] || [ "${EXTERNAL}" = "NO" ]; then
|
||||||
|
if [ -n "${IP}" ]; then
|
||||||
|
echo "Address=$IP/$CIDR"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$DNS" ]; then
|
||||||
|
for dns_server in $DNS; do
|
||||||
|
echo "DNS=$dns_server"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$SEARCH_DOMAIN" ]; then
|
||||||
|
for domain in $SEARCH_DOMAIN; do
|
||||||
|
echo "Domains=$domain"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
[Route]
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$GATEWAY" ]; then
|
||||||
|
echo "Gateway=$GATEWAY"
|
||||||
|
|
||||||
|
if [ -n "$METRIC" ]; then
|
||||||
|
echo "Metric=$METRIC"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf() {
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=${IP6}/${IP6_PREFIX_LENGTH:-64}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
ALIASES=$(get_interface_alias "$iface")
|
||||||
|
|
||||||
|
for nic_alias in $ALIASES; do
|
||||||
|
IP6=$(get_iface_var "$nic_alias" "IP6")
|
||||||
|
[ -z "$IP6" ] && IP6=$(get_iface_var "$nic_alias" "IPV6")
|
||||||
|
IP6_PREFIX_LENGTH=$(get_iface_var "$nic_alias" "IP6_PREFIX_LENGTH")
|
||||||
|
IP6_ULA=$(get_iface_var "$nic_alias" "IP6_ULA")
|
||||||
|
|
||||||
|
EXTERNAL=$(get_iface_var "$nic_alias" "EXTERNAL")
|
||||||
|
EXTERNAL=${EXTERNAL^^}
|
||||||
|
DETACH=$(get_iface_var "$nic_alias" "DETACH")
|
||||||
|
|
||||||
|
if [ -z "${DETACH}" ]; then
|
||||||
|
if [ -z "${EXTERNAL}" ] || [ "${EXTERNAL}" = "NO" ]; then
|
||||||
|
if [ -n "${IP6}" ]; then
|
||||||
|
echo "Address=$IP6/${IP6_PREFIX_LENGTH:-64}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "IPv6AcceptRA=false"
|
||||||
|
|
||||||
|
if [ -n "$DNS" ]; then
|
||||||
|
for dns_server in $DNS; do
|
||||||
|
echo "DNS=$dns_server"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$SEARCH_DOMAIN" ]; then
|
||||||
|
for domain in $SEARCH_DOMAIN; do
|
||||||
|
echo "Domains=$domain"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
[Route]
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$GATEWAY6" ]; then
|
||||||
|
echo "Gateway=$GATEWAY6"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$IP6_ULA" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=$IP6_ULA/64
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
INTERFACE_MAC=$(get_interface_mac)
|
||||||
|
CONTEXT_INTERFACES=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for iface in $CONTEXT_INTERFACES; do
|
||||||
|
MAC=$(get_iface_var "$iface" "MAC")
|
||||||
|
DEV=$(get_dev "$INTERFACE_MAC" "$MAC")
|
||||||
|
|
||||||
|
IP=$(get_ip "$iface")
|
||||||
|
MASK=$(get_mask "$iface")
|
||||||
|
CIDR=$(mask2cidr "$MASK")
|
||||||
|
MTU=$(get_mtu "$iface")
|
||||||
|
GATEWAY=$(get_gateway "$iface")
|
||||||
|
METRIC=$(get_iface_var "$iface" "METRIC")
|
||||||
|
DNS=$(get_dns "$iface")
|
||||||
|
SEARCH_DOMAIN=$(get_search_domain "$iface")
|
||||||
|
|
||||||
|
IP6=$(get_iface_var "$iface" "IP6")
|
||||||
|
IP6_PREFIX_LENGTH=$(get_iface_var "$iface" "IP6_PREFIX_LENGTH")
|
||||||
|
IP6_ULA=$(get_iface_var "$iface" "IP6_ULA")
|
||||||
|
GATEWAY6=$(get_gateway6 "$iface")
|
||||||
|
|
||||||
|
[ -z "${IP}${IP6}" ] && continue
|
||||||
|
[ -z "${DEV}" ] && continue
|
||||||
|
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Match]
|
||||||
|
Name=$DEV
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$MTU" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
[Link]
|
||||||
|
MTUBytes=$MTU
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -n "${IP}" ] && gen_iface_conf
|
||||||
|
[ -n "${IP6}" ] && gen_iface6_conf
|
||||||
|
|
||||||
|
} > "/etc/systemd/network/${DEV}.network"
|
||||||
|
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in new issue