f37 -> f39
[infrastructure.git] / scripts / backup-helper-deprecated
1 #!/bin/sh
2
3 # Goal: backup a directory
4 # $1: Destination
5 # $2: Server name (i.e.: onelab2)
6 # $3: Backup name (i.e.: twiki)
7 # $4: Date
8 # $5: Directory to backup
9 function backup_dir {
10         DEST=$1
11         BACKUP_NAME=$1/$2-$3-$4.tar.bz2
12         DIR=$5
13         mkdir -p $DEST
14         if [ ! -d $DIR ]; then
15                 echo " (No such directory) [KO]"
16                 return 1
17         fi
18         cd $DIR
19         echo -n "Backup directory $DIR..."
20         tar cfjp $BACKUP_NAME *
21         RES=$?
22         echo -n " (`stat --printf="%s" $BACKUP_NAME`)"
23         if [ $RES -eq 0 ]; then
24                 echo " [ OK ]"
25         else
26                 echo " [ KO ]"
27         fi
28
29         return 0
30 }
31
32 # Goal: backup a PostgreSQL database
33 # $1: Destination
34 # $2: Server name (i.e.: onelab2)
35 # $3: Date
36 # $4: Database name
37 # $5: Database owner
38 function backup_db {
39         DEST=$1
40         DBNAME=$4
41         DBUSER=$5
42         BACKUP_NAME=$DEST/$2-db-$DBNAME-$3.bak
43         mkdir -p $DEST
44         echo -n "Backup database $DBNAME..."
45         pg_dump -i -U postgres --user=$DBUSER -F c -f $BACKUP_NAME $DBNAME
46         RES=$?
47         echo -n " (`stat --printf="%s" $BACKUP_NAME`)"
48         if [ $RES -eq 0 ]; then
49                 echo " [ OK ]"
50         else
51                 echo " [ KO ]"
52                 return 1
53         fi
54
55         return 0
56 }
57
58 # Goal: backup all PostgreSQL databases on the machine
59 # $1: Destination
60 # $2: Server name (i.e.: onelab2)
61 # $3: Date
62 function backup_all_dbs {
63         for i in `psql -qtAF '|' -U postgres -l`; do
64                 DBNAME=`echo $i | cut -d '|' -f 1`
65                 DBUSER=`echo $i | cut -d '|' -f 2`
66                 if [ $DBNAME != template0 -a $DBNAME != template1 ]; then
67                         backup_db $1 $2 $3 $DBNAME $DBUSER
68                 fi
69         done
70 }
71
72 # Goal: backup a database in a VServer
73 # $1: Destination
74 # $2: VServer name (i.e.: onelab2)
75 # $3: Backup name (i.e.: twiki)
76 # $4: Date
77 # $5: Database name
78 # $6: Database owner
79 function backup_vserver_db {
80         DEST=$1
81         VSERVER=$2
82         BACKUP_NAME=$1/$2-$3-$4.bak
83         DBNAME=$5
84         DBUSER=$6
85         mkdir -p $DEST
86         mkdir -p /vservers/$VSERVER/$DEST
87         echo -n "Backup database $DBNAME..."
88         vserver $VSERVER exec \
89                 pg_dump -i -U postgres --user=$DBUSER -F c -v -f $BACKUP_NAME \
90                 -- $DBNAME >/dev/null
91         RES=$?
92         mv /vservers/$VSERVER/$BACKUP_NAME $BACKUP_NAME
93         echo -n " (`stat --printf="%s" $BACKUP_NAME`)"
94         if [ $RES -eq 0 ]; then
95                 echo " [ OK ]"
96         else
97                 echo " [ KO ]"
98                 return 1
99         fi
100
101         return 0
102 }
103
104 # Goal: backup an offline vserver instance
105 # $1: Destination (where to save the backup)
106 # $2: VServer name (i.e.: plc)
107 # $3: Date
108 function backup_vserver_offline {
109         DEST=$1
110         VSERVER=$2
111         BACKUP_NAME=$1/$2-vs-$3.off.tar.bz2
112         BACKUP_CONF_NAME=$1/$2-vsconf-$3.off.tar.bz2
113         mkdir -p $DEST
114         echo -n "Backup vserver $VSERVER..."
115         if [ ! -d /etc/vservers/$VSERVER ]; then
116                 echo " (No such vserver) [ KO ]"
117                 return 1
118         fi
119
120         cd /etc/vservers/$VSERVER &&
121         tar cfjp $BACKUP_CONF_NAME * 2>&1 >/dev/null &&
122         cd /vserver/$VSERVER &&
123         tar cfjp $BACKUP_NAME * 2>&1 >/dev/null
124         RES=$?
125
126         echo -n " (`stat --printf="%s" $BACKUP_NAME`)"
127         if [ $RES -eq 0 ]; then
128                 echo " [ OK ]"
129         else
130                 echo " [ KO ]"
131                 return 1
132         fi
133
134         return 0
135 }
136
137 # Goal: backup an online vserver instance
138 # $1: Destination (where to save the backup)
139 # $2: VServer name (i.e.: plc)
140 # $3: Date
141 # $4: LVM dev on which the VServer is mounted (default to /dev/vg/$2 if empty)
142 function backup_vserver_online {
143         DEST=$1
144         VSERVER=$2
145         BACKUP_NAME=$1/$2-vs-$3.on.tar.bz2
146         BACKUP_CONF_NAME=$1/$2-vsconf-$3.on.tar.bz2
147         DEV=$4
148         if [ -z $DEV ]; then
149                 DEV="/dev/vg/$VSERVER"
150         fi
151
152         echo -n "Backup vserver $VSERVER..."
153         mkdir -p $DEST >/dev/null
154         
155         SNAPDEV=${DEV}bkp
156         if [ ! -d /etc/vservers/$VSERVER ]; then
157                 echo " (No such vserver) [ KO ]"
158                 return 1
159         fi
160
161         # Create a snapshot of the running vserver filesystem...
162         SNAPVG=`echo $SNAPDEV | cut -f 3 -d '/'`
163         SNAPLV=`echo $SNAPDEV | cut -f 4 -d '/'`
164         SNAPMOUNT=/tmp/$SNAPLV
165         lvcreate -L20G -s -n$SNAPLV $DEV >/dev/null
166         if [ $? -ne 0 ]; then
167                 echo " (Can't create snapshot volume: $SNAPDEV) [ KO ]"
168                 return 1
169         fi
170
171         # ... mount it and backup it...
172         cd /etc/vservers/$VSERVER &&
173         tar cfjp $BACKUP_CONF_NAME * &&
174         mkdir -p $SNAPMOUNT &&
175         mount -t ext3 $SNAPDEV $SNAPMOUNT -o ro &&
176         cd $SNAPMOUNT &&
177         tar cfjp $BACKUP_NAME * 2>/dev/null >/dev/null
178         RES=$?
179
180         # ... and remove the snapshot
181         cd &&
182         umount $SNAPMOUNT &&
183         lvremove -f $SNAPDEV >/dev/null &&
184         rmdir $SNAPMOUNT
185         if [ $? -ne 0 ]; then
186                 echo " (Can't delete snapshot volume: $SNAPDEV) [ KO ]"
187                 return 1
188         fi
189
190         echo -n " (`stat --printf="%s" $BACKUP_NAME`)"
191         if [ $RES -eq 0 ]; then
192                 echo " [ OK ]"
193         else
194                 echo " [ KO ]"
195                 return 1
196         fi
197
198         return 0
199 }
200
201 # Goal: backup a vserver instance (online or offline)
202 # $1: Destination (where to save the backup)
203 # $2: VServer name (i.e.: onelab2)
204 # $3: Date
205 function backup_vserver {
206         DEST=$1
207         VSERVER=$2
208         DATE=$3
209         if [ ! -d /etc/vservers/$VSERVER ]; then
210                 echo "Backup vserver $VSERVER... (No such vserver) [ KO ]"
211         fi
212
213         ctx=`cat /etc/vservers/$VSERVER/context`
214         vserver-stat | grep $ctx 2>&1 > /dev/null
215         offline=$?
216
217         if [ $offline -eq 0 ]; then
218                 backup_vserver_online $DEST $VSERVER $DATE
219         else
220                 backup_vserver_offline $DEST $VSERVER $DATE
221         fi
222         return $?
223 }
224
225 # Goal: backup all vserver instances (online or offline) on the machine
226 # $1: Destination (where to save the backup)
227 # $2: Date
228 function backup_all_vservers {
229         for i in /etc/vservers/*; do
230                 VSERVER=`basename $i`
231                 backup_vserver $1 $VSERVER $2
232         done
233 }
234
235 # Fetch all backups from a server
236 # $1: destination
237 # $2: hostname
238 # $3: backup user
239 # $4: backup location
240 function fetch_backup {
241         DEST=$1
242         BACKUP_HOST=$2
243         BACKUP_USER=$3
244         BACKUP_LOC=$4
245         echo -n "Fetch backups from $BACKUP_HOST..."
246         su $BACKUP_USER -c "mkdir -pv $DEST"
247         su $BACKUP_USER -c "rsync --exclude="lost+found" -a $BACKUP_USER@$BACKUP_HOST:$BACKUP_LOC/ $DEST"
248         RES=$?
249         if [ $RES -eq 0 ]; then
250                 echo " [OK]"
251         else
252                 echo " [KO]"
253         fi
254         
255         return 0
256 }
257