Compare commits
90 Commits
Author | SHA1 | Date |
---|---|---|
Eugene Zamriy | 773e74d25e | 2 years ago |
Jan Orel | 67eeaabb18 | 2 years ago |
Jan Orel | 381b5b10da | 2 years ago |
Ruben S. Montero | 7324b69f82 | 2 years ago |
Jan Orel | 8073d3271c | 2 years ago |
Ruben S. Montero | 3de2c1f8d3 | 2 years ago |
Daniel Clavijo Coca | 8d5047d9aa | 2 years ago |
Ruben S. Montero | 6c2ab5c634 | 2 years ago |
Petr Ospalý | 7f58221986 | 2 years ago |
Petr Ospalý | 37b46e1a4c | 2 years ago |
Petr Ospalý | f976d999b2 | 2 years ago |
Petr Ospalý | 097d9a42e0 | 2 years ago |
Petr Ospalý | 48a469a019 | 2 years ago |
Petr Ospalý | 19a280c91b | 2 years ago |
Elkhan Mammadli | 5cffad221c | 3 years ago |
Petr Ospalý | 3be568eff0 | 3 years ago |
Petr Ospalý | e15422d871 | 3 years ago |
Petr Ospalý | 0c2ea340fa | 3 years ago |
Petr Ospalý | 587c52781d | 3 years ago |
Petr Ospalý | 3dcc05a406 | 3 years ago |
Thomas Lejeune | 0831bdf59d | 3 years ago |
Thomas Lejeune | 439b4af8b9 | 3 years ago |
Petr Ospalý | 6c18bfb4b4 | 3 years ago |
Petr Ospalý | 8c875a1a3c | 3 years ago |
Ruben S. Montero | 40efc92948 | 3 years ago |
Ruben S. Montero | 8df3030bcd | 3 years ago |
Alejandro Huertas | b246b8f151 | 3 years ago |
Petr Ospalý | 280f193655 | 3 years ago |
Petr Ospalý | 6c1ff12d74 | 3 years ago |
Daniel Dehennin | 74385d0961 | 3 years ago |
Vlastimil Holer | 72b895dcea | 3 years ago |
Vlastimil Holer | a5aa14fcc1 | 3 years ago |
Vlastimil Holer | 9a6a0182cc | 3 years ago |
Vlastimil Holer | b28cc857d1 | 3 years ago |
Vlastimil Holer | 0661840e7c | 3 years ago |
Vlastimil Holer | 5cb9f3aaa3 | 3 years ago |
Vlastimil Holer | bc0743fcf8 | 3 years ago |
Vlastimil Holer | 484e436596 | 3 years ago |
Vlastimil Holer | 0af852da61 | 3 years ago |
Your Name | c228e8c00f | 3 years ago |
Your Name | b10f2b32c4 | 3 years ago |
Your Name | b87d2c8959 | 3 years ago |
Vlastimil Holer | 6796fa0a7d | 3 years ago |
Vlastimil Holer | df90cb5eb0 | 3 years ago |
Vlastimil Holer | d5e3d3ac93 | 3 years ago |
Vlastimil Holer | 59591e5dfb | 3 years ago |
Vlastimil Holer | e463ebf28f | 3 years ago |
Vlastimil Holer | 962153d817 | 3 years ago |
Remy Zandwijk | 25690dc21f | 3 years ago |
Vlastimil Holer | 4f691774d8 | 3 years ago |
Vlastimil Holer | eaccee4ff4 | 3 years ago |
Petr Ospalý | bfba520831 | 3 years ago |
Vlastimil Holer | 70cf13f434 | 3 years ago |
Vlastimil Holer | 7701d3a426 | 3 years ago |
Vlastimil Holer | 3176c6a635 | 3 years ago |
Vlastimil Holer | bcd3c5b43a | 3 years ago |
Petr Ospalý | 914ceae299 | 3 years ago |
Petr Ospalý | 688c04e14c | 3 years ago |
Vlastimil Holer | 1e6741b345 | 3 years ago |
Vlastimil Holer | c2b10350d0 | 4 years ago |
Petr Ospalý | 45a8bdb39b | 4 years ago |
Vlastimil Holer | 86f639b670 | 4 years ago |
Vlastimil Holer | d1f4d3a97d | 4 years ago |
Vlastimil Holer | 9d4d93eaa7 | 4 years ago |
Vlastimil Holer | c6b47e093b | 4 years ago |
Moin | 4238552798 | 4 years ago |
Petr Ospalý | 789ac3cf4b | 4 years ago |
Vlastimil Holer | 4577d94d62 | 4 years ago |
Vlastimil Holer | 19623ba9bd | 4 years ago |
Vlastimil Holer | 740623f403 | 4 years ago |
Petr Ospalý | 7a8cb816c8 | 4 years ago |
Petr Ospalý | 8a4026e4f6 | 4 years ago |
Vlastimil Holer | b64deb39d3 | 4 years ago |
Vlastimil Holer | cfecad0516 | 4 years ago |
Vlastimil Holer | ee5f8f36f8 | 4 years ago |
Vlastimil Holer | d847784380 | 4 years ago |
Vlastimil Holer | bb2df2ab2c | 4 years ago |
Petr Ospalý | 04d85b45b6 | 4 years ago |
Alexandre Derumier | fccb01f52d | 4 years ago |
Vlastimil Holer | 2c7775ca8a | 4 years ago |
Alejandro Huertas | 811cf98c49 | 4 years ago |
Vlastimil Holer | 23fb8394e7 | 4 years ago |
Alejandro Huertas | c68deb36c2 | 4 years ago |
Vlastimil Holer | 2e487803a0 | 4 years ago |
Vlastimil Holer | 4144f9a794 | 4 years ago |
Vlastimil Holer | 092c2a38ee | 4 years ago |
Vlastimil Holer | 91b180323f | 4 years ago |
Petr Ospalý | d8bcc73e34 | 4 years ago |
Vlastimil Holer | 18ae88b264 | 4 years ago |
Petr Ospalý | 4ac75a4242 | 4 years ago |
@ -0,0 +1,14 @@
|
|||||||
|
name: 'ShellCheck'
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
name: Shellcheck
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Run ShellCheck
|
||||||
|
uses: ludeeus/action-shellcheck@master
|
||||||
|
with:
|
||||||
|
scandir: './src'
|
@ -1,20 +0,0 @@
|
|||||||
# Maintainer Harvard University FAS Research Computing <rchelp.fas.harvard.edu>
|
|
||||||
|
|
||||||
pkgname=one-context
|
|
||||||
pkgver=4.14.1
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc='OpenNebula Contextualisation'
|
|
||||||
arch=('any')
|
|
||||||
url='https://github.com/OpenNebula/addon-context-linux/releases'
|
|
||||||
license=('Apache')
|
|
||||||
depends=('mkinitcpio-growrootfs')
|
|
||||||
source=("")
|
|
||||||
install=one-context.install
|
|
||||||
md5sums=('')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd ${srcdir}
|
|
||||||
TARGET=arch OUT=${pkgdir} ./generate.sh
|
|
||||||
cp -rT ${pkgdir}/usr/sbin ${pkgdir}/usr/bin
|
|
||||||
rm -rf ${pkgdir}/usr/sbin
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
post_install(){
|
|
||||||
systemctl enable one-context
|
|
||||||
|
|
||||||
rm -f /etc/systemd/network/*
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
NETWORK_EC2=yes
|
|
||||||
SERVICES='one-context'
|
|
@ -1,7 +1,66 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Reload udev rules
|
||||||
udevadm control --reload >/dev/null 2>&1 || :
|
udevadm control --reload >/dev/null 2>&1 || :
|
||||||
|
|
||||||
if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then
|
### Enable services ########################################
|
||||||
|
|
||||||
|
SERVICES=${SERVICES:-one-context-local one-context-online one-context}
|
||||||
|
TIMERS=${TIMERS:-one-context-reconfigure.timer}
|
||||||
|
|
||||||
|
if which systemctl >/dev/null 2>&1 && \
|
||||||
|
[ -d /etc/systemd ] && \
|
||||||
|
[ -f /usr/lib/systemd/system/one-context.service ];
|
||||||
|
then
|
||||||
systemctl daemon-reload >/dev/null 2>&1 || :
|
systemctl daemon-reload >/dev/null 2>&1 || :
|
||||||
|
|
||||||
|
for S in ${SERVICES} ${TIMERS}; do
|
||||||
|
systemctl enable "${S}" >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if which chkconfig >/dev/null 2>&1; then
|
||||||
|
for S in ${SERVICES}; do
|
||||||
|
chkconfig --add "${S}" >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
# EL6: refresh initramfs via dracut for growroot module
|
||||||
|
if [ -f /usr/share/dracut/modules.d/50growroot/install ]; then
|
||||||
|
for I in $(find /boot -name 'initramfs-*.img'); do
|
||||||
|
KERNEL_VERS=$(echo "${I}" | sed -e 's/.*initramfs-\(.*\)\.img/\1/')
|
||||||
|
dracut -f "${I}" "${KERNEL_VERS}" || :
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif which update-rc.d >/dev/null 2>&1; then
|
||||||
|
for S in ${SERVICES}; do
|
||||||
|
update-rc.d "${S}" enable >/dev/null 2>&1
|
||||||
|
update-rc.d "${S}" defaults >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
elif which rc-update >/dev/null 2>&1; then
|
||||||
|
for S in ${SERVICES}; do
|
||||||
|
rc-update add "${S}" boot >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add crontab action for 1min schedules
|
||||||
|
if ! crontab -l -u root | grep -qF '/etc/periodic/1min'; then
|
||||||
|
(
|
||||||
|
crontab -l -u root
|
||||||
|
echo -e '\n# Added by one-context'
|
||||||
|
echo -e '* * * * * run-parts /etc/periodic/1min'
|
||||||
|
) | crontab -u root -
|
||||||
|
fi
|
||||||
|
|
||||||
|
# When existing file is changed, the new one might be created with
|
||||||
|
# .apk-new suffix. Such files need to be processed by update-conf.
|
||||||
|
if update-conf -al 2>/dev/null | grep -q context; then
|
||||||
|
echo 'WARNING: Run update-conf to process any updated one-context files in /etc!' >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ -x /bin/freebsd-version ]; then
|
||||||
|
:
|
||||||
|
|
||||||
|
else
|
||||||
|
echo 'WARNING: Contextualization service not enabled automatically' >&2
|
||||||
fi
|
fi
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
SERVICES='one-context'
|
|
@ -0,0 +1,7 @@
|
|||||||
|
# This enables sensible default for 'unmanaged-devices' on ubuntu:
|
||||||
|
# https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1638842
|
||||||
|
# https://askubuntu.com/questions/882806/ethernet-device-not-managed
|
||||||
|
#
|
||||||
|
# This file must exist prior start of NetworkManager to take an effect -
|
||||||
|
# a simple reloading of the already running daemon will not work.
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
[main]
|
||||||
|
no-auto-default=*
|
||||||
|
dns=none
|
@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# 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. #
|
||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
# As of Netplan 0.102, the NetworkManager renderer can only enable
|
||||||
|
# IPv6 privacy if ipv6-privacy == true, but doesn't disable it if false.
|
||||||
|
# Instead of enforcing any global defaults, we set IPv6 privacy via sysctl
|
||||||
|
# on Netplan described interfaces in case the current settings is -1 (unknown),
|
||||||
|
# i.e. not explicitly configured. This is a forward compatible workaround, once
|
||||||
|
# Netplan properly sets NM ipv6.ip6-privacy=0, this code won't be effective.
|
||||||
|
|
||||||
|
case "${CONNECTION_ID}" in
|
||||||
|
netplan-*)
|
||||||
|
IP6_PRIVACY=$(nmcli -g ipv6.ip6-privacy con show "${CONNECTION_UUID}")
|
||||||
|
|
||||||
|
# overwrite only unknown state
|
||||||
|
if [ "${IP6_PRIVACY}" = '-1' ]; then
|
||||||
|
sysctl -q -w "net.ipv6.conf.${DEVICE_IFACE}.use_tempaddr=0"
|
||||||
|
|
||||||
|
# delete any existing temporary IPv6 addresses
|
||||||
|
ip -6 address show dev "${DEVICE_IFACE}" | \
|
||||||
|
grep 'inet6.*temporary' | \
|
||||||
|
tr -s ' ' | \
|
||||||
|
cut -d' ' -f 3 | \
|
||||||
|
xargs -r -n1 ip -6 address del dev "${DEVICE_IFACE}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,6 @@
|
|||||||
|
# Periodically run one-context-reconfigure on VMware
|
||||||
|
SHELL=/bin/sh
|
||||||
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
||||||
|
MAILTO=''
|
||||||
|
|
||||||
|
* * * * * root if [ "$(virt-what 2>/dev/null)" = 'vmware' ]; then service one-context-reconfigure start >/dev/null 2>&1 || service one-context-reconfigure onestart >/dev/null 2>&1; fi
|
@ -0,0 +1,47 @@
|
|||||||
|
# On NIC hotplug the delayed reconfiguration is triggered.
|
||||||
|
|
||||||
|
# NOTE: With hot-attached emulated NICs (e1000, ...) the interface
|
||||||
|
# and kernel event may appear later, even after CD-ROM is refreshed.
|
||||||
|
# Such interface doesn't configure, since new change in context
|
||||||
|
# script is not detected anymore. We hack the state files so that the
|
||||||
|
# recontextualization is forced to run.
|
||||||
|
notify 21 {
|
||||||
|
match "system" "ETHERNET";
|
||||||
|
match "type" "IFATTACH";
|
||||||
|
match "subsystem" "!vtnet[0-9]+";
|
||||||
|
action "/bin/sh -c 'test -f /var/run/one-context/context.sh.local && echo >> /var/run/one-context/context.sh.local; test -f /var/run/one-context/context.sh.network && echo >> /var/run/one-context/context.sh.network; service one-context-reconfigure-delayed onestart'";
|
||||||
|
};
|
||||||
|
|
||||||
|
notify 20 {
|
||||||
|
match "system" "ETHERNET";
|
||||||
|
match "type" "IFATTACH";
|
||||||
|
action "service one-context-reconfigure-delayed onestart";
|
||||||
|
};
|
||||||
|
|
||||||
|
notify 20 {
|
||||||
|
match "system" "IFNET";
|
||||||
|
match "type" "DETACH";
|
||||||
|
action "service one-context-reconfigure-delayed onestart";
|
||||||
|
};
|
||||||
|
|
||||||
|
# On CONTEXT CD-ROM change the immediate reconfiguration is triggered.
|
||||||
|
notify 20 {
|
||||||
|
match "system" "DEVFS";
|
||||||
|
match "subsystem" "CDEV";
|
||||||
|
match "type" "CREATE";
|
||||||
|
match "cdev" "iso9660/CONTEXT";
|
||||||
|
action "service one-context-reconfigure onestart";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Handle disk resize
|
||||||
|
# NOTE: Event not generated on FreeBSD 12 and older
|
||||||
|
notify 20 {
|
||||||
|
match "system" "GEOM";
|
||||||
|
match "subsystem" "DEV";
|
||||||
|
match "type" "SIZECHANGE";
|
||||||
|
match "cdev" "!(cd[0-9]+|.*/.*|.*p[0-9]+)"; # skip CD-ROM/context, filesystems and partitions
|
||||||
|
action "service one-context-force onestart";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Handle swap hot-attach
|
||||||
|
# NOTE: swap activation not supported on FreeBSD now
|
@ -0,0 +1,60 @@
|
|||||||
|
#!/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. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# THIS IS A CONTEXTUALIZATION GUARD
|
||||||
|
if [ "$1" != 'local' ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Umount the directory and remove it
|
||||||
|
cleanup()
|
||||||
|
{
|
||||||
|
[ "$MOUNTED" = "yes" ] && umount -l "${ROOTFS_DIR}"
|
||||||
|
rm -r "${TMP_DIR}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "${RECREATE_RUN^^}" = "YES" ] && [ "$(uname -s)" = 'Linux' ]; then
|
||||||
|
# Detection of real run-time variable data directory in case there
|
||||||
|
# would be images with (unusual) reverse symlink /run -> /var/run
|
||||||
|
if [ -d /run ] && ! [ -L /run ]; then
|
||||||
|
RUN_DIR=/run
|
||||||
|
elif [ -d /var/run ] && ! [ -L /var/run ]; then
|
||||||
|
RUN_DIR=/var/run
|
||||||
|
else
|
||||||
|
# this shouldn't happen
|
||||||
|
echo 'ERROR: No suitable run-time data directory in image!' >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
TMP_DIR=$(mktemp -d "/tmp/one-context.XXXXXX")
|
||||||
|
ROOTFS_DIR="${TMP_DIR}/rootfs"
|
||||||
|
trap cleanup EXIT
|
||||||
|
chmod 0700 "${TMP_DIR}"
|
||||||
|
mkdir "${ROOTFS_DIR}"
|
||||||
|
|
||||||
|
mount --bind -o ro,nodev,noexec,nosuid / "${ROOTFS_DIR}"
|
||||||
|
MOUNTED=yes
|
||||||
|
|
||||||
|
# copy, but don't overwrite
|
||||||
|
# NOTE: using -i </dev/null is a workaround for silly cp in busybox without -n support
|
||||||
|
cp -aiv "${ROOTFS_DIR}/${RUN_DIR}" "$(dirname "${RUN_DIR}")" 2>/dev/null </dev/null
|
||||||
|
fi
|
@ -0,0 +1,165 @@
|
|||||||
|
#!/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. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091,SC1090
|
||||||
|
|
||||||
|
. /etc/one-context.d/loc-10-network.d/functions
|
||||||
|
|
||||||
|
context_type="$1"
|
||||||
|
action="$2"
|
||||||
|
os_id=$(detect_os)
|
||||||
|
|
||||||
|
if [ -z "${action}" ] ; then
|
||||||
|
action="configure"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${NETCFG_TYPE}" ] ; then
|
||||||
|
case "${os_id}" in
|
||||||
|
alpine)
|
||||||
|
NETCFG_TYPE='interfaces'
|
||||||
|
;;
|
||||||
|
altlinux)
|
||||||
|
NETCFG_TYPE='networkd nm'
|
||||||
|
;;
|
||||||
|
debian|devuan|ubuntu)
|
||||||
|
NETCFG_TYPE='interfaces netplan nm networkd'
|
||||||
|
;;
|
||||||
|
fedora|centos|rhel|almalinux|ol|rocky|msvsphere)
|
||||||
|
NETCFG_TYPE='scripts nm networkd'
|
||||||
|
;;
|
||||||
|
opensuse*|sles|sled)
|
||||||
|
NETCFG_TYPE='scripts'
|
||||||
|
;;
|
||||||
|
amzn)
|
||||||
|
NETCFG_TYPE='scripts'
|
||||||
|
;;
|
||||||
|
freebsd)
|
||||||
|
NETCFG_TYPE='bsd'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NETCFG_TYPE='none'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
# trim and lowercase
|
||||||
|
NETCFG_TYPE=$(echo "$NETCFG_TYPE" | \
|
||||||
|
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | \
|
||||||
|
tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
|
# support alternative names for some configuration renderers
|
||||||
|
case "${NETCFG_TYPE}" in
|
||||||
|
networkmanager)
|
||||||
|
NETCFG_TYPE='nm'
|
||||||
|
;;
|
||||||
|
systemd-networkd|systemd-network|systemd)
|
||||||
|
NETCFG_TYPE='networkd'
|
||||||
|
;;
|
||||||
|
redhat)
|
||||||
|
NETCFG_TYPE='scripts'
|
||||||
|
;;
|
||||||
|
debian)
|
||||||
|
NETCFG_TYPE='interfaces'
|
||||||
|
;;
|
||||||
|
freebsd)
|
||||||
|
NETCFG_TYPE='bsd'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${NETCFG_TYPE}" != 'none' ] ; then
|
||||||
|
_found_valid_netcfg='no'
|
||||||
|
|
||||||
|
# from a space separated list of $NETCFG_TYPE candidates check one
|
||||||
|
# by one and select the first suitable one for current environment
|
||||||
|
for _cfgtype in ${NETCFG_TYPE} ; do
|
||||||
|
_cfgtype_file="/etc/one-context.d/loc-10-network.d/netcfg-$(basename "${_cfgtype}")"
|
||||||
|
|
||||||
|
if [ -e "${_cfgtype_file}" ] ; then
|
||||||
|
# reload functions to reset back any overrides from prev. netcfg-X
|
||||||
|
. /etc/one-context.d/loc-10-network.d/functions
|
||||||
|
. "${_cfgtype_file}"
|
||||||
|
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
|
||||||
|
|
||||||
|
# regardless of the required_context_type we need cleanup in the 'local' stage
|
||||||
|
#
|
||||||
|
# TODO: currently we must skip cleanup during reconfigure action (check-out the
|
||||||
|
# initialize_network function) otherwise we would wiped-out running config and
|
||||||
|
# broke the system
|
||||||
|
if [ "${context_type}" = 'local' ] ; then
|
||||||
|
case "$action" in
|
||||||
|
configure|reconfigure)
|
||||||
|
initialize_network
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR [!]: Unknown ACTION: ${action}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# this is a contextualization guard
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
case "${required_context_type}" in
|
||||||
|
''|local|online)
|
||||||
|
if [ "${required_context_type:-local}" != "${context_type}" ] ; then
|
||||||
|
# skip this netcfg at this stage
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR [!]: Unknown required context type: ${required_context_type}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
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-2020, 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,274 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2020, 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() {
|
|
||||||
echo -n "ifconfig_${DEV}=\"inet ${IP} netmask ${MASK}"
|
|
||||||
|
|
||||||
if [ -n "${MTU}" ]; then
|
|
||||||
echo -n " mtu ${MTU}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "\""
|
|
||||||
|
|
||||||
###
|
|
||||||
|
|
||||||
if [ -n "${GATEWAY}" ]; then
|
|
||||||
echo "defaultrouter=\"${GATEWAY}\"" >> /etc/rc.conf.d/routing
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias_conf() {
|
|
||||||
echo "ifconfig_${DEV}_alias${ALIAS_NUM}=\"inet ${IP} netmask ${MASK}\""
|
|
||||||
ALIAS_NUM=$((ALIAS_NUM + 1))
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias6_conf() {
|
|
||||||
# very first IPv6 can't be alias
|
|
||||||
if [ -n "${HAS_IP6}" ]; then
|
|
||||||
echo "ifconfig_${DEV}_alias${ALIAS_NUM}=\"inet6 ${IP6} prefixlen ${IP6_PREFIX_LENGTH:-64}\""
|
|
||||||
ALIAS_NUM=$((ALIAS_NUM + 1))
|
|
||||||
else
|
|
||||||
echo -n "ifconfig_${DEV}_ipv6=\"inet6 ${IP6} prefixlen ${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
|
|
||||||
if [ -n "${MTU}" ]; then
|
|
||||||
echo -n " mtu ${MTU}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " -accept_rtadv\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${IP6_ULA}" ]; then
|
|
||||||
echo "ifconfig_${DEV}_alias${ALIAS_NUM}=\"inet6 ${IP6_ULA} prefixlen 64\""
|
|
||||||
ALIAS_NUM=$((ALIAS_NUM + 1))
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface6_conf() {
|
|
||||||
echo -n "ifconfig_${DEV}_ipv6=\"inet6 ${IP6} prefixlen ${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
|
|
||||||
if [ -n "${MTU}" ]; then
|
|
||||||
echo -n " mtu ${MTU}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " -accept_rtadv\""
|
|
||||||
|
|
||||||
if [ -n "${IP6_ULA}" ]; then
|
|
||||||
echo "ifconfig_${DEV}_alias${ALIAS_NUM}=\"inet6 ${IP6_ULA} prefixlen 64\""
|
|
||||||
ALIAS_NUM=$((ALIAS_NUM + 1))
|
|
||||||
fi
|
|
||||||
|
|
||||||
###
|
|
||||||
|
|
||||||
if [ -n "${GATEWAY6}" ]; then
|
|
||||||
echo "ipv6_defaultrouter=\"${GATEWAY6}\"" >> /etc/rc.conf.d/routing
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_interface_mac()
|
|
||||||
{
|
|
||||||
macs_array=($(ifconfig | grep ether | awk '{print $2}'))
|
|
||||||
#iface_name=()
|
|
||||||
|
|
||||||
for mac in "${macs_array[@]}"
|
|
||||||
do
|
|
||||||
echo "$(ifconfig | grep -B 2 $mac | head -n 1 | awk '{print $1}' | cut -d ':' -f 1) $mac"
|
|
||||||
#iface_mac+=$(ifconfig | grep -B 2 $mac | head -n 1 | awk '{print $1}' | cut -d ':' -f 1)
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
# clean routing information
|
|
||||||
echo -n > /etc/rc.conf.d/routing
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
ALIAS_NUM=0
|
|
||||||
HAS_IP6=${IP6}
|
|
||||||
|
|
||||||
[ -n "${IP}" ] && gen_iface_conf
|
|
||||||
[ -n "${IP6}" ] && gen_iface6_conf
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP=$(get_ip)
|
|
||||||
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
|
|
||||||
|
|
||||||
if [ -n "${IP6}" ]; then
|
|
||||||
gen_alias6_conf
|
|
||||||
HAS_IP6=${IP6}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network()
|
|
||||||
{
|
|
||||||
gen_network_configuration >/etc/rc.conf.d/network
|
|
||||||
|
|
||||||
if [ "${COMMAND}" = 'reconfigure' ]; then
|
|
||||||
service netif restart >/dev/null
|
|
||||||
service routing restart >/dev/null
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -z "$(env | cut -d= -f1 | grep -E '^ETH[0-9]+_IPV*6*')" ] && exit 0
|
|
||||||
|
|
||||||
configure_network
|
|
@ -1,315 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2020, 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()
|
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
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,320 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2020, 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
|
|
||||||
NETMASK=$MASK
|
|
||||||
IPADDR=$IP
|
|
||||||
EOT
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY" ]; then
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "default $GATEWAY - $DEV ${METRIC:+metric ${METRIC}}" \
|
|
||||||
>> "${CONFIG_PATH}/ifroute-${DEV}"
|
|
||||||
else
|
|
||||||
echo "default via $GATEWAY dev $DEV ${METRIC:+metric ${METRIC}}" \
|
|
||||||
>> "${CONFIG_PATH}/route-${DEV}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo "MTU=$MTU"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias_conf() {
|
|
||||||
cat <<EOT
|
|
||||||
IPADDR${ALIAS_NUM}="${IP}"
|
|
||||||
NETMASK${ALIAS_NUM}="${MASK}"
|
|
||||||
EOT
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_alias6_conf() {
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "IPADDR_A6A${ALIAS_NUM}=$IP6/${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
else
|
|
||||||
IPV6ADDR_SECONDARIES="${IPV6ADDR_SECONDARIES} ${IP6}/${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "IPADDR_A6B${ALIAS_NUM}=$IP6_ULA/64"
|
|
||||||
else
|
|
||||||
IPV6ADDR_SECONDARIES="${IPV6ADDR_SECONDARIES} ${IP6_ULA}/64"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_iface6_conf() {
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "IPADDR_6A=$IP6/${IP6_PREFIX_LENGTH:-64}"
|
|
||||||
|
|
||||||
cat <<EOT >> /etc/sysconfig/network/ifsysctl-$DEV
|
|
||||||
net.ipv6.conf.\$SYSCTL_IF.autoconf = 0
|
|
||||||
net.ipv6.conf.\$SYSCTL_IF.accept_ra = 0
|
|
||||||
EOT
|
|
||||||
else
|
|
||||||
cat <<EOT
|
|
||||||
IPV6INIT=yes
|
|
||||||
IPV6ADDR=$IP6/${IP6_PREFIX_LENGTH:-64}
|
|
||||||
IPV6_AUTOCONF=no
|
|
||||||
EOT
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$IP6_ULA" ]; then
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "IPADDR_6B=$IP6_ULA/64"
|
|
||||||
else
|
|
||||||
IPV6ADDR_SECONDARIES="${IPV6ADDR_SECONDARIES} ${IP6_ULA}/64"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$GATEWAY6" ]; then
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "default $GATEWAY6 - $DEV" >> /etc/sysconfig/network/ifroute-$DEV
|
|
||||||
else
|
|
||||||
echo "IPV6_DEFAULTGW=$GATEWAY6"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$MTU" ]; then
|
|
||||||
echo "IPV6_MTU=$MTU"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
if [ -d /etc/sysconfig/network-scripts ]; then
|
|
||||||
CONFIG_PATH=/etc/sysconfig/network-scripts
|
|
||||||
elif [ -d /etc/sysconfig/network ]; then
|
|
||||||
CONFIG_PATH=/etc/sysconfig/network
|
|
||||||
fi
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
# cumulative variable
|
|
||||||
IPV6ADDR_SECONDARIES=''
|
|
||||||
|
|
||||||
[ -z "${IP}${IP6}" ] && continue
|
|
||||||
[ -z "${DEV}" ] && continue
|
|
||||||
|
|
||||||
(
|
|
||||||
rm -f /etc/sysconfig/network-scripts/route-$DEV
|
|
||||||
rm -f /etc/sysconfig/network/ifroute-$DEV
|
|
||||||
rm -f /etc/sysconfig/network/ifsysctl-$DEV
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
DEVICE=$DEV
|
|
||||||
BOOTPROTO=static
|
|
||||||
NM_CONTROLLED=no
|
|
||||||
TYPE=Ethernet
|
|
||||||
EOT
|
|
||||||
if [ "$CONFIG_PATH" = "/etc/sysconfig/network" ]; then
|
|
||||||
echo "STARTMODE=auto"
|
|
||||||
else
|
|
||||||
echo "ONBOOT=yes"
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ -n $IP ]] && gen_iface_conf
|
|
||||||
[[ -n $IP6 ]] && gen_iface6_conf
|
|
||||||
|
|
||||||
INDEX=${interface: -1}
|
|
||||||
ALIAS=$(get_interface_alias)
|
|
||||||
ALIAS_NUM=0
|
|
||||||
|
|
||||||
for nic_alias in $ALIAS; do
|
|
||||||
UPCASE_DEV="ETH${INDEX}_${nic_alias}"
|
|
||||||
IP=$(get_ip)
|
|
||||||
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
|
|
||||||
|
|
||||||
if [ -n "${IP}${IP6}" ]; then
|
|
||||||
ALIAS_NUM=$((ALIAS_NUM + 1))
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# on Red Hats, we need just a single configuration
|
|
||||||
# entry with all additional IPv6 addresses
|
|
||||||
if [ -n "${IPV6ADDR_SECONDARIES}" ]; then
|
|
||||||
echo "IPV6ADDR_SECONDARIES='${IPV6ADDR_SECONDARIES## }'"
|
|
||||||
fi
|
|
||||||
) > ${CONFIG_PATH}/ifcfg-${DEV}
|
|
||||||
|
|
||||||
ifup ${DEV}
|
|
||||||
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network()
|
|
||||||
{
|
|
||||||
gen_network_configuration
|
|
||||||
|
|
||||||
if [ "${COMMAND}" = 'reconfigure' ]; then
|
|
||||||
service network restart
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 2
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -z "$(env | cut -d= -f1 | grep -E '^ETH[0-9]+_IPV*6*')" ] && exit 0
|
|
||||||
|
|
||||||
configure_network
|
|
||||||
|
|
@ -1,353 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2020, 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,573 @@
|
|||||||
|
#!/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. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
# shellcheck disable=SC2155
|
||||||
|
|
||||||
|
#
|
||||||
|
# network module interface
|
||||||
|
#
|
||||||
|
|
||||||
|
export required_context_type='local' # this is the default, the next option is 'online'
|
||||||
|
|
||||||
|
is_network_supported()
|
||||||
|
{
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize_network()
|
||||||
|
{
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
case "${os_id}" in
|
||||||
|
freebsd)
|
||||||
|
:
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
mkdir -p /etc/sysctl.d/
|
||||||
|
rm -f /etc/sysctl.d/50-one-context.conf
|
||||||
|
sysctl --system 2>/dev/null || sysctl -p
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#
|
||||||
|
# remove all stale configs from any of the previous runs
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: improve this and support proper network unconfigure and cleanup
|
||||||
|
# on action=reconfigure too - this becomes problematic when NETCFG_TYPE is
|
||||||
|
# changed while VM is running (deleting configs will break ifdown etc.)
|
||||||
|
#
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
[ "${action}" = 'configure' ] || return 0
|
||||||
|
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
_iface_mac=$(get_interface_mac)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
_mac=$(get_iface_var "${_iface}" "MAC")
|
||||||
|
_dev=$(get_dev "${_iface_mac}" "${_mac}")
|
||||||
|
|
||||||
|
# network-scripts
|
||||||
|
rm -f \
|
||||||
|
"/etc/sysconfig/network-scripts/route-${dev}" \
|
||||||
|
"/etc/sysconfig/network-scripts/route6-${dev}" \
|
||||||
|
"/etc/sysconfig/network-scripts/ifcfg-${dev}" \
|
||||||
|
"/etc/sysconfig/network/ifroute-${dev}" \
|
||||||
|
"/etc/sysconfig/network/ifsysctl-${dev}" \
|
||||||
|
"/etc/sysconfig/network/ifcfg-${dev}" \
|
||||||
|
;
|
||||||
|
|
||||||
|
# networkd
|
||||||
|
rm -f \
|
||||||
|
"/etc/systemd/network/${dev}.network" \
|
||||||
|
"/etc/systemd/network/${dev}.link"
|
||||||
|
|
||||||
|
# nm (on RH systems it was deleted with ifcfg-*)
|
||||||
|
for _nm_con in /etc/NetworkManager/system-connections/* ; do
|
||||||
|
if [ -e "${_nm_con}" ] && grep -q "^interface-name=${_dev}$" "${_nm_con}" ; then
|
||||||
|
rm -f "${_nm_con}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# To avoid clashes when running legacy network-scripts and
|
||||||
|
# NetworkManager/networkd, we disable old-style networking
|
||||||
|
# on Red Hats and enable later back only if needed.
|
||||||
|
if [ -d /etc/sysconfig/network-scripts/ ]; then
|
||||||
|
touch /etc/sysconfig/network
|
||||||
|
sed -i -e '/^NETWORKING=/d' /etc/sysconfig/network
|
||||||
|
echo 'NETWORKING=no' >>/etc/sysconfig/network
|
||||||
|
fi
|
||||||
|
|
||||||
|
# interfaces
|
||||||
|
if [ -e /etc/network/interfaces ] ; then
|
||||||
|
cat <<EOT >/etc/network/interfaces
|
||||||
|
# Generated by one-context
|
||||||
|
auto lo
|
||||||
|
iface lo inet loopback
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
case "${os_id}" in
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# netplan
|
||||||
|
rm -f /etc/netplan/50-one-context.yaml
|
||||||
|
|
||||||
|
nm_disable
|
||||||
|
}
|
||||||
|
|
||||||
|
nm_disable() {
|
||||||
|
if [ -d /etc/NetworkManager/conf.d/ ] &&
|
||||||
|
! [ -e /etc/NetworkManager/conf.d/50-unmanaged-devices.conf ];
|
||||||
|
then
|
||||||
|
cat - <<EOF >/etc/NetworkManager/conf.d/50-unmanaged-devices.conf
|
||||||
|
# Generated by one-context
|
||||||
|
|
||||||
|
# NOTE: NetworkManager was dynamically disabled by OpenNebula
|
||||||
|
# contextualization scripts because interfaces are managed by
|
||||||
|
# different network service!
|
||||||
|
|
||||||
|
[keyfile]
|
||||||
|
unmanaged-devices=*
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if command -v systemctl >/dev/null; then
|
||||||
|
systemctl --no-block try-reload-or-restart NetworkManager.service 2>/dev/null
|
||||||
|
else
|
||||||
|
service NetworkManager reload 2>/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
nm_enable() {
|
||||||
|
if [ -e /etc/NetworkManager/conf.d/50-unmanaged-devices.conf ]; then
|
||||||
|
rm -f /etc/NetworkManager/conf.d/50-unmanaged-devices.conf
|
||||||
|
|
||||||
|
if command -v systemctl >/dev/null; then
|
||||||
|
systemctl --no-block try-reload-or-restart NetworkManager.service 2>/dev/null
|
||||||
|
else
|
||||||
|
service NetworkManager reload 2>/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'configure_network' implementation for the network type: ${NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'stop_network' implementation for the network type: ${NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'start_network' implementation for the network type: ${NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
echo "ERROR [!]: No 'reload_network' implementation for the network type: ${NETCFG_TYPE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# generic shared functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# arg: <true|yes|false|no>
|
||||||
|
is_true()
|
||||||
|
(
|
||||||
|
_value=$(echo "$1" | \
|
||||||
|
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | \
|
||||||
|
tr '[:upper:]' '[:lower:]')
|
||||||
|
case "$_value" in
|
||||||
|
1|true|yes|y)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 1
|
||||||
|
)
|
||||||
|
|
||||||
|
# return OS ID
|
||||||
|
detect_os()
|
||||||
|
(
|
||||||
|
if [ -f /etc/os-release ] ; then
|
||||||
|
ID=
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
. /etc/os-release
|
||||||
|
echo "$ID" | tr '[:upper:]' '[:lower:]'
|
||||||
|
|
||||||
|
# check for legacy RHEL/CentOS 6
|
||||||
|
elif [ -f /etc/centos-release ]; then
|
||||||
|
echo 'centos'
|
||||||
|
elif [ -f /etc/redhat-release ]; then
|
||||||
|
echo 'rhel'
|
||||||
|
|
||||||
|
# fallback to uname (returns Linux, FreeBSD, ...)
|
||||||
|
else
|
||||||
|
uname | tr '[:upper:]' '[:lower:]'
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
disable_ipv6()
|
||||||
|
(
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
case "${os_id}" in
|
||||||
|
freebsd)
|
||||||
|
# TODO: these are the relevant options in /etc/rc.conf:
|
||||||
|
# ip6addrctl_enable="NO"
|
||||||
|
# ip6addrctl_policy="ipv4_prefer"
|
||||||
|
# ipv6_activate_all_interfaces="NO"
|
||||||
|
# ipv6_network_interfaces="none"
|
||||||
|
echo "ERROR [!]: Disabling of IPv6 on '${os_id}' is not supported" >&2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# VH-TODO: do we suport runtime enable?
|
||||||
|
for S in \
|
||||||
|
"net.ipv6.conf.${1}.disable_ipv6=1" \
|
||||||
|
"net.ipv6.conf.${1}.autoconf=0" \
|
||||||
|
"net.ipv6.conf.${1}.accept_ra=0";
|
||||||
|
do
|
||||||
|
# don't duplicate entries on recontextualization
|
||||||
|
if ! grep -Fxq "${S}" /etc/sysctl.d/50-one-context.conf 2>/dev/null; then
|
||||||
|
echo "${S}" >> /etc/sysctl.d/50-one-context.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
sysctl -w "${S}" >/dev/null
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <iface>
|
||||||
|
disable_ipv6_privacy()
|
||||||
|
(
|
||||||
|
case "${os_id}" in
|
||||||
|
freebsd)
|
||||||
|
echo "ERROR [!]: Disabling of IPv6 privacy on '${os_id}' is not supported" >&2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# shellcheck disable=SC2066
|
||||||
|
for S in \
|
||||||
|
"net.ipv6.conf.${1}.use_tempaddr=0";
|
||||||
|
do
|
||||||
|
# don't duplicate entries on recontextualization
|
||||||
|
if ! grep -Fxq "${S}" /etc/sysctl.d/50-one-context.conf 2>/dev/null; then
|
||||||
|
echo "${S}" >> /etc/sysctl.d/50-one-context.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
sysctl -w "${S}" >/dev/null
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
)
|
||||||
|
|
||||||
|
skip_interface()
|
||||||
|
{
|
||||||
|
[ -z "${dev}" ] && return 0
|
||||||
|
|
||||||
|
_skip4=
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
if [ -z "${ip}" ] ; then
|
||||||
|
_skip4=yes
|
||||||
|
else
|
||||||
|
_skip4=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
skip)
|
||||||
|
_skip4=yes
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
_skip4=no
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR [!]: Unknown IPv4 method: ${method}, skipping" >&2
|
||||||
|
_skip4=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_skip6=
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
if [ -z "${ip6}" ] ; then
|
||||||
|
_skip6=yes
|
||||||
|
else
|
||||||
|
_skip6=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
skip)
|
||||||
|
_skip6=yes
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
disable_ipv6 "${dev}"
|
||||||
|
_skip6=yes
|
||||||
|
;;
|
||||||
|
auto|dhcp)
|
||||||
|
_skip6=no
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR [!]: Unknown IPv6 method: ${ip6_method}" >&2
|
||||||
|
_skip6=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if is_true "${_skip4}" && is_true "${_skip6}" ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
(
|
||||||
|
# VH_TODO: drop default 1500, nekde se spoleha na tento default!
|
||||||
|
_mtu=$(get_iface_var "$1" "MTU")
|
||||||
|
echo "${_mtu:-1500}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Gets the network gateway
|
||||||
|
# arg: <iface>
|
||||||
|
get_gateway()
|
||||||
|
(
|
||||||
|
get_iface_var "$1" "GATEWAY"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
(
|
||||||
|
# sed on freebsd does not recognize '+' - replacing with asterisk
|
||||||
|
env | sed -n "s#^\(${1}_ALIAS[0-9][0-9]*\)_MAC=.*#\1#p" | sort
|
||||||
|
)
|
||||||
|
|
||||||
|
get_context_interfaces()
|
||||||
|
(
|
||||||
|
# sed on freebsd does not recognize '+' - replacing with asterisk
|
||||||
|
env | sed -n 's/^\(ETH[0-9][0-9]*\)_MAC=.*/\1/p' | sort
|
||||||
|
)
|
||||||
|
|
||||||
|
get_pci_interfaces()
|
||||||
|
(
|
||||||
|
# sed on freebsd does not recognize '+' - replacing with asterisk
|
||||||
|
env | sed -n 's/^\(PCI[0-9][0-9]*\)_MAC=.*/\1/p' | 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
|
||||||
|
)
|
||||||
|
|
||||||
|
# arg: <interface/alias>
|
||||||
|
setup_ipadr_vars()
|
||||||
|
{
|
||||||
|
export ip=$(get_ip "$1")
|
||||||
|
export network=$(get_network "$1")
|
||||||
|
export mask=$(get_mask "$1")
|
||||||
|
export cidr=$(mask2cidr "$mask")
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg: <interface/alias>
|
||||||
|
setup_ip6adr_vars()
|
||||||
|
{
|
||||||
|
export ip6=$(get_iface_var "$1" "IP6")
|
||||||
|
export ip6_prefix_length=$(get_iface_var "$1" "IP6_PREFIX_LENGTH")
|
||||||
|
export ip6_ula=$(get_iface_var "$1" "IP6_ULA")
|
||||||
|
|
||||||
|
[ -z "$ip6" ] && ip6=$(get_iface_var "$1" "IPV6")
|
||||||
|
[ -z "$ip6_prefix_length" ] && ip6_prefix_length=64
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg: <interface>
|
||||||
|
setup_iface_vars()
|
||||||
|
{
|
||||||
|
_iface_mac=$(get_interface_mac)
|
||||||
|
|
||||||
|
export mac=$(get_iface_var "$1" "MAC")
|
||||||
|
export dev=$(get_dev "$_iface_mac" "$mac")
|
||||||
|
export mtu=$(get_iface_var "$1" "MTU")
|
||||||
|
export gateway=$(get_gateway "$1")
|
||||||
|
export metric=$(get_iface_var "$1" "METRIC")
|
||||||
|
export dns=$(get_dns "$1")
|
||||||
|
export search_domains=$(get_search_domain "$1")
|
||||||
|
export method=$(get_iface_var "$1" "METHOD")
|
||||||
|
export ip6_gateway=$(get_iface_var "$1" "IP6_GATEWAY")
|
||||||
|
export ip6_metric=$(get_iface_var "$1" "IP6_METRIC")
|
||||||
|
export ip6_method=$(get_iface_var "$1" "IP6_METHOD")
|
||||||
|
|
||||||
|
# backward compatibility
|
||||||
|
[ -z "$ip6_gateway" ] && ip6_gateway=$(get_iface_var "$1" "GATEWAY6")
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
[ -z "$ip6_metric" ] && ip6_metric="${metric}"
|
||||||
|
[ -z "$method" ] && method='static'
|
||||||
|
[ -z "$ip6_method" ] && ip6_method="${method}"
|
||||||
|
|
||||||
|
setup_ipadr_vars "$1"
|
||||||
|
setup_ip6adr_vars "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg: <alias>
|
||||||
|
setup_alias_vars()
|
||||||
|
{
|
||||||
|
export external=$(get_iface_var "$1" "EXTERNAL")
|
||||||
|
export detach=$(get_iface_var "$1" "DETACH")
|
||||||
|
}
|
||||||
|
|
||||||
|
get_nameservers()
|
||||||
|
(
|
||||||
|
# sed on freebsd does not recognize '+' - replacing with asterisk
|
||||||
|
_dns_variables=$(env | sed -n 's/^\(ETH[0-9][0-9]*_DNS\)=.*/\1/p' | sort)
|
||||||
|
|
||||||
|
for _dns in DNS ${_dns_variables} ; do
|
||||||
|
_value=$(eval "echo \"\${$_dns}\"")
|
||||||
|
if [ -n "$_value" ] ; then
|
||||||
|
echo "$_value"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
)
|
||||||
|
|
||||||
|
get_searchdomains()
|
||||||
|
(
|
||||||
|
# sed on freebsd does not recognize '+' - replacing with asterisk
|
||||||
|
_search_domains=$(env | sed -n 's/^\(ETH[0-9][0-9]*_SEARCH_DOMAIN\)=.*/\1/p' | sort)
|
||||||
|
|
||||||
|
for _search in SEARCH_DOMAIN ${_search_domains} ; do
|
||||||
|
_value=$(eval "echo \"\${$_search}\"")
|
||||||
|
if [ -n "$_value" ] ; then
|
||||||
|
echo "$_value"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
)
|
||||||
|
|
||||||
|
gen_resolvconf()
|
||||||
|
{
|
||||||
|
export all_nameservers=$(get_nameservers)
|
||||||
|
export all_search_domains=$(get_searchdomains)
|
||||||
|
|
||||||
|
[ -z "$all_nameservers" ] && return 0
|
||||||
|
|
||||||
|
if [ -L /etc/resolv.conf ]; then
|
||||||
|
unlink /etc/resolv.conf
|
||||||
|
else
|
||||||
|
cat /dev/null > /etc/resolv.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
for _nameserver in $all_nameservers ; do
|
||||||
|
echo "nameserver ${_nameserver}" >> /etc/resolv.conf
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -f /etc/sysconfig/network/config ]; then
|
||||||
|
sed -i "/^NETCONFIG_DNS_STATIC_SERVERS=/ s/=.*$/=\"${all_nameservers}\"/" /etc/sysconfig/network/config
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -z "$all_search_domains" ] && return 0
|
||||||
|
|
||||||
|
echo "search ${all_search_domains}" >> /etc/resolv.conf
|
||||||
|
|
||||||
|
if [ -f /etc/sysconfig/network/config ]; then
|
||||||
|
sed -i "/^NETCONFIG_DNS_STATIC_SEARCHLIST=/ s/=.*$/=\"${all_search_domains}\"/" /etc/sysconfig/network/config
|
||||||
|
fi
|
||||||
|
}
|
@ -0,0 +1,285 @@
|
|||||||
|
#!/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
|
||||||
|
freebsd)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
gen_resolvconf
|
||||||
|
gen_network_configuration > /etc/rc.conf.d/network
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
service netif stop >/dev/null
|
||||||
|
service routing stop >/dev/null
|
||||||
|
service rtsold stop >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
service netif start >/dev/null
|
||||||
|
service routing start >/dev/null
|
||||||
|
service rtsold start >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
service netif restart >/dev/null
|
||||||
|
service routing restart >/dev/null
|
||||||
|
service rtsold restart >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
get_interface_mac()
|
||||||
|
(
|
||||||
|
_macs=$(ifconfig | grep ether | awk '{print $2}')
|
||||||
|
|
||||||
|
for _mac in ${_macs} ; do
|
||||||
|
_iface=$(ifconfig | grep -B 2 "$_mac" | head -n 1 | awk '{print $1}' | cut -d ':' -f 1)
|
||||||
|
echo "${_iface} ${_mac}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
echo -n "ifconfig_${dev}=\"inet ${ip} netmask ${mask}"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo -n " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# WARNING: On FreeBSD the interface metrics are used only
|
||||||
|
# by routing daemons (see man 8 ifconfig)
|
||||||
|
if [ -n "${metric}" ]; then
|
||||||
|
echo -n " metric ${metric}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "\""
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
if [ -n "${gateway}" ]; then
|
||||||
|
echo "defaultrouter=\"${gateway}\"" >> /etc/rc.conf.d/routing
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp_conf()
|
||||||
|
{
|
||||||
|
echo -n "ifconfig_${dev}=\"DHCP"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo -n " inet mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "\""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf()
|
||||||
|
{
|
||||||
|
echo "ifconfig_${dev}_alias${alias_num}=\"inet ${ip} netmask ${mask}\""
|
||||||
|
alias_num=$((alias_num + 1))
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf()
|
||||||
|
{
|
||||||
|
echo -n "ifconfig_${dev}_ipv6=\"inet6 ${ip6} prefixlen ${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo -n " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# WARNING: On FreeBSD the interface metrics are used only
|
||||||
|
# by routing daemons (see man 8 ifconfig)
|
||||||
|
if [ -n "${ip6_metric}" ]; then
|
||||||
|
echo -n " metric ${ip6_metric}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " -accept_rtadv\""
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
echo "ifconfig_${dev}_alias${alias_num}=\"inet6 ${ip6_ula} prefixlen 64\""
|
||||||
|
alias_num=$((alias_num + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
if [ -n "${ip6_gateway}" ]; then
|
||||||
|
echo "ipv6_defaultrouter=\"${ip6_gateway}\"" >> /etc/rc.conf.d/routing
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp6_conf()
|
||||||
|
{
|
||||||
|
echo -n "ifconfig_${dev}_ipv6=\""
|
||||||
|
|
||||||
|
if [ "${ip6_method}" = "dhcp" ] ; then
|
||||||
|
echo -n "DHCP "
|
||||||
|
|
||||||
|
# FreeBSD support for DHCP6 does not seem to be great:
|
||||||
|
# https://forums.freebsd.org/threads/ipv6-dhcpv6-client-and-accept_rtadv-vs-rtsold.77421/
|
||||||
|
# https://forums.freebsd.org/threads/is-there-a-working-dhcpv6-client-for-freebsd.60168/
|
||||||
|
# https://subatomicsolutions.org/8-freebsd/13-ipv4-ipv6-client-addresses-via-dhcp
|
||||||
|
_dhclient_program=$(sysrc -n dhclient_program 2>/dev/null)
|
||||||
|
if [ -z "${_dhclient_program}" ] || [ "${_dhclient_program}" = '/sbin/dhclient' ]; then
|
||||||
|
echo "WARNING [!]: DHCPv6 on '${os_id}' is poorly supported, you need a different DHCP client! You can install net/isc-dhcp44-client and put into /etc/rc.conf: dhclient_program=\"/usr/sbin/one-dual-dhclient\"" >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "inet6 accept_rtadv"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo -n " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "\""
|
||||||
|
|
||||||
|
# Enable Router Solicitation Deaemon
|
||||||
|
# NOTE: It's not enough to just enable the daemon during the current
|
||||||
|
# boot process, since the services to run are already evaluated. We also
|
||||||
|
# explicitly start the service on our own (but doesn't have to be correct!)
|
||||||
|
sysrc rtsold_enable="YES" >/dev/null
|
||||||
|
service rtsold start >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
# very first IPv6 can't be alias
|
||||||
|
if [ -n "${has_ip6}" ]; then
|
||||||
|
echo "ifconfig_${dev}_alias${alias_num}=\"inet6 ${ip6} prefixlen ${ip6_prefix_length:-64}\""
|
||||||
|
alias_num=$((alias_num + 1))
|
||||||
|
else
|
||||||
|
echo -n "ifconfig_${dev}_ipv6=\"inet6 ${ip6} prefixlen ${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo -n " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# WARNING: On FreeBSD the interface metrics are used only
|
||||||
|
# by routing daemons (see man 8 ifconfig)
|
||||||
|
if [ -n "${ip6_metric}" ]; then
|
||||||
|
echo -n " metric ${ip6_metric}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " -accept_rtadv\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
echo "ifconfig_${dev}_alias${alias_num}=\"inet6 ${ip6_ula} prefixlen 64\""
|
||||||
|
alias_num=$((alias_num + 1))
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
# clean routing information
|
||||||
|
echo '# Generated by one-context' | tee /etc/rc.conf.d/routing
|
||||||
|
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip}" ] && gen_iface_conf
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_iface6_conf
|
||||||
|
;;
|
||||||
|
auto|dhcp)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
:
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
has_ip6="${ip6}"
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
alias_num=0
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_alias_conf
|
||||||
|
|
||||||
|
if [ -n "${ip6}" ]; then
|
||||||
|
gen_alias6_conf
|
||||||
|
has_ip6="${ip6}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
@ -0,0 +1,403 @@
|
|||||||
|
#!/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_resolvconf
|
||||||
|
gen_network_configuration > /etc/network/interfaces
|
||||||
|
}
|
||||||
|
|
||||||
|
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 _iface in $_ifaces; do
|
||||||
|
if [ "${_iface}" != 'lo' ]; then
|
||||||
|
/sbin/ip link set dev "${_iface}" down || true
|
||||||
|
/sbin/ip addr flush dev "${_iface}" || true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
if [ -f "/usr/sbin/ifreload" ] ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
_ifaces=$(/sbin/ifquery --list -a)
|
||||||
|
|
||||||
|
for _iface in $_ifaces; do
|
||||||
|
if [ "${_iface}" != 'lo' ] ; then
|
||||||
|
/sbin/ifdown "${_iface}"
|
||||||
|
/sbin/ip link set dev "${_iface}" down || true
|
||||||
|
/sbin/ip addr flush dev "${_iface}" || true
|
||||||
|
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 _iface in $_ifaces; do
|
||||||
|
/sbin/ifup "${_iface}"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
stop_network
|
||||||
|
start_network
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
iface ${dev} inet static
|
||||||
|
address ${ip}
|
||||||
|
network ${network}
|
||||||
|
netmask ${mask}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$gateway" ]; then
|
||||||
|
echo " gateway ${gateway}"
|
||||||
|
|
||||||
|
if [ -n "$metric" ]; then
|
||||||
|
echo " metric ${metric}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$mtu" ]; then
|
||||||
|
echo " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp_conf()
|
||||||
|
{
|
||||||
|
echo "iface ${dev} inet dhcp"
|
||||||
|
|
||||||
|
if [ -n "$mtu" ]; then
|
||||||
|
case "${os_id}" in
|
||||||
|
alpine)
|
||||||
|
echo " mtu ${mtu}"
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
echo " pre-up ip link set dev ${dev} mtu ${mtu}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
iface ${dev} inet static
|
||||||
|
address ${ip}
|
||||||
|
network ${network}
|
||||||
|
netmask ${mask}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# On Alpine Linux when using IPv6 gateway/metric options,
|
||||||
|
# they override the metric on IPv4 routes. We better configure
|
||||||
|
# default route via up script.
|
||||||
|
if [ "${os_id}" = 'alpine' ] && \
|
||||||
|
[ -n "${ip6_gateway}" ] && [ -n "${ip6_metric}" ];
|
||||||
|
then
|
||||||
|
echo " up ip -6 route add default via ${ip6_gateway} dev ${dev} metric ${ip6_metric}"
|
||||||
|
|
||||||
|
elif [ -n "${ip6_gateway}" ]; then
|
||||||
|
echo " gateway ${ip6_gateway}"
|
||||||
|
|
||||||
|
if [ -n "${ip6_metric}" ]; then
|
||||||
|
echo " metric ${ip6_metric}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
case "${os_id}" in
|
||||||
|
alpine)
|
||||||
|
echo " mtu ${mtu}"
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
# Ignores "mtu x", IPv6-only interfaces would not be configured
|
||||||
|
echo " pre-up ip link set dev ${dev} mtu ${mtu}"
|
||||||
|
echo " pre-up echo ${mtu} > /proc/sys/net/ipv6/conf/${dev}/mtu"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
iface ${dev} inet6 static
|
||||||
|
address ${ip6_ula}
|
||||||
|
netmask 64
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp6_conf()
|
||||||
|
{
|
||||||
|
if [ "${ip6_method}" = "auto" ] ; then
|
||||||
|
echo "iface ${dev} inet6 auto"
|
||||||
|
else
|
||||||
|
echo "iface ${dev} inet6 dhcp"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${os_id}" in
|
||||||
|
alpine)
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo " mtu ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " pre-up echo 0 > /proc/sys/net/ipv6/conf/${dev}/use_tempaddr"
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
# Privext might not be effective in "dhcp" mode, so we better
|
||||||
|
# directly configure also sysctl parameters. Also, there might
|
||||||
|
# be a race condition between activating IPv4 and IPv6 part of
|
||||||
|
# interface if IPv4 is dhcp. As a aresult, IPv6 SLAAC privacy
|
||||||
|
# address might appear. So, for safety we better drop any global
|
||||||
|
# IPv6 addresses as part of pre-up.
|
||||||
|
echo " privext 0"
|
||||||
|
echo " pre-up echo 0 > /proc/sys/net/ipv6/conf/${dev}/use_tempaddr"
|
||||||
|
echo " pre-up ip -6 addr flush dev ${dev} scope global || /bin/true"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
# Ignores "mtu x", IPv6-only interfaces would not be configured
|
||||||
|
echo " pre-up ip link set dev ${dev} mtu ${mtu}"
|
||||||
|
echo " pre-up echo ${mtu} > /proc/sys/net/ipv6/conf/${dev}/mtu"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
case "${os_id}" in
|
||||||
|
alpine)
|
||||||
|
cat <<EOT
|
||||||
|
iface ${dev} inet6 static
|
||||||
|
address ${ip6}
|
||||||
|
netmask ${ip6_prefix_length:-64}
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
cat <<EOT
|
||||||
|
iface ${dev} inet6 static
|
||||||
|
address ${ip6}
|
||||||
|
netmask ${ip6_prefix_length:-64}
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
|
||||||
|
iface ${dev} inet6 static
|
||||||
|
address ${ip6_ula}
|
||||||
|
netmask 64
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
# Generated by one-context
|
||||||
|
auto lo
|
||||||
|
iface lo inet loopback
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
echo "auto ${dev}"
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip}" ] && gen_iface_conf
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_iface6_conf
|
||||||
|
;;
|
||||||
|
auto|dhcp)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
:
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases ; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_alias_conf
|
||||||
|
[ -n "${ip6}" ] && gen_alias6_conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
case "${os_id}" in
|
||||||
|
debian|ubuntu|devuan)
|
||||||
|
echo "source /etc/network/interfaces.d/*.cfg"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
@ -0,0 +1,346 @@
|
|||||||
|
#!/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()
|
||||||
|
{
|
||||||
|
command -v netplan >/dev/null
|
||||||
|
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
init_netplan_renderer
|
||||||
|
|
||||||
|
gen_resolvconf
|
||||||
|
gen_network_configuration > /etc/netplan/50-one-context.yaml
|
||||||
|
netplan generate
|
||||||
|
nm_symlink_run_connections
|
||||||
|
|
||||||
|
# On Debian 10 and Ubuntu 18.04 the initial netplan apply is needed to
|
||||||
|
# set some interface parameters (e.g., MTU). Unfortunately, this deadlocks
|
||||||
|
# booting of current systems, so we execute netplan apply on the background
|
||||||
|
case "${NETCFG_NETPLAN_RENDERER}" in
|
||||||
|
''|networkd)
|
||||||
|
flock /var/run/one-context/netplan.lock nohup netplan apply &>/dev/null &
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
service networking stop
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
netplan generate
|
||||||
|
nm_symlink_run_connections
|
||||||
|
service networking start
|
||||||
|
flock /var/run/one-context/netplan.lock netplan apply
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
netplan generate
|
||||||
|
nm_symlink_run_connections
|
||||||
|
flock /var/run/one-context/netplan.lock netplan apply
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
gen_addresses()
|
||||||
|
{
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip}" ] && gen_addr_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_addr6_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_addr_conf
|
||||||
|
[ -n "${ip6}" ] && gen_addr6_conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_routes()
|
||||||
|
{
|
||||||
|
if [ -n "${gateway}" ] && { [ -z "${method}" ] || [ "${method}" = 'static' ]; }; then
|
||||||
|
cat <<EOT
|
||||||
|
- to: "0.0.0.0/0"
|
||||||
|
via: ${gateway}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
# Force default Linux IPv4 metric (man 8 route) to override
|
||||||
|
# automatic metrics calculation done by NetworkManager and unify
|
||||||
|
# behavior among different renderers.
|
||||||
|
metric=${metric:-0}
|
||||||
|
|
||||||
|
if [ -n "${metric}" ] ; then
|
||||||
|
echo " metric: ${metric}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${ip6_gateway}" ] && { [ -z "${ip6_method}" ] || [ "${ip6_method}" = 'static' ]; }; then
|
||||||
|
cat <<EOT
|
||||||
|
- to: "::/0"
|
||||||
|
via: ${ip6_gateway}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
# Force default Linux IPv6 metric (man 8 route) to override
|
||||||
|
# automatic metrics calculation done by NetworkManager and unify
|
||||||
|
# behavior among different renderers.
|
||||||
|
ip6_metric=${ip6_metric:-1}
|
||||||
|
|
||||||
|
if [ -n "${ip6_metric}" ] ; then
|
||||||
|
echo " metric: ${ip6_metric}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
dhcp4: true
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_addr_conf()
|
||||||
|
{
|
||||||
|
echo " - ${ip}/${cidr}"
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_addr6_conf()
|
||||||
|
{
|
||||||
|
echo " - ${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
if [ -n "$ip6_ula" ]; then
|
||||||
|
echo " - ${ip6_ula}/64"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp6_conf()
|
||||||
|
{
|
||||||
|
if [ "${ip6_method}" = "auto" ] ; then
|
||||||
|
cat <<EOT
|
||||||
|
accept-ra: true
|
||||||
|
dhcp6: false
|
||||||
|
EOT
|
||||||
|
else
|
||||||
|
cat <<EOT
|
||||||
|
accept-ra: true
|
||||||
|
dhcp6: true
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
ipv6-privacy: false
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_ipv6_disable()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
accept-ra: false
|
||||||
|
link-local: []
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
# Old NM doesn't read from /run/NetworkManager/system-connections,
|
||||||
|
# so the generated Netplan configuration is not respected. As a workaround,
|
||||||
|
# we symlink the connection files into /etc
|
||||||
|
nm_symlink_run_connections()
|
||||||
|
{
|
||||||
|
if [ "${NETCFG_NETPLAN_RENDERER}" != 'NetworkManager' ] ||
|
||||||
|
! [ -d /run/NetworkManager/system-connections ];
|
||||||
|
then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# cleanup any old symlinks
|
||||||
|
rm -f /etc/NetworkManager/system-connections/netplan-*
|
||||||
|
|
||||||
|
case "$(NetworkManager --version 2>/dev/null)" in
|
||||||
|
1.14.*) # Debian 10
|
||||||
|
echo "WARNING: Symlinking NM's ephemeral connections into /etc" >&2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# symlink Netplan connection files
|
||||||
|
for _src in /run/NetworkManager/system-connections/netplan-*; do
|
||||||
|
if [ -f "${_src}" ]; then
|
||||||
|
_dst="/etc/NetworkManager/system-connections/$(basename "${_src}")"
|
||||||
|
ln -s "${_src}" "${_dst}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
init_netplan_renderer()
|
||||||
|
{
|
||||||
|
if [ -z "${NETCFG_NETPLAN_RENDERER}" ] ; then
|
||||||
|
if command -v networkctl >/dev/null ; then
|
||||||
|
NETCFG_NETPLAN_RENDERER='networkd'
|
||||||
|
elif command -v nmcli >/dev/null ; then
|
||||||
|
NETCFG_NETPLAN_RENDERER='NetworkManager'
|
||||||
|
else
|
||||||
|
# fallback to networkd only not to leave the variable
|
||||||
|
# uninitialized, deployment most likely won't work!
|
||||||
|
NETCFG_NETPLAN_RENDERER='networkd'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# support alternative names for some configuration renderers
|
||||||
|
_netcfg_netplan_renderer=$(echo "$NETCFG_NETPLAN_RENDERER" | \
|
||||||
|
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | \
|
||||||
|
tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
|
# normalize renderer names and support alternatives
|
||||||
|
case "${_netcfg_netplan_renderer}" in
|
||||||
|
systemd-networkd|systemd-network|systemd|networkd)
|
||||||
|
NETCFG_NETPLAN_RENDERER='networkd'
|
||||||
|
;;
|
||||||
|
networkmanager|nm)
|
||||||
|
NETCFG_NETPLAN_RENDERER='NetworkManager'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
if [ "${NETCFG_NETPLAN_RENDERER}" = 'NetworkManager' ]; then
|
||||||
|
nm_enable
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
# Generated by one-context
|
||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
renderer: ${NETCFG_NETPLAN_RENDERER}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
# ethernets key must have at least one interface
|
||||||
|
_ethernets_written=
|
||||||
|
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
if [ -z "${_ethernets_written}" ] ; then
|
||||||
|
echo " ethernets:"
|
||||||
|
_ethernets_written=yes
|
||||||
|
fi
|
||||||
|
echo " ${dev}:"
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo " mtu: ${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Requires Netplan 0.98+
|
||||||
|
# if [ -n "${mtu}" ]; then
|
||||||
|
# echo " ip6-mtu: ${mtu}"
|
||||||
|
# fi
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
: # in gen_addresses
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
: # in gen_addresses
|
||||||
|
;;
|
||||||
|
auto|dhcp)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
gen_ipv6_disable
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_addresses=$(gen_addresses)
|
||||||
|
if [ -n "${_addresses}" ] ; then
|
||||||
|
echo " addresses:"
|
||||||
|
echo "${_addresses}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
_routes=$(gen_routes)
|
||||||
|
if [ -n "${_routes}" ] ; then
|
||||||
|
echo " routes:"
|
||||||
|
echo "${_routes}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
@ -0,0 +1,380 @@
|
|||||||
|
#!/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()
|
||||||
|
{
|
||||||
|
command -v networkctl >/dev/null
|
||||||
|
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
gen_resolvconf
|
||||||
|
gen_network_configuration
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
systemctl stop systemd-networkd.service
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
systemctl start systemd-networkd.service
|
||||||
|
|
||||||
|
# Dummy query waits until networkd is running
|
||||||
|
networkctl list &>/dev/null || :
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
# TODO: for newer systemd-networkd use
|
||||||
|
# networkctl reload && networkctl reconfigure ethX
|
||||||
|
# and fallback to service restart only if needed
|
||||||
|
systemctl restart systemd-networkd.service
|
||||||
|
|
||||||
|
# Dummy query waits until networkd is running
|
||||||
|
networkctl list &>/dev/null || :
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=${ip}/${cidr}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$dns" ]; then
|
||||||
|
for _domain in $dns; do
|
||||||
|
echo "DNS=${_domain}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$search_domains" ]; then
|
||||||
|
for _search_domain in $search_domains; do
|
||||||
|
echo "Domains=${_search_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_dhcp_conf()
|
||||||
|
{
|
||||||
|
case "${dhcp_conf}" in
|
||||||
|
ipv4)
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
DHCP=ipv4
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
ipv4+auto)
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
DHCP=ipv4
|
||||||
|
IPv6AcceptRA=yes
|
||||||
|
|
||||||
|
[IPv6AcceptRA]
|
||||||
|
DHCPv6Client=no
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
ipv6)
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
DHCP=ipv6
|
||||||
|
IPv6AcceptRA=yes
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
both)
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
DHCP=yes
|
||||||
|
IPv6AcceptRA=yes
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
auto)
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
DHCP=no
|
||||||
|
IPv6AcceptRA=yes
|
||||||
|
|
||||||
|
[IPv6AcceptRA]
|
||||||
|
DHCPv6Client=no
|
||||||
|
EOT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
IPv6PrivacyExtensions=no
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Address]
|
||||||
|
Address=${ip}/${cidr}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=${ip6}/${ip6_prefix_length:-64}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo "IPv6AcceptRA=false"
|
||||||
|
|
||||||
|
if [ -n "$dns" ]; then
|
||||||
|
for _domain in $dns; do
|
||||||
|
echo "DNS=${_domain}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$search_domains" ]; then
|
||||||
|
for _search_domain in $search_domains; do
|
||||||
|
echo "Domains=${_search_domain}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
[Route]
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "$ip6_gateway" ]; then
|
||||||
|
echo "Gateway=${ip6_gateway}"
|
||||||
|
|
||||||
|
if [ -n "$ip6_metric" ]; then
|
||||||
|
echo "Metric=${ip6_metric}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ip6_ula" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
Address=${ip6_ula}/64
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Address]
|
||||||
|
Address=${ip6}/${ip6_prefix_length:-64}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_ipv6_disable()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
[Network]
|
||||||
|
LinkLocalAddressing=no
|
||||||
|
IPv6AcceptRA=no
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg: <interface>
|
||||||
|
is_networkd_iface_managed()
|
||||||
|
(
|
||||||
|
_managed=$(LANG=C networkctl list -al --no-pager --no-legend | \
|
||||||
|
awk -v dev="$1" '{if ($2 == dev) print $NF;}' | \
|
||||||
|
tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
|
case "${_managed}" in
|
||||||
|
''|unmanaged)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
)
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
_networkd_version=$(networkctl --version | head -1 | awk '{print $2}')
|
||||||
|
|
||||||
|
if [ -n "$_networkd_version" ]; then
|
||||||
|
# put some dummy low version if not detected
|
||||||
|
_networkd_version="100"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
# NOTE: This is needed to workaround issue with the networkd metrics.
|
||||||
|
#
|
||||||
|
# When attaching new NIC from the same vnet on a running system then
|
||||||
|
# the networkd will assign some metric to the prefix route of the first
|
||||||
|
# NIC but leave out metric for the same prefix route of the new NIC.
|
||||||
|
#
|
||||||
|
# What happens is that outgoing packets on this subnet will now always
|
||||||
|
# use the second NIC even while the incoming packets were targeted for
|
||||||
|
# the IP on the first NIC - the result is a broken connection.
|
||||||
|
#
|
||||||
|
# This occurs at least with systemd/networkd version 248, which is on
|
||||||
|
# Cent OS 8 for example.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $_networkd_version -le 250 ]; then
|
||||||
|
if is_networkd_iface_managed "${dev}" ; then
|
||||||
|
# networkctl up/down is not on ubuntu <21.04
|
||||||
|
networkctl down "$dev" 2>/dev/null || true
|
||||||
|
|
||||||
|
# this is still necessary to really unconfigure the interface
|
||||||
|
ip addr flush "$dev"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
# Generated by one-context
|
||||||
|
[Match]
|
||||||
|
Name=${dev}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
cat <<EOT
|
||||||
|
[Link]
|
||||||
|
MTUBytes=${mtu}
|
||||||
|
|
||||||
|
## Supported since Debian 10, Ubuntu 18.04, CentOS 8
|
||||||
|
# [Network]
|
||||||
|
# IPv6MTUBytes=${mtu}
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
dhcp_conf=''
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip}" ] && gen_iface_conf
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
dhcp_conf='ipv4'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_iface6_conf
|
||||||
|
;;
|
||||||
|
auto)
|
||||||
|
if [ -n "${dhcp_conf}" ] ; then
|
||||||
|
dhcp_conf='ipv4+auto'
|
||||||
|
else
|
||||||
|
dhcp_conf='auto'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
if [ -n "${dhcp_conf}" ] ; then
|
||||||
|
dhcp_conf='both'
|
||||||
|
else
|
||||||
|
dhcp_conf='ipv6'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
gen_ipv6_disable
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ -n "${dhcp_conf}" ] && gen_dhcp_conf
|
||||||
|
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases ; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_alias_conf
|
||||||
|
[ -n "${ip6}" ] && gen_alias6_conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
} > "/etc/systemd/network/${dev}.network"
|
||||||
|
|
||||||
|
done
|
||||||
|
}
|
@ -0,0 +1,320 @@
|
|||||||
|
#!/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
|
||||||
|
#
|
||||||
|
|
||||||
|
export required_context_type=online
|
||||||
|
|
||||||
|
is_network_supported()
|
||||||
|
{
|
||||||
|
command -v nmcli >/dev/null
|
||||||
|
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
wait_for_nm
|
||||||
|
gen_resolvconf
|
||||||
|
gen_network_configuration
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
service NetworkManager stop
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
service NetworkManager start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
# VH-TODO: It only reloads configuration from a disk,
|
||||||
|
# but we don't directly generate configuration files
|
||||||
|
nmcli connection reload
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
wait_for_nm()
|
||||||
|
{
|
||||||
|
nm_enable
|
||||||
|
|
||||||
|
_timeout=30
|
||||||
|
while [ "$_timeout" -gt 0 ] ; do
|
||||||
|
if _nm_networking=$(nmcli networking 2>/dev/null) ; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
_timeout=$(( _timeout - 1 ))
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "${_timeout}" -eq 0 ] ; then
|
||||||
|
echo "ERROR [!]: NetworkManager is not running" >&2
|
||||||
|
exit 1
|
||||||
|
elif [ "${_nm_networking}" = 'enabled' ] ; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "ERROR [!]: NetworkManager is disabled" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
nmcli con mod "${dev}" ipv4.method manual ipv4.addresses "${ip}/${cidr}"
|
||||||
|
|
||||||
|
if [ -n "$gateway" ]; then
|
||||||
|
nmcli con mod "${dev}" ipv4.gateway "${gateway}"
|
||||||
|
else
|
||||||
|
nmcli con mod "${dev}" ipv4.gateway ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$metric" ]; then
|
||||||
|
nmcli con mod "${dev}" ipv4.route-metric "${metric}"
|
||||||
|
else
|
||||||
|
# Force default Linux IPv4 metric (man 8 route) to override
|
||||||
|
# automatic metrics calculation done by NetworkManager and unify
|
||||||
|
# behavior among different renderers.
|
||||||
|
nmcli con mod "${dev}" ipv4.route-metric "0"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
reset_iface()
|
||||||
|
{
|
||||||
|
# the order is significant - ip.addresses cannot be erased while gateway is set
|
||||||
|
nmcli con mod "${dev}" ipv4.route-metric ""
|
||||||
|
nmcli con mod "${dev}" ipv4.gateway ""
|
||||||
|
nmcli con mod "${dev}" ipv4.addresses ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp_conf()
|
||||||
|
{
|
||||||
|
nmcli con mod "${dev}" ipv4.method auto
|
||||||
|
|
||||||
|
# cleanup any leftover from the static method
|
||||||
|
reset_iface
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf()
|
||||||
|
{
|
||||||
|
nmcli con mod "${dev}" +ipv4.addresses "${ip}/${cidr}"
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf()
|
||||||
|
{
|
||||||
|
nmcli con mod "${dev}" ipv6.method manual \
|
||||||
|
ipv6.addresses "${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
if [ -n "$ip6_ula" ]; then
|
||||||
|
nmcli con mod "${dev}" +ipv6.addresses "${ip6_ula}/64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ip6_gateway" ]; then
|
||||||
|
nmcli con mod "${dev}" ipv6.gateway "${ip6_gateway}"
|
||||||
|
else
|
||||||
|
nmcli con mod "${dev}" ipv6.gateway ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ip6_metric" ]; then
|
||||||
|
nmcli con mod "${dev}" ipv6.route-metric "${ip6_metric}"
|
||||||
|
else
|
||||||
|
# Force default Linux IPv6 metric (man 8 route) to override
|
||||||
|
# automatic metrics calculation done by NetworkManager and unify
|
||||||
|
# behavior among different renderers.
|
||||||
|
nmcli con mod "${dev}" ipv6.route-metric "1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We need this to ensure link-local address has expected form
|
||||||
|
nmcli con mod "${dev}" ipv6.addr-gen-mode eui64
|
||||||
|
}
|
||||||
|
|
||||||
|
reset_iface6()
|
||||||
|
{
|
||||||
|
# the order is significant - ipv6.addresses cannot be erased while gateway is set
|
||||||
|
nmcli con mod "${dev}" ipv6.route-metric ""
|
||||||
|
nmcli con mod "${dev}" ipv6.gateway ""
|
||||||
|
nmcli con mod "${dev}" ipv6.addresses ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
nmcli con mod "${dev}" +ipv6.addresses "${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
if [ -n "$ip6_ula" ]; then
|
||||||
|
nmcli con mod "${dev}" +ipv6.addresses "${ip6_ula}/64"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp6_conf()
|
||||||
|
{
|
||||||
|
if [ "${ip6_method}" = "auto" ] ; then
|
||||||
|
# Method "ignore" relies only on SLAAC configured by the kernel,
|
||||||
|
# while the "auto" might optionally trigger also DHCPv6 client!
|
||||||
|
# https://unix.stackexchange.com/questions/440076/disable-dhcpv6-while-not-disabling-slaac-in-network-manager
|
||||||
|
_dhcp=ignore
|
||||||
|
else
|
||||||
|
# Method "auto" optionally triggers DHCPv6 client if RA has relevant
|
||||||
|
# flags (also netplan+nm configures "auto")! Method "dhcp" could
|
||||||
|
# ignore RA.
|
||||||
|
_dhcp=auto
|
||||||
|
fi
|
||||||
|
|
||||||
|
nmcli con mod "${dev}" ipv6.method "${_dhcp}"
|
||||||
|
nmcli con mod "${dev}" ipv6.addr-gen-mode eui64
|
||||||
|
nmcli con mod "${dev}" ipv6.ip6-privacy 0
|
||||||
|
|
||||||
|
# cleanup any leftover from the static method
|
||||||
|
reset_iface6
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg: <interface-connection>
|
||||||
|
nm_connection_exist()
|
||||||
|
(
|
||||||
|
# VH-TODO: We should be better checking across all connections, if there
|
||||||
|
# isn't any with our device to avoid clashes and drop/rename that one
|
||||||
|
_iface=$(nmcli --field connection.interface-name con show "$1" | awk '{print $2}')
|
||||||
|
if [ "${_iface}" = "$1" ] ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
)
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
# We might need to disable IPv6 and privacy directly by sysctl
|
||||||
|
_disable_ipv6=''
|
||||||
|
_disable_ipv6_privacy=''
|
||||||
|
|
||||||
|
if ! nm_connection_exist "${dev}" ; then
|
||||||
|
nmcli con add type ethernet \
|
||||||
|
con-name "${dev}" ifname "${dev}" \
|
||||||
|
ipv4.method disabled \
|
||||||
|
ipv6.method ignore
|
||||||
|
fi
|
||||||
|
|
||||||
|
nmcli con mod "${dev}" connection.autoconnect yes
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
nmcli con mod "${dev}" ethernet.mtu "${mtu}"
|
||||||
|
else
|
||||||
|
nmcli con mod "${dev}" ethernet.mtu ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip}" ] && gen_iface_conf
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp_conf
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_iface6_conf
|
||||||
|
;;
|
||||||
|
auto)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
|
||||||
|
# NOTE: Hot plugged NICs configured with IPv6 method ignore
|
||||||
|
# doesn't have to properly update the IPv6 privacy.
|
||||||
|
# We better enforce them via direct sysctl.
|
||||||
|
# VH-TODO: limit only for reconfigure action?
|
||||||
|
_disable_ipv6_privacy='yes'
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
# NOTE: Older NMs don't support ipv6.method disabled,
|
||||||
|
# in that case we rely on hard disablemenets via sysctl
|
||||||
|
nmcli con mod "${dev}" ipv6.method disabled ||
|
||||||
|
_disable_ipv6='yes'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_alias_conf
|
||||||
|
[ -n "${ip6}" ] && gen_alias6_conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 'nmcli con reload' is not enough
|
||||||
|
nmcli con up "${dev}"
|
||||||
|
|
||||||
|
if [ -n "${_disable_ipv6}" ]; then
|
||||||
|
disable_ipv6 "${dev}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${_disable_ipv6_privacy}" ]; then
|
||||||
|
disable_ipv6_privacy "${dev}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
@ -0,0 +1,393 @@
|
|||||||
|
#!/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()
|
||||||
|
{
|
||||||
|
# Red Hat family
|
||||||
|
if [ -x /etc/sysconfig/network-scripts/ifup ]; then
|
||||||
|
# On EL8, the network-scripts (package) is legacy
|
||||||
|
# and network service is not even enabled by default.
|
||||||
|
# For safety we check if network service is enabled
|
||||||
|
# and if not, we better choose different renderer.
|
||||||
|
if command -v systemctl &>/dev/null; then
|
||||||
|
systemctl is-enabled network &>/dev/null && return 0
|
||||||
|
|
||||||
|
# NOTE: Probably not necessary test on old systems
|
||||||
|
elif chkconfig network --level 3 &>/dev/null || \
|
||||||
|
chkconfig network --level 5 &>/dev/null;
|
||||||
|
then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SUSE family
|
||||||
|
elif [ -d /etc/sysconfig/network/ ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_network()
|
||||||
|
{
|
||||||
|
gen_resolvconf
|
||||||
|
gen_network_configuration
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_network()
|
||||||
|
{
|
||||||
|
service network stop
|
||||||
|
}
|
||||||
|
|
||||||
|
start_network()
|
||||||
|
{
|
||||||
|
service network start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_network()
|
||||||
|
{
|
||||||
|
service network restart
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# helper functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: remove global variables and get rid off exports
|
||||||
|
#
|
||||||
|
# to satisfy shellcheck SC2154:
|
||||||
|
export os_id
|
||||||
|
export ip
|
||||||
|
export network
|
||||||
|
export mask
|
||||||
|
export cidr
|
||||||
|
export ip6
|
||||||
|
export ip6_prefix_length
|
||||||
|
export ip6_ula
|
||||||
|
export mac
|
||||||
|
export dev
|
||||||
|
export mtu
|
||||||
|
export gateway
|
||||||
|
export ip6_gateway
|
||||||
|
export method
|
||||||
|
export ip6_method
|
||||||
|
export metric
|
||||||
|
export ip6_metric
|
||||||
|
export dns
|
||||||
|
export search_domains
|
||||||
|
export external
|
||||||
|
export detach
|
||||||
|
export all_nameservers
|
||||||
|
export all_search_domains
|
||||||
|
|
||||||
|
gen_iface_conf()
|
||||||
|
{
|
||||||
|
cat <<EOT
|
||||||
|
NETMASK="${mask}"
|
||||||
|
IPADDR="${ip}"
|
||||||
|
EOT
|
||||||
|
|
||||||
|
### SUSE family ###
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo 'BOOTPROTO=static'
|
||||||
|
|
||||||
|
if [ -n "${gateway}" ]; then
|
||||||
|
echo "default ${gateway} - ${dev} ${metric:+metric ${metric}}" \
|
||||||
|
>> "${config_path}/ifroute-${dev}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Red Hat family ###
|
||||||
|
else
|
||||||
|
echo 'BOOTPROTO=none'
|
||||||
|
|
||||||
|
if [ -n "${gateway}" ]; then
|
||||||
|
echo "default via ${gateway} dev ${dev} ${metric:+metric ${metric}}" \
|
||||||
|
>> "${config_path}/route-${dev}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo "MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp_conf()
|
||||||
|
{
|
||||||
|
### SUSE family ###
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
if [ "${ip6_method}" = 'dhcp' ]; then
|
||||||
|
echo 'BOOTPROTO=dhcp'
|
||||||
|
else
|
||||||
|
echo 'BOOTPROTO=dhcp4'
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Red Hat family ###
|
||||||
|
else
|
||||||
|
cat <<EOT
|
||||||
|
BOOTPROTO=dhcp
|
||||||
|
PERSISTENT_DHCLIENT=1
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo "MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias_conf() {
|
||||||
|
cat <<EOT
|
||||||
|
IPADDR${alias_num}="${ip}"
|
||||||
|
NETMASK${alias_num}="${mask}"
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iface6_conf()
|
||||||
|
{
|
||||||
|
### SUSE family ###
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "IPADDR_6A=${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
|
||||||
|
cat <<EOT >> "/etc/sysconfig/network/ifsysctl-${dev}"
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.autoconf = 0
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.accept_ra = 0
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
# place only if not set via IPv4 parts
|
||||||
|
if [ -z "${_set_ipv4}" ]; then
|
||||||
|
echo "MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT >> "/etc/sysconfig/network/ifsysctl-${dev}"
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.mtu = ${mtu}
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Red Hat family ###
|
||||||
|
else
|
||||||
|
cat <<EOT
|
||||||
|
IPV6INIT=yes
|
||||||
|
IPV6ADDR=${ip6}/${ip6_prefix_length:-64}
|
||||||
|
IPV6_AUTOCONF=no
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo "IPV6_MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "IPADDR_6B=${ip6_ula}/64"
|
||||||
|
else
|
||||||
|
ipv6addr_secondaries="${ipv6addr_secondaries} ${ip6_ula}/64"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${ip6_gateway}" ]; then
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "default ${ip6_gateway} - ${dev} ${ip6_metric:+metric ${ip6_metric}}" \
|
||||||
|
>> "/etc/sysconfig/network/ifroute-${dev}"
|
||||||
|
else
|
||||||
|
echo "default via ${ip6_gateway} dev ${dev} ${ip6_metric:+metric ${ip6_metric}}" \
|
||||||
|
>> "${config_path}/route6-${dev}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_dhcp6_conf()
|
||||||
|
{
|
||||||
|
### SUSE family ###
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
# On SUSE the BOOTPROTO is shared for both IPv4/6,
|
||||||
|
# in case IPv4 is not dhcp we configure DHCPv6 only here
|
||||||
|
# (if IPv4 is static, we unforunately overwrite that)
|
||||||
|
if [ "${ip6_method}" = 'dhcp' ] && [ "${method}" != 'dhcp' ]; then
|
||||||
|
echo 'BOOTPROTO=dhcp6'
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT >> "/etc/sysconfig/network/ifsysctl-${dev}"
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.autoconf = 1
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.accept_ra = 1
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.use_tempaddr = 0
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
# place only if not set via IPv4 parts
|
||||||
|
if [ -z "${_set_ipv4}" ]; then
|
||||||
|
echo "MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOT >> "/etc/sysconfig/network/ifsysctl-${dev}"
|
||||||
|
net.ipv6.conf.\$SYSCTL_IF.mtu = ${mtu}
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Red Hat family ###
|
||||||
|
else
|
||||||
|
if [ "${ip6_method}" = "auto" ] ; then
|
||||||
|
cat <<EOT
|
||||||
|
IPV6INIT=yes
|
||||||
|
IPV6_AUTOCONF=yes
|
||||||
|
EOT
|
||||||
|
else
|
||||||
|
cat <<EOT
|
||||||
|
IPV6INIT=yes
|
||||||
|
IPV6_AUTOCONF=yes
|
||||||
|
DHCPV6C=yes
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${mtu}" ]; then
|
||||||
|
echo "IPV6_MTU=${mtu}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 'IPV6_PRIVACY=no'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_alias6_conf()
|
||||||
|
{
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "IPADDR_A6A${alias_num}=${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
else
|
||||||
|
ipv6addr_secondaries="${ipv6addr_secondaries} ${ip6}/${ip6_prefix_length:-64}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${ip6_ula}" ]; then
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "IPADDR_A6B${alias_num}=${ip6_ula}/64"
|
||||||
|
else
|
||||||
|
ipv6addr_secondaries="${ipv6addr_secondaries} ${ip6_ula}/64"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_network_configuration()
|
||||||
|
{
|
||||||
|
### Red Hat family ###
|
||||||
|
if [ -d /etc/sysconfig/network-scripts ]; then
|
||||||
|
config_path=/etc/sysconfig/network-scripts
|
||||||
|
|
||||||
|
# if disabled, enable networking via network scripts
|
||||||
|
if [ -f /etc/sysconfig/network ] &&
|
||||||
|
! grep -qx 'NETWORKING=yes' /etc/sysconfig/network;
|
||||||
|
then
|
||||||
|
sed -i -e '/^NETWORKING=/d' /etc/sysconfig/network
|
||||||
|
echo 'NETWORKING=yes' >>/etc/sysconfig/network
|
||||||
|
fi
|
||||||
|
|
||||||
|
### SUSE family ###
|
||||||
|
elif [ -d /etc/sysconfig/network ]; then
|
||||||
|
config_path=/etc/sysconfig/network
|
||||||
|
fi
|
||||||
|
|
||||||
|
_context_interfaces=$(get_context_interfaces)
|
||||||
|
|
||||||
|
for _iface in $_context_interfaces; do
|
||||||
|
setup_iface_vars "$_iface"
|
||||||
|
|
||||||
|
skip_interface && continue
|
||||||
|
|
||||||
|
# in IPv6 sections we might need to know if
|
||||||
|
# any IPv4 configuration was already placed
|
||||||
|
_set_ipv4=
|
||||||
|
|
||||||
|
# cumulative variable
|
||||||
|
ipv6addr_secondaries=''
|
||||||
|
|
||||||
|
{
|
||||||
|
rm -f "/etc/sysconfig/network-scripts/route-${dev}"
|
||||||
|
rm -f "/etc/sysconfig/network-scripts/route6-${dev}"
|
||||||
|
rm -f "/etc/sysconfig/network/ifroute-${dev}"
|
||||||
|
rm -f "/etc/sysconfig/network/ifsysctl-${dev}"
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
# Generated by one-context
|
||||||
|
DEVICE=${dev}
|
||||||
|
NM_CONTROLLED=no
|
||||||
|
TYPE=Ethernet
|
||||||
|
EOT
|
||||||
|
|
||||||
|
# SUSE family
|
||||||
|
if [ "${config_path}" = "/etc/sysconfig/network" ]; then
|
||||||
|
echo "STARTMODE=auto"
|
||||||
|
else
|
||||||
|
echo "ONBOOT=yes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${method}" in
|
||||||
|
''|static)
|
||||||
|
if [ -n "${ip}" ]; then
|
||||||
|
gen_iface_conf
|
||||||
|
_set_ipv4=yes
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
dhcp)
|
||||||
|
gen_dhcp_conf
|
||||||
|
_set_ipv4=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${ip6_method}" in
|
||||||
|
''|static)
|
||||||
|
[ -n "${ip6}" ] && gen_iface6_conf
|
||||||
|
;;
|
||||||
|
auto|dhcp)
|
||||||
|
gen_dhcp6_conf
|
||||||
|
;;
|
||||||
|
disable)
|
||||||
|
:
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_aliases=$(get_interface_alias "$_iface")
|
||||||
|
alias_num=0
|
||||||
|
|
||||||
|
for _nic_alias in $_aliases; do
|
||||||
|
setup_ipadr_vars "$_nic_alias"
|
||||||
|
setup_ip6adr_vars "$_nic_alias"
|
||||||
|
setup_alias_vars "$_nic_alias"
|
||||||
|
|
||||||
|
if [ -z "${detach}" ]; then
|
||||||
|
if ! is_true "${external}" ; then
|
||||||
|
[ -n "${ip}" ] && gen_alias_conf
|
||||||
|
[ -n "${ip6}" ] && gen_alias6_conf
|
||||||
|
|
||||||
|
if [ -n "${ip}${ip6}" ]; then
|
||||||
|
alias_num=$((alias_num + 1))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# on Red Hats, we need just a single configuration
|
||||||
|
# entry with all additional IPv6 addresses
|
||||||
|
if [ -n "${ipv6addr_secondaries}" ]; then
|
||||||
|
echo "IPV6ADDR_SECONDARIES='${ipv6addr_secondaries## }'"
|
||||||
|
fi
|
||||||
|
} > "${config_path}/ifcfg-${dev}"
|
||||||
|
|
||||||
|
# TODO: do we want this here?
|
||||||
|
ifup "${dev}"
|
||||||
|
|
||||||
|
done
|
||||||
|
}
|
@ -1,63 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------- #
|
|
||||||
# Copyright 2002-2020, 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. #
|
|
||||||
#--------------------------------------------------------------------------- #
|
|
||||||
|
|
||||||
export DNS_VARIABLES="DNS $(env | sed 's/=.*$//' | grep -E '^ETH[0-9]+_DNS$' | sort)"
|
|
||||||
|
|
||||||
export SEARCH_VARIABLES="SEARCH_DOMAIN $(env | sed 's/=.*$//' | grep -E '^ETH[0-9]+_SEARCH_DOMAIN$' | sort)"
|
|
||||||
|
|
||||||
nameservers=$(
|
|
||||||
for var in ${DNS_VARIABLES}; do
|
|
||||||
value=$(eval "echo \"\${$var}\"")
|
|
||||||
if [ -n "$value" ]; then
|
|
||||||
echo "$value"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
)
|
|
||||||
|
|
||||||
searchdomains=$(
|
|
||||||
for var in ${SEARCH_VARIABLES}; do
|
|
||||||
value=$(eval "echo \"\${$var}\"")
|
|
||||||
if [ -n "$value" ]; then
|
|
||||||
echo "$value"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
)
|
|
||||||
|
|
||||||
[ -z "$nameservers" ] && exit 0
|
|
||||||
|
|
||||||
if [ -L /etc/resolv.conf ]; then
|
|
||||||
unlink /etc/resolv.conf
|
|
||||||
else
|
|
||||||
echo -n '' > /etc/resolv.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
for nameserver in $nameservers; do
|
|
||||||
echo nameserver $nameserver >> /etc/resolv.conf
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -f /etc/sysconfig/network/config ]; then
|
|
||||||
sed -i "/^NETCONFIG_DNS_STATIC_SERVERS=/ s/=.*$/=\"$nameservers\"/" /etc/sysconfig/network/config
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -z "$searchdomains" ] && exit 0
|
|
||||||
|
|
||||||
echo search $searchdomains >> /etc/resolv.conf
|
|
||||||
|
|
||||||
if [ -f /etc/sysconfig/network/config ]; then
|
|
||||||
sed -i "/^NETCONFIG_DNS_STATIC_SEARCHLIST=/ s/=.*$/=\"$searchdomains\"/" /etc/sysconfig/network/config
|
|
||||||
fi
|
|
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Periodically run one-context-reconfigure on VMware
|
||||||
|
if [ "$(virt-what 2>/dev/null)" = 'vmware' ]; then
|
||||||
|
service one-context-reconfigure restart >/dev/null 2>&1
|
||||||
|
fi
|
@ -0,0 +1,3 @@
|
|||||||
|
[Unit]
|
||||||
|
# https://github.com/OpenNebula/one/issues/5504
|
||||||
|
ConditionVirtualization=!container
|
@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=OpenNebula early-networking contextualization
|
||||||
|
Requires=one-context-local.service
|
||||||
|
After=one-context-local.service
|
||||||
|
After=NetworkManager.service systemd-networkd.service
|
||||||
|
Wants=network.target
|
||||||
|
Before=network.target
|
||||||
|
Before=NetworkManager-wait-online.service systemd-networkd-wait-online.service
|
||||||
|
ConditionPathExists=!/var/run/one-context/context.sh.online
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/sbin/one-contextd online
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Periodic OpenNebula reconfiguration
|
||||||
|
After=one-context.service
|
||||||
|
ConditionVirtualization=vmware
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* *:*:0
|
||||||
|
AccuracySec=1s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue