From 773c194279bb6e1ca91de76b82fe94c6e2ff624a Mon Sep 17 00:00:00 2001
From: intrigeri <intrigeri@boum.org>
Date: Tue, 9 Aug 2005 20:28:52 +0000
Subject: [PATCH] Added pgsql (PostgreSQL) handler, with vservers support.

---
 README                     |  1 +
 backupninja                |  2 +
 changelog                  |  4 ++
 etc/backup.d/example.pgsql | 19 ++++++++
 handlers/pgsql             | 96 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 122 insertions(+)
 create mode 100644 etc/backup.d/example.pgsql
 create mode 100644 handlers/pgsql

diff --git a/README b/README
index e3977bc..9e2f2e6 100644
--- a/README
+++ b/README
@@ -62,6 +62,7 @@ file in /etc/backup.d according to the file's suffix:
   .dup     --  filesystem backup (using duplicity)
   .mysql   --  backup mysql databases
   .ldap    --  backup ldap databases
+  .pgsql   --  backup PostgreSQL databases
   .sys     --  general hardware, partition, and system reports.
   .svn     --  backup subversion repositories
   .maildir --  incrementally backup maildirs (very specialized)
diff --git a/backupninja b/backupninja
index 7bd3541..59361b3 100755
--- a/backupninja
+++ b/backupninja
@@ -438,6 +438,8 @@ getconf RDIFFBACKUP /usr/bin/rdiff-backup
 getconf MYSQL /usr/bin/mysql
 getconf MYSQLHOTCOPY /usr/bin/mysqlhotcopy
 getconf MYSQLDUMP /usr/bin/mysqldump
+getconf PGSQLDUMP /usr/bin/pg_dump
+getconf PGSQLDUMPALL /usr/bin/pg_dumpall
 getconf GZIP /bin/gzip
 getconf RSYNC /usr/bin/rsync
 getconf vservers no
diff --git a/changelog b/changelog
index e344db6..198009d 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+version XX -- ...
+
+	added pgsql (PostgreSQL) handler, with vservers support
+
 version 0.7 -- July 26 2005
 	added ninjahelper: a dialog based wizard for creating backupninja configs.
 	considerably improved and changed the log file output.
diff --git a/etc/backup.d/example.pgsql b/etc/backup.d/example.pgsql
new file mode 100644
index 0000000..8313bd4
--- /dev/null
+++ b/etc/backup.d/example.pgsql
@@ -0,0 +1,19 @@
+### backupninja PostgreSQL config file ###
+
+# backupdir = <dir> (default: /var/backups/postgres)
+# where to dump the backups
+#
+# databases = < all | db1 db2 db3 > (default = all)
+# which databases to backup. should either be the word 'all' or a 
+# space separated list of database names.
+# Note: when using 'all', pg_dumpall is used instead of pg_dump, which means
+# that cluster-wide data (such as users and groups) are saved.
+#
+# compress = < yes | no > (default = yes)
+# if yes, compress the pg_dump output. 
+#
+# vsname = <vserver> (no default)
+# what vserver to operate on, only used if vserver = yes in /etc/backupninja.conf
+# if you do not specify a vsname the host will be operated on
+# Note: if operating on a vserver, $VROOTDIR will be prepended to backupdir.
+
diff --git a/handlers/pgsql b/handlers/pgsql
new file mode 100644
index 0000000..8d8f0c7
--- /dev/null
+++ b/handlers/pgsql
@@ -0,0 +1,96 @@
+#
+# PostgreSQL handler script for backupninja
+#
+
+getconf backupdir /var/backups/postgres
+getconf databases all
+getconf compress yes
+getconf vsname
+
+localhost=`hostname`
+
+# If vservers are configured, decide if the handler should
+# use them or if it should just operate on the host
+
+if [ "$vservers" == "yes" ]
+    then
+    if [ ! -z $vsname ]
+	then		
+	info "Using vserver '$vsname'"
+	usevserver=1
+    else
+	info "No vserver name specified, actions will be performed on the host"
+    fi
+fi
+
+# Check to make sure that the specified vserver exists
+if [ $usevserver ]
+    then
+    vroot="$VROOTDIR/$vsname"
+    [ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
+fi
+
+# create backup dir, the vroot variable will be empty if no vsname was specified
+# and will proceed to operate on the host
+[ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir
+[ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'"
+
+# give backup dir the good uid and permissions
+# (in respect to the vserver, if $usevserver)
+pguid=`grep '^postgres:' $vroot/etc/passwd | awk -F: '{print $3}'`
+debug "chown $pguid $vroot$backupdir"
+chown $pguid $vroot$backupdir
+debug "chmod 700 $vroot$backupdir"
+chmod 700 $vroot$backupdir
+
+# if $databases = all, use pg_dumpall
+if [ "$databases" == "all" ]; then
+    if [ $usevserver ]; then
+	execstr="$VSERVER $vsname exec su - postgres -c $PGSQLDUMPALL > $vroot$backupdir/${vsname}.sql"
+    else
+	execstr="su - postgres -c $PGSQLDUMPALL > $backupdir/${localhost}-all.sql"
+    fi
+    debug "$execstr"
+    if [ ! $test ]; then
+	output=`$execstr 2>&1`
+	code=$?
+	if [ "$code" == "0" ]; then
+	    debug $output
+	    info "Successfully finished dump of pgsql cluster"
+	else
+	    warning $output
+	    warning "Failed to dump pgsql cluster"
+	fi
+    fi
+    
+# else use pg_dump on each specified database
+else
+    for db in $databases; do
+	if [ $usevserver ]
+	    then
+	    execstr="$VSERVER $vsname exec su - postgres -c $PGSQLDUMP $db > $vroot$backupdir/${db}.sql"
+	else
+	    execstr="su - postgres -c $PGSQLDUMP $db > $backupdir/${db}.sql"
+	fi
+	debug "$execstr"
+	if [ ! $test ]; then
+	    output=`$execstr 2>&1`
+	    code=$?
+	    if [ "$code" == "0" ]; then
+		debug $output
+		info "Successfully finished dump of pgsql database ${db}"
+	    else
+		warning $output
+		warning "Failed to dump pgsql database ${db}"
+	    fi
+	fi
+    done
+fi
+
+if [ "$compress" == "yes" ]; then
+    output=`$GZIP -f $vroot$backupdir/*.sql 2>&1`
+    debug $output
+fi
+
+return 0
+
-- 
GitLab