オーナー一括削除スクリプト¶
SQLを使ってオーナーを削除する場合、オーナーが存在しないメーリングリストという
Web画面上からの操作では発生しないエラー状態が起きることがある。これは設定エラー
として処理されるため、即座に配送停止はされないが望ましい状態ではない。
(いつリストが停止されたり配送停止されるかわからない)
そのため一括削除の際に「ドメイン単位であるユーザを削除するが、オーナーがその
ユーザしかいない場合は代わりのアドレスを割り当てる」という処理を実施する。
スクリプト¶
- 以下のスクリプトを作成します。DBに関するパラメータは適宜設定します。
# vi delete_owner.sh -------------------- ##################################### # sh delete_owner.sh <delete_address> <robot_domain> <replace_address> ##################################### #!/bin/sh DEL_OWNER=$1 DEL_DOMAIN=$2 RENAME_ADDRESS=$3 ERR=0 [ -z "${DEL_OWNER}" ] && ERR=1 [ -z "${DEL_DOMAIN}" ] && ERR=1 [ -z "${RENAME_ADDRESS}" ] && ERR=1 if [ ${ERR} -eq 1 ]; then echo "# sh delete_owner.sh <delete_address> <robot_domain> <replace_address>" exit fi DBUSER="sympa" DBPASS="パスワード" DBNAME="sympa" DBHOST="localhost" TMP_FILE=$(mktemp) ##################################### mysql -u ${DBUSER} -p${DBPASS} --database=${DBNAME} --host=${DBHOST} --batch -e \ "select \ a.list_admin,a.robot_admin,a.user_admin \ ,(select count(user_admin) \ from admin_table \ where list_admin=a.list_admin and robot_admin=a.robot_admin \ group by list_admin \ ) AS owners \ from admin_table as a \ where \ user_admin=\"${DEL_OWNER}\" \ and robot_admin=\"${DEL_DOMAIN}\" \ " -N | sed 's/\t/,/g;s/\n//g' >${TMP_FILE} echo "#----------------------------------------------------------------------------" echo "# <listname>,<robot_domain>,<delete_address>,< i=1:replace, i>1:delete >" echo "#----------------------------------------------------------------------------" [ -s ${TMP_FILE} ] || ERR=1 if [ ${ERR} -eq 1 ]; then echo "# 削除対象が存在しないため終了します。" exit fi cat ${TMP_FILE} echo "#----------------------------------------------------------------------------" read -p "# 次のオーナーを削除(一人の場合は置換)します。 Yes[ENTER] / No[Ctrl+C]" echo "#----------------------------------------------------------------------------" while read LINE do DEL_LIST=$(echo ${LINE} |awk -F "," '{print $1}') DEL_DOMAIN=$(echo ${LINE} |awk -F "," '{print $2}') DEL_ADDRESS=$(echo ${LINE} |awk -F "," '{print $3}') DEL_OWNERS=$(echo ${LINE} |awk -F "," '{print $4}') if [ ${DEL_OWNERS} -gt 1 ]; then echo DELETE : ${DEL_LIST}@${DEL_DOMAIN} ${DEL_ADDRESS} mysql -u ${DBUSER} -p${DBPASS} --database=${DBNAME} --host=${DBHOST} --batch -e \ "delete from admin_table \ where \ user_admin=\"${DEL_ADDRESS}\" \ and list_admin=\"${DEL_LIST}\" \ and robot_admin=\"${DEL_DOMAIN}\" \ " else echo REPLACE : ${DEL_LIST}@${DEL_DOMAIN} ${DEL_ADDRESS} ${RENAME_ADDRESS} mysql -u ${DBUSER} -p${DBPASS} --database=${DBNAME} --host=${DBHOST} --batch -e \ "update admin_table \ set user_admin = \"${RENAME_ADDRESS}\" \ where \ user_admin=\"${DEL_ADDRESS}\" \ and list_admin=\"${DEL_LIST}\" \ and robot_admin=\"${DEL_DOMAIN}\" \ " fi done < ${TMP_FILE} rm -f ${TMP_FILE}
- これ自体をスクリプト実行する場合などで確認が不要であれば、readコマンドの行をコメントアウトする。
使い方¶
- 次のように実行します
# sh delete_owner.sh 削除したいアドレス 削除したいドメイン 1件のみの場合置換するアドレス 例:sh delete_owner.sh user@example.co.jp example.co.jp postmaster@example.co.jp
- 対象がいない場合は次のように終了します
#---------------------------------------------------------------------------- # <listname>,<robot_domain>,<delete_address>,< i=1:replace, i>1:delete > #---------------------------------------------------------------------------- # 削除対象が存在しないため終了します。
- 対象がいない場合は次のように終了します
- 対象がある場合、確認メッセージが表示されます。
#---------------------------------------------------------------------------- # <listname>,<robot_domain>,<delete_address>,< i>1:replace, other:delete > #---------------------------------------------------------------------------- test,example.co.jp,user@example.co.jp,2 #---------------------------------------------------------------------------- # 次のオーナーを削除(一人の場合は置換)します。 Yes[ENTER] / No[Ctrl+C] #----------------------------------------------------------------------------
- 実行すると、以下のパターンで削除または置換結果が表示されます。
DELETE : test@example.co.jp user@example.co.jp REPLACE : test@example.co.jp user@example.co.jp postmaster@example.co.jp