2025-01-25 06:33:30 +00:00
|
|
|
# Package details
|
2025-01-08 23:34:51 +00:00
|
|
|
PACKAGE_NAME := pgmon
|
2025-01-09 01:58:52 +00:00
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
SCRIPT := src/$(PACKAGE_NAME).py
|
|
|
|
|
|
2025-07-06 07:28:16 +00:00
|
|
|
# Figure out the version components
|
|
|
|
|
# Note: The release is for RPM packages, where prerelease releases are written as 0.<release>
|
|
|
|
|
FULL_VERSION := $(shell grep -m 1 '^VERSION = ' "$(SCRIPT)" | sed -ne 's/.*"\(.*\)".*/\1/p')
|
|
|
|
|
VERSION := $(shell echo $(FULL_VERSION) | sed -n 's/\(.*\)\(-rc.*\|$$\)/\1/p')
|
|
|
|
|
RELEASE := $(shell echo $(FULL_VERSION) | sed -n 's/.*-rc\([0-9]\+\)$$/\1/p')
|
|
|
|
|
|
|
|
|
|
ifeq ($(RELEASE),)
|
|
|
|
|
RPM_RELEASE := 1
|
|
|
|
|
RPM_VERSION := $(VERSION)-$(RPM_RELEASE)
|
|
|
|
|
DEB_VERSION := $(VERSION)
|
|
|
|
|
else
|
|
|
|
|
RPM_RELEASE := 0.$(RELEASE)
|
|
|
|
|
RPM_VERSION := $(VERSION)-$(RPM_RELEASE)
|
|
|
|
|
DEB_VERSION := $(VERSION)~rc$(RELEASE)
|
|
|
|
|
endif
|
|
|
|
|
|
2025-06-01 04:23:26 +00:00
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Where packages are built
|
2025-01-08 23:34:51 +00:00
|
|
|
BUILD_DIR := build
|
2025-01-09 01:58:52 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# List of distros we support
|
|
|
|
|
SUPPORTED := ubuntu-20.04 \
|
|
|
|
|
ubuntu-22.04 \
|
|
|
|
|
ubuntu-24.04 \
|
|
|
|
|
debian-10 \
|
|
|
|
|
debian-11 \
|
|
|
|
|
rockylinux-8 \
|
|
|
|
|
rockylinux-9 \
|
2025-05-14 05:43:44 +00:00
|
|
|
oraclelinux-7 \
|
|
|
|
|
gentoo
|
2025-01-10 05:40:41 +00:00
|
|
|
|
|
|
|
|
##
|
|
|
|
|
# These targets are the main ones to use for most things.
|
|
|
|
|
##
|
|
|
|
|
|
2025-09-23 05:12:49 +00:00
|
|
|
.PHONY: all clean tgz lint format test query-tests install-common install-openrc install-systemd
|
2025-07-06 07:28:16 +00:00
|
|
|
|
|
|
|
|
all: package-all
|
2025-01-25 06:33:30 +00:00
|
|
|
|
2025-07-06 07:28:16 +00:00
|
|
|
version:
|
|
|
|
|
@echo "full version=$(FULL_VERSION) version=$(VERSION) rel=$(RELEASE) rpm=$(RPM_VERSION) deb=$(DEB_VERSION)"
|
2025-01-25 06:33:30 +00:00
|
|
|
|
|
|
|
|
# Build all packages
|
|
|
|
|
.PHONY: package-all
|
2025-07-05 16:28:36 +00:00
|
|
|
package-all: $(foreach distro_release, $(SUPPORTED), package-$(distro_release))
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-05-14 05:43:44 +00:00
|
|
|
# Gentoo package (tar.gz) creation
|
|
|
|
|
.PHONY: package-gentoo
|
|
|
|
|
package-gentoo:
|
|
|
|
|
mkdir -p $(BUILD_DIR)/gentoo
|
2025-07-06 07:28:16 +00:00
|
|
|
tar --transform "s,^,$(PACKAGE_NAME)-$(FULL_VERSION)/," -acjf $(BUILD_DIR)/gentoo/$(PACKAGE_NAME)-$(FULL_VERSION).tar.bz2 --exclude .gitignore $(shell git ls-tree --full-tree --name-only -r HEAD)
|
2025-05-14 05:43:44 +00:00
|
|
|
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Create a deb package
|
2025-01-25 06:33:30 +00:00
|
|
|
.PHONY: package-%
|
|
|
|
|
package-%: PARTS=$(subst -, ,$*)
|
|
|
|
|
package-%: DISTRO=$(word 1, $(PARTS))
|
|
|
|
|
package-%: RELEASE=$(word 2, $(PARTS))
|
|
|
|
|
package-%:
|
|
|
|
|
mkdir -p $(BUILD_DIR)
|
2025-01-08 23:34:51 +00:00
|
|
|
docker run --rm \
|
|
|
|
|
-v .:/src:ro \
|
2025-01-25 06:33:30 +00:00
|
|
|
-v ./$(BUILD_DIR):/output \
|
2025-01-11 06:18:03 +00:00
|
|
|
--user $(shell id -u):$(shell id -g) \
|
2025-01-25 06:33:30 +00:00
|
|
|
"$(DISTRO)-packager:$(RELEASE)"
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Create a tarball
|
2025-01-10 05:40:41 +00:00
|
|
|
tgz:
|
|
|
|
|
rm -rf $(BUILD_DIR)/tgz/root
|
|
|
|
|
mkdir -p $(BUILD_DIR)/tgz/root
|
2025-06-03 23:38:59 +00:00
|
|
|
$(MAKE) install-openrc DESTDIR=$(BUILD_DIR)/tgz/root
|
2025-07-06 07:28:16 +00:00
|
|
|
tar -cz -f $(BUILD_DIR)/tgz/$(PACKAGE_NAME)-$(FULL_VERSION).tgz -C $(BUILD_DIR)/tgz/root .
|
2025-01-10 05:40:41 +00:00
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Clean up the build directory
|
2025-01-08 23:34:51 +00:00
|
|
|
clean:
|
|
|
|
|
rm -rf $(BUILD_DIR)
|
|
|
|
|
|
2025-09-23 05:12:49 +00:00
|
|
|
# Check for lint
|
|
|
|
|
lint:
|
|
|
|
|
pylint src/pgmon.py
|
|
|
|
|
pylint src/test_pgmon.py
|
|
|
|
|
black --check --diff src/pgmon.py
|
|
|
|
|
black --check --diff src/test_pgmon.py
|
|
|
|
|
|
|
|
|
|
# Format the code using black
|
|
|
|
|
format:
|
|
|
|
|
black src/pgmon.py
|
|
|
|
|
black src/test_pylint.py
|
|
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Run unit tests for the script
|
2025-01-09 01:58:52 +00:00
|
|
|
test:
|
|
|
|
|
cd src ; python3 -m unittest
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-06-01 04:11:44 +00:00
|
|
|
# Run query tests
|
|
|
|
|
query-tests:
|
|
|
|
|
cd tests ; ./run-tests.sh
|
|
|
|
|
|
2025-06-03 23:25:33 +00:00
|
|
|
# Install the script at the specified base directory (common components)
|
|
|
|
|
install-common:
|
2025-01-10 05:40:41 +00:00
|
|
|
# Set up directories
|
|
|
|
|
mkdir -p $(DESTDIR)/etc/$(PACKAGE_NAME)
|
2025-01-16 05:14:05 +00:00
|
|
|
mkdir -p ${DESTDIR}/etc/logrotate.d
|
2025-06-04 05:10:20 +00:00
|
|
|
mkdir -p $(DESTDIR)/usr/bin
|
2025-01-16 05:14:05 +00:00
|
|
|
mkdir -p $(DESTDIR)/usr/share/man/man1
|
2025-01-10 05:40:41 +00:00
|
|
|
|
|
|
|
|
# Install script
|
2025-06-04 05:10:20 +00:00
|
|
|
cp $(SCRIPT) $(DESTDIR)/usr/bin/$(PACKAGE_NAME)
|
|
|
|
|
chmod 755 $(DESTDIR)/usr/bin/$(PACKAGE_NAME)
|
2025-01-10 05:40:41 +00:00
|
|
|
|
|
|
|
|
# Install manpage
|
|
|
|
|
cp manpages/* $(DESTDIR)/usr/share/man/man1/
|
2025-01-11 06:18:03 +00:00
|
|
|
gzip -f -9 $(DESTDIR)/usr/share/man/man1/$(PACKAGE_NAME).1
|
2025-01-10 05:40:41 +00:00
|
|
|
|
|
|
|
|
# Install sample config
|
|
|
|
|
cp sample-config/* $(DESTDIR)/etc/$(PACKAGE_NAME)/
|
|
|
|
|
|
2025-06-03 23:25:33 +00:00
|
|
|
# Install logrotate config
|
|
|
|
|
cp logrotate/${PACKAGE_NAME}.logrotate ${DESTDIR}/etc/logrotate.d/${PACKAGE_NAME}
|
|
|
|
|
|
|
|
|
|
# Install for systemd
|
|
|
|
|
install-systemd:
|
|
|
|
|
# Install the common stuff
|
|
|
|
|
$(MAKE) install-common
|
|
|
|
|
|
|
|
|
|
# Set up directories
|
|
|
|
|
mkdir -p $(DESTDIR)/lib/systemd/system
|
|
|
|
|
|
2025-01-10 05:40:41 +00:00
|
|
|
# Install systemd unit files
|
|
|
|
|
cp systemd/* $(DESTDIR)/lib/systemd/system/
|
2025-06-03 23:25:33 +00:00
|
|
|
|
|
|
|
|
# Install for open-rc
|
|
|
|
|
install-openrc:
|
|
|
|
|
# Install the common stuff
|
|
|
|
|
$(MAKE) install-common
|
2025-01-15 06:34:04 +00:00
|
|
|
|
2025-06-03 23:25:33 +00:00
|
|
|
# Set up directories
|
|
|
|
|
mkdir -p $(DESTDIR)/etc/init.d
|
|
|
|
|
mkdir -p $(DESTDIR)/etc/conf.d
|
|
|
|
|
|
|
|
|
|
# Install init script
|
2025-06-03 23:38:59 +00:00
|
|
|
cp openrc/pgmon.initd $(DESTDIR)/etc/init.d/pgmon
|
2025-06-04 05:10:20 +00:00
|
|
|
chmod 755 $(DESTDIR)/etc/init.d/pgmon
|
2025-06-03 23:25:33 +00:00
|
|
|
|
|
|
|
|
# Install init script config file
|
2025-06-03 23:38:59 +00:00
|
|
|
cp openrc/pgmon.confd $(DESTDIR)/etc/conf.d/pgmon
|
2025-01-08 23:34:51 +00:00
|
|
|
|
|
|
|
|
|
2025-01-22 05:45:20 +00:00
|
|
|
# Run all of the install tests
|
2025-06-01 04:11:44 +00:00
|
|
|
.PHONY: install-tests debian-%-install-test rockylinux-%-install-test ubuntu-%-install-test gentoo-install-test
|
2025-01-25 06:33:30 +00:00
|
|
|
install-tests: $(foreach distro_release, $(SUPPORTED), $(distro_release)-install-test)
|
2025-01-22 05:45:20 +00:00
|
|
|
|
|
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Run a Debian install test
|
|
|
|
|
debian-%-install-test:
|
2025-01-10 05:40:41 +00:00
|
|
|
docker run --rm \
|
2025-01-25 06:33:30 +00:00
|
|
|
-v ./$(BUILD_DIR):/output \
|
|
|
|
|
debian:$* \
|
2025-07-06 07:28:16 +00:00
|
|
|
bash -c 'apt-get update && apt-get install -y /output/$(PACKAGE_NAME)-$(DEB_VERSION)-debian-$*.deb'
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Run a RedHat install test
|
|
|
|
|
rockylinux-%-install-test:
|
2025-01-10 05:40:41 +00:00
|
|
|
docker run --rm \
|
2025-01-25 06:33:30 +00:00
|
|
|
-v ./$(BUILD_DIR):/output \
|
|
|
|
|
rockylinux:$* \
|
2025-07-06 07:28:16 +00:00
|
|
|
bash -c 'dnf makecache && dnf install -y /output/$(PACKAGE_NAME)-$(RPM_VERSION).el$*.noarch.rpm'
|
2025-01-10 05:40:41 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Run an Ubuntu install test
|
|
|
|
|
ubuntu-%-install-test:
|
2025-01-22 05:45:20 +00:00
|
|
|
docker run --rm \
|
2025-01-25 06:33:30 +00:00
|
|
|
-v ./$(BUILD_DIR):/output \
|
|
|
|
|
ubuntu:$* \
|
2025-07-06 07:28:16 +00:00
|
|
|
bash -c 'apt-get update && apt-get install -y /output/$(PACKAGE_NAME)-$(DEB_VERSION)-ubuntu-$*.deb'
|
2025-01-22 05:45:20 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Run an OracleLinux install test (this is for EL7 since CentOS7 images no longer exist)
|
|
|
|
|
oraclelinux-%-install-test:
|
2025-01-10 05:40:41 +00:00
|
|
|
docker run --rm \
|
2025-01-25 06:33:30 +00:00
|
|
|
-v ./$(BUILD_DIR):/output \
|
|
|
|
|
oraclelinux:7 \
|
2025-07-06 07:28:16 +00:00
|
|
|
bash -c 'yum makecache && yum install -y /output/$(PACKAGE_NAME)-$(RPM_VERSION).el7.noarch.rpm'
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-06-01 04:11:44 +00:00
|
|
|
# Run a Gentoo install test
|
|
|
|
|
gentoo-install-test:
|
|
|
|
|
# May impliment this in the future, but would require additional headaches to set up a repo
|
|
|
|
|
true
|
|
|
|
|
|
2025-01-10 05:40:41 +00:00
|
|
|
##
|
2025-01-25 06:33:30 +00:00
|
|
|
# Container targets
|
2025-01-10 05:40:41 +00:00
|
|
|
#
|
2025-01-25 06:33:30 +00:00
|
|
|
# These targets build the docker images used to create packages
|
2025-01-10 05:40:41 +00:00
|
|
|
##
|
|
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Target to build packaging images for all supported releases
|
|
|
|
|
.PHONY: all-package-images
|
|
|
|
|
all-package-images: $(foreach distro_release, $(SUPPORTED), package-image-$(distro_release))
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Generic target for creating images that actually build the packages
|
|
|
|
|
# The % is expected to be: distro-release
|
|
|
|
|
# The build/.package-image-% target actually does the work and touches a state file to avoid excessive building
|
|
|
|
|
.PHONY: package-image-%
|
|
|
|
|
package-image-%: PARTS=$(subst -, ,$*)
|
|
|
|
|
package-image-%: DISTRO=$(word 1, $(PARTS))
|
|
|
|
|
package-image-%: RELEASE=$(word 2, $(PARTS))
|
|
|
|
|
package-image-%:
|
|
|
|
|
docker build -t "$(DISTRO)-packager:$(RELEASE)" --build-arg "RELEASE=$(RELEASE)" --build-arg "DISTRO=$(DISTRO)" -f docker/Dockerfile-$(DISTRO) .
|
2025-01-22 05:45:20 +00:00
|
|
|
|
2025-01-08 23:34:51 +00:00
|
|
|
|
2025-01-10 05:40:41 +00:00
|
|
|
##
|
2025-01-25 06:33:30 +00:00
|
|
|
# Inside-container targets
|
2025-01-10 05:40:41 +00:00
|
|
|
#
|
2025-01-25 06:33:30 +00:00
|
|
|
# These targets are used inside containers. They expect the repo to be mounted
|
|
|
|
|
# at /src and the package manager specific build directory to be mounted at
|
|
|
|
|
# /output.
|
2025-01-10 05:40:41 +00:00
|
|
|
##
|
|
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
.PHONY: actually-package-debian-% actually-package-rockylinux-% actually-package-ubuntu-% actually-package-oraclelinux-%
|
2025-01-10 05:40:41 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# Debian package creation
|
|
|
|
|
actually-package-debian-%:
|
2025-06-03 23:25:33 +00:00
|
|
|
$(MAKE) install-systemd DESTDIR=/output/debian-$*
|
2025-01-25 06:33:30 +00:00
|
|
|
cp -r --preserve=mode DEBIAN /output/debian-$*/
|
2025-07-06 07:28:16 +00:00
|
|
|
dpkg-deb -Zgzip --build /output/debian-$* "/output/$(PACKAGE_NAME)-$(DEB_VERSION)-debian-$*.deb"
|
2025-01-10 05:40:41 +00:00
|
|
|
|
2025-01-25 06:33:30 +00:00
|
|
|
# RedHat package creation
|
|
|
|
|
actually-package-rockylinux-%:
|
|
|
|
|
mkdir -p /output/rockylinux-$*/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
|
2025-07-06 07:28:16 +00:00
|
|
|
sed -e "s/@@VERSION@@/$(VERSION)/g" -e "s/@@RELEASE@@/$(RPM_RELEASE)/g" RPM/$(PACKAGE_NAME).spec > /output/rockylinux-$*/SPECS/$(PACKAGE_NAME).spec
|
2025-01-25 06:33:30 +00:00
|
|
|
rpmbuild --define '_topdir /output/rockylinux-$*' \
|
2025-07-06 07:28:16 +00:00
|
|
|
--define 'version $(RPM_VERSION)' \
|
2025-01-25 06:33:30 +00:00
|
|
|
-bb /output/rockylinux-$*/SPECS/$(PACKAGE_NAME).spec
|
2025-07-06 07:28:16 +00:00
|
|
|
cp /output/rockylinux-$*/RPMS/noarch/$(PACKAGE_NAME)-$(RPM_VERSION).el$*.noarch.rpm /output/
|
2025-01-25 06:33:30 +00:00
|
|
|
|
|
|
|
|
# Ubuntu package creation
|
|
|
|
|
actually-package-ubuntu-%:
|
2025-06-03 23:25:33 +00:00
|
|
|
$(MAKE) install-systemd DESTDIR=/output/ubuntu-$*
|
2025-01-25 06:33:30 +00:00
|
|
|
cp -r --preserve=mode DEBIAN /output/ubuntu-$*/
|
2025-07-06 07:28:16 +00:00
|
|
|
dpkg-deb -Zgzip --build /output/ubuntu-$* "/output/$(PACKAGE_NAME)-$(DEB_VERSION)-ubuntu-$*.deb"
|
2025-01-25 06:33:30 +00:00
|
|
|
|
|
|
|
|
# OracleLinux package creation
|
|
|
|
|
actually-package-oraclelinux-%:
|
|
|
|
|
mkdir -p /output/oraclelinux-$*/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
|
2025-07-06 07:28:16 +00:00
|
|
|
sed -e "s/@@VERSION@@/$(VERSION)/g" -e "s/@@RELEASE@@/$(RPM_RELEASE)/g" RPM/$(PACKAGE_NAME)-el7.spec > /output/oraclelinux-$*/SPECS/$(PACKAGE_NAME).spec
|
2025-01-25 06:33:30 +00:00
|
|
|
rpmbuild --define '_topdir /output/oraclelinux-$*' \
|
2025-07-06 07:28:16 +00:00
|
|
|
--define 'version $(RPM_VERSION)' \
|
2025-01-25 06:33:30 +00:00
|
|
|
-bb /output/oraclelinux-$*/SPECS/$(PACKAGE_NAME).spec
|
2025-07-06 07:28:16 +00:00
|
|
|
cp /output/oraclelinux-$*/RPMS/noarch/$(PACKAGE_NAME)-$(RPM_VERSION).el$*.noarch.rpm /output/
|