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
|
TIMEOUT=60
# mailbox list and alphabet (exclude &, / and ~, which dovecot treats specially)
declare -a MAILBOXES=( "INBOX" ) ALPHABET=()
str="!\"#\$'()+,-0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]_\`abcdefghijklmnopqrstuvwxyz{|}"
for ((i=0; i < ${#str}; i++)); do
ALPHABET[i]="${str:i:1}"
done
interimap_init
# start a long-lived interimap process
interimap --watch=1 & PID=$!
trap "ptree_abort $PID" EXIT INT TERM
timer=$(( $(date +%s) + TIMEOUT ))
while [ $(date +%s) -le $timer ]; do
# create new mailbox with 10% probability
if [ $(shuf -n1 -i0-9) -eq 0 ]; then
m=
d=$(shuf -n1 -i1-3) # random depth
for (( i=0; i < d; i++)); do
l=$(shuf -n1 -i1-16)
m="${m:+$m.}$(shuf -n "$l" -e -- "${ALPHABET[@]}" | tr -d '\n')"
done
MAILBOXES+=( "$m" )
u="$(shuf -n1 -e "local" "remote")" # choose target at random
[ "$u" = "local" ] || m="${m//./^}"
doveadm -u "$u" mailbox create --no-userdb-lookup -- "$m"
fi
# EXPUNGE some messages
u="$(shuf -n1 -e "local" "remote")" # choose target at random
n="$(shuf -n1 -i0-3)"
while read guid uid; do
doveadm -u "$u" expunge --no-userdb-lookup mailbox-guid "$guid" uid "$uid"
done < <(doveadm -u "$u" search --no-userdb-lookup all | shuf -n "$n")
# mark some existing messages as read (toggle \Seen flag as unlike other
# flags it's easier to query and check_mailboxes_status checks it)
u="$(shuf -n1 -e "local" "remote")" # choose target at random
n="$(shuf -n1 -i0-9)"
while read guid uid; do
a="$(shuf -n1 -e add remove replace)"
doveadm -u "$u" flags "$a" --no-userdb-lookup "\\Seen" mailbox-guid "$guid" uid "$uid"
done < <(doveadm -u "$u" search --no-userdb-lookup all | shuf -n "$n")
# select at random a mailbox where to deliver some messages
u="$(shuf -n1 -e "local" "remote")" # choose target at random
m="$(shuf -n1 -e -- "${MAILBOXES[@]}")"
[ "$u" = "local" ] || m="${m//./^}"
# deliver between 1 and 5 messages to the chosen mailbox
n="$(shuf -n1 -i1-5)"
for (( i=0; i < n; i++)); do
sample_message | deliver -u "$u" -- -m "$m"
done
# sleep a little bit (sometimes beyond --watch timer, sometimes not)
s=$(shuf -n1 -i1-1500)
[ $s -ge 1000 ] && s="$(printf "1.%03d" $((s-1000)))" || s="$(printf "0.%03d" $s)"
sleep "$s"
done
# wait a little longer so interimap has time to run loop() again and
# synchronize outstanding changes, then terminate the process we started
# above
sleep 5
ptree_abort $PID
trap - EXIT INT TERM
check_mailbox_list
check_mailboxes_status "${MAILBOXES[@]}"
# vim: set filetype=bash :
|