Name: sysmanage-agent Version: 0.9.8.12 Release: 0 Summary: System management agent for SysManage License: Dual (Open Source / Commercial) URL: https://github.com/bceverly/sysmanage-agent Source0: %{name}-%{version}.tar.gz Source1: %{name}-vendor-%{version}.tar.gz # Not noarch because virtualenv contains compiled extensions # Disable debug package generation (no debug symbols in Python bytecode) %global debug_package %{nil} %global _enable_debug_package 0 %global __os_install_post /usr/lib/rpm/brp-compress %{nil} # Disable automatic Python dependency generation # We manually specify python311 in Requires %global __requires_exclude ^python\\(abi\\) %global __provides_exclude_from ^%{_libdir}/sysmanage-agent/venv/.*$ # Handle different Python package names across distributions # openSUSE uses python311-* packages # Fedora, RHEL, CentOS, Amazon Linux use python3-* packages %if 0%{?suse_version} BuildRequires: python311-devel BuildRequires: python311-pip %else BuildRequires: python3-devel BuildRequires: python3-pip %endif BuildRequires: python3-setuptools BuildRequires: systemd-rpm-macros %if 0%{?suse_version} BuildRequires: fdupes %endif %if 0%{?suse_version} Requires: python311 Requires: python311-pip %else Requires: python3 Requires: python3-pip %endif Requires: systemd Requires: sudo Requires(pre): shadow Requires(post): systemd Requires(preun): systemd Requires(postun): systemd %description The SysManage agent provides comprehensive system management capabilities including: * Package inventory and updates * System monitoring and metrics * Security policy enforcement * Certificate management * Firewall configuration * Remote command execution * Integration with SysManage server This agent runs as a system service and communicates securely with the SysManage server to provide centralized management of Linux systems. %prep %setup -q # Extract vendor dependencies to current directory tar xzf %{_sourcedir}/%{name}-vendor-%{version}.tar.gz %build # No build step needed - Python application %install # Create directory structure install -d %{buildroot}/opt/sysmanage-agent install -d %{buildroot}/etc/sysmanage-agent install -d %{buildroot}/var/lib/sysmanage-agent install -d %{buildroot}/var/log/sysmanage-agent # Copy application files cp -r src %{buildroot}/opt/sysmanage-agent/ install -m 644 main.py %{buildroot}/opt/sysmanage-agent/ install -m 644 alembic.ini %{buildroot}/opt/sysmanage-agent/ install -m 644 requirements-prod.txt %{buildroot}/opt/sysmanage-agent/ # Copy vendor directory for offline installation cp -r vendor %{buildroot}/opt/sysmanage-agent/ # Create virtualenv and install Python dependencies from vendor directory # Use python3.11 for openSUSE, python3 for Fedora/RHEL/Amazon Linux %if 0%{?suse_version} python3.11 -m venv %{buildroot}/opt/sysmanage-agent/.venv %else python3 -m venv %{buildroot}/opt/sysmanage-agent/.venv %endif %{buildroot}/opt/sysmanage-agent/.venv/bin/pip install --upgrade pip --no-index --find-links=%{_builddir}/%{name}-%{version}/vendor %{buildroot}/opt/sysmanage-agent/.venv/bin/pip install -r requirements-prod.txt --no-index --find-links=%{_builddir}/%{name}-%{version}/vendor # Fix virtualenv paths to use final installation directory instead of buildroot sed -i 's|%{buildroot}||g' %{buildroot}/opt/sysmanage-agent/.venv/pyvenv.cfg # Also fix any hardcoded paths in activation scripts find %{buildroot}/opt/sysmanage-agent/.venv/bin -type f -exec sed -i 's|%{buildroot}||g' {} \; # Remove development files (headers, source files) to reduce package size and avoid rpmlint errors find %{buildroot}/opt/sysmanage-agent/.venv -type f \( -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.hpp" \) -delete # Deduplicate files to save space # Use %fdupes macro on OBS (openSUSE), use fdupes command elsewhere %if 0%{?suse_version} %fdupes %{buildroot}/opt/sysmanage-agent/.venv %else # For non-openSUSE builds, use fdupes if available, otherwise skip if command -v fdupes >/dev/null 2>&1; then fdupes -r -1 -N %{buildroot}/opt/sysmanage-agent/.venv | while read line; do first=true for file in $line; do if $first; then first=false else rm -f "$file" ln "$line" "$file" fi done done fi %endif # Install example config install -m 644 installer/opensuse/sysmanage-agent.yaml.example %{buildroot}/etc/sysmanage-agent/ # Install systemd service install -d %{buildroot}/usr/lib/systemd/system install -m 644 installer/opensuse/sysmanage-agent.service %{buildroot}/usr/lib/systemd/system/ # Install sudoers file install -d %{buildroot}/etc/sudoers.d install -m 440 installer/opensuse/sysmanage-agent.sudoers %{buildroot}/etc/sudoers.d/sysmanage-agent %pre # Create sysmanage-agent user if it doesn't exist %if 0%{?suse_version} %service_add_pre sysmanage-agent.service %else %systemd_pre sysmanage-agent.service %endif if ! getent group sysmanage-agent >/dev/null; then groupadd --system sysmanage-agent fi if ! getent passwd sysmanage-agent >/dev/null; then useradd --system --gid sysmanage-agent --home-dir /nonexistent --no-create-home \ --shell /sbin/nologin --comment "SysManage Agent" sysmanage-agent fi %post # Set ownership of application directories chown -R sysmanage-agent:sysmanage-agent /opt/sysmanage-agent chown -R sysmanage-agent:sysmanage-agent /var/lib/sysmanage-agent chown -R sysmanage-agent:sysmanage-agent /var/log/sysmanage-agent chown -R sysmanage-agent:sysmanage-agent /etc/sysmanage-agent # Set proper permissions chmod 755 /opt/sysmanage-agent chmod 755 /var/lib/sysmanage-agent chmod 755 /var/log/sysmanage-agent chmod 750 /etc/sysmanage-agent # Fix virtualenv to work with system Python # Recreate the venv using the system's Python to fix all symlinks and paths cd /opt/sysmanage-agent rm -rf .venv %if 0%{?suse_version} python3.11 -m venv .venv %else python3 -m venv .venv %endif # Check if we have a vendor directory from the RPM (for OBS builds) if [ -d vendor ]; then .venv/bin/pip install --quiet --upgrade pip --no-index --find-links=vendor .venv/bin/pip install --quiet -r requirements-prod.txt --no-index --find-links=vendor else # Fallback to network install (for direct RPM installs outside OBS) .venv/bin/pip install --quiet --upgrade pip .venv/bin/pip install --quiet -r requirements-prod.txt fi cd - # Create config file if it doesn't exist if [ ! -f /etc/sysmanage-agent.yaml ]; then cp /etc/sysmanage-agent/sysmanage-agent.yaml.example /etc/sysmanage-agent.yaml chown sysmanage-agent:sysmanage-agent /etc/sysmanage-agent.yaml chmod 640 /etc/sysmanage-agent.yaml echo "Please edit /etc/sysmanage-agent.yaml to configure the agent" fi # Enable and start the service %if 0%{?suse_version} %service_add_post sysmanage-agent.service %else %systemd_post sysmanage-agent.service # Explicitly enable the service on RHEL/Fedora/CentOS systemctl enable sysmanage-agent.service >/dev/null 2>&1 || : %endif echo "" echo "==========================================" echo "SysManage Agent installation complete!" echo "==========================================" echo "" echo "Next steps:" echo " 1. Edit /etc/sysmanage-agent.yaml to configure server connection" echo " 2. Restart the service: sudo systemctl restart sysmanage-agent" echo " 3. Check status: sudo systemctl status sysmanage-agent" echo "" echo "Log files are located in: /var/log/sysmanage-agent/" echo "" %preun %if 0%{?suse_version} %service_del_preun sysmanage-agent.service %else %systemd_preun sysmanage-agent.service %endif %postun %if 0%{?suse_version} %service_del_postun sysmanage-agent.service %else %systemd_postun_with_restart sysmanage-agent.service %endif # Clean up on purge (erase) if [ $1 -eq 0 ]; then # Remove log files rm -rf /var/log/sysmanage-agent || true # Remove configuration directory rm -rf /etc/sysmanage-agent || true # Remove database and runtime data rm -rf /var/lib/sysmanage-agent || true # Remove user and group if getent passwd sysmanage-agent >/dev/null; then userdel sysmanage-agent >/dev/null 2>&1 || true fi if getent group sysmanage-agent >/dev/null; then groupdel sysmanage-agent >/dev/null 2>&1 || true fi fi %files %license LICENSE %doc README.md /opt/sysmanage-agent/ /etc/sysmanage-agent/ %dir /var/lib/sysmanage-agent %dir /var/log/sysmanage-agent /usr/lib/systemd/system/sysmanage-agent.service # Note: /etc/sudoers.d is owned by sudo package, we only own our file within it %config(noreplace) /etc/sudoers.d/sysmanage-agent %changelog * Mon Oct 14 2024 Bryan Everly - 0.1.0-0 - Initial RPM release for openSUSE - Support for openSUSE Leap, Tumbleweed, and SLES