diff --git a/.addon-context-linux.metadata b/.addon-context-linux.metadata new file mode 100644 index 0000000..3d63458 --- /dev/null +++ b/.addon-context-linux.metadata @@ -0,0 +1 @@ +0fb6c583ecb9d6aff73534f8c025eef2cec2a830 SOURCES/addon-context-linux-6.6.0.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..806cd73 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/addon-context-linux-6.6.0.tar.gz diff --git a/SPECS/one-context.spec b/SPECS/one-context.spec new file mode 100644 index 0000000..4551301 --- /dev/null +++ b/SPECS/one-context.spec @@ -0,0 +1,368 @@ +# Use md5 file digest method. +%define _binary_filedigest_algorithm 1 + +# Use gzip payload compression +%define _binary_payload w9.gzdio + +Name: one-context +Version: 6.6.0 +Release: 1%{?dist}.inferit +Summary: OpenNebula Contextualization Package +AutoReqProv: no +Group: System Environment/Base +License: Apache 2.0 +Vendor: MSVSphere +URL: http://opennebula.org +Packager: MSVSphere +Source: https://github.com/OpenNebula/%{name}/archive/refs/tags/addon-context-linux-%{version}.tar.gz +Patch1: addon-context-linux-msvsphere.patch +Patch2: addon-context-linux-srpmbuild.patch + +Requires: util-linux +Requires: bash +Requires: curl +Requires: bind-utils +Requires: cloud-utils-growpart +Requires: parted +Requires: ruby +Requires: rubygem-json +Requires: sudo +Requires: shadow-utils +Requires: openssh-server +Requires: qemu-guest-agent +Requires: gawk +Requires: virt-what +BuildRequires: git +Recommends: open-vm-tools +Conflicts: cloud-init +Conflicts: one-context-ec2 +Obsoletes: cloud-init <= 21.4 +BuildArch: noarch + +# Disable shebang mangling +%undefine __brp_mangle_shebangs + +%description +Contextualization tools for the virtual machine running in the OpenNebula +cloud. Based on parameters provided by the cloud controller configures the +networking, initial user password, SSH keys, runs custom start scripts, +resizes the root filesystem, and provides tools to communicate with +OneGate service. +Check the OpenNebula web page (http://opennebula.org) to get the support. + + +%prep +%autosetup -v -n addon-context-linux-%{version} -p1 + +%build +TARGET=el9 NAME=one-context BUILD_DIR=./out ./generate.sh + +%install +cp -a out/* %{buildroot}/ + +%post +upgrade() { + : +#!/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 + 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 + +} +_install() { + : +#!/usr/bin/env bash + +SERVICES=${SERVICES:-one-context-local one-context-online one-context} +TIMERS=${TIMERS:-one-context-reconfigure.timer} + +rm -f /etc/udev/rules.d/70-persistent-cd.rules +rm -f /etc/udev/rules.d/70-persistent-net.rules + +# Reload udev rules +udevadm control --reload >/dev/null 2>&1 || : + + +### Enable services ######################################## + +if which systemctl >/dev/null 2>&1 && \ + [ -d /etc/systemd ] && \ + [ -f /usr/lib/systemd/system/one-context.service ]; +then + systemctl daemon-reload >/dev/null 2>&1 || : + + 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 + + +### Cleanup network configuration ########################## + +if [ -f /etc/sysctl.d/50-one-context.conf ]; then + rm -f /etc/sysctl.d/50-one-context.conf +fi + +# Debian based distros +if [ -d /etc/network ]; then + # Prepare network files + cp /etc/network/interfaces "/etc/network/interfaces.$(date '+%s')" + rm -rf /etc/network/interfaces.d + + cat > /etc/network/interfaces <> /etc/default/networking +# fi +# fi +fi + +# Red Hat 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' \ + -exec rm -f {} \; +fi + +# openSUSE based distros +if [ -d /etc/sysconfig/network/ ]; then + # Prepare network files + find /etc/sysconfig/network -type f \ + \( -name 'ifcfg-*' -o -name 'ifroute-*' -o -name 'ifsysctl-*' \) \ + ! -name 'ifcfg-lo' ! -name 'ifroute-lo' ! -name 'ifsysctl-lo' \ + -exec rm -f {} \; + + 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_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 +fi + +# FreeBSD based distros +#TODO: pfsense paths? +if [ -x /bin/freebsd-version ]; then + rm -f /etc/rc.conf.d/network /etc/rc.conf.d/routing + + if [ -f /etc/rc.conf ]; then + sed -i '' \ + -e '/^ifconfig_/d' \ + -e '/^route_/d' \ + -e '/^static_routes/d' \ + -e '/^defaultrouter/d' \ + /etc/rc.conf + fi +fi + +} +if [ "${1}" -eq 1 ] +then + # "after install" goes here + _install +elif [ "${1}" -gt 1 ] +then + # "after upgrade" goes here + upgrade +fi +%preun +if [ "${1}" -eq 0 ] +then + : +#!/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} + +# 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 || : + done +fi + +if which chkconfig >/dev/null 2>&1; then + for S in ${SERVICES}; do + chkconfig --del "${S}" >/dev/null 2>&1 || : + done + +elif which update-rc.d >/dev/null 2>&1; then + for S in ${SERVICES}; do + update-rc.d -f "${S}" remove >/dev/null 2>&1 || : + done + +elif which rc-update >/dev/null 2>&1; then + for S in ${SERVICES}; do + rc-update del "${S}" boot >/dev/null 2>&1 || : + done +fi + +fi +%postun +if [ "${1}" -eq 0 ] +then + : +#!/usr/bin/env bash + +udevadm control --reload >/dev/null 2>&1 || : + +if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then + systemctl daemon-reload >/dev/null 2>&1 || : +fi + +fi + + +%files +%defattr(-,root,root,-) +%config(noreplace) /etc/NetworkManager/conf.d/10-globally-managed-devices.conf +%config(noreplace) /etc/NetworkManager/conf.d/one-context.conf +%config(noreplace) /etc/udev/rules.d/75-cd-aliases-generator.rules +%config(noreplace) /etc/udev/rules.d/75-persistent-net-generator.rules + +%dir /etc/one-context.d +%dir /etc/one-context.d/loc-10-network.d +/etc/one-context.d/* +/etc/one-context.d/loc-10-network.d/* +/lib/udev/rules.d/* +/usr/bin/* +/usr/lib/systemd/system/* +/usr/sbin/* + +%changelog +* Fri Apr 28 2023 Alexey Lyubimov - 6.6.0-1.inferit +- De-branded for MSVSphere +- Initial built for MSVSphere 9.1 + diff --git a/SPECS/one-context.spec.fpm b/SPECS/one-context.spec.fpm new file mode 100644 index 0000000..36e4d70 --- /dev/null +++ b/SPECS/one-context.spec.fpm @@ -0,0 +1,431 @@ +# Hello packaging friend! +# +# If you find yourself using this 'fpm --edit' feature frequently, it is +# a sign that fpm is missing a feature! I welcome your feature requests! +# Please visit the following URL and ask for a feature that helps you never +# need to edit this file again! :) +# https://github.com/jordansissel/fpm/issues +# ------------------------------------------------------------------------ + +# Disable the stupid stuff rpm distros include in the build process by default: +# Disable any prep shell actions. replace them with simply 'true' +%define __spec_prep_post true +%define __spec_prep_pre true +# Disable any build shell actions. replace them with simply 'true' +%define __spec_build_post true +%define __spec_build_pre true +# Disable any install shell actions. replace them with simply 'true' +%define __spec_install_post true +%define __spec_install_pre true +# Disable any clean shell actions. replace them with simply 'true' +%define __spec_clean_post true +%define __spec_clean_pre true +# Disable checking for unpackaged files ? +#%undefine __check_files + +# Allow building noarch packages that contain binaries +%define _binaries_in_noarch_packages_terminate_build 0 + +# Use md5 file digest method. +# The first macro is the one used in RPM v4.9.1.1 +%define _binary_filedigest_algorithm 1 +# This is the macro I find on OSX when Homebrew provides rpmbuild (rpm v5.4.14) +%define _build_binary_file_digest_algo 1 + +# Use gzip payload compression +%define _binary_payload w9.gzdio + + +Name: one-context +Version: 6.6.0 +Release: 1.el9 +Summary: OpenNebula Contextualization Package +AutoReqProv: no +# Seems specifying BuildRoot is required on older rpmbuild (like on CentOS 5) +# fpm passes '--define buildroot ...' on the commandline, so just reuse that. +BuildRoot: %buildroot + +Prefix: / + +Group: default +License: Apache 2.0 +Vendor: OpenNebula Systems +URL: http://opennebula.org +Packager: OpenNebula Systems + +Requires: util-linux +Requires: bash +Requires: curl +Requires: bind-utils +Requires: cloud-utils-growpart +Requires: parted +Requires: ruby +Requires: rubygem-json +Requires: sudo +Requires: shadow-utils +Requires: openssh-server +Requires: qemu-guest-agent +Requires: gawk +Requires: virt-what +Recommends:open-vm-tools +Conflicts: cloud-init +Conflicts: one-context-ec2 +Obsoletes: cloud-init +%description + . +Contextualization tools for the virtual machine running in the OpenNebula +cloud. Based on parameters provided by the cloud controller configures the +networking, initial user password, SSH keys, runs custom start scripts, +resizes the root filesystem, and provides tools to communicate with +OneGate service. + . +Check the OpenNebula web page (http://opennebula.org) to get the support. + + +%prep +# noop + +%build +# noop + +%install +# noop + +%clean +# noop + + +%post +upgrade() { + : +#!/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 + 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 + +} +_install() { + : +#!/usr/bin/env bash + +SERVICES=${SERVICES:-one-context-local one-context-online one-context} +TIMERS=${TIMERS:-one-context-reconfigure.timer} + +rm -f /etc/udev/rules.d/70-persistent-cd.rules +rm -f /etc/udev/rules.d/70-persistent-net.rules + +# Reload udev rules +udevadm control --reload >/dev/null 2>&1 || : + + +### Enable services ######################################## + +if which systemctl >/dev/null 2>&1 && \ + [ -d /etc/systemd ] && \ + [ -f /usr/lib/systemd/system/one-context.service ]; +then + systemctl daemon-reload >/dev/null 2>&1 || : + + 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 + + +### Cleanup network configuration ########################## + +if [ -f /etc/sysctl.d/50-one-context.conf ]; then + rm -f /etc/sysctl.d/50-one-context.conf +fi + +# Debian based distros +if [ -d /etc/network ]; then + # Prepare network files + cp /etc/network/interfaces "/etc/network/interfaces.$(date '+%s')" + rm -rf /etc/network/interfaces.d + + cat > /etc/network/interfaces <> /etc/default/networking +# fi +# fi +fi + +# Red Hat 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' \ + -exec rm -f {} \; +fi + +# openSUSE based distros +if [ -d /etc/sysconfig/network/ ]; then + # Prepare network files + find /etc/sysconfig/network -type f \ + \( -name 'ifcfg-*' -o -name 'ifroute-*' -o -name 'ifsysctl-*' \) \ + ! -name 'ifcfg-lo' ! -name 'ifroute-lo' ! -name 'ifsysctl-lo' \ + -exec rm -f {} \; + + 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_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 +fi + +# FreeBSD based distros +#TODO: pfsense paths? +if [ -x /bin/freebsd-version ]; then + rm -f /etc/rc.conf.d/network /etc/rc.conf.d/routing + + if [ -f /etc/rc.conf ]; then + sed -i '' \ + -e '/^ifconfig_/d' \ + -e '/^route_/d' \ + -e '/^static_routes/d' \ + -e '/^defaultrouter/d' \ + /etc/rc.conf + fi +fi + +} +if [ "${1}" -eq 1 ] +then + # "after install" goes here + _install +elif [ "${1}" -gt 1 ] +then + # "after upgrade" goes here + upgrade +fi +%preun +if [ "${1}" -eq 0 ] +then + : +#!/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} + +# 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 || : + done +fi + +if which chkconfig >/dev/null 2>&1; then + for S in ${SERVICES}; do + chkconfig --del "${S}" >/dev/null 2>&1 || : + done + +elif which update-rc.d >/dev/null 2>&1; then + for S in ${SERVICES}; do + update-rc.d -f "${S}" remove >/dev/null 2>&1 || : + done + +elif which rc-update >/dev/null 2>&1; then + for S in ${SERVICES}; do + rc-update del "${S}" boot >/dev/null 2>&1 || : + done +fi + +fi +%postun +if [ "${1}" -eq 0 ] +then + : +#!/usr/bin/env bash + +udevadm control --reload >/dev/null 2>&1 || : + +if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then + systemctl daemon-reload >/dev/null 2>&1 || : +fi + +fi + + +%files +%defattr(-,root,root,-) +%config(noreplace) /etc/NetworkManager/conf.d/10-globally-managed-devices.conf +%config(noreplace) /etc/NetworkManager/conf.d/one-context.conf +%config(noreplace) /etc/udev/rules.d/75-cd-aliases-generator.rules +%config(noreplace) /etc/udev/rules.d/75-persistent-net-generator.rules + +%dir /etc/one-context.d +%dir /etc/one-context.d/loc-10-network.d +# Reject config files already listed or parent directories, then prefix files +# with "/", then make sure paths with spaces are quoted. I hate rpm so much. +/etc/one-context.d/loc-04-run-dir +/etc/one-context.d/loc-05-grow-rootfs +/etc/one-context.d/loc-09-timezone +/etc/one-context.d/loc-10-network +/etc/one-context.d/loc-10-network-pci +/etc/one-context.d/loc-10-network.d/functions +/etc/one-context.d/loc-10-network.d/netcfg-bsd +/etc/one-context.d/loc-10-network.d/netcfg-interfaces +/etc/one-context.d/loc-10-network.d/netcfg-netplan +/etc/one-context.d/loc-10-network.d/netcfg-networkd +/etc/one-context.d/loc-10-network.d/netcfg-nm +/etc/one-context.d/loc-10-network.d/netcfg-scripts +/etc/one-context.d/loc-14-mount-swap +/etc/one-context.d/loc-16-gen-env +/etc/one-context.d/loc-20-set-username-password +/etc/one-context.d/loc-22-ssh_public_key +/etc/one-context.d/loc-30-console +/etc/one-context.d/loc-35-securetty +/etc/one-context.d/net-15-hostname +/etc/one-context.d/net-97-start-script +/etc/one-context.d/net-98-execute-scripts +/etc/one-context.d/net-99-report-ready +/lib/udev/rules.d/65-context.rules +/usr/bin/onegate +/usr/bin/onegate.rb +/usr/lib/systemd/system/one-context-force.service +/usr/lib/systemd/system/one-context-local.service +/usr/lib/systemd/system/one-context-online.service +/usr/lib/systemd/system/one-context-reconfigure-delayed.service +/usr/lib/systemd/system/one-context-reconfigure.service +/usr/lib/systemd/system/one-context-reconfigure.timer +/usr/lib/systemd/system/one-context.service +/usr/sbin/one-context-run +/usr/sbin/one-contextd +/usr/sbin/onesysprep + +%changelog + diff --git a/SPECS/one-context.spec.fpm.fordiff b/SPECS/one-context.spec.fpm.fordiff new file mode 100644 index 0000000..525757c --- /dev/null +++ b/SPECS/one-context.spec.fpm.fordiff @@ -0,0 +1,422 @@ +# Hello packaging friend! +# +# If you find yourself using this 'fpm --edit' feature frequently, it is +# a sign that fpm is missing a feature! I welcome your feature requests! +# Please visit the following URL and ask for a feature that helps you never +# need to edit this file again! :) +# https://github.com/jordansissel/fpm/issues +# ------------------------------------------------------------------------ + +# Disable the stupid stuff rpm distros include in the build process by default: +# Disable any prep shell actions. replace them with simply 'true' +%define __spec_prep_post true +%define __spec_prep_pre true +# Disable any build shell actions. replace them with simply 'true' +%define __spec_build_post true +%define __spec_build_pre true +# Disable any install shell actions. replace them with simply 'true' +%define __spec_install_post true +%define __spec_install_pre true +# Disable any clean shell actions. replace them with simply 'true' +%define __spec_clean_post true +%define __spec_clean_pre true +# Disable checking for unpackaged files ? +#%undefine __check_files + +# Allow building noarch packages that contain binaries +%define _binaries_in_noarch_packages_terminate_build 0 + +# Use md5 file digest method. +# The first macro is the one used in RPM v4.9.1.1 +%define _binary_filedigest_algorithm 1 +# This is the macro I find on OSX when Homebrew provides rpmbuild (rpm v5.4.14) +%define _build_binary_file_digest_algo 1 + +# Use gzip payload compression +%define _binary_payload w9.gzdio + + +Name: one-context +Version: 6.6.0 +Release: 0%{?dist}.inferit +Summary: OpenNebula Contextualization Package +Group: default +License: Apache 2.0 +Vendor: OpenNebula Systems +URL: http://opennebula.org +Packager: OpenNebula Systems + +Requires: util-linux +Requires: bash +Requires: curl +Requires: bind-utils +Requires: cloud-utils-growpart +Requires: parted +Requires: ruby +Requires: rubygem-json +Requires: sudo +Requires: shadow-utils +Requires: openssh-server +Requires: qemu-guest-agent +Requires: gawk +Requires: virt-what +Recommends:open-vm-tools +Conflicts: cloud-init +Conflicts: one-context-ec2 +Obsoletes: cloud-init + +%description +Contextualization tools for the virtual machine running in the OpenNebula +cloud. Based on parameters provided by the cloud controller configures the +networking, initial user password, SSH keys, runs custom start scripts, +resizes the root filesystem, and provides tools to communicate with +OneGate service. +Check the OpenNebula web page (http://opennebula.org) to get the support. + + +%prep +%autosetup -v + +%build +# noop + +%install +# noop + +%clean +# noop + + +%post +upgrade() { + : +#!/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 + 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 + +} +_install() { + : +#!/usr/bin/env bash + +SERVICES=${SERVICES:-one-context-local one-context-online one-context} +TIMERS=${TIMERS:-one-context-reconfigure.timer} + +rm -f /etc/udev/rules.d/70-persistent-cd.rules +rm -f /etc/udev/rules.d/70-persistent-net.rules + +# Reload udev rules +udevadm control --reload >/dev/null 2>&1 || : + + +### Enable services ######################################## + +if which systemctl >/dev/null 2>&1 && \ + [ -d /etc/systemd ] && \ + [ -f /usr/lib/systemd/system/one-context.service ]; +then + systemctl daemon-reload >/dev/null 2>&1 || : + + 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 + + +### Cleanup network configuration ########################## + +if [ -f /etc/sysctl.d/50-one-context.conf ]; then + rm -f /etc/sysctl.d/50-one-context.conf +fi + +# Debian based distros +if [ -d /etc/network ]; then + # Prepare network files + cp /etc/network/interfaces "/etc/network/interfaces.$(date '+%s')" + rm -rf /etc/network/interfaces.d + + cat > /etc/network/interfaces <> /etc/default/networking +# fi +# fi +fi + +# Red Hat 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' \ + -exec rm -f {} \; +fi + +# openSUSE based distros +if [ -d /etc/sysconfig/network/ ]; then + # Prepare network files + find /etc/sysconfig/network -type f \ + \( -name 'ifcfg-*' -o -name 'ifroute-*' -o -name 'ifsysctl-*' \) \ + ! -name 'ifcfg-lo' ! -name 'ifroute-lo' ! -name 'ifsysctl-lo' \ + -exec rm -f {} \; + + 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_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 +fi + +# FreeBSD based distros +#TODO: pfsense paths? +if [ -x /bin/freebsd-version ]; then + rm -f /etc/rc.conf.d/network /etc/rc.conf.d/routing + + if [ -f /etc/rc.conf ]; then + sed -i '' \ + -e '/^ifconfig_/d' \ + -e '/^route_/d' \ + -e '/^static_routes/d' \ + -e '/^defaultrouter/d' \ + /etc/rc.conf + fi +fi + +} +if [ "${1}" -eq 1 ] +then + # "after install" goes here + _install +elif [ "${1}" -gt 1 ] +then + # "after upgrade" goes here + upgrade +fi +%preun +if [ "${1}" -eq 0 ] +then + : +#!/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} + +# 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 || : + done +fi + +if which chkconfig >/dev/null 2>&1; then + for S in ${SERVICES}; do + chkconfig --del "${S}" >/dev/null 2>&1 || : + done + +elif which update-rc.d >/dev/null 2>&1; then + for S in ${SERVICES}; do + update-rc.d -f "${S}" remove >/dev/null 2>&1 || : + done + +elif which rc-update >/dev/null 2>&1; then + for S in ${SERVICES}; do + rc-update del "${S}" boot >/dev/null 2>&1 || : + done +fi + +fi +%postun +if [ "${1}" -eq 0 ] +then + : +#!/usr/bin/env bash + +udevadm control --reload >/dev/null 2>&1 || : + +if which systemctl >/dev/null 2>&1 && [ -d /etc/systemd ]; then + systemctl daemon-reload >/dev/null 2>&1 || : +fi + +fi + + +%files +%defattr(-,root,root,-) +%config(noreplace) /etc/NetworkManager/conf.d/10-globally-managed-devices.conf +%config(noreplace) /etc/NetworkManager/conf.d/one-context.conf +%config(noreplace) /etc/udev/rules.d/75-cd-aliases-generator.rules +%config(noreplace) /etc/udev/rules.d/75-persistent-net-generator.rules + +%dir /etc/one-context.d +%dir /etc/one-context.d/loc-10-network.d +# Reject config files already listed or parent directories, then prefix files +# with "/", then make sure paths with spaces are quoted. I hate rpm so much. +/etc/one-context.d/loc-04-run-dir +/etc/one-context.d/loc-05-grow-rootfs +/etc/one-context.d/loc-09-timezone +/etc/one-context.d/loc-10-network +/etc/one-context.d/loc-10-network-pci +/etc/one-context.d/loc-10-network.d/functions +/etc/one-context.d/loc-10-network.d/netcfg-bsd +/etc/one-context.d/loc-10-network.d/netcfg-interfaces +/etc/one-context.d/loc-10-network.d/netcfg-netplan +/etc/one-context.d/loc-10-network.d/netcfg-networkd +/etc/one-context.d/loc-10-network.d/netcfg-nm +/etc/one-context.d/loc-10-network.d/netcfg-scripts +/etc/one-context.d/loc-14-mount-swap +/etc/one-context.d/loc-16-gen-env +/etc/one-context.d/loc-20-set-username-password +/etc/one-context.d/loc-22-ssh_public_key +/etc/one-context.d/loc-30-console +/etc/one-context.d/loc-35-securetty +/etc/one-context.d/net-15-hostname +/etc/one-context.d/net-97-start-script +/etc/one-context.d/net-98-execute-scripts +/etc/one-context.d/net-99-report-ready +/lib/udev/rules.d/65-context.rules +/usr/bin/onegate +/usr/bin/onegate.rb +/usr/lib/systemd/system/one-context-force.service +/usr/lib/systemd/system/one-context-local.service +/usr/lib/systemd/system/one-context-online.service +/usr/lib/systemd/system/one-context-reconfigure-delayed.service +/usr/lib/systemd/system/one-context-reconfigure.service +/usr/lib/systemd/system/one-context-reconfigure.timer +/usr/lib/systemd/system/one-context.service +/usr/sbin/one-context-run +/usr/sbin/one-contextd +/usr/sbin/onesysprep + +%changelog