diff --git a/golang-github-prometheus-node_exporter.spec b/golang-github-prometheus-node_exporter.spec new file mode 100644 index 0000000..6ea2ecb --- /dev/null +++ b/golang-github-prometheus-node_exporter.spec @@ -0,0 +1,287 @@ +# Generate devel rpm +%global with_devel 1 +# Build project from bundled dependencies +%global with_bundled 1 +# Build with debug info rpm +%global with_debug 0 +# Run tests in check section +%global with_check 1 +# Generate unit-test rpm +%global with_unit_test 0 + +%if 0%{?with_debug} +%global _dwz_low_mem_die_limit 0 +%else +%global debug_package %{nil} +%endif + + +%global provider github +%global provider_tld com +%global project prometheus +%global repo node_exporter +# https://github.com/prometheus/node_exporter +%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} +%global import_path %{provider_prefix} + + +Name: golang-%{provider}-%{project}-%{repo} +Version: 1.0.1 +Release: 1%{?dist} +Summary: Exporter for machine metrics +License: ASL 2.0 +URL: https://%{provider_prefix} +Source0: https://%{provider_prefix}/archive/v%{version}.tar.gz +Source1: sysconfig.node_exporter +Source2: node_exporter.service +Source3: node_exporter_textfile_wrapper.sh +Source4: textfile_collectors_README + +Provides: node_exporter = %{version}-%{release} + +BuildRequires: systemd + +# e.g. el6 has ppc64 arch without gcc-go, so EA tag is required +ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}} + +%description +%{summary} + +%if 0%{?with_devel} +%package devel +Summary: %{summary} +BuildArch: noarch + +BuildRequires: git +BuildRequires: golang >= 1.14 +%if 0%{?with_check} && ! 0%{?with_bundled} +BuildRequires: golang(github.com/beevik/ntp) +BuildRequires: golang(github.com/coreos/go-systemd/dbus) +BuildRequires: golang(github.com/godbus/dbus) +BuildRequires: golang(github.com/golang/protobuf/proto) +BuildRequires: golang(github.com/kolo/xmlrpc) +BuildRequires: golang(github.com/mdlayher/wifi) +BuildRequires: golang(github.com/prometheus/client_golang/prometheus) +BuildRequires: golang(github.com/prometheus/client_model/go) +BuildRequires: golang(github.com/prometheus/common/expfmt) +BuildRequires: golang(github.com/prometheus/common/log) +BuildRequires: golang(github.com/prometheus/procfs) +BuildRequires: golang(github.com/soundcloud/go-runit/runit) +BuildRequires: golang(golang.org/x/sys/unix) +%endif + +Requires: golang(github.com/beevik/ntp) +Requires: golang(github.com/coreos/go-systemd/dbus) +Requires: golang(github.com/godbus/dbus) +Requires: golang(github.com/golang/protobuf/proto) +Requires: golang(github.com/kolo/xmlrpc) +Requires: golang(github.com/mdlayher/wifi) +Requires: golang(github.com/prometheus/client_golang/prometheus) +Requires: golang(github.com/prometheus/client_model/go) +Requires: golang(github.com/prometheus/common/expfmt) +Requires: golang(github.com/prometheus/common/log) +Requires: golang(github.com/prometheus/procfs) +Requires: golang(github.com/soundcloud/go-runit/runit) +Requires: golang(golang.org/x/sys/unix) + +Provides: golang(%{import_path}/collector) = %{version}-%{release} +Provides: golang(%{import_path}/collector/ganglia) = %{version}-%{release} + +%description devel +%{summary} + +This package contains library source intended for +building other packages which use import path with +%{import_path} prefix. +%endif + +%if 0%{?with_unit_test} && 0%{?with_devel} +%package unit-test-devel +Summary: Unit tests for %{name} package +%if 0%{?with_check} +#Here comes all BuildRequires: PACKAGE the unit tests +#in %%check section need for running +%endif + +# test subpackage tests code from devel subpackage +Requires: %{name}-devel = %{version}-%{release} + +%if 0%{?with_check} && ! 0%{?with_bundled} +BuildRequires: golang(github.com/prometheus/client_golang/prometheus/promhttp) +%endif + +Requires: golang(github.com/prometheus/client_golang/prometheus/promhttp) + +%description unit-test-devel +%{summary} + +This package contains unit tests for project +providing packages with %{import_path} prefix. +%endif + +%prep +%setup -q -n %{repo}-%{version} +mkdir -p _build/src/%{provider}.%{provider_tld}/%{project} +ln -s $(pwd) _build/src/%{provider_prefix} + +%build +# mkdir -p _build/src/%{provider}.%{provider_tld}/%{project} +# ln -s $(pwd) _build/src/%{provider_prefix} + +%if ! 0%{?with_bundled} +export GOPATH=$(pwd)/_build:%{gopath} +%else +# Since we aren't packaging up the vendor directory we need to link +# back to it somehow. Hack it up so that we can add the vendor +# directory from BUILD dir as a gopath to be searched when executing +# tests from the BUILDROOT dir. +ln -s ./ ./vendor/src # ./vendor/src -> ./vendor +export GOPATH=$(pwd)/_build:$(pwd)/vendor:%{gopath} +%endif + +# set version information +export LDFLAGS="-X github.com/prometheus/common/version.Version=%{version} -X github.com/prometheus/common/version.BuildUser=copr -X github.com/prometheus/common/version.BuildDate=$(date '+%Y%m%d-%T')" + +%if ! 0%{?gobuild:1} +function _gobuild { go build -a -ldflags "-B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \n') $LDFLAGS" -v -x "$@"; } +%global gobuild _gobuild +%endif + +# non-modular build +##### +export GOPATH=$(pwd)/_build +##### +export GO111MODULE=off; rm -f go.mod +%gobuild -o _build/node_exporter %{provider_prefix} + +%install +install -d -p %{buildroot}%{_sbindir} \ + %{buildroot}%{_defaultdocdir}/node_exporter \ + %{buildroot}%{_sysconfdir}/sysconfig \ + %{buildroot}%{_sysconfdir}/prometheus/node_exporter/text_collectors + +%if 0%{?rhel} != 6 +install -d -p %{buildroot}%{_unitdir} +%endif + +install -p -m 0644 %{_sourcedir}/textfile_collectors_README %{buildroot}%{_sysconfdir}/prometheus/node_exporter/text_collectors/README +install -p -m 0644 %{_sourcedir}/sysconfig.node_exporter %{buildroot}%{_sysconfdir}/sysconfig/node_exporter +%if 0%{?rhel} != 6 +install -p -m 0644 %{_sourcedir}/node_exporter.service %{buildroot}%{_unitdir}/node_exporter.service +%endif +install -p -m 0755 %{_sourcedir}/node_exporter_textfile_wrapper.sh %{buildroot}%{_sbindir}/node_exporter_textfile_wrapper +install -p -m 0755 ./_build/node_exporter %{buildroot}%{_sbindir}/node_exporter + +# source codes for building projects +%if 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list +# find all *.go but no *_test.go files and generate devel.file-list +for file in $(find . \( -iname "*.go" -or -iname "*.s" \) \! -iname "*_test.go" | grep -v "vendor") ; do + dirprefix=$(dirname $file) + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$dirprefix + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list + + while [ "$dirprefix" != "." ]; do + echo "%%dir %%{gopath}/src/%%{import_path}/$dirprefix" >> devel.file-list + dirprefix=$(dirname $dirprefix) + done +done +%endif + +# testing files for this project +%if 0%{?with_unit_test} && 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +# find all *_test.go files and generate unit-test-devel.file-list +for file in $(find . -iname "*_test.go" | grep -v "vendor") ; do + dirprefix=$(dirname $file) + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$dirprefix + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test-devel.file-list + + while [ "$dirprefix" != "." ]; do + echo "%%dir %%{gopath}/src/%%{import_path}/$dirprefix" >> devel.file-list + dirprefix=$(dirname $dirprefix) + done +done +%endif + +%if 0%{?with_devel} +sort -u -o devel.file-list devel.file-list +%endif + +%check +%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel} +%if ! 0%{?with_bundled} +export GOPATH=%{buildroot}/%{gopath}:%{gopath} +%else +# Since we aren't packaging up the vendor directory we need to link +# back to it somehow. Hack it up so that we can add the vendor +# directory from BUILD dir as a gopath to be searched when executing +# tests from the BUILDROOT dir. +ln -s ./ ./vendor/src # ./vendor/src -> ./vendor + +export GOPATH=%{buildroot}/%{gopath}:$(pwd)/vendor:%{gopath} +%endif + +%if ! 0%{?gotest:1} +%global gotest go test +%endif + +%gotest %{import_path} +%gotest %{import_path}/collector +%endif + +#define license tag if not already defined +%{!?_licensedir:%global license %doc} + +%if 0%{?with_devel} +%files devel -f devel.file-list +%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project} +%endif + +%if 0%{?with_unit_test} && 0%{?with_devel} +%files unit-test-devel -f unit-test-devel.file-list +%endif + +%files +%if 0%{?rhel} != 6 +%{_unitdir}/node_exporter.service +%endif +%config(noreplace) %{_sysconfdir}/sysconfig/node_exporter +%config %{_sysconfdir}/prometheus/node_exporter/text_collectors/README +%license LICENSE +%doc *.md text_collector_examples +%{_sbindir}/* + +%pre +getent group node_exporter > /dev/null || groupadd -r node_exporter +getent passwd node_exporter > /dev/null || \ + useradd -rg node_exporter -d /var/lib/node_exporter -s /sbin/nologin \ + -c "Prometheus node exporter" node_exporter +mkdir -p /var/lib/node_exporter/textfile_collector +chgrp node_exporter /var/lib/node_exporter/textfile_collector +chmod 771 /var/lib/node_exporter/textfile_collector + +%post +%if 0%{?rhel} != 6 +%systemd_post node_exporter.service +%endif + +%preun +%if 0%{?rhel} != 6 +%systemd_preun node_exporter.service +%endif + +%postun +%if 0%{?rhel} != 6 +%systemd_postun node_exporter.service +%endif + +%changelog +* Fri Jun 21 2020 houjian 1.0.1-1 +- Package Init + + + diff --git a/node_exporter.service b/node_exporter.service new file mode 100644 index 0000000..c11903f --- /dev/null +++ b/node_exporter.service @@ -0,0 +1,11 @@ +[Unit] +Description=Node Exporter + +[Service] +User=node_exporter +EnvironmentFile=/etc/sysconfig/node_exporter +ExecStart=/usr/sbin/node_exporter $OPTIONS +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/node_exporter_textfile_wrapper.sh b/node_exporter_textfile_wrapper.sh new file mode 100755 index 0000000..a95d4cd --- /dev/null +++ b/node_exporter_textfile_wrapper.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# usage: +# node_exporter_textfile_wrapper smartmon.sh smartmon +# will atomically replace smartmon.prom in the textfile-collector dir with +# output from smartmon.sh in /etc/prometheus/node_exporter/text_collectors or +# in /usr/share/doc/golang-github-prometheus-node_exporter*/text_collector_examples. + +set -eu +set -o pipefail + +script="$1" +outname="${2-""}" + +dirs_to_consider=( "/etc/prometheus/node_exporter/text_collectors" /usr/share/doc/golang-github-prometheus-node_exporter*/text_collector_examples) + +if [[ "$outname" = "" ]]; then + outname="$(basename "$script")" + outname="${outname%.*}" +fi + +if [[ "$(dirname "$script")" = "." ]]; then + for dir in "${dirs_to_consider[@]}"; do + candidate="$dir/$script" + if [[ -x "$candidate" ]]; then + script="$candidate" + break + fi + done +fi + +tmpout="$(mktemp -p /var/lib/node_exporter/textfile_collector/)" +realout="/var/lib/node_exporter/textfile_collector/$outname.prom" + +main() { + $script > "$tmpout" + chmod 640 "$tmpout" + chgrp node_exporter "$tmpout" || chmod a+r "$tmpout" + mv "$tmpout" "$realout" +} + +cleanup() { + rm -f "$tmpout" +} + +trap cleanup EXIT +main diff --git a/sysconfig.node_exporter b/sysconfig.node_exporter new file mode 100644 index 0000000..8f95a01 --- /dev/null +++ b/sysconfig.node_exporter @@ -0,0 +1 @@ +OPTIONS="--collector.textfile.directory /var/lib/node_exporter/textfile_collector" diff --git a/textfile_collectors_README b/textfile_collectors_README new file mode 100644 index 0000000..743f067 --- /dev/null +++ b/textfile_collectors_README @@ -0,0 +1,13 @@ +Collectors to run with cronjobs +=============================== + +This is a place for textfile collectors for node_exporter. +See /usr/share/doc/golang-github-prometheus-node_exporter/text_collector_examples for included examples. + +You can use /usr/sbin/node_exporter_textfile_wrapper to simplify using them. + +Example: + +* * * * * /usr/sbin/node_exporter_textfile_wrapper smartmon.sh + +will minutely execute smartmon.sh in the examples dir and write the output to the expected path. diff --git a/v1.0.1.tar.gz b/v1.0.1.tar.gz new file mode 100644 index 0000000..4e156e3 Binary files /dev/null and b/v1.0.1.tar.gz differ