aboutsummaryrefslogtreecommitdiff
path: root/handlers/pgsql.in
blob: 0b7badfdecb51c1c122c71f04a1ecf807a304f89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
#
# PostgreSQL handler script for backupninja
#

getconf backupdir /var/backups/postgres
getconf databases all
getconf compress yes
getconf vsname

localhost=`hostname`

# Decide if the handler should operate on a vserver or on the host.
# In the former case, check that $vsname exists and is running.
local usevserver=no
local vroot
if [ $vservers_are_available = yes ]; then
   if [ -n "$vsname" ]; then
      # does it exist ?
      if ! vservers_exist "$vsname" ; then
         fatal "The vserver given in vsname ($vsname) does not exist."
      fi
      # is it running ?
      vservers_running $vsname || fatal "The vserver $vsname is not running."
      # everything ok
      info "Using vserver '$vsname'."
      usevserver=yes
      vroot="$VROOTDIR/$vsname"
   else
      info "No vserver name specified, actions will be performed on the host."
   fi
fi

# Make sure that the system to backup has the needed executables
if [ $usevserver = yes ]; then
   debug "Examining vserver '$vsname'."
   if [ "$databases" == "all" ]; then
      [ -x "$vroot`$VSERVER $vsname exec which $PGSQLDUMPALL`" ] || \
         fatal "Can't find $PGSQLDUMPALL in vserver $vsname."
   else
      [ -x "$vroot`$VSERVER $vsname exec which $PGSQLDUMP`" ] || \
         fatal "Can't find $PGSQLDUMP in vserver $vsname."
   fi
else
   if [ "$databases" == "all" ]; then
      [ -x "`which $PGSQLDUMPALL`" ] || \
         fatal "Can't find $PGSQLDUMPALL."
   else
      [ -x "`which $PGSQLDUMP`" ] || \
         fatal "Can't find $PGSQLDUMP."
   fi
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 ] || (debug "mkdir -p $vroot$backupdir"; mkdir -p $vroot$backupdir)
[ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir' does not exist, and could not be created."

# give backup dir the good uid and permissions
# (in respect to the vserver, if $usevserver = yes)
if [ $usevserver = yes ]; then
   pguid=`$VSERVER $vsname exec getent passwd $PGSQLUSER | @AWK@ -F: '{print $3}'`
else
   pguid=`getent passwd $PGSQLUSER | @AWK@ -F: '{print $3}'`
fi
[ -n "$pguid" ] || \
   fatal "No user called $PGSQLUSER`[ $usevserver = no ] || echo \" on vserver $vsname\"`."
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 = yes ]; then
      if [ "$compress" == "yes" ]; then
         execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"set -o pipefail ; $PGSQLDUMPALL | $GZIP $GZIP_OPTS > '$backupdir/${vsname}.sql.gz'\""
      else
         execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMPALL > '$backupdir/${vsname}.sql'\""
      fi
   else
      if [ "$compress" == "yes" ]; then
         execstr="su - $PGSQLUSER -c \"set -o pipefail ; $PGSQLDUMPALL | $GZIP $GZIP_OPTS > '$backupdir/${localhost}-all.sql.gz'\""
      else
         execstr="su - $PGSQLUSER -c \"$PGSQLDUMPALL > '$backupdir/${localhost}-all.sql'\""
      fi
   fi
   debug "$execstr"
   if [ ! $test ]; then
      output=`eval $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 = yes ]; then
         if [ "$compress" == "yes" ]; then
            execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"set -o pipefail ; $PGSQLDUMP $db | $GZIP $GZIP_OPTS > '$backupdir/${db}.sql.gz'\""
         else
            execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMP $db | > '$backupdir/${db}.sql'\""
         fi
      else
         if [ "$compress" == "yes" ]; then
            execstr="su - $PGSQLUSER -c \"set -o pipefail ; $PGSQLDUMP $db | $GZIP $GZIP_OPTS > '$backupdir/${db}.sql.gz'\""
         else
            execstr="su - $PGSQLUSER -c \"$PGSQLDUMP $db > '$backupdir/${db}.sql'\""
         fi
      fi
      debug "$execstr"
      if [ ! $test ]; then
         output=`eval $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

return 0