From 04215d1c2d2e6b7d78630ff7dcae2adb94df3dd3 Mon Sep 17 00:00:00 2001 From: Steven Elliott <6461548+sdelliot@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:55:12 -0500 Subject: [PATCH] feat: Create automated debian and RPM packaging (#1549) * Adding RPM packaging functionality for minimega. * Testing a variable version number * Adding a github action to test the RPM building * Version upgrades * Adding more necessary packages * Clearer path for updating rpm spec * Update rpm.yml artifact path * Adding a script for the debian packaging * Update deb.yml * Update build.bash * Update build.bash * Update control to use debhelp as the build dependency * Addressing ntfs-3g which resides in the epel repository * Adding a warning message about ntfs-3g * Automatically fail if ntfs-3g is not found * Fixing packaging with libpcap and updating environment variables to be similar to those in the dockerized version. (#2) * Addressing review comments by addressing inefficencies and inconsistencies * Minor pipeline bug fixes * Cleaning up after the build script * Copy the x86_64 RPM to the root directory to keep consistency with debian files. * Updating debhelper to ensure that the systemd service does not automatically start. --- .github/workflows/deb.yml | 25 +++ .github/workflows/rpm.yml | 25 +++ .gitignore | 21 +++ CONTRIBUTORS | 1 + misc/daemon/minimega.conf | 44 ++++- misc/daemon/minimega.service | 30 +++ packaging/debian/README.md | 10 + packaging/debian/build.bash | 32 +--- packaging/debian/changelog.base | 5 + packaging/debian/clean.bash | 9 +- packaging/debian/compat | 1 + .../{minimega/DEBIAN/control.base => control} | 19 +- packaging/debian/install | 8 + packaging/debian/links | 5 + .../debian/{minimega/DEBIAN => }/postinst | 5 + packaging/debian/rules | 24 +++ packaging/rpm/.gitignore | 1 + packaging/rpm/README.md | 10 + packaging/rpm/build.bash | 23 +++ packaging/rpm/clean.bash | 9 + .../rpm/rpmbuild/SPECS/minimega.spec.base | 174 ++++++++++++++++++ 21 files changed, 450 insertions(+), 31 deletions(-) create mode 100644 .github/workflows/deb.yml create mode 100644 .github/workflows/rpm.yml create mode 100644 misc/daemon/minimega.service create mode 100644 packaging/debian/README.md create mode 100644 packaging/debian/changelog.base create mode 100644 packaging/debian/compat rename packaging/debian/{minimega/DEBIAN/control.base => control} (55%) create mode 100644 packaging/debian/install create mode 100644 packaging/debian/links rename packaging/debian/{minimega/DEBIAN => }/postinst (79%) create mode 100755 packaging/debian/rules create mode 100644 packaging/rpm/.gitignore create mode 100644 packaging/rpm/README.md create mode 100755 packaging/rpm/build.bash create mode 100755 packaging/rpm/clean.bash create mode 100644 packaging/rpm/rpmbuild/SPECS/minimega.spec.base diff --git a/.github/workflows/deb.yml b/.github/workflows/deb.yml new file mode 100644 index 000000000..48129eeeb --- /dev/null +++ b/.github/workflows/deb.yml @@ -0,0 +1,25 @@ +name: DEB Build +on: push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential debhelper dnsmasq iproute2 isc-dhcp-client libpcap-dev ntfs-3g openssh-client openvswitch-switch qemu-kvm qemu-utils + + - name: Build Deb package + id: deb + run: | + chmod +x ./packaging/debian/build.bash + ./packaging/debian/build.bash + + - name: Upload artifact + uses: actions/upload-artifact@v4.0.0 + with: + name: minimega-deb + path: ./*.deb diff --git a/.github/workflows/rpm.yml b/.github/workflows/rpm.yml new file mode 100644 index 000000000..f20d07b07 --- /dev/null +++ b/.github/workflows/rpm.yml @@ -0,0 +1,25 @@ +name: RPM Build +on: push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y rpm dnsmasq iproute2 isc-dhcp-client libpcap-dev ntfs-3g openssh-client openvswitch-switch qemu-kvm qemu-utils + + - name: Build RPM package + id: rpm + run: | + chmod +x ./packaging/rpm/build.bash + ./packaging/rpm/build.bash + + - name: Upload artifact + uses: actions/upload-artifact@v4.0.0 + with: + name: minimega-rpm + path: ./packaging/rpm/rpmbuild/RPMS/* diff --git a/.gitignore b/.gitignore index 352e6af71..90349273c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,24 @@ lib/minimega.py tests/*.got tests/*/*.got .DS_Store* +*.deb +*.changes +*.buildinfo +*.ddeb +*.rpm +packaging/debian/.debhelper/ +packaging/debian/debhelper-build-stamp +packaging/debian/files +packaging/debian/minimega.debhelper.log +packaging/debian/minimega.postinst.debhelper +packaging/debian/minimega.postrm.debhelper +packaging/debian/minimega.prerm.debhelper +packaging/debian/minimega.service +packaging/debian/minimega.substvars +packaging/debian/minimega/DEBIAN/control +packaging/debian/minimega/DEBIAN/md5sums +packaging/debian/minimega/DEBIAN/postrm +packaging/debian/minimega/DEBIAN/prerm +packaging/debian/tmp/ +packaging/debian/minimega/ +lib/minimega.egg-info/ diff --git a/CONTRIBUTORS b/CONTRIBUTORS index aa4e68833..8158fc28a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -6,6 +6,7 @@ Miles Crabill Jonathan Crussell Jerry Cruz Jacob Davis +Steven Elliott Jeremy Erickson John Floren David Fritz diff --git a/misc/daemon/minimega.conf b/misc/daemon/minimega.conf index d29f681b5..96a1c2d20 100644 --- a/misc/daemon/minimega.conf +++ b/misc/daemon/minimega.conf @@ -1,19 +1,59 @@ # minimega source/build directory MINIMEGA_DIR="/opt/minimega/" -# Runtime directory for minimega to use + +# Runtime directory for minimega to use also known as the BASE directory +# "MM_RUN_PATH" is deprecated and will be removed in a future release +# Please use "MM_BASE" instead. MM_RUN_PATH="/tmp/minimega" +MM_BASE="/tmp/minimega" + # Directory to serve files from MM_FILEPATH="/tmp/minimega/files" + # Number of meshage peers to find +# "MM_MESH_DEGREE" is deprecated and will be removed in a future release +# Please use "MM_DEGREE" instead. MM_MESH_DEGREE=0 +MM_DEGREE=0 + +# meshage MSA timeout +MM_MSA=10 + # Context for finding meshage peers (must be set the same among peers) MM_CONTEXT="minimega" + # Port to listen on for meshage connections and to look for peers on (must be set the same among peers) MM_PORT=9000 -# Run as a daemonized process (should be true when started via /etc/init.d) + +# Run as a daemonized process (should be true when started via /etc/init.d or systemd) MM_DAEMON=true + # Logging level - options are "debug","info","warn","error","fatal" +# "MM_LOG_LEVEL" is deprecated and will be removed in a future release +# Please use "MM_LOGLEVEL" instead. MM_LOG_LEVEL="error" +MM_LOGLEVEL="error" + # Location for log file +# "MM_LOG_FILE" is deprecated and will be removed in a future release +# Please use "MM_LOGFILE" instead. MM_LOG_FILE="/tmp/minimega.log" +MM_LOGFILE="/var/log/minimega.log" + +# Panic on quit, producing stack traces for debugging +MM_PANIC=false + +# The meshage broadcast address to use (default "255.255.255.255") +MM_BROADCAST="255.255.255.255" + +# The VLAN range for namespaces (default "101-4096") +MM_VLANRANGE="101-4096" + +# Force minimega to run even if it appears to already be running +MM_FORCE=true + +# Attempt to recover from a previously running instance (only if MM_FORCE is false) +MM_RECOVER=false +# Path to control group (cgroup) mount location +MM_CGROUP="/sys/fs/cgroup" \ No newline at end of file diff --git a/misc/daemon/minimega.service b/misc/daemon/minimega.service new file mode 100644 index 000000000..81200f85d --- /dev/null +++ b/misc/daemon/minimega.service @@ -0,0 +1,30 @@ +[Unit] +Description="minimega Emulytics Daemon" +Documentation=https://www.sandia.gov/minimega +Wants=openvswitch-switch.service + +[Install] +WantedBy=default.target + +[Service] +Type=simple +# Kill mode settings +KillMode=control-group +TimeoutStopSec=5 +Restart=on-success +# Setting ulimit and environment variables +LimitNOFILE=1024000 +LimitNPROC=4096000 +EnvironmentFile=/etc/minimega/minimega.conf +# Pre Start script +ExecStartPre=/bin/mkdir -p /etc/minimega/saved_vms/ +ExecStartPre=/bin/mkdir -p ${MM_RUN_PATH} +# Starting minimega +ExecStart=/usr/bin/minimega -nostdin=${MM_DAEMON} -force=${MM_FORCE} -recover=${MM_RECOVER} -base=${MM_BASE} -filepath=${MM_FILEPATH} -broadcast=${MM_BROADCAST} -vlanrange=${MM_VLANRANGE} -port=${MM_PORT} -degree=${MM_DEGREE} -context=${MM_CONTEXT} -level=${MM_LOGLEVEL} -logfile=${MM_LOGFILE} -cgroup=${MM_CGROUP} -panic=${MM_PANIC} -msa=${MM_MSA} +# After start options +ExecStartPost=/bin/sleep 1 +ExecStartPost=/bin/chgrp -R minimega ${MM_RUN_PATH} +ExecStartPost=/bin/chmod -R g=u ${MM_RUN_PATH} +ExecStartPost=/bin/chmod g+s ${MM_RUN_PATH} ${MM_RUN_PATH}/minimega +# Post stop instructions +ExecStopPost=/bin/rm -f ${MM_RUN_PATH}/minimega diff --git a/packaging/debian/README.md b/packaging/debian/README.md new file mode 100644 index 000000000..09319ecf7 --- /dev/null +++ b/packaging/debian/README.md @@ -0,0 +1,10 @@ +# Building minimega + +To create a ``.deb`` you will need the following additional dependencies: + +```bash +sudo apt install debhelper +``` + +Once that is installed, run ``build.bash`` to create a new package. +It, along with other build files will be placed in minimega's top level directory. diff --git a/packaging/debian/build.bash b/packaging/debian/build.bash index b78e8fc77..da6a0e40e 100755 --- a/packaging/debian/build.bash +++ b/packaging/debian/build.bash @@ -8,32 +8,18 @@ echo BUILDING MINIMEGA... (cd $MM && ./scripts/build.bash && ./scripts/doc.bash) echo DONE BUILDING -echo COPYING FILES... - -DST=$SCRIPT_DIR/minimega/opt/minimega -mkdir -p $DST -cp -r $MM/bin $DST/ -cp -r $MM/doc $DST/ -cp -r $MM/lib $DST/ -mkdir -p $DST/misc -cp -r $MM/misc/daemon $DST/misc/ -cp -r $MM/misc/vmbetter_configs $DST/misc/ -mkdir -p $DST/web -cp -r $MM/web $DST/web/ - -DOCS=$SCRIPT_DIR/minimega/usr/share/doc/minimega -mkdir -p $DOCS -cp $MM/LICENSE $DOCS/ -cp -r $MM/LICENSES $DOCS/ - -echo COPIED FILES - # substitute version for control file source $MM/VERSION -sed -e 's/${version}/'"$VERSION"'/g' minimega/DEBIAN/control.base > minimega/DEBIAN/control +DATE=$(date -R) +sed -e 's/${version}/'"$VERSION"'/g' $SCRIPT_DIR/changelog.base > $SCRIPT_DIR/changelog.out +sed -e 's/${date}/'"$DATE"'/g' $SCRIPT_DIR/changelog.out > $SCRIPT_DIR/changelog +rm $SCRIPT_DIR/changelog.out +cp $MM/misc/daemon/minimega.service . echo BUILDING PACKAGE... -(cd $SCRIPT_DIR && fakeroot dpkg-deb -b minimega) -rm minimega/DEBIAN/control + + +(cd $SCRIPT_DIR/.. && dpkg-buildpackage --no-sign -b) +rm $SCRIPT_DIR/changelog echo DONE diff --git a/packaging/debian/changelog.base b/packaging/debian/changelog.base new file mode 100644 index 000000000..bfead3c8a --- /dev/null +++ b/packaging/debian/changelog.base @@ -0,0 +1,5 @@ +minimega (${version}) stable; urgency=low + + * Release minimega version ${version}. + + -- Minimega-Dev ${date} diff --git a/packaging/debian/clean.bash b/packaging/debian/clean.bash index b801fa43d..2c16ae62f 100755 --- a/packaging/debian/clean.bash +++ b/packaging/debian/clean.bash @@ -2,5 +2,10 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -rm -r $SCRIPT_DIR/minimega/opt -rm -r $SCRIPT_DIR/minimega/usr +rm -rf $SCRIPT_DIR/minimega +rm -rf $SCRIPT_DIR/*.debhelper* +rm -rf $SCRIPT_DIR/minimega.service +rm -rf $SCRIPT_DIR/minimega.substvars +rm -rf $SCRIPT_DIR/debhelper-build-stamp +rm -rf $SCRIPT_DIR/tmp +rm -f $SCRIPT_DIR/changelog diff --git a/packaging/debian/compat b/packaging/debian/compat new file mode 100644 index 000000000..f599e28b8 --- /dev/null +++ b/packaging/debian/compat @@ -0,0 +1 @@ +10 diff --git a/packaging/debian/minimega/DEBIAN/control.base b/packaging/debian/control similarity index 55% rename from packaging/debian/minimega/DEBIAN/control.base rename to packaging/debian/control index feff3680b..42ca6299f 100644 --- a/packaging/debian/minimega/DEBIAN/control.base +++ b/packaging/debian/control @@ -1,10 +1,21 @@ -Package: minimega -Version: ${version} +Source: minimega Section: utils Priority: extra -Architecture: amd64 -Depends: qemu-kvm, qemu-utils, openvswitch-switch, dnsmasq, dosfstools, ntfs-3g, libpcap-dev Maintainer: Arthur Hernandez , Jacob Davis +Build-Depends: debhelper +Vcs-Browser: https://github.com/sandia-minimega/minimega/ +Vcs-Git: https://github.com/sandia-minimega/minimega.git + +Package: minimega +Architecture: amd64 +Homepage: https://www.sandia.gov/minimega +Depends: qemu-kvm, + qemu-utils, + openvswitch-switch, + dnsmasq, + dosfstools, + ntfs-3g, + libpcap-dev Description: a distributed VM management tool. minimega is a tool for launching and managing virtual machines. It can run on your laptop or distributed across a cluster. minimega is fast, easy to deploy, diff --git a/packaging/debian/install b/packaging/debian/install new file mode 100644 index 000000000..cc7c28652 --- /dev/null +++ b/packaging/debian/install @@ -0,0 +1,8 @@ +../../../bin /opt/minimega/ +../../../doc /opt/minimega/ +../../../lib /opt/minimega/ +../../../misc/daemon /opt/minimega/misc/ +../../../misc/vmbetter_configs /opt/minimega/misc/ +../../../web /opt/minimega/ +../../../LICENSE /usr/share/doc/minimega/ +../../../LICENSES /usr/share/doc/minimega/ diff --git a/packaging/debian/links b/packaging/debian/links new file mode 100644 index 000000000..60b3a6324 --- /dev/null +++ b/packaging/debian/links @@ -0,0 +1,5 @@ +opt/minimega/bin/minimega usr/bin/minimega +opt/minimega/bin/miniweb usr/bin/miniweb +opt/minimega/bin/protonuke usr/bin/protonuke +opt/minimega/misc/daemon/minimega.conf /etc/minimega/minimega.conf + diff --git a/packaging/debian/minimega/DEBIAN/postinst b/packaging/debian/postinst similarity index 79% rename from packaging/debian/minimega/DEBIAN/postinst rename to packaging/debian/postinst index 5267e2b99..b1097386a 100755 --- a/packaging/debian/minimega/DEBIAN/postinst +++ b/packaging/debian/postinst @@ -11,3 +11,8 @@ fi chown -R minimega:minimega /usr/share/doc/minimega chown -R minimega:minimega /opt/minimega +chown -R minimega:minimega /etc/minimega + +# Symlink all binaries + +#DEBHELPER# diff --git a/packaging/debian/rules b/packaging/debian/rules new file mode 100755 index 000000000..afd5d771f --- /dev/null +++ b/packaging/debian/rules @@ -0,0 +1,24 @@ +#!/usr/bin/make -f +#export DH_VERBOSE=1 + +MM=".." +DST="debian/tmp/opt/minimega" +DOCS="debian/tmp/usr/share/doc/minimega" + +%: + dh $@ --with systemd --no-start --parallel + +override_dh_prep: + dh_prep + mkdir -p $(DST) + cp -r $(MM)/bin $(DST)/ + cp -r $(MM)/doc $(DST)/ + cp -r $(MM)/lib $(DST)/ + mkdir -p $(DST)/misc + cp -r $(MM)/misc/daemon $(DST)/misc/ + cp -r $(MM)/misc/vmbetter_configs $(DST)/misc/ + mkdir -p $(DST)/web + cp -r $(MM)/web $(DST)/web/ + mkdir -p $(DOCS) + cp $(MM)/LICENSE $(DOCS)/ + cp -r $(MM)/LICENSES $(DOCS)/ diff --git a/packaging/rpm/.gitignore b/packaging/rpm/.gitignore new file mode 100644 index 000000000..fd2a9affc --- /dev/null +++ b/packaging/rpm/.gitignore @@ -0,0 +1 @@ +rpmbuild/BUILDROOT diff --git a/packaging/rpm/README.md b/packaging/rpm/README.md new file mode 100644 index 000000000..7e2ae9df2 --- /dev/null +++ b/packaging/rpm/README.md @@ -0,0 +1,10 @@ +# Building minimega + +To create a ``.rpm`` you will need the following additional dependencies: + +```bash +sudo apt install rpm +``` + +Once that is installed, run ``build.bash`` to create a new package. +The package will be placed in minimega's top level directory. diff --git a/packaging/rpm/build.bash b/packaging/rpm/build.bash new file mode 100755 index 000000000..467b3c58f --- /dev/null +++ b/packaging/rpm/build.bash @@ -0,0 +1,23 @@ +#!/bin/bash -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +MM=$SCRIPT_DIR/../.. +FILES=$SCRIPT_DIR/minmega + +# substitute version for control file +source $MM/VERSION +sed -e 's/${version}/'"$VERSION"'/g' $SCRIPT_DIR/rpmbuild/SPECS/minimega.spec.base > $SCRIPT_DIR/rpmbuild/SPECS/minimega.spec + +echo "PREPARING FOR BUILDING RPM..." +mkdir -p rpmbuild/BUILD +mkdir -p rpmbuild/RPMS +mkdir -p rpmbuild/SOURCES +mkdir -p rpmbuild/SPECS +mkdir -p rpmbuild/SRPMS + +echo "BUILDING PACKAGE..." +(cd $SCRIPT_DIR && rpmbuild --define "_topdir $SCRIPT_DIR/rpmbuild" -bb rpmbuild/SPECS/minimega.spec) +cp $SCRIPT_DIR/rpmbuild/RPMS/x86_64/*.rpm $SCRIPT_DIR/../../ +rm -rf $SCRIPT_DIR/rpmbuild/SPECS/minimega.spec +echo "DONE" diff --git a/packaging/rpm/clean.bash b/packaging/rpm/clean.bash new file mode 100755 index 000000000..9b3abe9c2 --- /dev/null +++ b/packaging/rpm/clean.bash @@ -0,0 +1,9 @@ +#!/bin/bash -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +rm -rf rpmbuild/BUILD +rm -rf rpmbuild/BUILDROOT +rm -rf rpmbuild/RPMS +rm -rf rpmbuild/SOURCES +rm -rf rpmbuild/SRPMS diff --git a/packaging/rpm/rpmbuild/SPECS/minimega.spec.base b/packaging/rpm/rpmbuild/SPECS/minimega.spec.base new file mode 100644 index 000000000..f9efadadc --- /dev/null +++ b/packaging/rpm/rpmbuild/SPECS/minimega.spec.base @@ -0,0 +1,174 @@ +# Golang has issues adding build ids +%global _missing_build_ids_terminate_build 0 +%define _build_id_links none + +Name: minimega +Version: ${version} +Release: 1%{?dist} +Summary: A distributed VM management tool. +License: GPLv3 + +Group: utils +URL: https://www.sandia.gov/minimega +#Source0: https://github.com/sandia-minimega/minimega.git +BuildArch: x86_64 +AutoReqProv: no + +Provides: minimega = 1%{?dist} +Provides: minimega(x86-64) = 1%{?dist} + +Requires: /bin/bash +Requires: /bin/sh +Requires: /usr/bin/env +Requires: qemu-img +Requires: qemu-kvm +Requires: qemu-kvm-common +Requires: dnsmasq +Requires: dosfstools +Requires: net-tools +Requires: ntfs-3g +Requires: libpcap +Requires: openssl-devel +Requires(post): /bin/sh + + + +%description +minimega is a tool for launching and managing virtual machines. It can run on +your laptop or distributed across a cluster. minimega is fast, easy to deploy, +and can scale to run on massive clusters with virtually no setup. + +**Note:** This package requires the EPEL repository to be enabled, as it depends on the `ntfs-3g` package, which is only available in EPEL. + +%build +MM="../../../../" +(cd $MM && ./scripts/build.bash && ./scripts/doc.bash) + +%install +MM="../../../../" + +rm -rf $RPM_BUILD_ROOT +rm -rf %{_rpmdir}/* + +mkdir -p $RPM_BUILD_ROOT/opt/minimega/misc +mkdir -p $RPM_BUILD_ROOT/usr/share/doc/minimega +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/etc/minimega +mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system + +cp -Lr $MM/bin $RPM_BUILD_ROOT/opt/minimega/ +cp -Lr $MM/doc $RPM_BUILD_ROOT/opt/minimega/ +cp -Lr $MM/lib $RPM_BUILD_ROOT/opt/minimega/ +cp -Lr $MM/misc/daemon $RPM_BUILD_ROOT/opt/minimega/misc/ +cp -Lr $MM/misc/vmbetter_configs $RPM_BUILD_ROOT/opt/minimega/misc/ +cp -Lr $MM/web $RPM_BUILD_ROOT/opt/minimega/ +cp -Lr $MM/LICENSE $RPM_BUILD_ROOT/usr/share/doc/minimega/ +cp -Lr $MM/LICENSES $RPM_BUILD_ROOT/usr/share/doc/minimega/ + +# Make future symlinks +ln -sf /opt/minimega/bin/minimega $RPM_BUILD_ROOT/usr/bin/minimega +ln -sf /opt/minimega/bin/miniweb $RPM_BUILD_ROOT/usr/bin/miniweb +ln -sf /opt/minimega/bin/protonuke $RPM_BUILD_ROOT/usr/bin/protonuke +ln -sf /opt/minimega/misc/daemon/minimega.conf $RPM_BUILD_ROOT/etc/minimega/minimega.conf + +ln -sf /opt/minimega/misc/daemon/minimega.service $RPM_BUILD_ROOT/usr/lib/systemd/system/minimega.service + +find $RPM_BUILD_ROOT -type f -printf "/%%P\n" > $RPM_BUILD_ROOT/../../buildfiles + +%files -f %{buildroot}/../../buildfiles +%verify(link) /etc/minimega/minimega.conf +%verify(link) /usr/bin/minimega +%verify(link) /usr/bin/miniweb +%verify(link) /usr/bin/protonuke +%verify(link) /usr/lib/systemd/system/minimega.service + +%postun +if [ $1 -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Package upgrade, not uninstall + /usr/lib/systemd/systemd-update-helper mark-reload-system-units minimega.service || : +fi + +%preun +if [ $1 -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Package removal, not upgrade + /usr/lib/systemd/systemd-update-helper remove-system-units minimega.service || : +fi + +if [ $1 -eq 0 ]; then + /usr/bin/systemctl --no-reload disable minimega.service + /usr/bin/systemctl stop minimega.service >/dev/null 2>&1 ||: + /usr/bin/systemctl disable minimega.service + +fi +if [ $1 -eq 1 ]; then + /usr/bin/systemctl --no-reload disable minimega.service + /usr/bin/systemctl stop %minimega.service +fi + +%post -p /bin/sh +#! /bin/sh + +set -e + +if ! id -u minimega >/dev/null 2>&1; then + echo "Adding minimega user." + useradd --system --no-create-home --home-dir /run/minimega minimega +else + echo "minimega user already exists." +fi + +MINIMEGA_BIN="/usr/bin/minimega" +LIBPCAP_SO_0_8="/usr/lib64/libpcap.so.0.8" +LIBPCAP_SO="/usr/lib64/libpcap.so" +LIBPCAP_SO_1="/usr/lib64/libpcap.so.1" + +if [ -f "$MINIMEGA_BIN" ]; then + echo "Checking if $MINIMEGA_BIN links to libpcap..." + + # Check the linked libraries + LINKED_LIBS=$(ldd "$MINIMEGA_BIN" | grep "libpcap.so.0.8") + + if echo "$LINKED_LIBS" | grep -q "not found"; then + echo "Warning: $MINIMEGA_BIN links to libpcap.so.0.8, which is not found." + + # First, check if libpcap.so exists + if [ -f "$LIBPCAP_SO" ]; then + echo "Creating symbolic link for libpcap.so.0.8 to libpcap.so" + ln -sf "$LIBPCAP_SO" "$LIBPCAP_SO_0_8" + echo "Symbolic link created: $LIBPCAP_SO_0_8 -> $LIBPCAP_SO" + # If libpcap.so doesn't exist, check for libpcap.so.1 + elif [ -f "$LIBPCAP_SO_1" ]; then + echo "Creating symbolic link for libpcap.so.0.8 to libpcap.so.1" + ln -sf "$LIBPCAP_SO_1" "$LIBPCAP_SO_0_8" + echo "Symbolic link created: $LIBPCAP_SO_0_8 -> $LIBPCAP_SO_1" + else + echo "Error: Neither libpcap.so nor libpcap.so.1 is installed. Cannot create the symbolic link." + exit 1 + fi + fi +else + echo "Error: $MINIMEGA_BIN does not exist." + exit 1 +fi + +chown -R minimega:minimega /usr/share/doc/minimega +chown -R minimega:minimega /opt/minimega +chown -R minimega:minimega /etc/minimega + +if [ $1 -eq 1 ]; then + /usr/bin/systemctl daemon-reload + /usr/bin/systemctl start minimega.service +fi +if [ $1 -eq 2 ]; then + /usr/bin/systemctl daemon-reload + /usr/bin/systemctl start minimega.service +fi + +if [ $1 -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Initial installation + /usr/lib/systemd/systemd-update-helper install-system-units minimega.service || : +fi + +%clean +rm $RPM_BUILD_ROOT/../../buildfiles +rm -rf $RPM_BUILD_ROOT