File netbox.spec of Package netbox

#
# spec file for package netbox
#
# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#


%define netbox_services %{name}.target %{name}-update.service %{name}-gunicorn.service  %{name}-rqworker.service %{name}-housekeeping.service %{name}-housekeeping.timer
%define app_dir  %{_datadir}/%{name}
%define home_dir %{_localstatedir}/lib/netbox
%define log_dir  %{_localstatedir}/log/netbox
%{?sle15_python_module_pythons}
%define user_group_name _netbox
%define mypython 3.11

Name:           netbox
Version:        3.7.8
Release:        0
Summary:        Web based IPAM and DCIM tool
License:        Apache-2.0
Group:          Productivity/Networking/Other
URL:            https://github.com/netbox-community/netbox
Source:         https://github.com/netbox-community/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
Source1:        %{name}-rpmlintrc
Source2:        ldap_config.py
Source3:        netbox.target
Source4:        netbox-update.service
Source5:        netbox-gunicorn.service
Source7:        netbox-rqworker.service
Source8:        netbox-gunicorn.config
Source9:        netbox.tmpfiles.d
Source10:       %{name}.firewalld
Source11:       %{name}.firewall
Source12:       %{name}.vhost-apache
Source13:       %{name}.vhost-nginx
Source14:       netbox-housekeeping.service
Source15:       netbox-housekeeping.timer
Source16:       netbox.sysusers.d
Source17:       sso_pipeline_opensuse.py
# https://github.com/netbox-community/netbox/issues/15955
Patch0:         redis-unix-socket.patch
BuildRequires:  apache-rpm-macros
BuildRequires:  fdupes
BuildRequires:  pkgconfig
BuildRequires:  python-rpm-macros
BuildRequires:  rsync
BuildRequires:  sysuser-tools
BuildRequires: %{python_module devel}
BuildRequires: %{python_module bleach >= 6.0.0}
BuildRequires: %{python_module boto3 >= 1.26.127}
BuildRequires: %{python_module Django >= 4.2.5}
BuildRequires: %{python_module django-cors-headers >= 4.2.0}
BuildRequires: %{python_module django-debug-toolbar >= 4.2}
BuildRequires: %{python_module django-filter >= 23.2}
BuildRequires: %{python_module django-graphiql-debug-toolbar >= 0.2.0}
BuildRequires: %{python_module django-mptt >= 0.14}
BuildRequires: %{python_module django-pglocks >= 1.0.4}
BuildRequires: %{python_module django-prometheus >= 2.3.1}
BuildRequires: %{python_module django-redis >= 5.3.0}
BuildRequires: %{python_module django-rich >= 1.7.0}
BuildRequires: %{python_module django-rq >= 2.8.1}
BuildRequires: %{python_module django-tables2 >= 2.6.0}
BuildRequires: %{python_module django-taggit >= 4.0.0}
BuildRequires: %{python_module django-timezone-field >= 6.0}
BuildRequires: %{python_module djangorestframework >= 3.14.0}
BuildRequires: %{python_module drf-spectacular >= 0.26.4}
BuildRequires: %{python_module drf-spectacular-sidecar >= 2023.9.1}
BuildRequires: %{python_module dulwich >= 0.21.5}
BuildRequires: %{python_module feedparser >= 6.0.10}
BuildRequires: %{python_module graphene-django >= 3.0.0}
BuildRequires: %{python_module griffe}
BuildRequires: %{python_module gunicorn >= 21.2.0}
BuildRequires: %{python_module Jinja2 >= 3.1.2}
BuildRequires: %{python_module Markdown >= 3.3.7}
BuildRequires: %{python_module markdown-include >= 0.6.0}
BuildRequires: %{python_module mkdocs-material >= 9.2.7}
BuildRequires: %{python_module mkdocstrings >= 0.23.0}
BuildRequires: %{python_module mkdocstrings-python}
BuildRequires: %{python_module netaddr >= 0.8.0}
BuildRequires: %{python_module Pillow >= 10.0.0}
BuildRequires: %{python_module psycopg >= 3.1.13}
BuildRequires: %{python_module psycopg-pool >= 3.1.13}
BuildRequires: %{python_module pycryptodome >= 3.10.1}
BuildRequires: %{python_module PyYAML >= 6.0.1}
BuildRequires: %{python_module sentry-sdk >= 1.30.0}
BuildRequires: %{python_module social-auth-app-django >= 5.3.0}
BuildRequires: %{python_module social-auth-core >= 4.4.2}
BuildRequires: %{python_module svgwrite >= 1.4.3}
BuildRequires: %{python_module tablib >= 3.5.0}
BuildRequires: %{python_module jsonschema == 3.2.0}
# ldap auth
BuildRequires: %{python_module django-auth-ldap}
BuildRequires: %{python_module ldap}
# optional from docs/installation/2-netbox.md
BuildRequires: %{python_module django-storages}
BuildRequires:  pkgconfig(systemd)
BuildConflicts: python3-Django >= 4.3.0
Requires:       %{pythons}
Requires:       %{pythons}-bleach >= 6.0.0
Requires:       %{pythons}-Django >= 4.2.5
Requires:       %{pythons}-django-cors-headers >= 4.2.0
Requires:       %{pythons}-django-debug-toolbar >= 4.2
Requires:       %{pythons}-django-filter >= 23.2
Requires:       %{pythons}-django-graphiql-debug-toolbar >= 0.2.0
Requires:       %{pythons}-django-mptt >= 0.14
Requires:       %{pythons}-django-pglocks >= 1.0.4
Requires:       %{pythons}-django-prometheus >= 2.3.1
Requires:       %{pythons}-django-redis >= 5.3.0
Requires:       %{pythons}-django-rich >= 1.7.0
Requires:       %{pythons}-django-rq >= 2.8.1
Requires:       %{pythons}-django-tables2 >= 2.6.0
Requires:       %{pythons}-django-taggit >= 4.0.0
Requires:       %{pythons}-django-timezone-field >= 6.0
Requires:       %{pythons}-djangorestframework >= 3.14.0
Requires:       %{pythons}-drf-yasg >= 1.21.4
Requires:       %{pythons}-drf-spectacular >= 0.26.4
Requires:       %{pythons}-drf-spectacular-sidecar >= 2023.9.1
Requires:       %{pythons}-dulwich >= 0.21.5
Requires:       %{pythons}-feedparser >= 6.0.10
Requires:       %{pythons}-graphene-django >= 3.0.0
Requires:       %{pythons}-gunicorn >= 21.2.0
Requires:       %{pythons}-Jinja2 >= 3.1.2
Requires:       %{pythons}-Markdown >= 3.3.7
Requires:       %{pythons}-markdown-include >= 0.6.0
Requires:       %{pythons}-mkdocs-material >= 9.2.7
Requires:       %{pythons}-mkdocstrings >= 0.23.0
Requires:       %{pythons}-netaddr >= 0.8.0
Requires:       %{pythons}-Pillow >= 10.0.0
Requires:       %{pythons}-psycopg >= 3.1.13
Requires:       %{pythons}-psycopg-pool >= 3.1.13
Requires:       %{pythons}-pycryptodome >= 3.10.1
Requires:       %{pythons}-PyYAML >= 6.0.1
Requires:       %{pythons}-sentry-sdk >= 1.30.0
Requires:       %{pythons}-social-auth-app-django >= 5.3.0
Requires:       %{pythons}-social-auth-core >= 4.4.2
Requires:       %{pythons}-svgwrite >= 1.4.3
Requires:       %{pythons}-tablib >= 3.5.0
Requires:       %{pythons}-jsonschema == 3.2.0
Requires:       %{pythons}-django-storages
Requires:       %{pythons}-redis
#/ldap auth
#
Recommends:     postgresql-server >= 12.0
BuildArch:      noarch

%description
NetBox is an IP address management (IPAM) and data center infrastructure
management (DCIM) tool. NetBox was developed specifically to address the needs
of network and infrastructure engineers.

%package ldap
Summary:        LDAP configuration for Netbox
Requires:       netbox = %{version}
Requires:       %{pythons}-django-auth-ldap
Requires:       %{pythons}-ldap
BuildArch:      noarch

%description ldap
LDAP configuration files for Netbox

%package idm-ioo
Summary:        Magic
Requires:       netbox = %{version}
BuildArch:      noarch

%description idm-ioo
SSO pipeline hook for integrating NetBox into the internal openSUSE infrastructure.

%package nginx
Summary:        Nginx configuration for Netbox
BuildRequires:  nginx
Requires:       netbox = %{version}
Requires:       nginx
Supplements:    (nginx and %name)
BuildArch:      noarch

%description nginx
Nginx configuration files for Netbox.

%package apache
Summary:        Apache configuration for Netbox
BuildRequires:  apache2
Requires:       apache2
Requires:       netbox = %{version}
Supplements:    (apache2 and %name)
BuildArch:      noarch

%description apache
Apache configuration files for Netbox.

%prep
%autosetup -p1
echo napalm >> local_requirements.txt
echo django-storages >> local_requirements.txt

sed -Ei 's|#!/usr/bin/env python3?|#!%{_bindir}/python%{mypython}|' netbox/generate_secret_key.py netbox/manage.py

%build
# Upstream sadly ships git meta files
find \( -name .gitignore -or -name .gitkeep \) -delete
# js, css and md files should not be executable
find -type f \( -name '*.js' -o -name '*.css' -o -name '*.md' \) -exec chmod -x {} \;

mv netbox/netbox/configuration_example.py .

cat >> configuration.example.py << EOF

# SUSE packages need to adjust the documentation root
# to account for the standardized documentation paths

DOCS_ROOT = '%{_docdir}/netbox/docs'
EOF

pushd netbox/
%if %{with build_assets}
sed -e "s|SECRET_KEY = ''|SECRET_KEY = 'justforbuilding'|g" < ../configuration.example.py > netbox/configuration.py
%python_exec manage.py collectstatic --no-input
rm -f netbox/configuration.py netbox/__pycache__/configuration.cpython-*.pyc
%endif
%python_exec -m compileall -x '.*/migrations/.*' .
popd
mkdir %{name}/{tmp,public}

PYTHONPATH=$PWD/netbox mkdocs build
rsync -r netbox/project-static/docs/ docs
rm -r netbox/project-static

%sysusers_generate_pre %{SOURCE16} %{name} system-user-%{name}

%install
putconf() {
  sed s/__PYTHON__/%{mypython}/ "$1" > "$2"/"$(basename "$1")"
}

install -D -d -m 0750 %{buildroot}%{home_dir} %{buildroot}%{log_dir}

mkdir -p %{buildroot}%{_datadir}
cp -a %{name} %{buildroot}%{_datadir}

install -D -d -m 0750 %{buildroot}%{_sysconfdir}/%{name}

install -m 0640 %{SOURCE8}                   %{buildroot}%{_sysconfdir}/%{name}/gunicorn.py
install -m 0640 %{SOURCE2}                   %{buildroot}%{_sysconfdir}/%{name}/ldap_config.py
install -m 0640 configuration.example.py %{buildroot}%{_sysconfdir}/%{name}/configuration.py

ln -s %{_sysconfdir}/%{name}/configuration.py %{buildroot}%{app_dir}/%{name}/configuration.py
ln -s %{_sysconfdir}/%{name}/ldap_config.py   %{buildroot}%{app_dir}/%{name}/ldap_config.py

install -m 0644 %{SOURCE17} %{buildroot}%{_sysconfdir}/%{name}
ln -s %{_sysconfdir}/%{name}/"$(basename %{SOURCE17})"  %{buildroot}%{app_dir}/%{name}/

mkdir -p %{buildroot}%{_unitdir}
for x in %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE7} %{SOURCE14} %{SOURCE15}
do
  putconf "$x" %{buildroot}%{_unitdir}
done

mkdir -p %{buildroot}%{_sbindir}
for service in %{netbox_services} ; do
  echo "$service" | grep -q '.*.service' && ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc${service%.*}
done
install -D -m 0644 %{SOURCE9} %{buildroot}%{_tmpfilesdir}/%{name}.conf
install -D -m 0644 %{SOURCE16} %{buildroot}%{_sysusersdir}/system-user-%{name}.conf

cat > %{buildroot}%{_sbindir}/netbox-build-assets <<EOF
#!/bin/bash
cd %{app_dir}/%{name}
%python_exec manage.py collectstatic --no-input
EOF
chmod a+rx %{buildroot}%{_sbindir}/netbox-build-assets

cat > %{buildroot}%{_sbindir}/netbox-manage<<EOF
#!/bin/bash

cd %{app_dir}
sudo -u _%{name} ./manage.py \$@
EOF
chmod a+rx %{buildroot}%{_sbindir}/netbox-manage

# Apache
install -D -m 0644 %{SOURCE12} %{buildroot}%{apache_sysconfdir}/vhosts.d/%{name}.conf
# nginx
install -D -m 0644 %{SOURCE13} %{buildroot}%{_sysconfdir}/nginx/vhosts.d/%{name}.conf
# firewall
%if %{with firewall_files}
%if 0%{?suse_version} >= 1500
install -d %{buildroot}%{_libexecdir}/firewalld/services/
install -D -m 0644 %{SOURCE10} %{buildroot}%{_libexecdir}/firewalld/services/%{name}.xml
%else
install -d %{buildroot}%{_sysconfdir}/sysconfig/SuSEfirewall2/services/
install -D -m 0644 %{SOURCE11} %{buildroot}%{_sysconfdir}/sysconfig/SuSEfirewall2/services/%{name}
%endif
%endif

%fdupes %{buildroot}%{app_dir}

%pre -f %{name}.pre
%service_add_pre %{netbox_services}

%post
%tmpfiles_create %{_tmpfilesdir}/%{name}.conf
%service_add_post %{netbox_services}

%preun
%service_del_preun %{netbox_services}

%postun
%service_del_postun %{netbox_services}

%files
%license LICENSE.txt
%doc README.md CONTRIBUTING.md
%doc docs/
%doc configuration.example.py
#
%dir %attr(750,root,_netbox) %{_sysconfdir}/%{name}
%config(noreplace) %attr(-,root,_netbox) %{_sysconfdir}/%{name}/configuration.py
%config(noreplace) %attr(-,root,_netbox) %{_sysconfdir}/%{name}/gunicorn.py
#
%dir %attr(-,_netbox,_netbox) %{app_dir}/media
%dir %attr(-,_netbox,_netbox) %{app_dir}/tmp
%{app_dir}/
%exclude %{app_dir}/%{name}/ldap_config.py
%exclude %{app_dir}/%{name}/sso_pipeline_opensuse.py
#
%{_tmpfilesdir}/%{name}.conf
%{_sysusersdir}/system-user-%{name}.conf
%{_unitdir}/%{name}*
%{_sbindir}/rc%{name}*
%{_sbindir}/netbox-build-assets
%{_sbindir}/netbox-manage
#
%dir %attr(-,_netbox,_netbox) %{home_dir}
%dir %attr(-,_netbox,_netbox) %{log_dir}
#
%ghost %dir %attr(755,_netbox,_netbox) /run/netbox
%ghost %dir %attr(755,_netbox,_netbox) /run/netbox/gunicorn

%files ldap
%config(noreplace) %attr(-,root,_netbox) %{_sysconfdir}/%{name}/ldap_config.py
%{app_dir}/%{name}/ldap_config.py

%files idm-ioo
%config(noreplace) %attr(-,root,_netbox) %{_sysconfdir}/%{name}/sso_pipeline_opensuse.py
%{app_dir}/%{name}/sso_pipeline_opensuse.py

%files nginx
%config(noreplace) %{_sysconfdir}/nginx/vhosts.d/%{name}.conf

%files apache
%config(noreplace) %{apache_sysconfdir}/vhosts.d/%{name}.conf

%if %{with firewall_files}
%files firewall
%if 0%{?suse_version} >= 1500
%dir %{_libexecdir}/firewalld
%dir %{_libexecdir}/firewalld/services
%config(noreplace) %{_libexecdir}/firewalld/services/%{name}.xml
%else
%config(noreplace) %{_sysconfdir}/sysconfig/SuSEfirewall2.d/services/%{name}
%endif
%endif

%changelog
openSUSE Build Service is sponsored by