diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rwxr-xr-x | build-rpm.sh | 14 | ||||
-rw-r--r-- | dist/fedora/pgbak.spec | 33 | ||||
-rw-r--r-- | etc/systemd-pgbak.conf | 3 | ||||
-rw-r--r-- | pgbak.c | 18 |
5 files changed, 64 insertions, 5 deletions
@@ -1 +1,2 @@ /pgbak +/build diff --git a/build-rpm.sh b/build-rpm.sh new file mode 100755 index 0000000..bd63808 --- /dev/null +++ b/build-rpm.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -ex +version=$(sed -n 's/^Version: *\([0-9.]\+\)$/\1/p' < dist/fedora/pgbak.spec) +[[ -n "$version" ]] +if [[ -d "build" ]]; then + rm -r build +fi +mkdir build build/{src,rpms,srpms} +git archive --prefix="pgbak-$version/" HEAD > "build/src/pgbak-$version.tar.xz" +rpmbuild \ + -D"_sourcedir $PWD/build/src" \ + -D"_srcrpmdir $PWD/build/srpms" \ + -D"_rpmdir $PWD/build/rpms" \ + -ba dist/fedora/pgbak.spec diff --git a/dist/fedora/pgbak.spec b/dist/fedora/pgbak.spec new file mode 100644 index 0000000..823e9a9 --- /dev/null +++ b/dist/fedora/pgbak.spec @@ -0,0 +1,33 @@ +Name: pgbak +Version: 0.0.1 +Release: %autorelease +Summary: A robust WAL archiver for PostgreSQL + +License: LGPL-3.0-or-later +URL: https://git.venev.name/hristo/pgbak/about/ +Source0: pgbak-%{version}.tar.xz + +BuildRequires: make +BuildRequires: gcc + +%description +pgbak is a robust WAL archiver for PostgreSQL. It automates compression as well as the creation of full snapshots. + + +%prep +%autosetup + +%build +%make_build + + +%install +install -Dm755 -t "$RPM_BUILD_ROOT"%{_bindir} pgbak +install -Dm755 etc/systemd-pgbak.conf "$RPM_BUILD_ROOT"%{_unitdir}/postgresql.service.d/10-pgbak.conf + + +%files +%{_bindir}/pgbak +%{_unitdir}/postgresql.service.d/10-pgbak.conf +%license LICENSE LICENSE.GPL3 +%doc README.md diff --git a/etc/systemd-pgbak.conf b/etc/systemd-pgbak.conf new file mode 100644 index 0000000..dd841c9 --- /dev/null +++ b/etc/systemd-pgbak.conf @@ -0,0 +1,3 @@ +[Service] +Environment=PGBAK=/var/lib/pgsql/backups +ExecStopPost=-/usr/bin/pgbak try-wait 60 @@ -660,20 +660,28 @@ int main(int argc, char **argv) { return 1; } + const char *op = argv[1]; + bool is_try_wait = !strcmp(op, "try-wait"); + backup_dfd = open(backup_dir, O_RDONLY | O_DIRECTORY | O_CLOEXEC); if(backup_dfd < 0) { + if(is_try_wait && errno == ENOENT) { + return 0; + } fprintf(stderr, "Failed to open $PGBAK directory '%s': %m\n", backup_dir); return 1; } - lck_fd = openat(backup_dfd, "pgbak.lock", O_RDWR | O_CREAT | O_CLOEXEC, 0600); + int lck_flags = O_RDWR | (is_try_wait ? 0 : O_CREAT) | O_CLOEXEC; + lck_fd = openat(backup_dfd, "pgbak.lock", lck_flags, 0600); if(lck_fd < 0) { + if(is_try_wait && errno == ENOENT) { + return 0; + } fprintf(stderr, "Failed to open $PGBAK/pgbak.lock: %m\n"); - _Exit(1); + return 1; } - const char *op = argv[1]; - if(!strcmp(op, "wal")) { if(argc != 3) goto usage; return cmd_wal(argv[2]); @@ -694,7 +702,7 @@ int main(int argc, char **argv) { return cmd_sync(true, true); } - if(!strcmp(op, "wait")) { + if(is_try_wait || !strcmp(op, "wait")) { if(argc != 2 && argc != 3) goto usage; long timeout = -1; if(argc > 2) { |