File netdata.spec of Package netdata

#
# spec file for package netdata
#
# Copyright (c) 2024 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 netdata_user    netdata
%define netdata_group   netdata

%define __builder ninja

Name:           netdata
Version:        1.47.2
Release:        0
Summary:        A system for distributed real-time performance and health monitoring
# netdata is GPL-3.0+, other licenses refer to included third-party software (see REDISTRIBUTED.md)
License:        Apache-2.0 AND BSD-2-Clause AND GPL-3.0-or-later AND MIT AND BSD-3-Clause AND LGPL-2.1-or-later AND OFL-1.1 AND CC-BY-4.0 AND WTFPL
Group:          System/Monitoring
URL:            http://my-netdata.io/
Source:         %{name}-%{version}.tar.xz
Source1:        vendor.tar.gz
Source2:        netdata-rpmlintrc
Patch0:         netdata-logrotate-su.patch
# PATCH-FIX-OPENSUSE netdata_disable_v2_dashboard.patch bsc#1229119
Patch1:         netdata_disable_v2_dashboard.patch
BuildRequires:  c++_compiler
BuildRequires:  cmake
BuildRequires:  cups-devel
BuildRequires:  dos2unix
BuildRequires:  fdupes
BuildRequires:  git-core
BuildRequires:  judy-devel
BuildRequires:  ninja
BuildRequires:  pkgconfig
BuildRequires:  snappy-devel
BuildRequires:  golang(API) >= 1.22
BuildRequires:  pkgconfig(grpc)
BuildRequires:  pkgconfig(json)
BuildRequires:  pkgconfig(libcap)
BuildRequires:  pkgconfig(libcurl)
BuildRequires:  pkgconfig(libelf)
BuildRequires:  pkgconfig(liblz4)
BuildRequires:  pkgconfig(libmnl)
BuildRequires:  pkgconfig(libmosquitto)
BuildRequires:  pkgconfig(libnetfilter_acct)
BuildRequires:  pkgconfig(libuv)
BuildRequires:  pkgconfig(libwebsockets)
BuildRequires:  pkgconfig(openssl)
# Broken with current upstream protobuf - uses bundled copy
# BuildRequires:  pkgconfig(protobuf)
BuildRequires:  pkgconfig(libsystemd)
BuildRequires:  pkgconfig(libzstd)
BuildRequires:  pkgconfig(uuid)
BuildRequires:  pkgconfig(yajl)
BuildRequires:  pkgconfig(yaml-0.1)
BuildRequires:  pkgconfig(zlib)
Requires(pre):  shadow permissions
Recommends:     PyYAML
Recommends:     curl
Recommends:     iproute-tc
Recommends:     lm_sensors
Recommends:     nmap-ncat
Recommends:     openssl(cli)
Suggests:       logrotate
Suggests:       nodejs
%if 0%{?suse_version} > 1550
BuildRequires:  python3
%else
BuildRequires:  python311
%endif
%ifarch %ix86 x86_64 aarch64
BuildRequires:  pkgconfig(xenstat)
%endif
BuildRequires:  pkgconfig(libipmimonitoring)
Provides:       group(%{netdata_group})
Provides:       user(%{netdata_user})

%description
Netdata is a system for distributed real-time performance and
health monitoring.
It provides insights, in real-time, of everything happening on the
system it runs on (including applications such as web and database
servers), using interactive web dashboards.

%package plugin-cups
Summary:        The CUPS metrics collection plugin for the Netdata Agent
Enhances:       cups
Requires:       netdata = %{version}
Supplements:    netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/cups.plugin

%description plugin-cups
This plugin allows the Netdata Agent to collect metrics from the
Common UNIX Printing System.

%files plugin-cups
%attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/cups.plugin

%package plugin-freeipmi
Summary:        The FreeIPMI metrics collection plugin for the Netdata Agent
Enhances:       freeipmi
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/freeipmi.plugin

%description plugin-freeipmi
This plugin allows the Netdata Agent to collect metrics from
hardware using FreeIPMI.

%post plugin-freeipmi
%set_permissions

%files plugin-freeipmi
%attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/freeipmi.plugin

%package plugin-nfacct
Summary:        The NFACCT metrics collection plugin for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/nfacct.plugin

%description plugin-nfacct
This plugin allows the Netdata Agent to collect metrics from the
firewall using NFACCT objects.

%post plugin-nfacct
%set_permissions

%files plugin-nfacct
%attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/nfacct.plugin

%package plugin-chartsd
Summary:        The charts.d metrics collection plugin for the Netdata Agent
Requires:       bash
Requires:       netdata = %{version}
Enhances:       nut
Enhances:       apcupsd
Enhances:       iw
Suggests:       sudo
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/charts.d.plugin
BuildArch:      noarch

%description plugin-chartsd
This plugin adds a selection of additional collectors written in
shell script to the Netdata Agent.
It includes collectors for NUT, APCUPSD, LibreSWAN, OpenSIPS, and
Wireless access point statistics.

%files plugin-chartsd
%defattr(0750,root,%{netdata_user},0750)
%{_libexecdir}/%{name}/plugins.d/charts.d.plugin
%{_libexecdir}/%{name}/plugins.d/charts.d.dryrun-helper.sh
%{_libexecdir}/%{name}/charts.d/
%defattr(0644,root,%{netdata_user},0644)
%{_prefix}/lib/%{name}/conf.d/charts.d.conf
%{_prefix}/lib/%{name}/conf.d/charts.d/

%package plugin-pythond
Summary:        The python.d metrics collection plugin for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
%if 0%{?suse_version} > 1550
Requires:       python3
%else
Requires:       python311
%endif
Suggests:       sudo
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/python.d.plugin
BuildArch:      noarch

%description plugin-pythond
This plugin adds a selection of additional collectors written in
Python to the Netdata Agent.
Many of the collectors provided by this package are also available
in netdata-plugin-go. In msot cases, you probably want to use those
versions instead of the Python versions.

%files plugin-pythond
%defattr(0750,root,%{netdata_user},0750)
%{_libexecdir}/%{name}/plugins.d/python.d.plugin
%{_libexecdir}/%{name}/python.d
%defattr(0640,root,%{netdata_user},0640)
%{_prefix}/lib/%{name}/conf.d/python.d.conf
%{_prefix}/lib/%{name}/conf.d/python.d

%package plugin-go
Summary:        The go.d metrics collection plugin for the Netdata Agent
Requires:       netdata = %{version}
Suggests:       nvme-cli
Suggests:       sensors
Suggests:       sudo
Supplements:    netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/go.d.plugin

%description plugin-go
This plugin adds a selection of additional collectors written in Go
to the Netdata Agent.
A significant percentage of the application specific collectors
provided by Netdata are part of this plugin, so most users will
want it installed.

%post plugin-go
%set_permissions

%files plugin-go
%defattr(0750,root,%{netdata_user},0750)
# CAP_NET_ADMIN needed for WireGuard collector
# CAP_NET_RAW needed for ping collector
%caps(cap_net_admin,cap_net_raw=eip) %{_libexecdir}/%{name}/plugins.d/go.d.plugin
%defattr(0644,root,%{netdata_user},0644)
%{_prefix}/lib/%{name}/conf.d/go.d.conf
%{_prefix}/lib/%{name}/conf.d/go.d

%package plugin-apps
Summary:        The per-application metrics collection plugin for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/apps.plugin

%description plugin-apps
This plugin allows the Netdata Agent to collect per-application and
per-user metrics without using cgroups.

%post plugin-apps
%set_permissions

%files plugin-apps
%defattr(0750,root,%{netdata_user},0750)
# CAP_DAC_READ_SEARCH and CAP_SYS_PTRACE needed for data collection by the plugin.
%caps(cap_dac_read_search,cap_sys_ptrace=ep) %{_libexecdir}/%{name}/plugins.d/apps.plugin
%defattr(0644,root,%{netdata_user},0644)
%{_prefix}/lib/%{name}/conf.d/apps_groups.conf

%package plugin-slabinfo
Summary:        The slabinfo metrics collector for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/slabinfo.plugin

%description plugin-slabinfo
This plugin allows the Netdata Agent to collect perfromance and
utilization metrics for the Linux kernel’s SLAB allocator.

%post plugin-slabinfo
%set_permissions

%files plugin-slabinfo
%defattr(0750,root,%{netdata_user},0750)
# CAP_DAC_READ_SEARCH needed to access the files the plugin reads to collect data.
%caps(cap_dac_read_search=ep) %{_libexecdir}/%{name}/plugins.d/slabinfo.plugin

%package plugin-perf
Summary:        The perf metrics collector for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/perf.plugin

%description plugin-perf
This plugin allows the Netdata to collect metrics from the Linux
perf subsystem.

%post plugin-perf
%set_permissions

%files plugin-perf
%defattr(0750,root,%{netdata_user},0750)
# Either CAP_SYS_ADMIN or CAP_PERFMON needed for data collection
%caps(cap_perfmon=ep) %{_libexecdir}/%{name}/plugins.d/perf.plugin

%package plugin-debugfs
Summary:        The debugfs metrics collector for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/debugfs.plugin

%description plugin-debugfs
This plugin allows the Netdata Agent to collect Linux kernel
metrics exposed through debugfs.

%post plugin-debugfs
%set_permissions

%files plugin-debugfs
# CAP_DAC_READ_SEARCH required for data collection.
%caps(cap_dac_read_search=ep) %attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/debugfs.plugin

%package plugin-network-viewer
Summary:        The network viewer plugin for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/network-viewer.plugin

%description plugin-network-viewer
This plugin allows the Netdata Agent to provide network connection
mapping functionality for use in netdata Cloud.

%files plugin-network-viewer
%defattr(0750,root,%{netdata_user},0750)
# CAP_SYS_ADMIN, CAP_SYS_PTRACE and CAP_DAC_READ_SEARCH needed for data collection.
%caps(cap_sys_admin,cap_sys_ptrace,cap_dac_read_search=ep) %attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/network-viewer.plugin

%package plugin-systemd-journal
Summary:        The systemd-journal plugin for the Netdata Agent
Requires:       netdata = %{version}
Enhances:       netdata
Provides:       netdata:%{_libexecdir}/%{name}/plugins.d/systemd-journal.plugin

%description plugin-systemd-journal
This plugin allows the Netdata Agent to present entries from the systemd
journal on Netdata Cloud or the local Agent Dashboard.

%files plugin-systemd-journal
%defattr(0750,root,%{netdata_user},0750)
# CAP_DAC_READ_SEARCH required for data collection.
%caps(cap_dac_read_search=ep) %attr(0750,root,%{netdata_user}) %{_libexecdir}/%{name}/plugins.d/systemd-journal.plugin

%prep
%autosetup -p1
sed -i 's,%{_bindir}/env bash,/bin/bash,' src/claim/%{name}-claim.sh.in

%if 0%{?sle_version} >= 150200 || 0%{?suse_version} > 1500
%if 0%{?suse_version} > 1550
sed -i 's,^pybinary=.*,pybinary=%{_bindir}/python3,' src/collectors/python.d.plugin/python.d.plugin.in
%else
sed -i 's,^pybinary=.*,pybinary=%{_bindir}/python3.11,' src/collectors/python.d.plugin/python.d.plugin.in
%endif

tar -xf %{SOURCE1} -C src/go
%endif

%build
export GOFLAGS=-mod=vendor
%ifarch x86_64 aarch64
    export GOFLAGS="$GOFLAGS -buildmode=pie"
%endif

# Agent-Cloud Link and the Prometheus exporter require protobuf,
# which is broken with openSUSE’s version (too new).
# Bundled protobuf requires Abseil, which this build system
# will fetch from a Git repo.
# They explicitly disable disconnected mode.
%cmake \
    -DENABLE_PLUGIN_EBPF=False \
    -DENABLE_ACLK=False -DENABLE_EXPORTER_PROMETHEUS_REMOTE_WRITE=False \
    -DNETDATA_USER=%{netdata_user} \
%ifnarch %ix86 x86_64 aarch64
    -DENABLE_PLUGIN_XENSTAT=False \
%endif
    -DCMAKE_INSTALL_PREFIX=/
%cmake_build

%install
%cmake_install
install -D -m 0644 %{buildroot}%{_prefix}/lib/%{name}/system/systemd/%{name}.service %{buildroot}%{_unitdir}/%{name}.service
install -D -m 0644 %{buildroot}%{_prefix}/lib/%{name}/system/logrotate/%{name} %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
install -D -m 0644 system/%{name}.conf %{buildroot}%{_sysconfdir}/%{name}/%{name}.conf

ln -s -f %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}

sed -i 's,^#!%{_bindir}/env bash,#!/bin/bash,;s,^#!%{_bindir}/env sh,#!/bin/sh,' \
    %{buildroot}%{_libexecdir}/%{name}/plugins.d/* \
    %{buildroot}%{_sysconfdir}/%{name}/edit-config

# Respect FHS
mv %{buildroot}%{_sysconfdir}/%{name}/edit-config %{buildroot}%{_libexecdir}/%{name}
sed -i 's|%{_prefix}/lib|%{_libdir}|' %{buildroot}%{_libexecdir}/%{name}/edit-config

# This should be opt-in, not opt-out.
# Disable statistics by default.
touch %{buildroot}%{_sysconfdir}/%{name}/.opt-out-from-anonymous-statistics

install -m 755 -d %{buildroot}%{_localstatedir}/cache/%{name}
install -m 755 -d %{buildroot}%{_localstatedir}/log/%{name}
install -m 755 -d %{buildroot}%{_localstatedir}/lib/%{name}/registry

rm %{buildroot}%{_prefix}/lib/%{name}/conf.d/netdata-updater.conf
rm -r %{buildroot}%{_prefix}/lib/%{name}/system
rm %{buildroot}%{_libexecdir}/%{name}/install-service.sh
rm %{buildroot}%{_libexecdir}/%{name}/netdata-updater.sh

# This is a suid binary that is supposed to allow Netdata to run
# some privileged commands. Not packaged due to security concerns.
rm %{buildroot}%{_libexecdir}/%{name}/plugins.d/ndsudo

%fdupes %{buildroot}/lib %{buildroot}%{_libexecdir} %{buildroot}%{_datadir}

%check

%pre
getent group %{netdata_group} >/dev/null || \
    %{_sbindir}/groupadd -r %{netdata_group}
getent passwd %{netdata_user} >/dev/null || \
    %{_sbindir}/useradd -r -g %{netdata_group} -s /bin/false \
    -c "netdata daemon user" -d %{_localstatedir}/lib/empty %{netdata_user}
%{_sbindir}/usermod -g %{netdata_group} %{netdata_user} >/dev/null
%service_add_pre %{name}.service

%post
%service_add_post %{name}.service

%preun
%service_del_preun %{name}.service

%postun
%service_del_postun %{name}.service

%files
%doc README.md CHANGELOG.md
%license LICENSE REDISTRIBUTED.md

%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}

%dir %{_libexecdir}/%{name}
%dir %{_libexecdir}/%{name}/plugins.d
%{_libexecdir}/%{name}/plugins.d/*.sh
%exclude %{_libexecdir}/%{name}/plugins.d/charts.d.dryrun-helper.sh
%{_libexecdir}/%{name}/plugins.d/cgroup-network
%{_libexecdir}/%{name}/plugins.d/ioping.plugin
%{_libexecdir}/%{name}/plugins.d/local-listeners
%{_libexecdir}/%{name}/plugins.d/loopsleepms.sh.inc
%ifarch %ix86 x86_64 aarch64
%{_libexecdir}/%{name}/plugins.d/xenstat.plugin
%endif

%dir %{_prefix}/lib/%{name}
%dir %{_prefix}/lib/%{name}/conf.d
%dir %{_prefix}/lib/%{name}/conf.d/schema.d
%{_prefix}/lib/%{name}/conf.d/health.d
%{_prefix}/lib/%{name}/conf.d/statsd.d
%{_prefix}/lib/%{name}/conf.d/vnodes
%{_prefix}/lib/%{name}/conf.d/exporting.conf
%{_prefix}/lib/%{name}/conf.d/health_alarm_notify.conf
%{_prefix}/lib/%{name}/conf.d/health_email_recipients.conf
%{_prefix}/lib/%{name}/conf.d/ioping.conf
%{_prefix}/lib/%{name}/conf.d/netdata.conf
%{_prefix}/lib/%{name}/conf.d/stream.conf
%{_prefix}/lib/%{name}/conf.d/schema.d/*.json

%{_sbindir}/%{name}
%{_sbindir}/%{name}-claim.sh
%{_sbindir}/%{name}cli
%{_sbindir}/rc%{name}
%{_sbindir}/systemd-cat-native

%{_unitdir}/%{name}.service

%attr(-,root,%{netdata_group}) %dir %{_datadir}/%{name}
%attr(-,root,%{netdata_group}) %{_datadir}/%{name}/web

%attr(0750,%{netdata_user},root) %dir %{_localstatedir}/cache/%{name}
%attr(0750,%{netdata_user},root) %dir %{_localstatedir}/log/%{name}
%attr(0750,%{netdata_user},root) %dir %{_localstatedir}/lib/%{name}

# Do not allow users to read netdata config dir and files as they can
# contain passwords!
%defattr(0640,root,%{netdata_group},0750)

%dir %{_sysconfdir}/%{name}
%dir %{_sysconfdir}/%{name}/health.d
%dir %{_sysconfdir}/%{name}/python.d
%dir %{_sysconfdir}/%{name}/statsd.d

%config(noreplace) %{_sysconfdir}/%{name}/.opt-out-from-anonymous-statistics
%config(noreplace) %{_sysconfdir}/%{name}/*.conf
# used for statistics
%config %{_sysconfdir}/%{name}/.install-type

%attr(0750,root,%{netdata_group}) %{_libexecdir}/%{name}/edit-config

%changelog
openSUSE Build Service is sponsored by