From a21a4355e5a80d74666455d595aeafd5e3482ebb Mon Sep 17 00:00:00 2001 From: James Campbell Date: Wed, 8 Jan 2025 18:34:51 -0500 Subject: [PATCH] Restructure for packaging --- .gitignore | 1 + DEBIAN/control | 9 ++ Dockerfile.deb | 11 +++ Dockerfile.rpm | 10 +++ Makefile | 84 +++++++++++++++++++ RPM/pgmon.spec | 32 +++++++ .../pgmon-metrics.yml | 0 pgmon.yml => sample-config/pgmon.yml | 0 pgmon.py => src/pgmon.py | 0 test_pgmon.py => src/test_pgmon.py | 0 pgmon@.service => systemd/pgmon@.service | 0 .../pgmon_templates.yaml | 0 12 files changed, 147 insertions(+) create mode 100644 DEBIAN/control create mode 100644 Dockerfile.deb create mode 100644 Dockerfile.rpm create mode 100644 Makefile create mode 100644 RPM/pgmon.spec rename pgmon-metrics.yml => sample-config/pgmon-metrics.yml (100%) rename pgmon.yml => sample-config/pgmon.yml (100%) rename pgmon.py => src/pgmon.py (100%) rename test_pgmon.py => src/test_pgmon.py (100%) rename pgmon@.service => systemd/pgmon@.service (100%) rename pgmon_templates.yaml => zabbix_templates/pgmon_templates.yaml (100%) diff --git a/.gitignore b/.gitignore index f24632a..fc7836e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ install-sh missing __pycache__ venv +build diff --git a/DEBIAN/control b/DEBIAN/control new file mode 100644 index 0000000..0e8bc21 --- /dev/null +++ b/DEBIAN/control @@ -0,0 +1,9 @@ +Package: pgmon +Version: 1.0 +Section: utils +Priority: optional +Architecture: all +Depends: python3, python3-psycopg2, systemd +Maintainer: James Campbell +Homepage: https://www.commandprompt.com +Description: A bridge to sit between monitoring tools and PostgreSQL diff --git a/Dockerfile.deb b/Dockerfile.deb new file mode 100644 index 0000000..890834d --- /dev/null +++ b/Dockerfile.deb @@ -0,0 +1,11 @@ +FROM ubuntu:noble + +RUN apt-get update && apt-get install -y \ + dpkg-dev \ + build-essential \ + fakeroot \ + make \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /src +CMD ["make", "package-deb"] diff --git a/Dockerfile.rpm b/Dockerfile.rpm new file mode 100644 index 0000000..547c38d --- /dev/null +++ b/Dockerfile.rpm @@ -0,0 +1,10 @@ +# Dockerfile.rpm +FROM rockylinux:9 + +RUN dnf install -y \ + rpm-build \ + make \ + && dnf clean all + +WORKDIR /src +CMD ["make", "package-rpm"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e92343c --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ +PACKAGE_NAME := pgmon +VERSION := 1.0 +BUILD_DIR := build +DEB_IMAGE := debian-package-builder +RPM_IMAGE := rpm-package-builder + +SCRIPT := src/$(PACKAGE_NAME).py + +# Top-level targets +.PHONY: all clean deb rpm + +all: deb rpm + +deb: + mkdir -p $(BUILD_DIR)/deb + docker run --rm \ + -v .:/src:ro \ + -v ./$(BUILD_DIR)/deb:/output \ + $(DEB_IMAGE) + +rpm: + mkdir -p $(BUILD_DIR)/rpm + docker run --rm \ + -v .:/src:ro \ + -v ./$(BUILD_DIR)/rpm:/output \ + $(RPM_IMAGE) + +clean: + rm -rf $(BUILD_DIR) + + +# Container targets +.PHONY: docker deb-package-image rpm-package-image + +docker: deb-package-image rpm-package-image + +deb-package-image: Dockerfile.deb + docker build -t $(DEB_IMAGE) -f Dockerfile.deb . + +rpm-package-image: Dockerfile.rpm + docker build -t $(RPM_IMAGE) -f Dockerfile.rpm . + + +# Inside-container targets +.PHONY: package-deb package-rpm + +# Debian package creation logic +package-deb: + $(MAKE) install DESTDIT=/output + cp -r DEBIAN /output/ + dpkg-deb --build /output /output/$(PACKAGE_NAME)_$(VERSION).deb + +# RPM package creation logic +package-rpm: + mkdir -p /output/{BUILD,RPMS,SOURCES,SPECS,SRPMS} + cp RPM/$(PACKAGE_NAME).spec /output/SPECS/ + rpmbuild --define '_topdir /output' \ + --define 'version $(VERSION)' \ + -ba /output/SPECS/$(PACKAGE_NAME).spec + cp /output/rpm/RPMS/x86_64/*.rpm /output/ + +# Install into the specified destination directory (used inside the packaging systems) +.PHONY: install + +install: + # Set up directories + mkdir -p $(DESTDIR)/usr/bin + mkdir -p $(DESTDIR)/usr/share/man/man1 + mkdir -p $(DESTDIR)/etc/$(PACKAGE_NAME) + mkdir -p $(DESTDIR)/lib/systemd/system + + # Install script + cp script.py $(DESTDIR)/usr/bin/$(PACKAGE_NAME) + chmod 755 $(DESTDIR)/usr/bin/$(PACKAGE_NAME) + + # Install manpage + cp manpages/* $(DESTDIR)/usr/share/man/man1/ + gzip -9 $(DESTDIR)/usr/share/man/man1/$(PACKAGE_NAME).1 + + # Install sample config + cp sample-config/* $(DESTDIR)/etc/$(PACKAGE_NAME)/ + + # Install systemd unit files + cp systemd/* $(DESTDIR)/lib/systemd/system/ diff --git a/RPM/pgmon.spec b/RPM/pgmon.spec new file mode 100644 index 0000000..53c5323 --- /dev/null +++ b/RPM/pgmon.spec @@ -0,0 +1,32 @@ +Name: pgmon +Version: 1.0 +Release: 1%{?dist} +Summary: A bridge to sit between monitoring tools and PostgreSQL + +License: MIT +URL: https://www.commandprompt.com +Source0: %{name}-%{version}.tar.gz + +Requires: python3, python3-psycopg2, systemd + +%description +A bridge to sit between monitoring tools and PostgreSQL + +%prep + +%build + +%install +make -C /src install DESTDIR=%{buildroot} + +%files +/usr/local/bin/pgmon +/usr/share/man/man1/pgmon.1.gz +/etc/pgmon/pgmon.yml +/etc/pgmon/pgmon-metrics.yml +/lib/systemd/system/pgmon.service +/lib/systemd/system/pgmon@.service + +%changelog +* Wed Jan 08 2025 James Campbell - 1.0-1 +- Initial RPM release. diff --git a/pgmon-metrics.yml b/sample-config/pgmon-metrics.yml similarity index 100% rename from pgmon-metrics.yml rename to sample-config/pgmon-metrics.yml diff --git a/pgmon.yml b/sample-config/pgmon.yml similarity index 100% rename from pgmon.yml rename to sample-config/pgmon.yml diff --git a/pgmon.py b/src/pgmon.py similarity index 100% rename from pgmon.py rename to src/pgmon.py diff --git a/test_pgmon.py b/src/test_pgmon.py similarity index 100% rename from test_pgmon.py rename to src/test_pgmon.py diff --git a/pgmon@.service b/systemd/pgmon@.service similarity index 100% rename from pgmon@.service rename to systemd/pgmon@.service diff --git a/pgmon_templates.yaml b/zabbix_templates/pgmon_templates.yaml similarity index 100% rename from pgmon_templates.yaml rename to zabbix_templates/pgmon_templates.yaml