aboutsummaryrefslogtreecommitdiff
path: root/handlers/pgsql
blob: 1b916247bc091233757cfcab98b4cc70adc1710c (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
135
136
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
#
# 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 ?
      $VSERVERINFO -q $vsname RUNNING
      if [ $? -ne 0 ]; then
         fatal "The vserver $vsname is not running."
      fi
      # 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'"

# 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 postgres | awk -F: '{print $3}'`
fi
[ -n "$pguid" ] || \
    fatal "No user called postgres`[ $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 - postgres -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${vsname}.sql.gz\""
       else
          execstr="$VSERVER $vsname exec su - postgres -c \"$PGSQLDUMPALL > $backupdir/${vsname}.sql\""
       fi
    else
       if [ "$compress" == "yes" ]; then
          execstr="su - postgres -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${localhost}-all.sql.gz\""
       else
	execstr="su - postgres -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 - postgres -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\""
           else
              execstr="$VSERVER $vsname exec su - postgres -c \"$PGSQLDUMP $db | > $backupdir/${db}.sql\""
           fi
	else
           if [ "$compress" == "yes" ]; then
              execstr="su - postgres -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\""
           else
              execstr="su - postgres -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