Project

General

Profile

オーナー一括削除スクリプト

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