File cyrus-imapd.cvt_cyrusdb_all of Package cyrus-imapd
269
1
#!/bin/bash
2
# Simplified version of Simon Matter's cvt_cyrusdb_all.
3
4
function usage() {
5
echo "Usage: $0 [-C <altconfig>] [--verbose] [--devel] <export|import>"
6
exit 1
7
}
8
9
if [ ! -c /dev/null ]; then
10
exit 1
11
fi
12
13
if [ ! -r /dev/null -o ! -w /dev/null ]; then
14
exit 1
15
fi
16
17
if [ "$(stat -c %a /dev/null)" != "666" ]; then
18
chmod 666 /dev/null
19
fi
20
21
if [ -f /etc/sysconfig/cyrus-imapd ]; then
22
. /etc/sysconfig/cyrus-imapd
23
elif [ -f /etc/default/cyrus-imapd ]; then
24
. /etc/default/cyrus-imapd
25
fi
26
27
if [ ! -z "${QUICK}" ]; then
28
if [ ${QUICK} -ne 0 ]; then
29
exit 0
30
fi
31
fi
32
33
# Ensure this script is run as the cyrus user.
34
if [ -x "$(which runuser 2>/dev/null)" ]; then
35
SWITCHUSER=runuser
36
else
37
SWITCHUSER=su
38
fi
39
40
#if [ ! $(whoami) = "cyrus" ]; then
41
# exec $SWITCHUSER -s /bin/bash - cyrus -c "cd \$HOME < /dev/null ; INSTANCE=$0 $*"
42
# exit 0
43
#fi
44
45
alt_config="/etc/imapd.conf"
46
devel_mode=0
47
verbose_mode=0
48
mode=""
49
50
while [ $# -gt 0 ]; do
51
case $1 in
52
-C)
53
alt_config=$2
54
shift; shift
55
;;
56
57
--devel)
58
devel_mode=1
59
shift
60
;;
61
62
--verbose)
63
verbose_mode=1
64
shift
65
;;
66
67
export|import)
68
mode=$1
69
shift
70
;;
71
72
*)
73
usage
74
;;
75
76
esac
77
done
78
79
if [ -z "${mode}" ]; then
80
usage
81
fi
82
83
if [ ${devel_mode} -eq 1 ]; then
84
verbose_mode=1
85
fi
86
87
declare -a dbs
88
declare -a db_paths
89
90
dbs[${#dbs[@]}]="annotation_db"; db_paths[${#db_paths[@]}]="annotations.db"
91
dbs[${#dbs[@]}]="duplicate_db"; db_paths[${#db_paths[@]}]="deliver.db"
92
# dbs[${#dbs[@]}]="mboxkey_db"; db_paths[${#db_paths[@]}]=""
93
dbs[${#dbs[@]}]="mboxlist_db"; db_paths[${#db_paths[@]}]="mailboxes.db"
94
dbs[${#dbs[@]}]="ptscache_db"; db_paths[${#db_paths[@]}]="ptclient/ptscache.db"
95
dbs[${#dbs[@]}]="quota_db"; db_paths[${#db_paths[@]}]="quotas.db"
96
# dbs[${#dbs[@]}]="seenstate_db"; db_paths[${#db_paths[@]}]=""
97
dbs[${#dbs[@]}]="statuscache_db"; db_paths[${#db_paths[@]}]="statuscache.db"
98
# dbs[${#dbs[@]}]="subscription_db"; db_paths[${#db_paths[@]}]=""
99
dbs[${#dbs[@]}]="tls_sessions_db"; db_paths[${#db_paths[@]}]="tls_sessions.db"
100
dbs[${#dbs[@]}]="userdeny_db"; db_paths[${#db_paths[@]}]="user_deny.db"
101
102
# /usr/lib/cyrus-imapd/cyr_dbtool /var/lib/imap/annotations.db skiplist consistent; echo $?
103
# Yes, consistent
104
# 0
105
106
cvt_cyrusdb="/usr/lib/cyrus-imapd/cvt_cyrusdb"
107
cyr_dbtool="/usr/lib/cyrus-imapd/cyr_dbtool"
108
cyr_info="/usr/lib/cyrus-imapd/cyr_info"
109
110
system_magic=$(file --version 2>&1 | awk '/magic file/ {print $4}')
111
112
if [ ${devel_mode} -gt 0 ]; then
113
if [ -f "$(pwd)/imap/cvt_cyrusdb" ]; then
114
cvt_cyrusdb="$(pwd)/imap/cvt_cyrusdb"
115
fi
116
117
if [ -f "$(pwd)/imap/.libs/cyr_dbtool" ]; then
118
cyr_dbtool="$(pwd)/imap/cyr_dbtool"
119
fi
120
121
if [ -f "$(pwd)/imap/.libs/cyr_info" ]; then
122
cyr_info="$(pwd)/imap/cyr_info"
123
fi
124
fi
125
126
function check_consistency() {
127
db_path=$1
128
db_tech=$2
129
130
if [ ! -f "${db_path}" ]; then
131
return 1
132
fi
133
134
retval=$(${cyr_dbtool} -C ${alt_config} ${db_path} ${db_tech} consistent >/dev/null 2>&1; echo $?)
135
136
return ${retval}
137
}
138
139
function convert_database() {
140
retval=$(${cvt_cyrusdb} -C ${alt_config} "$1" "$2" "$3" "$4" >/dev/null 2>&1; echo $?)
141
chown cyrus:mail "$3"
142
}
143
144
function expand_db_path() {
145
if [ "${1:0:1}" != "/" ]; then
146
config_directory=$(get_config "configdirectory")
147
value="${config_directory}/${1}"
148
fi
149
150
echo "${value}"
151
}
152
153
function get_config() {
154
echo $(${cyr_info} -C ${alt_config} conf | grep -E "^$1:\s+" | sed -r -e 's/[a-z0-9_-]+\:\s*(.*)/\1/g')
155
}
156
157
function get_config_default() {
158
echo $(${cyr_info} -C ${alt_config} conf-default | grep -E "^$1:\s+" | sed -r -e 's/[a-z0-9_-]+\:\s*(.*)/\1/g')
159
}
160
161
function get_current() {
162
default_path="$2"
163
value=$(${cyr_info} -C ${alt_config} conf-all | grep -E "^$1_path:\s+" | sed -r -e 's/[a-z0-9_-]+\:\s*(.*)/\1/g')
164
165
if [ -z "${value}" ]; then
166
if [ ! -z "${default_path}" ]; then
167
value=$(expand_db_path "${default_path}")
168
fi
169
fi
170
171
if [ -z "${value}" ]; then
172
return 1
173
fi
174
175
if [ ! -f "${value}" ]; then
176
return 1
177
fi
178
179
current=$(file -b -m /var/lib/imap/rpm/magic:${system_magic} "${value}")
180
181
if echo "${current}" | grep -qi skiplist > /dev/null 2>&1; then
182
current="skiplist"
183
elif echo "${current}" | grep -qi twoskip > /dev/null 2>&1; then
184
current="twoskip"
185
elif echo "${current}" | grep -qi text > /dev/null 2>&1; then
186
current="flat"
187
else
188
current="berkeley"
189
fi
190
191
echo "${current}"
192
}
193
194
config_directory=$(get_config "configdirectory")
195
196
if [ ${devel_mode} -eq 1 ]; then
197
echo "Using configuration directory: '${config_directory}'"
198
fi
199
200
x=0
201
while [ ${x} -lt ${#dbs[@]} ]; do
202
config=$(get_config "${dbs[${x}]}")
203
default=$(get_config_default "${dbs[${x}]}")
204
current=$(get_current "${dbs[${x}]}" "${db_paths[${x}]}")
205
206
if [ ${verbose_mode} -eq 1 ]; then
207
echo -n "${dbs[${x}]}: "
208
fi
209
210
if [ $? -ne 0 ]; then
211
if [ ${verbose_mode} -eq 1 ]; then
212
echo "SKIPPED"
213
fi
214
let x++
215
continue
216
fi
217
218
# If configuration doesn't hold anything, we have defaults
219
if [ -z "${config}" ]; then
220
config="${default}"
221
fi
222
223
if [ "${config}" == "${default}" -a "${config}" == "${current}" ]; then
224
if [ ${verbose_mode} -eq 1 ]; then
225
echo "SKIPPED (unchanged)"
226
fi
227
let x++
228
continue
229
fi
230
231
db_path=$(expand_db_path "${db_paths[${x}]}")
232
233
if [ ! -f "${db_path}" ]; then
234
if [ ${verbose_mode} -eq 1 ]; then
235
echo "SKIPPED (No such file or directory '${db_path}')"
236
fi
237
let x++
238
continue
239
fi
240
241
if [ "${current}" != "${default}" ]; then
242
if [ ${devel_mode} -eq 1 ]; then
243
echo -n "to default(1), "
244
fi
245
convert_database "${db_path}" "${current}" "${db_path}.${default}" "${default}"
246
fi
247
248
if [ "${current}" != "${config}" ]; then
249
mv "${db_path}" "${db_path}.${current}"
250
if [ "${current}" != "${default}" ]; then
251
if [ ${devel_mode} -eq 1 ]; then
252
echo -n "to default(2), "
253
fi
254
convert_database "${db_path}.${current}" "${current}" "${db_path}.${default}" "${default}"
255
fi
256
257
if [ ${devel_mode} -eq 1 ]; then
258
echo -n "to config(1), "
259
fi
260
convert_database "${db_path}.${current}" "${current}" "${db_path}" "${config}"
261
fi
262
263
if [ ${verbose_mode} -eq 1 ]; then
264
echo "OK"
265
fi
266
267
let x++
268
done
269