Compare commits

..

5 Commits

Author SHA1 Message Date
Vlastimil Holer 5a7b1f53e7
B #216: More specific detach NIC workarounds
4 years ago
Vlastimil Holer 9b98a6ada8
M #-: Bump version to 5.12.0.2
4 years ago
Vlastimil Holer bdc853e74b
F OpenNebula/one#5112: Update OneGate client to 5.12.6 (EE)
4 years ago
Vlastimil Holer 38633f11f5
M #-: Bump version to 5.12.0.1
4 years ago
Petr Ospalý 20a9c97343
B #212: Fix chown command on FreeBSD
4 years ago

@ -5,6 +5,6 @@
<!--//////////////////////////////////////////////////////////-->
Changes proposed in this pull request:
- briefly describe change here,
- briefly describe change here,
- briefly describe change here.
-
-
-

@ -1,14 +0,0 @@
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
.gitignore vendored

@ -2,4 +2,3 @@ out/
*.rpm
*.deb
.vagrant*/
*~bak

@ -0,0 +1,20 @@
# 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
}

@ -26,84 +26,23 @@ For beta releases, refer to the latest
List of tested platforms only:
| Platform | Versions |
|---------------------------------|------------------------------------------|
| AlmaLinux | 8, 9 |
| Alpine Linux | 3.13, 3.14, 3.15 |
| ALT Linux | 9, 10, Sisyphus |
| Amazon Linux | 2 |
| CentOS | 7, 8 Stream |
| Debian | 10, 11, 12 |
| Devuan | 2 |
| Fedora | 34, 35 |
| FreeBSD | 12, 13 |
| MSVSphere | 8, 9 |
| openSUSE | 15 |
| Oracle Linux | 7, 8 |
| Red Hat Enterprise Linux | 7, 8, 9 |
| Rocky Linux | 8 |
| Ubuntu | 16.04, 18.04, 20.04, 21.10, 22.04 |
| Ubuntu Minimal | 20.04, 22.04 |
| Platform | Versions |
|---------------------------------|----------------------------------------|
| ALT Linux | P9, Sisyphus |
| Amazon Linux | 2 |
| CentOS | 6, 7, 8, 8 Stream |
| Red Hat Enterprise Linux | 7, 8 |
| Fedora | 30, 31, 32 |
| openSUSE | 15, Tumbleweed |
| SUSE Linux Enterprise Server | 12 SP3 |
| Debian | 8, 9, 10 |
| Devuan | 2 |
| Ubuntu | 14.04, 16.04, 18.04, 19.10, 20.04 |
| Alpine Linux | 3.8, 3.9, 3.10, 3.11 |
| FreeBSD | 11, 12 |
(the packages might work on other versions or flavours, but those aren't tested)
### Guest Network Configuration
> **NOTE: Available since context packages version 6.2.0.**
The context scripts support selectable guest network management service (a component in guest OS responsible for assigning IP addresses, routes, and bringing interfaces up). Following network configuration types can be selected by setting the context variable `NETCFG_TYPE` (empty default fallbacks to autodetection of the most suitable one for a particular platform):
- `bsd` for FreeBSD network configuration,
- `interfaces` for Debian-style configuration in `/etc/network/interfaces`,
- `netplan` for Netplan with following renders set in context variable `NETCFG_NETPLAN_RENDERER`:
- empty or `networkd` for systemd-network (default),
- `NetworkManager` for NetworkManager
- `networkd` for systemd-networkd,
- `nm` for NetworkManager,
- `scripts` for legacy Red Hat-style configuration via `/etc/sysconfig/network-scripts/ifcfg-ethX` files.
Interface IP address configuration method can be customized as well. Following IPv4 configuration methods are supported via NIC attribute `METHOD`:
- empty or `static` for static address assignment based on context variables,
- `dhcp` for DHCPv4,
- `skip` to skip IPv4 configuration.
Following IPv6 configuration methods are supported via NIC attribute `IP6_METHOD`:
- empty or `static` for static address assignment based on context variables,
- `auto` for SLAAC,
- `dhcp` for SLAAC and DHCPv6,
- `disable` to disable IPv6 in guest,
- `skip` to skip IPv6 configuration.
Selectable configuration types and IP configuration methods are **supported only on the following platforms**:
| Platform | Network Type (`NETCFG_TYPE`) |
|-----------------------------------------------------------------|-------------------------------------------|
| Alpine Linux 3.14+ | `interfaces` |
| ALT Linux p10, Sisyphus | `networkd`, `nm` |
| Amazon Linux 2 | `scripts` |
| Debian 10+ | `interfaces`, `netplan`, `nm`, `networkd` |
| Devuan 2 | `interfaces` |
| Fedora 34+ | `scripts`, `nm`, `networkd` |
| FreeBSD 12+ | `bsd` |
| openSUSE 15 | `scripts` |
| RHEL-like 7 (CentOS, Oracle Linux) | `scripts` |
| RHEL-like 8 (CentOS, Oracle/Rocky/AlmaLinux/MSVSphere) | `scripts`, `nm`, `networkd` |
| RHEL-like 9 (CentOS Stream 9, Oracle/Rocky/AlmaLinux/MSVSphere) | `nm`, `networkd` |
| Ubuntu 18.04, 20.04, 21.10, 22.04 | `interfaces`, `netplan`, `nm`, `networkd` |
(other than listed platforms are not supported for using `NETCFG_TYPE` nor `METHOD`/`IP6_METHOD`!):
Known Issues:
- Alpine Linux: `IP6_METHOD=dhcp` runs DHCPv4 client instead of DHCPv6,
- Debian 10: `NETCFG_TYPE=netplan` with **networkd** doesn't configure IPv6 (only) SLAAC (`IP6_METHOD=auto`) when no IPv4 is configured,
- Debian/Ubuntu: `NETCFG_TYPE=netplan` with **NetworkManager** might not configure IPv6 SLAAC (`IP6_METHOD=auto`) for hot-plugged interfaces,
- Debian 10 and Ubuntu 18.04, 20.04: might trigger DHCPv6 with `IP6_METHOD=auto`
- on `NETCFG_TYPE=netplan` with **networkd**,
- on `NETCFG_TYPE=networkd`.
## Build own package
Packages for each release for supported guests are available in the
@ -185,7 +124,7 @@ executed as a first during the post-networking contextualization stage.
## License
Copyright 2002-2022, OpenNebula Project, OpenNebula Systems (formerly C12G Labs)
Copyright 2002-2020, OpenNebula Project, OpenNebula Systems (formerly C12G Labs)
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

@ -3,7 +3,7 @@
set -e
export DATE=$(date +%Y%m%d)
TARGETS='el6 el7 el8 el9 alt suse deb alpine freebsd iso'
TARGETS='el6 el7 el7_ec2 el8 el8_ec2 alt suse deb deb_ec2 alpine freebsd iso'
for TARGET in $TARGETS; do
TARGET="${TARGET}" ./generate.sh

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2022, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,8 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# shellcheck disable=SC1091
if [ -z "${TARGET}" ]; then
echo 'Error: env. variable TARGET not set' >&2
exit 1
@ -30,7 +28,7 @@ set +e
###
if [ -z "${RELEASE}" ]; then
if git describe --contains "$(git rev-parse HEAD)" &>/dev/null; then
if git describe --contains $(git rev-parse HEAD) &>/dev/null; then
RELEASE=1
else
DATE=${DATE:-$(date +%Y%m%d)}
@ -41,9 +39,9 @@ fi
###
VERSION=${VERSION:-6.6.0}
RELEASE=${RELEASE:-1}
MAINTAINER=${MAINTAINER:-OpenNebula Systems <contact@opennebula.io>}
VERSION=${VERSION:-5.12.0.2}
RELEASE=${RELEASE:-0}
MAINTAINER=${MAINTAINER:-OpenNebula Systems <support@opennebula.systems>}
LICENSE=${LICENSE:-Apache 2.0}
VENDOR=${VENDOR:-OpenNebula Systems}
SUMMARY="OpenNebula Contextualization Package"
@ -92,14 +90,12 @@ _PREUN=$(mktemp)
_POSTUN=$(mktemp)
_POSTUP=$(mktemp)
# shellcheck disable=SC2064
trap "rm -rf ${UNAME_PATH} ${BUILD_DIR} ${_POSTIN} ${_PREUN} ${_POSTUN} ${_POSTUP}" EXIT
while IFS= read -r -d $'\0' SRC; do
F_TAGS=${SRC##*##}
if [ "x${SRC}" != "x${F_TAGS}" ]; then
# shellcheck disable=SC2001
for F_TAG in $(echo "${F_TAGS}" | sed -e 's/\./ /g'); do
for F_TAG in $(echo ${F_TAGS} | sed -e 's/\./ /g'); do
for TAG in ${TAGS}; do
if [ "${F_TAG}" = "${TAG}" ]; then
continue 2 # tag matches, continue with next tag
@ -115,7 +111,7 @@ while IFS= read -r -d $'\0' SRC; do
cp "src/${SRC}" "${BUILD_DIR}/${DST}"
done < <(cd src/ && find . -type f -print0)
for F in "$@"; do
for F in $@; do
cp -r "$F" "${BUILD_DIR}/"
done
@ -127,8 +123,7 @@ umask 0022
# cleanup
if [ -z "${OUT}" ]; then
OUT="out/${FILENAME}"
_out_dir=$(dirname "${OUT}")
mkdir -p "${_out_dir}"
mkdir -p $(dirname "${OUT}")
rm -rf "${OUT}"
fi
@ -149,12 +144,11 @@ if [ "${TYPE}" = 'dir' ]; then
cp -rT "${BUILD_DIR}" "${OUT}"
elif [ "${TYPE}" = 'iso' ]; then
_out_dir=$(dirname "${OUT}")
mkisofs -J -R -input-charset utf8 \
-m '*.iso' \
-V "${LABEL}" \
-o "${OUT}" \
"${_out_dir}"
$(dirname "${OUT}")
else
CONFIG_FILES=$(cd "${BUILD_DIR}" && \
@ -165,26 +159,21 @@ else
# concatenate pre/postinstall scripts
if [ -n "${POSTIN}" ]; then
cat "${POSTIN}" >"${_POSTIN}"
cat ${POSTIN} >"${_POSTIN}"
fi
if [ -n "${PREUN}" ]; then
cat "${PREUN}" >"${_PREUN}"
cat ${PREUN} >"${_PREUN}"
fi
if [ -n "${POSTUN}" ]; then
cat "${POSTUN}" >"${_POSTUN}"
cat ${POSTUN} >"${_POSTUN}"
fi
if [ -n "${POSTUP}" ]; then
cat "${POSTUP}" >"${_POSTUP}"
cat ${POSTUP} >"${_POSTUP}"
fi
# set the package version of onesysprep
sed -i "s/\<_PACKAGE_VERSION_\>/${VERSION}/" \
"${BUILD_DIR}/usr/sbin/onesysprep"
# shellcheck disable=SC2086
fpm --name "${NAME}" --version "${VERSION}" --iteration "${RELEASE_FULL}" \
--architecture all --license "${LICENSE}" \
--vendor "${VENDOR}" --maintainer "${MAINTAINER}" \
@ -198,8 +187,6 @@ else
--rpm-os linux \
--rpm-summary "${SUMMARY}" \
${DEPENDS:+ --depends ${DEPENDS// / --depends }} \
${RECOMMENDS:+ --rpm-tag Recommends:${RECOMMENDS// / --rpm-tag Recommends:}} \
${RECOMMENDS:+ --deb-recommends ${RECOMMENDS// / --deb-recommends }} \
${REPLACES:+ --replaces ${REPLACES// / --replaces }} \
${CONFLICTS:+ --conflicts ${CONFLICTS// / --conflicts }} \
${PROVIDES:+ --provides ${PROVIDES// / --provides }} \
@ -210,4 +197,4 @@ else
--package "${OUT}"
fi
basename "${OUT}"
echo $(basename ${OUT})

@ -0,0 +1,5 @@
post_install(){
systemctl enable one-context
rm -f /etc/systemd/network/*
}

@ -1,7 +1,8 @@
#!/usr/bin/env bash
SERVICES=${SERVICES:-one-context-local one-context-online one-context}
TIMERS=${TIMERS:-one-context-reconfigure.timer}
NETWORK=${NETWORK:-yes}
NETWORK_EC2=${NETWORK_EC2:-no}
SERVICES=${SERVICES:-one-context-local one-context}
rm -f /etc/udev/rules.d/70-persistent-cd.rules
rm -f /etc/udev/rules.d/70-persistent-net.rules
@ -18,8 +19,8 @@ if which systemctl >/dev/null 2>&1 && \
then
systemctl daemon-reload >/dev/null 2>&1 || :
for S in ${SERVICES} ${TIMERS}; do
systemctl enable "${S}" >/dev/null 2>&1
for S in ${SERVICES}; do
systemctl enable "${S}.service" >/dev/null 2>&1
done
fi
@ -47,21 +48,6 @@ elif which rc-update >/dev/null 2>&1; then
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
:
@ -72,21 +58,33 @@ fi
### Cleanup network configuration ##########################
if [ -f /etc/sysctl.d/50-one-context.conf ]; then
rm -f /etc/sysctl.d/50-one-context.conf
if [ "${NETWORK}" != 'yes' ]; then
exit
fi
# Debian based distros
if [ -d /etc/network ]; then
# Prepare network files
cp /etc/network/interfaces "/etc/network/interfaces.$(date '+%s')"
cp /etc/network/interfaces /etc/network/interfaces.$(date "+%s")
rm -rf /etc/network/interfaces.d
rm -rf /etc/netplan/*
cat > /etc/network/interfaces <<EOT
if [ "${NETWORK_EC2}" = 'yes' ]; then
cat > /etc/network/interfaces <<EOT
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOT
else
cat > /etc/network/interfaces <<EOT
# The loopback network interface
auto lo
iface lo inet loopback
EOT
fi
# Do not reconfigure network interfaces on boot
# if [ -f /etc/default/networking ]; then
@ -96,17 +94,31 @@ EOT
# fi
fi
# Red Hat based distros
if [ -d /etc/sysconfig/network-scripts/ ]; then
# RedHat based distros
if [ -d /etc/sysconfig/network-scripts ]; then
# Prepare network files
find /etc/sysconfig/network-scripts -type f \
\( -name 'ifcfg-*' -o -name 'route-*' -o -name 'route6-*' \) \
! -name 'ifcfg-lo' ! -name 'route-lo' ! -name 'route6-lo' \
\( -name 'ifcfg-*' -o -name 'route-*' \) \
! -name 'ifcfg-lo' ! -name 'route-lo' \
-exec rm -f {} \;
if [ "${NETWORK_EC2}" = 'yes' ]; then
cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<EOT
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="yes"
PEERDNS="yes"
IPV6INIT="no"
NM_CONTROLLED="no"
PERSISTENT_DHCLIENT="1"
EOT
fi
fi
# openSUSE based distros
if [ -d /etc/sysconfig/network/ ]; then
if [ -d /etc/sysconfig/network ]; then
# Prepare network files
find /etc/sysconfig/network -type f \
\( -name 'ifcfg-*' -o -name 'ifroute-*' -o -name 'ifsysctl-*' \) \
@ -115,25 +127,17 @@ if [ -d /etc/sysconfig/network/ ]; then
rm -f /etc/sysconfig/network/routes /etc/sysconfig/network/ifsysctl
sed -i '/^NETCONFIG_DNS_STATIC_SERVERS=/ s/=.*$/=""/' /etc/sysconfig/network/config
sed -i '/^NETCONFIG_DNS_STATIC_SERVERS=/ s/=.*$/="/' /etc/sysconfig/network/config
sed -i '/^NETCONFIG_DNS_STATIC_SEARCHLIST=/ s/=.*$/=""/' /etc/sysconfig/network/config
fi
# Netplan
if [ -d /etc/netplan/ ]; then
rm -f /etc/netplan/*
fi
# NetworkManager
if [ -d /etc/NetworkManager/system-connections/ ]; then
rm -f /etc/NetworkManager/system-connections/*
fi
# systemd-networkd
if [ -d /etc/systemd/network/ ]; then
rm -f \
/etc/systemd/networkd/*.network \
/etc/systemd/networkd/*.link
if [ "${NETWORK_EC2}" = 'yes' ]; then
cat >/etc/sysconfig/network/ifcfg-eth0 <<EOT
DEVICE=eth0
BOOTPROTO=dhcp4
STARTMODE=auto
USERCONTROL=yes
EOT
fi
fi
# FreeBSD based distros

@ -0,0 +1,4 @@
#!/usr/bin/env bash
NETWORK_EC2=yes
SERVICES='one-context'

@ -1,66 +1,7 @@
#!/usr/bin/env bash
# Reload udev rules
udevadm control --reload >/dev/null 2>&1 || :
### 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
if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then
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

@ -1,13 +1,12 @@
#!/usr/bin/env bash
SERVICES=${SERVICES:-one-context one-context-online one-context-local one-context-reconfigure one-context-reconfigure-delayed}
TIMERS=${TIMERS:-one-context-reconfigure.timer}
SERVICES=${SERVICES:-one-context one-context-local}
# Disable services
if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then
for S in ${TIMERS} ${SERVICES}; do
systemctl --no-reload disable "${S}" >/dev/null 2>&1 || :
systemctl stop "${S}" >/dev/null 2>&1 || :
for S in ${SERVICES}; do
systemctl --no-reload disable "${S}.service" >/dev/null 2>&1 || :
systemctl stop "${S}.service" >/dev/null 2>&1 || :
done
fi

@ -0,0 +1,3 @@
#!/usr/bin/env bash
SERVICES='one-context'

@ -1,7 +0,0 @@
# 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.

@ -1,3 +0,0 @@
[main]
no-auto-default=*
dns=none

@ -1,44 +0,0 @@
#!/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

@ -1,6 +0,0 @@
# 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

@ -1,47 +0,0 @@
# 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

@ -1,7 +1,7 @@
#!/sbin/openrc-run
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -21,7 +21,7 @@ name="OpenNebula contextualization"
depend() {
use one-context-local net
before sshd
after logger
use logger
keyword -stop -shutdown
}

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/sbin/openrc-run
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/sbin/openrc-run
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -15,13 +15,13 @@
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
name="OpenNebula pre-networking contextualization"
depend() {
need localmount udev udev-trigger udev-settle
before net
after logger
use logger
keyword -stop -shutdown
}

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/sbin/openrc-run
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/sbin/openrc-run
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,5 +1,5 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,5 +1,5 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,5 +1,5 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,5 +1,5 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,5 +1,5 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,60 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
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

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,278 +16,84 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# shellcheck disable=SC2001
set -e
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
GROW_ROOTFS=${GROW_ROOTFS:-YES}
GROW_ROOTFS=${GROW_ROOTFS^^}
#GROW_FS # list of mountpoints to resize
#
# functions
#
# modified code based on the /etc/rc.d/growfs from FreeBSD
freebsd_growfs()
(
#
# Copyright 2014 John-Mark Gurney
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
_FS="$1"
MOUNT_LINE=$(mount -p | awk -v grow_fs="${_FS}" '
{if ( $2 == grow_fs) print $1, $3;}
')
if [ -z "$MOUNT_LINE" ] ; then
echo "GROWFS: No such mountpoint: ${_FS}" >&2
return 1
fi
FSDEV=$(echo "$MOUNT_LINE" | cut -d' ' -f1)
FSTYPE=$(echo "$MOUNT_LINE" | cut -d' ' -f2)
case "$FSTYPE" in
ufs)
rootdev=${FSDEV#/dev/}
;;
zfs)
pool=${FSDEV%%/*}
rootdev=$(zpool list -v "$pool" | awk 'END { print $1 }')
;;
*)
echo "GROWFS: Mount-point '${_FS}' of type '${FSTYPE}' is not supported!" >&2
return 0
esac
if [ x"$rootdev" = x"${rootdev%/*}" ]; then
# raw device
rawdev="$rootdev"
else
rawdev=$(glabel status | awk '$1 == "'"$rootdev"'" { print $3 }')
if [ x"$rawdev" = x"" ]; then
echo "GROWFS: Unable to found a device for '${rootdev}'!" >&2
return 1
fi
fi
if [ -n "$DEBUG" ]; then
echo "DEVICE: ${rootdev}"
echo "RAW DEVICE: ${rawdev}"
echo "FSTYPE: ${FSTYPE}"
fi
sysctl -b kern.geom.conftxt | awk '
{
lvl=$1
device[lvl] = $3
type[lvl] = $2
idx[lvl] = $7
parttype[lvl] = $13
if (dev == $3) {
for (i = 1; i <= lvl; i++) {
# resize
if (type[i] == "PART") {
pdev = device[i - 1]
cmd[i] = "gpart resize -i " idx[i] " " pdev
if (parttype[i] == "GPT")
cmd[i] = "gpart recover " pdev " ; " cmd[i]
} else if (type[i] == "LABEL") {
continue
} else {
print "unhandled type: " type[i]
exit 1
}
}
for (i = 1; i <= lvl; i++) {
if (cmd[i])
system(cmd[i])
}
exit 0
}
}' dev="$rawdev"
gpart commit "$rootdev"
case "$FSTYPE" in
ufs)
growfs -y /dev/"$rootdev"
;;
zfs)
zpool online -e "$pool" "$rootdev"
;;
esac
)
#
# main
#
if [ -z "${GROW_FS}" ] && [ "${GROW_ROOTFS}" != 'YES' ]; then
echo 'GROWFS: Skipping filesystem resize' >&2
if [ "${GROW_ROOTFS}" != 'YES' ]; then
echo 'Skipped root filesystem growing.' >&2
exit 0
fi
# add rootfs ('/') to the GROW_FS if GROW_ROOTFS=YES
if [ "${GROW_ROOTFS}" = 'YES' ] ; then
# duplicates will be removed by the next command
GROW_FS="/ ${GROW_FS}"
# FreeBSD
if [ -x /etc/rc.d/growfs ]; then
/etc/rc.d/growfs onestart
exit $?
fi
# sanitize the GROW_FS
GROW_FS=$(echo "${GROW_FS}" | sed 's/[[:space:]]\+/\n/g' | sed '/^$/d' | sort -u)
MOUNT_LINE=$(cat /etc/mtab | grep ' / ' | grep -v '^rootfs')
DEVICE=$(echo "$MOUNT_LINE" | cut -d' ' -f1)
FSTYPE=$(echo "$MOUNT_LINE" | cut -d' ' -f3)
GROWPART=$(which growpart)
OS=$(uname | tr '[:upper:]' '[:lower:]')
case "$OS" in
linux)
GROWPART=$(command -v growpart || true)
if [ -z "${GROWPART}" ]; then
echo "GROWFS: growpart command is missing" >&2
exit 1
fi
;;
freebsd)
if ! [ -x /etc/rc.d/growfs ]; then
echo "GROWFS: growfs command is missing" >&2
exit 1
fi
;;
esac
export DEBUG
_exit_result=0
for _FS in ${GROW_FS} ; do
# FreeBSD
if [ "${OS}" = 'freebsd' ]; then
case "$_FS" in
/)
/etc/rc.d/growfs onestart || _exit_result=$?
;;
*)
freebsd_growfs "$_FS" || _exit_result=$?
;;
esac
continue
fi
# Linux
# try /proc/mounts first otherwise fallback to /etc/mtab
MOUNT_LINE=$(\
if [ -e /proc/mounts ] ; then \
cat /proc/mounts ; \
else \
cat /etc/mtab ; \
fi | awk -v grow_fs="${_FS}" '
{if (($0 !~ /rootfs/) && ($2 == grow_fs)) print $1, $3;}
')
if [ -z "$MOUNT_LINE" ] ; then
echo "GROWFS: No such mountpoint: ${_FS}" >&2
_exit_result=1
continue
fi
DEVICE=$(echo "$MOUNT_LINE" | cut -d' ' -f1)
FSTYPE=$(echo "$MOUNT_LINE" | cut -d' ' -f2)
LVM=$(lvdisplay "${DEVICE}" 2>/dev/null | wc -l)
if [ "$LVM" -eq 0 ]; then
# findmnt supports --nofsroot since util-linux v2.19.1 but
# unfortunately this is broken even in v2.20 (Ubuntu 14.04)
# so trivial test follows which should filter out old and broken
# versions...
if findmnt -V >/dev/null 2>&1 ; then
DEVICE=$(findmnt -ln -o SOURCE --nofsroot "$_FS")
else
# old broken util-linux does not have the -V option
DEVICE=$(findmnt -ln -o SOURCE "$_FS")
fi
DISK=$(echo "$DEVICE" | sed 's/[0-9]*$//')
PARTITION=$(echo "$DEVICE" | sed "s|^$DISK||")
LVM="no"
fi
if [ "${LVM}" != "no" ]; then
# TODO: This should be rewritten to accomodate other PVs - this expects
# that PV name ends with zero or exactly one numeric: /dev/sda1
PVRESIZE=$(which pvresize)
LVEXTEND=$(which lvextend)
DISK=$(pvdisplay | awk '/PV Name/ {sub(/.$/, "", $3); print $3;}')
PARTITION=$(pvdisplay | awk -v d="$DISK" '/PV Name/ {sub("^" d, "", $3); print $3;}')
PV=$(pvdisplay | awk '/PV Name/ {print $3}')
LV=$(lvdisplay "${DEVICE}" | awk '/LV Path/ {print $3}')
# when PV is on MSDOS logical partition, detect the umbrella
# extended partition and grow it first
TABLE=$(parted -s "${DISK}" print 2>/dev/null | awk '/Partition Table:/ {print $3}')
if [ "${TABLE}" = 'msdos' ] && [ "${PARTITION}" -gt 4 ]; then
EXTENDED=$(parted -s "${DISK}" print | awk '/extended/ {print $1}')
PARTITION="${EXTENDED} ${PARTITION}"
fi
fi
if [ -n "$DEBUG" ]; then
echo "DEVICE: ${DEVICE}"
echo "FSTYPE: ${FSTYPE}"
echo "DISK: ${DISK}"
echo "PARTITION: ${PARTITION}"
fi
(
for PART in ${PARTITION}; do
${GROWPART} "${DISK}" "${PART}"
done
if [ $? -ne 0 ]; then
echo "growpart command is missing"
exit 1
fi
if [ "${LVM}" != "no" ]; then
${PVRESIZE} "${PV}"
${LVEXTEND} -l +100%FREE "${LV}"
fi
) || : # don't fail, partition can be already extended by dracut
if [ $(lvdisplay ${DEVICE} 2>/dev/null | wc -l) -eq 0 ]; then
DEVICE=$(findmnt -ln -o SOURCE /)
DISK=$(echo "$DEVICE" | sed 's/[0-9]*$//')
PARTITION=$(echo "$DEVICE" | sed "s|^$DISK||")
LVM="no"
fi
case "${FSTYPE}" in
ext2|ext3|ext4)
resize2fs "${DEVICE}"
;;
xfs)
xfs_growfs "${_FS}"
;;
btrfs)
btrfs filesystem resize max "${_FS}"
;;
esac
if [ "${LVM}" != "no" ]; then
if [ -f /etc/debian_version ]; then
DEVICE=$(mount | grep ' / ' | grep -v '^rootfs'|cut -d' ' -f1)
fi
PVRESIZE=$(which pvresize)
LVEXTEND=$(which lvextend)
DISK=$(pvdisplay |grep "PV Name"|awk '{print $3}'|sed 's/.$//')
PARTITION=$(pvdisplay |grep "PV Name"|awk '{print $3}'| sed "s|^${DISK}||")
PV=$(pvdisplay |grep "PV Name"|awk '{print $3}')
LV=$(lvdisplay ${DEVICE} |grep "LV Path"|awk '{print $3}')
# when PV is on MSDOS logical partition, detect the umbrella
# extended partition and grow it first
TABLE=$(parted -s ${DISK} print 2>/dev/null | grep 'Partition Table:' | awk '{print $3}')
if [ "${TABLE}" = 'msdos' ] && [ ${PARTITION} -gt 4 ]; then
PARTITION="$(parted -s ${DISK} print | grep 'extended' | awk '{print $1}') $PARTITION"
fi
fi
done
if [ -n "$DEBUG" ]; then
echo DEVICE: ${DEVICE}
echo FSTYPE: ${FSTYPE}
echo DISK: ${DISK}
echo PARTITION: ${PARTITION}
fi
exit "$_exit_result"
(
for PART in ${PARTITION}; do
${GROWPART} ${DISK} ${PART}
done
if [ "${LVM}" != "no" ]; then
${PVRESIZE} ${PV}
${LVEXTEND} -l +100%FREE ${LV}
fi
) || : # don't fail, partition can be already extended by dracut
case "${FSTYPE}" in
ext2|ext3|ext4)
resize2fs ${DEVICE}
;;
xfs)
xfs_growfs /
;;
btrfs)
btrfs filesystem resize max /
;;
esac

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
if [ -z "${TIMEZONE}" ]; then
exit 0
fi

@ -1,165 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
# 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

@ -0,0 +1,357 @@
#!/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

@ -0,0 +1,274 @@
#!/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

@ -0,0 +1,315 @@
#!/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

@ -0,0 +1,320 @@
#!/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

@ -0,0 +1,353 @@
#!/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

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
get_iface_var()
{
var_name="${UPCASE_DEV}_$1"
@ -63,6 +58,7 @@ for pci in $PCI_INTERFACES; do
GATEWAY=$(get_iface_var "GATEWAY")
METRIC=$(get_iface_var "METRIC")
MTU=$(get_iface_var "MTU")
MTU=${MTU:-1500}
VLAN_ID=$(get_iface_var "VLAN_ID")
IP6=$(get_iface_var "IP6")

@ -1,573 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
# 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
}

@ -1,285 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -1,403 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -1,346 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -1,380 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -1,320 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -1,393 +0,0 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
#
# 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
}

@ -0,0 +1,63 @@
#!/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

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
get_management_interfaces() {
env | grep -E "^ETH[0-9]+_VROUTER_MANAGEMENT=YES" | sed 's/_.*$//' | tr 'ETH' 'eth' | sort
}
@ -86,7 +81,7 @@ gen_footer
) > /etc/iptables/rules-save
if [ "$2" == "reconfigure" ]; then
if [ "$1" == "reconfigure" ]; then
reload_service
else
rc-update add iptables boot

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,39 +16,15 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
# 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
)
activate_swaps_linux() {
SWAP_DRIVES=$(blkid -t TYPE="swap" -o device)
for SWAP in $SWAP_DRIVES ; do
if [ -z "$(swapon -s | grep $SWAP)" ]; then
swapon "$SWAP"
swapon $SWAP
fi
done
}
if is_true "${IGNORE_SWAP}" ; then
exit 0
fi
if [ "$(uname -s)" = 'Linux' ]; then
activate_swaps_linux
fi

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
if [ -z "${VROUTER_ID}${VROUTER_KEEPALIVED_ID}" ]; then
if [ -f /etc/sysctl.d/01-one.conf ]; then
unlink /etc/sysctl.d/01-one.conf

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
get_context_interfaces() {
env | grep -E "^ETH[0-9]+_VROUTER_IP=" | sed 's/_.*$//' | sort
}
@ -186,7 +181,7 @@ gen_instances
) > /etc/keepalived/keepalived.conf
if [ "$2" == "reconfigure" ]; then
if [ "$1" == "reconfigure" ]; then
reload_service
else
rc-update add keepalived boot

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
ENV_FILE=/var/run/one-context/one_env
MOUNT_DIR="${MOUNT_DIR:-/mnt}"
TOKEN_FILE="${MOUNT_DIR}/token.txt"

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
# defaults
USERNAME=${USERNAME:-root}
USERNAME_SUDO=${USERNAME_SUDO:-${GRANT_SUDO:-YES}}

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
[ -z "${SSH_PUBLIC_KEY}${EC2_PUBLIC_KEY}" ] && exit 0
if [ -z "${USERNAME}" ]

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,17 +16,7 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
if ssh-keygen -A; then
if type restorecon >/dev/null 2>&1; then
restorecon -R -v /etc/ssh/
fi
else
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure openssh-server
fi
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure openssh-server
fi

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
# Linux
for _dev_tty in $(find /dev -type c -name 'tty[0-9]*'); do
TERM=linux setterm -blank 0 -powerdown 0 >>"${_dev_tty}"

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,11 +16,6 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
# THIS IS A CONTEXTUALIZATION GUARD
if [ "$1" != 'local' ] ; then
exit 0
fi
_pam_file="/etc/pam.d/login"
if [ ! -f "${_pam_file}" ]; then
exit 0

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -23,53 +23,29 @@ else
SED_I="sed -i''"
fi
# Detects suitable running syslog service and restarts it
# to propagate the changed hostname into the logs
# (otherwise old or default value remains until reboot)
function restart_syslog() {
for _name in syslog syslogd rsyslog; do
if LANG=C systemctl is-active "${_name}" >/dev/null 2>&1; then
systemctl restart "${_name}" && return
elif service "${_name}" status >/dev/null 2>&1; then
service "${_name}" restart && return
fi
done
}
function set_hostname() {
local _hostname=$1
# remember currently set hostname to detect a change
local _old_hostname
_old_hostname=$(hostname)
local hostname=$1
if [ -d /run/systemd/system/ ] && hostnamectl status >/dev/null 2>/dev/null; then
hostnamectl set-hostname --static "${_hostname}"
hostnamectl set-hostname --static "${hostname}"
else
if [ -f /etc/sysconfig/network ]; then
eval "${SED_I} '/^HOSTNAME=.*$/d' /etc/sysconfig/network"
echo "HOSTNAME=${_hostname}" >>/etc/sysconfig/network
echo "HOSTNAME=${hostname}" >>/etc/sysconfig/network
elif [ "${_kernel}" = 'FreeBSD' ]; then
sysrc hostname="${_hostname}"
sysrc hostname="${hostname}"
else
echo "${_hostname}" >/etc/hostname
echo "${hostname}" >/etc/hostname
fi
hostname "${_hostname}"
fi
# restart syslog if actual hostname changed
if [ "${_old_hostname}" != "$(hostname)" ]; then
restart_syslog
hostname "${hostname}"
fi
}
function set_domainname() {
local _domain=$1
touch /etc/resolv.conf
domain=$1
eval "${SED_I} -e '/^domain .*/d' /etc/resolv.conf"
echo "domain ${_domain}" >>/etc/resolv.conf
echo "domain ${domain}" >>/etc/resolv.conf
}
function get_first_ip() {
@ -155,10 +131,6 @@ if [ -n "${name}" ]; then
domain=''
fi
if [ -n "${domain}" ]; then
set_domainname "${domain}"
fi
# FreeBSD
if [ "${_kernel}" = 'FreeBSD' ]; then
set_hostname "${name}"
@ -166,6 +138,10 @@ if [ -n "${name}" ]; then
set_hostname "${hostname}"
fi
if [ -n "${domain}" ]; then
set_domainname "${domain}"
fi
if [ -n "${DNS_HOSTNAME}" ]; then
host_ip=$first_ip
else

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,33 +16,25 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
set -e
MOUNT_DIR=${MOUNT_DIR:-/mnt}
TMP_DIR=$(mktemp -d "${TMP_DIR:-/var/lib/one-context/tmp}/one-context.XXXXXX")
START_SCRIPT_AVAILABLE=no
TMP_DIR=$(mktemp -d "/tmp/one-context.XXXXXX")
TMP_FILE="${TMP_DIR}/one-start-script"
START_SCRIPT_AVAILABLE=no
cleanup()
{
rm -rf "${TMP_DIR}"
}
trap cleanup EXIT
chmod 0700 "${TMP_DIR}"
chmod 700 "${TMP_DIR}"
if [ -n "${START_SCRIPT_BASE64}" ]; then
echo "${START_SCRIPT_BASE64}" | base64 -d > "${TMP_FILE}"
if [ -n "$START_SCRIPT_BASE64" ]; then
echo "${START_SCRIPT_BASE64}" | base64 -d > $TMP_FILE
START_SCRIPT_AVAILABLE=yes
elif [ -n "${START_SCRIPT}" ]; then
echo "${START_SCRIPT}" > "${TMP_FILE}"
elif [ -n "$START_SCRIPT" ]; then
echo "${START_SCRIPT}" > $TMP_FILE
START_SCRIPT_AVAILABLE=yes
fi
if [ "${START_SCRIPT_AVAILABLE}" = "yes" ]; then
cd "${MOUNT_DIR}"
chmod +x "${TMP_FILE}"
"${TMP_FILE}"
if [ "$START_SCRIPT_AVAILABLE" = "yes" ]; then
cd $MOUNT_DIR
chmod +x $TMP_FILE
$TMP_FILE
fi
rm -rf "${TMP_DIR}"

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -16,40 +16,23 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
set -e
MOUNT_DIR=${MOUNT_DIR:-/mnt}
TMP_DIR=$(mktemp -d "/tmp/one-context.XXXXXX")
MOUNT_DIR="${MOUNT_DIR:-/mnt}"
TMP_DIR=$(mktemp -d "${TMP_DIR:-/var/lib/one-context/tmp}/one-context.XXXXXX")
chmod 700 "${TMP_DIR}"
cleanup()
{
rm -rf "${TMP_DIR}"
}
trap cleanup EXIT
chmod 0700 "${TMP_DIR}"
if [ -z "${INIT_SCRIPTS}" ]; then
if [ -f "${MOUNT_DIR}/init.sh" ]; then
if [ -z "$INIT_SCRIPTS" ]; then
if [ -f "$MOUNT_DIR/init.sh" ]; then
INIT_SCRIPTS=init.sh
fi
fi
cd "${MOUNT_DIR}"
cd $MOUNT_DIR
_result=0
for f in $INIT_SCRIPTS; do
f=$(basename "$f")
if [ -f "$f" ] ; then
cp "${f}" "${TMP_DIR}/"
chmod +x "${TMP_DIR}/${f}"
"${TMP_DIR}/${f}" || _result=$?
else
echo "ERROR: Init script does not exist: ${f}" >&2
_result=1
fi
cp "$f" "${TMP_DIR}/"
chmod +x $TMP_DIR/$f
$TMP_DIR/$f
done
exit $_result
rm -rf "${TMP_DIR}"

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -17,8 +17,6 @@
#--------------------------------------------------------------------------- #
ENV_FILE=${ENV_FILE:-/var/run/one-context/one_env}
RETRY_COUNT="${RETRY_COUNT:-3}"
RETRY_WAIT_PERIOD="${RETRY_WAIT_PERIOD:-10}"
if [ "$REPORT_READY" != "YES" ]; then
exit 0
@ -26,57 +24,39 @@ fi
# $TOKENTXT is available only through the env. file
if [ -f "${ENV_FILE}" ]; then
# shellcheck disable=SC1090
. "${ENV_FILE}"
fi
###
if command -v curl ; then
_command=curl
elif command -v wget && ! wget --help 2>&1 | grep -q BusyBox; then
_command=wget
elif command -v onegate ; then
_command=onegate
else
echo "ERROR: No way to signal READY=YES (no usable binary)" >&2
exit 1
fi > /dev/null # this will not drop the error message which goes to stderr
if which curl >/dev/null 2>&1; then
curl -X "PUT" "${ONEGATE_ENDPOINT}/vm" \
--header "X-ONEGATE-TOKEN: $TOKENTXT" \
--header "X-ONEGATE-VMID: $VMID" \
--insecure \
-d "READY=YES"
while [ "$RETRY_COUNT" -gt 0 ] ; do
case "$_command" in
curl)
curl -X "PUT" "${ONEGATE_ENDPOINT}/vm" \
--header "X-ONEGATE-TOKEN: $TOKENTXT" \
--header "X-ONEGATE-VMID: $VMID" \
--max-time 10 \
--insecure \
-d "READY=YES"
;;
wget)
wget --method=PUT "${ONEGATE_ENDPOINT}/vm" \
--body-data="READY=YES" \
--header "X-ONEGATE-TOKEN: $TOKENTXT" \
--header "X-ONEGATE-VMID: $VMID" \
--timeout=10 \
--no-check-certificate
;;
onegate)
if command -v timeout >/dev/null; then
timeout 10 onegate vm update --data "READY=YES"
else
onegate vm update --data "READY=YES"
fi
;;
esac
if [ "$?" = "0" ]; then
exit 0
fi
fi
if which wget >/dev/null 2>&1; then
wget --method=PUT "${ONEGATE_ENDPOINT}/vm" \
--body-data="READY=YES" \
--header "X-ONEGATE-TOKEN: $TOKENTXT" \
--header "X-ONEGATE-VMID: $VMID" \
--no-check-certificate
# shellcheck disable=SC2181
if [ "$?" = "0" ]; then
exit 0
fi
fi
RETRY_COUNT=$(( RETRY_COUNT - 1 ))
sleep "${RETRY_WAIT_PERIOD}"
done
if which onegate >/dev/null 2>&1; then
onegate vm update --data "READY=YES"
exit 1
if [ "$?" = "0" ]; then
exit 0
fi
fi

@ -1,5 +0,0 @@
#!/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

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -18,7 +18,7 @@
### BEGIN INIT INFO
# PROVIDE: one-context
# REQUIRE: LOGIN NETWORKING one-context-local
# REQUIRE: LOGIN NETWORKING
### END INIT INFO
. /etc/rc.subr
@ -26,42 +26,12 @@
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin
name="one_context"
desc="OpenNebula contextualization"
desc="OpenNebula's context scripts"
rcvar="${name}_enable"
start_precmd="${name}_prestart"
stop_cmd="${name}_stop"
command="/usr/sbin/one-contextd"
command_args="network"
one_context_get_pids()
{
# get main process PID and direct children processes
for _pid in $(pgrep -f "${command} ${command_args}$"); do
echo "${_pid}"
pgrep -P "${_pid}"
done
}
one_context_prestart()
{
if [ -f /var/run/one-context/context.sh.network ]; then
warn "Service started once already."
return 1
fi
}
one_context_stop()
{
echo -n "Stopping ${name}"
_pids=$(one_context_get_pids)
for _pid in $_pids; do
kill -- "${_pid}" >/dev/null 2>&1
done
echo '.'
}
load_rc_config $name
: ${one_context_enable:="yes"}
run_rc_command "$1"

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -17,8 +17,9 @@
#--------------------------------------------------------------------------- #
### BEGIN INIT INFO
# PROVIDE: one-context-force
# REQUIRE: one-context-local one-context
# PROVIDE: one-context-force
# Short-Description: OpenNebula forced reconfiguration
### END INIT INFO
. /etc/rc.subr
@ -28,67 +29,10 @@ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/b
name="one_context_force"
desc="OpenNebula forced reconfiguration"
rcvar="${name}_enable"
start_precmd="${name}_prestart"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
command="/usr/sbin/one-context-run"
command_args="force"
one_context_get_pids()
{
# get main process PID and direct children processes
for _pid in $(pgrep -f "${command} ${command_args}$"); do
echo "${_pid}"
pgrep -P "${_pid}"
done
}
one_context_force_status()
{
_pids=$(one_context_get_pids)
if [ -z "${_pids}" ]; then
echo "${name} is not running."
return 1
else
echo "${name} is running as pids ${_pids}."
return 0
fi
}
one_context_force_prestart()
{
if ! [ -f /var/run/one-context/context.sh.local ]; then
warn "Service one-context-local must run first."
return 1
fi
if ! [ -f /var/run/one-context/context.sh.network ]; then
warn "Service one-context must run first."
return 1
fi
_pids=$(one_context_get_pids)
if [ -n "${_pids}" ]; then
warn "${name} already running? (pids=${_pids})"
return 1
fi
return 0
}
one_context_force_stop()
{
echo -n "Stopping ${name}"
_pids=$(one_context_get_pids)
for _pid in $_pids; do
kill -- "${_pid}" >/dev/null 2>&1
done
echo '.'
}
# run without any delay
export TIMEOUT=0

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -18,7 +18,7 @@
### BEGIN INIT INFO
# PROVIDE: one-context-local
# REQUIRE: FILESYSTEMS ldconfig
# REQUIRE: FILESYSTEMS
# BEFORE: NETWORKING hostname
### END INIT INFO
@ -29,40 +29,10 @@ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/b
name="one_context_local"
desc="OpenNebula pre-networking contextualization"
rcvar="${name}_enable"
start_precmd="${name}_prestart"
stop_cmd="${name}_stop"
command="/usr/sbin/one-contextd"
command_args="local"
one_context_get_pids()
{
# get main process PID and direct children processes
for _pid in $(pgrep -f "${command} ${command_args}$"); do
echo "${_pid}"
pgrep -P "${_pid}"
done
}
one_context_local_prestart()
{
if [ -f /var/run/one-context/context.sh.local ]; then
warn "Service started once already."
return 1
fi
}
one_context_local_stop()
{
echo -n "Stopping ${name}"
_pids=$(one_context_get_pids)
for _pid in $_pids; do
kill -- "${_pid}" >/dev/null 2>&1
done
echo '.'
}
load_rc_config $name
: ${one_context_local_enable:="yes"}
run_rc_command "$1"

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -17,8 +17,8 @@
#--------------------------------------------------------------------------- #
### BEGIN INIT INFO
# PROVIDE: one-context-reconfigure
# REQUIRE: one-context-local one-context
# PROVIDE: one-context-reconfigure
### END INIT INFO
. /etc/rc.subr
@ -28,68 +28,8 @@ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/b
name="one_context_reconfigure"
desc="OpenNebula reconfiguration"
rcvar="${name}_enable"
start_precmd="${name}_prestart"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
command="/usr/sbin/one-context-run"
one_context_get_pids()
{
# get main process PID and direct children processes
for _pid in $(pgrep -f "${command}$"); do
echo "${_pid}"
pgrep -P "${_pid}"
done
}
one_context_reconfigure_status()
{
_pids=$(one_context_get_pids)
if [ -z "${_pids}" ]; then
echo "${name} is not running."
return 1
else
echo "${name} is running as pids ${_pids}."
return 0
fi
}
one_context_reconfigure_prestart()
{
if ! [ -f /var/run/one-context/context.sh.local ]; then
warn "Service one-context-local must run first."
return 1
fi
if ! [ -f /var/run/one-context/context.sh.network ]; then
warn "Service one-context must run first."
return 1
fi
# immediate reconfiguration terminates delayed reconfiguration
service one-context-reconfigure-delayed onestop >/dev/null 2>&1
_pids=$(one_context_get_pids)
if [ -n "${_pids}" ]; then
warn "${name} already running? (pids=${_pids})"
return 1
fi
return 0
}
one_context_reconfigure_stop()
{
echo -n "Stopping ${name}"
_pids=$(one_context_get_pids)
for _pid in $_pids; do
kill -- "${_pid}" >/dev/null 2>&1
done
echo '.'
}
command="/usr/sbin/one-context-run"
# run without any delay
export TIMEOUT=0

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -17,8 +17,8 @@
#--------------------------------------------------------------------------- #
### BEGIN INIT INFO
# PROVIDE: one-context-reconfigure-delayed
# REQUIRE: one-context-local one-context
# PROVIDE: one-context-reconfigure-delayed
### END INIT INFO
. /etc/rc.subr
@ -28,65 +28,8 @@ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/b
name="one_context_reconfigure_delayed"
desc="OpenNebula delayed reconfiguration"
rcvar="${name}_enable"
start_precmd="${name}_prestart"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
command="/usr/sbin/one-context-run"
one_context_get_pids()
{
# get main process PID and direct children processes
for _pid in $(pgrep -f "${command}$"); do
echo "${_pid}"
pgrep -P "${_pid}"
done
}
one_context_reconfigure_delayed_status()
{
_pids=$(one_context_get_pids)
if [ -z "${_pids}" ]; then
echo "${name} is not running."
return 1
else
echo "${name} is running as pids ${_pids}."
return 0
fi
}
one_context_reconfigure_delayed_prestart()
{
if ! [ -f /var/run/one-context/context.sh.local ]; then
warn "Service one-context-local must run first."
return 1
fi
if ! [ -f /var/run/one-context/context.sh.network ]; then
warn "Service one-context must run first."
return 1
fi
_pids=$(one_context_get_pids)
if [ -n "${_pids}" ]; then
warn "${name} already running? (pids=${_pids})"
return 1
fi
return 0
}
one_context_reconfigure_delayed_stop()
{
echo -n "Stopping ${name}"
_pids=$(one_context_get_pids)
for _pid in $_pids; do
kill -- "${_pid}" >/dev/null 2>&1
done
echo '.'
}
command="/usr/sbin/one-context-run"
load_rc_config $name
: ${one_context_reconfigure_delayed_enable:="no"}

@ -1,3 +0,0 @@
[Unit]
# https://github.com/OpenNebula/one/issues/5504
ConditionVirtualization=!container

@ -12,12 +12,10 @@ SUBSYSTEM=="net", ACTION=="add", \
SUBSYSTEM=="net", ACTION=="remove", \
RUN+="/sbin/service one-context-reconfigure-delayed restart"
# Change of CONTEXT CD-ROM triggers immediate reconfiguration,
# which stops any existing delayed reconfiguration.
# On CONTEXT CD-ROM change the immediate reconfiguration is triggered.
SUBSYSTEM=="block", ACTION=="change", \
ENV{ID_CDROM}=="1", \
ENV{ID_FS_TYPE}=="iso9660", \
ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
ENV{ID_FS_TYPE}=="iso9660" ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
RUN+="/sbin/service one-context-reconfigure restart"
# Handle disk resize
@ -32,5 +30,4 @@ SUBSYSTEM=="scsi", ACTION=="change", \
# Handle swap hot-attach
SUBSYSTEM=="block", ACTION=="add", \
ENV{ID_FS_TYPE}=="swap", \
ENV{DM_ACTIVATION}!="1", \
RUN+="/sbin/service one-context-force restart"

@ -7,30 +7,32 @@ SUBSYSTEM=="net", ACTION=="remove", \
# On NIC hotplug the delayed reconfiguration is triggered.
SUBSYSTEM=="net", ACTION=="add", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-reconfigure-delayed.service || /usr/sbin/service one-context-reconfigure-delayed start'"
TAG+="systemd", ENV{SYSTEMD_WANTS}+="one-context-reconfigure-delayed.service", \
RUN+="/usr/bin/timeout 5 /usr/sbin/service one-context-reconfigure-delayed start"
SUBSYSTEM=="net", ACTION=="remove", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-reconfigure-delayed.service || /usr/sbin/service one-context-reconfigure-delayed start'"
TAG+="systemd", ENV{SYSTEMD_WANTS}+="one-context-reconfigure-delayed.service", \
RUN+="/usr/bin/timeout 5 /usr/sbin/service one-context-reconfigure-delayed start"
# Change of CONTEXT CD-ROM triggers immediate reconfiguration,
# which stops any existing delayed reconfiguration.
# When CONTEXT CD-ROM is changed, it generates 2 events. This rule takes
# every second event and triggers systemd service one-context-reconfigure.
# This service also stops any existing delayed reconfiguration.
SUBSYSTEM=="block", ACTION=="change", \
ENV{ID_CDROM}=="1", \
ENV{ID_FS_TYPE}=="iso9660", \
ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-reconfigure.service || /usr/sbin/service one-context-reconfigure start'"
ENV{ID_FS_TYPE}=="iso9660" ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
ENV{SEQNUM}=="*[02468]", \
RUN+="/usr/sbin/service one-context-reconfigure start"
# Handle disk resize
SUBSYSTEM=="block", ACTION=="change", \
ENV{RESIZE}=="1", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-force.service || /usr/sbin/service one-context-force start'"
RUN+="/usr/sbin/service one-context-force start"
SUBSYSTEM=="scsi", ACTION=="change", \
ENV{SDEV_UA}=="CAPACITY_DATA_HAS_CHANGED", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-force.service || /usr/sbin/service one-context-force start'"
RUN+="/usr/sbin/service one-context-force start"
# Handle swap hot-attach
SUBSYSTEM=="block", ACTION=="add", \
ENV{ID_FS_TYPE}=="swap", \
ENV{DM_ACTIVATION}!="1", \
RUN+="/bin/sh -c '/bin/systemctl --no-block start one-context-force.service || /usr/sbin/service one-context-force start'"
RUN+="/usr/sbin/service one-context-force start"

@ -12,12 +12,13 @@ SUBSYSTEM=="net", ACTION=="add", \
SUBSYSTEM=="net", ACTION=="remove", \
RUN+="/usr/bin/systemctl --no-block start one-context-reconfigure-delayed.service"
# Change of CONTEXT CD-ROM triggers immediate reconfiguration,
# which stops any existing delayed reconfiguration.
# When CONTEXT CD-ROM is changed, it generates 2 events. This rule takes
# every second event and triggers systemd service one-context-reconfigure.
# This service also stops any existing delayed reconfiguration.
SUBSYSTEM=="block", ACTION=="change", \
ENV{ID_CDROM}=="1", \
ENV{ID_FS_TYPE}=="iso9660", \
ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
ENV{ID_FS_TYPE}=="iso9660" ENV{ID_FS_LABEL_ENC}=="CONTEXT", \
ENV{SEQNUM}=="*[02468]", \
RUN+="/usr/bin/systemctl --no-block start one-context-reconfigure.service"
# Handle disk resize
@ -32,5 +33,4 @@ SUBSYSTEM=="scsi", ACTION=="change", \
# Handle swap hot-attach
SUBSYSTEM=="block", ACTION=="add", \
ENV{ID_FS_TYPE}=="swap", \
ENV{DM_ACTIVATION}!="1", \
RUN+="/usr/bin/systemctl --no-block start one-context-force.service"

@ -24,5 +24,4 @@ SUBSYSTEM=="scsi", ACTION=="change", \
# Handle swap hot-attach
SUBSYSTEM=="block", ACTION=="add", \
ENV{ID_FS_TYPE}=="swap", \
ENV{DM_ACTIVATION}!="1", \
RUN+="/sbin/service one-context-force start"

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2022, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -29,7 +29,7 @@ require 'pp'
module CloudClient
# OpenNebula version
VERSION = '6.4.0'
VERSION = '5.12.6'
# #########################################################################
# Default location for the authentication file
@ -221,9 +221,6 @@ module OneGate
DISK_RESIZE_POWEROFF
DISK_RESIZE_UNDEPLOYED
HOTPLUG_NIC_POWEROFF
HOTPLUG_RESIZE
HOTPLUG_SAVEAS_UNDEPLOYED
HOTPLUG_SAVEAS_STOPPED
}
SHORT_VM_STATES={
@ -305,10 +302,7 @@ module OneGate
"DISK_RESIZE" => "drsz",
"DISK_RESIZE_POWEROFF" => "drsz",
"DISK_RESIZE_UNDEPLOYED" => "drsz",
"HOTPLUG_NIC_POWEROFF" => "hotp",
"HOTPLUG_RESIZE" => "hotp",
"HOTPLUG_SAVEAS_UNDEPLOYED" => "hotp",
"HOTPLUG_SAVEAS_STOPPED" => "hotp"
"HOTPLUG_NIC_POWEROFF" => "hotp"
}
def self.state_to_str(id, lcm_id)
@ -345,21 +339,17 @@ module OneGate
module Service
STATE = {
'PENDING' => 0,
'DEPLOYING' => 1,
'RUNNING' => 2,
'UNDEPLOYING' => 3,
'WARNING' => 4,
'DONE' => 5,
'FAILED_UNDEPLOYING' => 6,
'FAILED_DEPLOYING' => 7,
'SCALING' => 8,
'FAILED_SCALING' => 9,
'COOLDOWN' => 10,
'DEPLOYING_NETS' => 11,
'UNDEPLOYING_NETS' => 12,
'FAILED_DEPLOYING_NETS' => 13,
'FAILED_UNDEPLOYING_NETS' => 14
'PENDING' => 0,
'DEPLOYING' => 1,
'RUNNING' => 2,
'UNDEPLOYING' => 3,
'WARNING' => 4,
'DONE' => 5,
'FAILED_UNDEPLOYING' => 6,
'FAILED_DEPLOYING' => 7,
'SCALING' => 8,
'FAILED_SCALING' => 9,
'COOLDOWN' => 10
}
STATE_STR = [
@ -373,11 +363,7 @@ module OneGate
'FAILED_DEPLOYING',
'SCALING',
'FAILED_SCALING',
'COOLDOWN',
'DEPLOYING_NETS',
'UNDEPLOYING_NETS',
'FAILED_DEPLOYING_NETS',
'FAILED_UNDEPLOYING_NETS'
'COOLDOWN'
]
# Returns the string representation of the service state
@ -681,7 +667,7 @@ when "vm"
"release",
# Compatibility with 4.x
"delete",
"shutdown"
"shutdown",
if ARGV[2]
action_hash = {
"action" => {

@ -4,7 +4,6 @@ After=one-context.service
Requisite=one-context.service
ConditionPathExists=/var/run/one-context/context.sh.local
ConditionPathExists=/var/run/one-context/context.sh.network
StartLimitInterval=0
[Service]
Type=oneshot

@ -1,8 +1,8 @@
[Unit]
Description=OpenNebula pre-networking contextualization
Description=OpenNebula pre-networking contextualization script
DefaultDependencies=no
Wants=network-pre.target local-fs.target systemd-udev-settle.service syslog.target
Before=network-pre.target
Wants=network-pre.target local-fs.target systemd-udev-settle.service syslog.target
After=local-fs.target systemd-udev-settle.service syslog.target
ConditionPathExists=!/var/run/one-context/context.sh.local

@ -1,7 +1,7 @@
[Unit]
Description=OpenNebula pre-networking contextualization
Wants=network-pre.target local-fs.target systemd-udev-settle.service syslog.target
Description=OpenNebula pre-networking contextualization script
Before=network-pre.target
Wants=network-pre.target local-fs.target systemd-udev-settle.service syslog.target
After=local-fs.target systemd-udev-settle.service syslog.target
ConditionPathExists=!/var/run/one-context/context.sh.local

@ -1,17 +0,0 @@
[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

@ -1,9 +1,8 @@
[Unit]
Description=OpenNebula delayed reconfiguration
Description=OpenNebula delayed reconfiguration script
After=one-context.service
Requisite=one-context.service
ConditionPathExists=/var/run/one-context/context.sh.network
StartLimitInterval=0
[Service]
Type=forking

@ -1,10 +1,9 @@
[Unit]
Description=OpenNebula reconfiguration
Description=OpenNebula reconfiguration script
After=one-context.service
Requisite=one-context.service
Conflicts=one-context-reconfigure-delayed.service
ConditionPathExists=/var/run/one-context/context.sh.network
StartLimitInterval=0
[Service]
Type=oneshot

@ -1,11 +0,0 @@
[Unit]
Description=Periodic OpenNebula reconfiguration
After=one-context.service
ConditionVirtualization=vmware
[Timer]
OnCalendar=*-*-* *:*:0
AccuracySec=1s
[Install]
WantedBy=timers.target

@ -1,5 +1,5 @@
[Unit]
Description=OpenNebula contextualization
Description=OpenNebula contextualization script
Requires=network.target
After=multi-user.target
ConditionPathExists=!/var/run/one-context/context.sh.local

@ -1,9 +1,7 @@
[Unit]
Description=OpenNebula contextualization
Requires=one-context-local.service one-context-online.service
After=multi-user.target one-context-local.service one-context-online.service
Wants=network-online.target
After=network-online.target
Description=OpenNebula contextualization script
Requires=one-context-local.service
After=multi-user.target one-context-local.service
ConditionPathExists=!/var/run/one-context/context.sh.network
[Service]

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/bin/sh
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -19,7 +19,7 @@
# Set PATH
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
TIMEOUT=${TIMEOUT:-30}
TIMEOUT=${TIMEOUT:-60}
COMMAND=${1:-reconfigure}
CONTEXT_BASE=${CONTEXT_BASE:-/var/run/one-context/context.sh}

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2022, OpenNebula Project, OpenNebula Systems #
# 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 #
@ -18,36 +18,16 @@
set -e
# Save original locale variables and enforce POSIX C locale
#
# We provide the user a way to fallback to the correct locale when a command
# should or must respect system's locale by saving the original values into the
# '_one_orig*' variables...
export _one_orig_LANG="${LANG}"
export _one_orig_LC_ALL="${LC_ALL}"
export _one_orig_LC_COLLATE="${LC_COLLATE}"
export _one_orig_LC_CTYPE="${LC_CTYPE}"
export _one_orig_LC_MESSAGES="${LC_MESSAGES}"
export _one_orig_LC_MONETARY="${LC_MONETARY}"
export _one_orig_LC_NUMERIC="${LC_NUMERIC}"
export _one_orig_LC_TIME="${LC_TIME}"
export LANG=C
export LC_ALL=C
TYPE="${1:-all}" # local, online, network, all
COMMAND="${2}" # force, reconfigure?
SCRIPTS_DIR="${SCRIPTS_DIR:-/etc/one-context.d}"
RUNTIME_DIR="${RUNTIME_DIR:-/var/run/one-context}"
TMP_DIR="${TMP_DIR:-/var/lib/one-context/tmp}"
TYPE="${1:-all}" # local, network, all
COMMAND="${2}" # reconfigure?
SCRIPTS_DIR=${SCRIPTS_DIR:-/etc/one-context.d}
RUNTIME_DIR=${RUNTIME_DIR:-/var/run/one-context}
LOCK_FILE="${RUNTIME_DIR}/one-context.lock"
SCRIPT_OUTPUT="${TMP_DIR}/script-output.log"
CONTEXT_BASE="${RUNTIME_DIR}/context.sh"
SYSLOG_TAG="$(basename $0)"
[ -d "${RUNTIME_DIR}" ] || mkdir -m 0700 -p "${RUNTIME_DIR}"
[ -d "${TMP_DIR}" ] || mkdir -m 0700 -p "${TMP_DIR}"
CONTEXT_NEW=$(mktemp "${CONTEXT_BASE}.XXXXXX" 2>/dev/null)
SYSLOG_FACILITY="${SYSLOG_FACILITY:-local3}"
@ -111,26 +91,16 @@ function export_rc_vars
}
function execute_scripts {
local _type="$1"
local _command="$2"
local _type=$1
local _command=$2
# choose
case "${_type}" in
local|online)
# VH-TODO: separate online scripts? have onl- for online only with onl-10-network symlink pointing to loc-10-network?
local _scripts=$(find "${SCRIPTS_DIR}" \
-maxdepth 1 -mindepth 1 -type f \
-name 'loc-*' \
2>/dev/null | sort)
;;
network)
local _scripts=$(find "${SCRIPTS_DIR}" \
-maxdepth 1 -mindepth 1 -type f \
\! \( -name 'net-*' -o -name 'loc-*' \) \
-o -name 'net-*' \
2>/dev/null | sort)
;;
esac
if [ "${_type}" = 'local' ]; then
local _scripts=$(ls ${SCRIPTS_DIR}/loc-* 2>/dev/null)
elif [ "${_type}" = 'network' ]; then
local _scripts=$(ls ${SCRIPTS_DIR}/!(net-*|loc-*) 2>/dev/null; \
ls ${SCRIPTS_DIR}/net-* 2>/dev/null)
fi
export MOUNT_DIR
export RUNTIME_DIR
@ -141,10 +111,8 @@ function execute_scripts {
# run script and catch output and exit code
log debug "Script ${_name}: Starting ..."
cat /dev/null > "${SCRIPT_OUTPUT}"
"${_script}" "${_type}" "${_command}" > "${SCRIPT_OUTPUT}" 2>&1
_out=$("${_script}" "${_command}" 2>&1)
local _rtn=$?
_out=$(cat "${SCRIPT_OUTPUT}")
# log on any output
if [ -n "${_out}" ]; then
@ -177,69 +145,34 @@ function vmware_context {
}
function get_new_context {
local dev_context
case "${distro}" in
Linux)
# on C6, "blkid" without -l doesn't return anything
dev_context=$(
{
blkid -l -t LABEL='CONTEXT' -o device;
blkid -t LABEL='CONTEXT' -o device;
blkid | grep "LABEL=['\"]CONTEXT['\"]" | cut -d: -f1;
} | grep -v '^/dev/loop' | head -n1
)
;;
BSD)
# glabel returns relative device name (e.g., cd0) or nothing
local glabel_dev
glabel_dev=$(glabel status | grep CONTEXT | awk '{print $3}')
if [ -n "${glabel_dev}" ] && [ -e "/dev/${glabel_dev}" ]; then
dev_context="/dev/${glabel_dev}"
fi
;;
esac
if [[ "$distro" == "Linux" ]]; then
# on C6, "blkid" without -l doesn't return anything
local dev_context=$(
{
blkid -l -t LABEL='CONTEXT' -o device;
blkid -t LABEL='CONTEXT' -o device;
blkid | grep "LABEL=['\"]CONTEXT['\"]" | cut -d: -f1;
} | grep -v '^/dev/loop' | head -n1
)
elif [[ "$distro" == "BSD" ]]; then
local dev_context="/dev/"$(glabel status | grep CONTEXT | awk '{print $3}')
fi
_mount_dir_mounted=no
if [ -e "${dev_context}" ]; then
mount_dir
if ! [ -d "${MOUNT_DIR}" ]; then
log err 'Error: Failed to create mountpoint' 2
exit 1
fi
log debug "Mounting CD-ROM ${dev_context} on ${MOUNT_DIR}"
if [[ "$distro" == "Linux" ]]; then
mount -o ro ${dev_context} ${MOUNT_DIR} 2>/dev/null
elif [[ "$distro" == "BSD" ]]; then
mount_cd9660 ${dev_context} ${MOUNT_DIR} 2>/dev/null
fi
# Retry mounting several times
# https://github.com/OpenNebula/addon-context-linux/issues/247
_timeout=6
while [ "$_timeout" -gt 0 ] ; do
case "${distro}" in
Linux)
mount -o ro "${dev_context}" "${MOUNT_DIR}" 2>/dev/null
;;
BSD)
mount_cd9660 "${dev_context}" "${MOUNT_DIR}" 2>/dev/null
;;
*)
echo "ERROR: Unsupported distribution - ${distro}" >&2
exit 1
esac
if [ $? -eq 0 ] ;then
_mount_dir_mounted=yes
break
else
# sleep and retry
_timeout=$(( _timeout - 1 ))
log debug "Mount failed (retries left: (${_timeout})"
sleep 1
fi
done
if [ "${_timeout}" -eq 0 ] || [ "${_mount_dir_mounted}" != 'yes' ]; then
if [ "$?" != '0' ]; then
log err "Error: Failed to mount ${dev_context}" 2
exit 1
fi
@ -251,6 +184,8 @@ function get_new_context {
cp /context/* "${MOUNT_DIR}"
context_sh "${MOUNT_DIR}"
elif vmware_context ; then
log debug "Reading context via vmtoolsd"
vmtoolsd --cmd 'info-get guestinfo.opennebula.context' | \
@ -354,17 +289,14 @@ function acquire_lock {
function cleanup {
# unmount context
if [ -d "${MOUNT_DIR}" ]; then
if [ "x${_mount_dir_mounted}" = 'xyes' ]; then
log debug "Unmounting ${MOUNT_DIR}"
if [ "$distro" = 'Linux' ]; then
umount -l "${MOUNT_DIR}"
elif [ "$distro" = 'BSD' ]; then
umount "${MOUNT_DIR}"
fi
log debug "Unmounting ${MOUNT_DIR}"
if [[ "$distro" == "Linux" ]]; then
umount -l "${MOUNT_DIR}"
elif [[ "$distro" == "BSD" ]]; then
umount "${MOUNT_DIR}"
fi
rm -rf "${MOUNT_DIR}"
rm -r "${MOUNT_DIR}"
fi
# remove remporary files
@ -375,27 +307,21 @@ function cleanup {
# remove lock
log debug "Releasing lock ${LOCK_FILE}"
rm -rf "${LOCK_FILE}"
# remove scripts output
rm -f "${SCRIPT_OUTPUT}"
}
#####
if ! [[ ${TYPE} =~ ^(local|online|network|all)$ ]]; then
if ! [[ ${TYPE} =~ ^(local|network|all)$ ]]; then
log err "Error: Invalid or missing execution type ${TYPE}" 2
exit 1
fi
# detect distribution type
case "$(uname)" in
*BSD*)
distro='BSD'
;;
*)
distro='Linux'
;;
esac
unamestr=`uname`
if [[ "$unamestr" == *"BSD"* ]]; then
distro="BSD"
else
distro="Linux"
fi
log info "Started ${TYPE:+for type $TYPE} ${COMMAND:+to $COMMAND}"
acquire_lock
@ -403,7 +329,6 @@ get_new_context
if [ "${TYPE}" = 'all' ]; then
run_context 'local' "${COMMAND}"
run_context 'online' "${COMMAND}"
run_context 'network' "${COMMAND}"
else
run_context "${TYPE}" "${COMMAND}"

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save