# create database interimap # start a long-lived interimap process interimap --watch=1 & pid=$! abort() { # kill interimap process and its children pkill -P "$pid" -TERM || true kill -TERM "$pid" || true wait } trap abort EXIT INT TERM # 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 timer=$(( $(date +%s) + 30 )) 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 -- "$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 mailbox-guid "$guid" uid "$uid" done < <(doveadm -u "$u" search 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" "\\Seen" mailbox-guid "$guid" uid "$uid" done < <(doveadm -u "$u" search 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 sleep "0.$(shuf -n1 -i1-99)" 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 2 abort trap - EXIT INT TERM check_mailbox_list check_mailboxes_status "${mailboxes[@]}" # vim: set filetype=sh :