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