38b1fa307c9fc32e8cff18740dc83079dedaab80
[citadel.git] / citadel / database_cleanup.sh
1 #!/bin/bash
2
3 die () {
4         echo Exiting.
5         exit 1
6 }
7
8 DATA_DIR="/usr/local/citadel"
9
10 usage() {
11         echo "Usage: database_cleanup.sh [ -h citadel_dir ]"
12         exit 2
13 }
14
15 PARSED_ARGUMENTS=$(getopt -a -n database_cleanup.sh -o h: -- "$@")
16 VALID_ARGUMENTS=$?
17 if [ "$VALID_ARGUMENTS" != "0" ]; then
18         usage
19 fi
20
21 eval set -- "$PARSED_ARGUMENTS"
22 while :
23 do
24         case "$1" in
25                 -h | --alpha)
26                         DATA_DIR=${2}
27                         shift 2
28                         ;;
29                 # -- means the end of the arguments; drop this, and break out of the while loop
30                 --) shift; break ;;
31                 # If invalid options were passed, then getopt should have reported an error,
32                 # which we checked as VALID_ARGUMENTS when getopt was called...
33                 *) echo "Unexpected option: $1 - this should not happen."
34                         usage
35                         ;;
36         esac
37 done
38
39 DATA_DIR=$DATA_DIR/data
40
41 # If we're on a Docker or Easy Install system, use our own db_ tools.
42 if [ -x /usr/local/ctdlsupport/bin/db_dump ] ; then
43         export PATH=/usr/local/ctdlsupport/bin:$PATH
44         RECOVER=/usr/local/ctdlsupport/bin/db_recover
45         DUMP=/usr/local/ctdlsupport/bin/db_dump
46         LOAD=/usr/local/ctdlsupport/bin/db_load
47
48 # usual install
49 else
50         if test -f /usr/bin/db_dump; then 
51                 RECOVER=/usr/bin/db_recover
52                 DUMP=/usr/bin/db_dump
53                 LOAD=/usr/bin/db_load
54         else
55                 if test -n "`ls /usr/bin/db?*recover`"; then
56                         # seems we have something debian alike thats adding version in the filename
57                         if test "`ls /usr/bin/db*recover |wc -l`" -gt "1"; then 
58                                 echo "Warning: you have more than one version of the Berkeley DB utilities installed." 1>&2
59                                 echo "Using the latest one." 1>&2
60                                 RECOVER=`ls /usr/bin/db*recover |sort |tail -n 1`
61                                 DUMP=`ls /usr/bin/db*dump |sort |tail -n 1`
62                                 LOAD=`ls /usr/bin/db*load |sort |tail -n 1`
63                         else
64                                 RECOVER=`ls /usr/bin/db*recover`
65                                 DUMP=`ls /usr/bin/db*dump`
66                                 LOAD=`ls /usr/bin/db*load`
67                         fi
68                 else
69                         echo "database_cleanup.sh cannot find the Berkeley DB utilities.  Exiting." 1>&2
70                         die
71                 fi
72
73         fi
74 fi
75
76 # Ok, let's begin.
77
78 clear
79 cat <<!
80
81 Citadel Database Cleanup
82 ---------------------------
83
84 This script exports, deletes, and re-imports your database.  If you have
85 any data corruption issues, this program may be able to clean them up for you.
86  
87 Please note that this program does a Berkeley DB dump/load, not a Citadel
88 export.  The export files are not generated by the Citadel export module.
89
90 WARNING #1:
91   MAKE A BACKUP OF YOUR DATA BEFORE ATTEMPTING THIS.  There is no guarantee
92   that this will work (in case of disk full, power failure, program crash)!
93
94 WARNING #2:
95   citserver must NOT be running while you do this.
96
97 WARNING #3:
98   Please try "cd $DATA_DIR; $RECOVER -c" first. Run citserver afterwards to 
99   revalidate whether its fixed or not, No news might be good news. Use this
100   tool only if that one fails to fix your problem.
101
102 WARNING #4:
103   You must have an amount of free space in /tmp that is at least twice
104   the size of your database. see the following output:
105
106 `df -h`
107
108 you will need `du -sh $DATA_DIR|sed "s;/.*;;"` of free space.
109
110 !
111
112 echo We will attempt to look for a Citadel database in $DATA_DIR
113 echo -n "Do you want to continue? "
114
115 read yesno
116 case "$yesno" in
117         "y" | "Y" | "yes" | "YES" | "Yes" )
118                 echo 
119                 echo DO NOT INTERRUPT THIS PROCESS.
120                 echo
121         ;;
122         * )
123                 exit
124 esac
125
126 for x in 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d
127 do
128         filename=cdb.$x
129         echo Dumping $filename
130         $DUMP -h $DATA_DIR $filename >/tmp/CitaDump.$x || {
131                 echo error $?
132                 die
133         }
134         rm -vf $DATA_DIR/$filename
135 done
136
137 echo Removing old databases
138 rm -vf $DATA_DIR/*
139
140 for x in 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d
141 do
142         filename=cdb.$x
143         echo Loading $filename
144         $LOAD -h $DATA_DIR $filename </tmp/CitaDump.$x && {
145                 rm -f /tmp/CitaDump.$x
146         }
147 done
148
149 echo 
150 echo Dump/load operation complete.  Start your Citadel server now.
151 echo