postfix とdovecot (SMTP Auth) でvirtual その5(dovecotのユーザー管理スクリプト)

ユーザー追加のためのスクリプト

dovecotにSASL認証を任せるためには、ファイルにユーザーとパスワードを記載しなくてはならない。前回の構築では、1ユーザーにつき1ファイルの設定ができたので、それを追加、更新、削除できるようなスクリプトを作ってみた。(以前は1ファイルで複数ユーザーだったので、バックアップは楽でも削除や更新には気を使った)

下記は作ってみたもの。スクリプトが必要以上に大きくならないようにしているが…正直言うと、引数1がユーザー、引数2がドメイン名だと、ついついxxxx@xxxxx.comのように記載したくなるので、むしろ引数1つでよかったんじゃないかなと思ったりはしている。(@が複数ついている場合とかを検知するような部分を書かないとダメだけど)

そういうメールアドレスか否か?という処理はphpにfilterで実装されているので、bashにこだわる必要もないかなと思ったりしている。多分、bashだと正規表現でがっちりと処理を書かないとダメだと思うし。

共通のスクリプト(mail_user_common.sh)

#!/bin/bash
VMAILBOX=/etc/postfix/vmailbox
DOVECOTUSER_DIR=/etc/dovecot/users
VMAILDIR=/var/spool/mail/vhosts
VMAILALIAS=/etc/postfix/virtual

if [ $# -ne 2 ];then
echo ‘$1 = userid ,$2 = domain name’ exit 1;
fi

# dovecotのユーザーディレクトリ作成
if [ ! -d ${DOVECOTUSER_DIR} ];then
mkdir -p ${DOVECOTUSER_DIR}
fi

# postfix のファイル作成
if [ ! -f ${VMAILBOX} ];then
touch ${VMAILBOX}
fi

ユーザー追加のスクリプト(mail_user_add.sh)

#!/bin/bash
. ./mail_user_common.sh

# postfix の設定ファイルにuserが存在しているかチェック
if [ fgrep -c "$1@$2" ${VMAILBOX} -ne 1 ];then
echo “$1@$2 $2/$1/” >> ${VMAILBOX}
fi

# dovecot のパスワードファイルを作る。
CRYPT_PASS=`doveadm pw`
echo “$1@$2:${CRYPT_PASS}” > “${DOVECOTUSER_DIR}/$1@$2”

# 基本メールディレクトリを作る
mkdir -p ${VMAILDIR}/$2/$1
chown vmail:vmail ${VMAILDIR}/$2/$1
chmod 700 ${VMAILDIR}/$2/$1

# postfixのハッシュ更新
postmap ${VMAILBOX}
postmap ${VMAILALIAS}

パスワード変更のスクリプト(mail_user_passchange.sh)

#!/bin/bash
. ./mail_user_common.sh

# postfix の設定ファイルにuserが存在しているかチェックいないなら終了。
if [ fgrep -c "$1@$2" ${VMAILBOX} -ne 1 ];then
echo “user not found”
exit 1;
fi
# dovecot のパスワードファイルを作る。
CRYPT_PASS=doveadm pw echo “$1@$2:${CRYPT_PASS}” > “${DOVECOTUSER_DIR}/$1@$2”

ユーザー削除のスクリプト(mail_user_delete.sh)

#!/bin/bash
. ./mail_user_common.sh
# postfix の設定ファイルにuserが存在しているかチェックいないなら終了。
if [ fgrep -c "$1@$2" ${VMAILBOX} -ne 1 ];then
echo “user not found”
exit 1;
fi
# postfix の設定ファイルの該当行を削除
sed -i -e “/^$1@$2/d” ${VMAILBOX}
# postfixのハッシュ更新
postmap ${VMAILBOX}
postmap ${VMAILALIAS}

# dovecot のパスワードファイルを削除
rm -f “${DOVECOTUSER_DIR}/$1@$2”
if [ -z $1 ] || [ -z $2 ];then
echo ‘ERROR !! $1 or $2 are empty.’
exit 1
else
# 基本メールディレクトリの削除
rm -rf ${VMAILDIR}/$2/$1
fi