Bem-Vindo, Visitante

TÓPICO: sincroniza filtros Sieve ExpressoV2 no ExpressoBR

sincroniza filtros Sieve ExpressoV2 no ExpressoBR 09 Jul 2015 12:21 #1

A quem possa interessar, criamos um shell script que realiza a migração de filtros do Sieve criados pelo ExpressoV2 para o ExpressoBR (povoando a base de dados, no caso usando o Postgresql).

Demos um nome de sincroniza_f.sh, ele funciona a partir de um host que tenha acesso tanto ao servidor de banco de dados do expressoBR quanto ao servidor(es) que está(ão) rodando o Sieve, passando como parâmetros o USUARIO do sieve a ser sincronizado e o SERVIDOR SIEVE que abriga os filtros para este usuário.

Sua execução é via linha de comando do Linux com a seguinte sintaxe:
./sincroniza_f.sh USUARIO SERVIDOR_SIEVE

OBS.:
- O script ainda se encontra embrionário, o seu uso pode acarretar alguns imprevistos na criação de usuarios para o ExpressoBR. A utilização corre pelo risco do executante.
- Qualquer colaboração no aperfeiçoamento deste script, será muito bem vinda.
- Existem algumas limitações que são inerentes à implementação de filtros do ExpressoBR, que não contemplam todos os possíveis tipos de filtro do Sieve, bem como multiplas ações para filtros.

Segue o script:
#!/bin/bash
#sincroniza filtros do Sieve criados pelo Expresso V2 para o V3
#uso: ./sincroniza_f.sh USUARIO SERVIDOR_SIEVE
DOM="DOMINIO_EMAIL"
SRV_BD='SERV_BD'
USR_BD='USUARIO_BD_V3'
BD='BD_V3'


#USUARIO passado como parâmetro
USU=$1
ARQ=$1.script
srv=$2

#obtem arquivo de script do V2
pc_usu=`echo $USU|cut -c1`
usu_dir=`echo $USU|tr '.' '^'`

ssh $srv "cat /var/spool/sieve/$pc_usu/$usu_dir/$USU.script" > $ARQ


cat $ARQ|sed 's/\"/\\\"/g' > ARQ_M_$USU

>insert.$USU.sql
>erro.$USU.log

#obtem account_id        
account_id=`psql -h $SRV_BD -U $USR_BD $BD -t -c "select id from tine20_expressomail_account where email like '$USU@$DOM'"|head -1|sed 's/^ //g'`

#tira backup das regras
psql -h $SRV_BD -U $USR_BD $BD -t -c "select * from tine20_expressomail_sieve_rule where account_id like '$account_id'"|sed 's/^ //g' >> regras_sieve_$USU_`date +%d%m%Y%H%M%S`.bkp

#eliminina regras
psql -h $SRV_BD -U $USR_BD $BD -t -c "delete from tine20_expressomail_sieve_rule where account_id='$account_id'"

#seta vacaion para não
vac=0

script_v3=`echo -e "#GERADO PELO EXPRESSOBR\n"`
script_v3=`echo -e "$script_v3 \n \n"`


while read LINHA;do
#set -x
   LINHA=`echo $LINHA|tr -d '\r'`
   STATMN=`echo $LINHA|awk '{print $1}'`
   
   if [ "$STATMN" == "#PseudoScript#" ];then
      break 
   else
       case $STATMN in
          "require")
                        require=`echo $LINHA`
                        script_v3=`echo -e "$script_v3\n$LINHA"`
                        ;;
          "if"|"elsif") 
                        cond=`echo $LINHA|cut -f 2 -d ' '` 
                        
                        teste=`echo $LINHA|cut -f2- -d'('|cut -f1 -d')'`
                        testes=`echo $teste|sed 's/\", /\"|/g'|sed 's/,/\n/g'|sed 's/^ //g'`
                        echo "$testes" > ARQ_M2_$USU
                        n_cond=1
                        
                           while read LINHA_T;do
                             CONDS[$n_cond]="["
                             LINHA_T=`echo $LINHA_T|tr '|' ','`
                             ftest=`echo $LINHA_T|cut -f 1 -d ':'|cut -f 1 -d ' '`
                             if [ "$ftest" != "size" ];then
                                comperator=`echo $LINHA_T|cut -f2 -d':'|cut -f1 -d' '`
                                header=`echo $LINHA_T|cut -f2 -d':'|cut -f2 -d' '`
                                key=`echo $LINHA_T|cut -f2- -d':'|cut -f3- -d' '`
                                if [ "$comperator" == "matches" -o "$comperator" == "is" ];then
                                      comperator="contains"
                                      key=`echo $key|tr -d '*'`
                                fi
                                cond_if[$n_cond]="$ftest :$comperator $header $key"
                             else
                                comperator=`echo $LINHA_T|cut -f2 -d':'|cut -f1 -d' '`
                                header="\"size\""
                                key=`echo $LINHA_T|cut -f2 -d':'|cut -f2 -d' '|tr -d 'K'`
                                key=$(( key / 1024 ))
                                key_if=$key
                                cond_if[$n_cond]="$ftest :$comperator $key"
                             fi
                             if [ "$cond" == "allof" ];then 
                                 CONDS[$n_cond]="${CONDS[$n_cond]}{\"test\":\"$ftest\",\"comperator\":\"$comperator\",\"header\":$header,\"key\":$key,}"
                             else
                                      CONDS[$n_cond]="[{\"test\":\"$ftest\",\"comperator\":\"$comperator\",\"header\":$header,\"key\":$key}]"
                                      n_cond=$(( n_cond + 1 )) 
                             fi
                            done < ARQ_M2_$USU
                            rm ARQ_M2_$USU
                            if [ "$cond" == "allof" ];then
                               CONDS[1]=`echo ${CONDS[1]}|rev|cut -c2-|rev`
                               CONDS[1]="${CONDS[1]}]"
                            fi
                       ;;
          "fileinto"|"redirect"|"reject"|"setflag"|"discard")  
                         if [ -z "$action_type" ];then
                            action_type=`echo $LINHA|cut -f1 -d ' '`
                            action_argument=`echo $LINHA|cut -f2 -d' '|tr -d ';'|sed 's/\\"//g'`
                            if echo $action_argument|grep '@' >/dev/null 2>&1;then
                                 action_argument=`echo $action_argument|tr -d '"'`
                            fi
                         else
                            echo "$LINHA não cadastrado, multiplos actions não permitidos no V3, cadastrando somente o $action_type $action_argument para a condição ${CONDS[1]}" >> erro.$USU.log
                         fi
                        ;;
          "vacation")
                         vac=1
                         addresses=`echo $LINHA|cut -f 2 -d '['|cut -f1 -d ']'|tr -d '"'`
                         reason=`echo $LINHA|cut -f2 -d ']'|sed 's/^ //g'|tr -d '"'|sed 's/ª/ª/g'|sed 's/º/º/g'| sed 's/á/á/g'|sed 's/ã/ã/g'|sed 's/â/â/g'|sed 's/é/é/g'| sed 's/ê/ê/g'|sed 's/ó/ó/g'| sed 's/ô/ô/g'|sed 's/õ/õ/g'|sed 's/ú/ú/g'| sed 's/ü/ü/g'|sed 's/Ã<80>/À/g'| sed 's/Ã<81>/Á/g'| sed 's/Ã<83>/Ã/g'| sed 's/Ã<82>/Â/g'|sed 's/Ã<89>/É/g'| sed 's/Ã<8a>/Ê/g'|sed 's/Ã<8d>/Í/g'|sed 's/Ã<93>/Ó/g'| sed 's/Ã<94>/Ô/g'| sed 's/Ã<95>/Õ/g'|sed 's/Ã<9a>/Ú/g'|sed 's/Ã<9c>/Ü/g'|sed 's/ç/ç/g'| sed 's/Ã<87>/Ç/g'|sed 's/Ã/à/g'`
                         break
                        ;;
          "}")
                         if [ "$action_type" != "setflag" ];then
                            i=1
                            while [ $i -le ${#CONDS[@]} ];do
                               n_id=`psql -h $SRV_BD -U $USR_BD $BD -t -c "select id from tine20_expressomail_sieve_rule where account_id like '$account_id'"|egrep -v '^$'|sed 's/^ //g'|sort -n|tail -1`
                               if [ -n "$n_id" ];then
                                  n_id=$(( n_id + 1 ))
                               else
                                  n_id='1'
                               fi

			       CONDS[$i]=`echo ${CONDS[$i]}|sed 's/,]$/}]/'`

                               psql -h $SRV_BD -U $USR_BD $BD -t -c "insert into tine20_expressomail_sieve_rule(id,account_id,action_type,action_argument,conditions,enabled) VALUES ('$n_id', '$account_id', '$action_type','$action_argument','${CONDS[$i]}',1)" > /dev/null
                               echo "insert into tine20_expressomail_sieve_rule(id,account_id,action_type,action_argument,conditions,enabled) VALUES ('$n_id', '$account_id', '$action_type','$action_argument','${CONDS[$i]}',1)" >> insert.$USU.sql
                              script_v3=`echo -e "$script_v3\nif allof (${cond_if[$i]}){\n      $action_type \"$action_argument\";\n}"`
                               i=$(( i + 1 ))
                           done
                         else
                            echo "$USU=setflag=$condit=$action_argument não cadastrado" >> erro.$USU.log
                         fi
                         unset CONDS
                         unset action_type
                         unset action_argument
                        ;;
       esac 
   fi
done < ARQ_M_$USU

script_v3=`echo "$script_v3"|sed 's/"/\\\"/g'`
ssh $srv "echo \"$script_v3\" > /var/spool/sieve/$pc_usu/$usu_dir/expressoV3.script;chown cyrus.mail /var/spool/sieve/$pc_usu/$usu_dir/expressoV3.script; su - cyrus -c '/usr/lib/cyrus/bin/sievec /var/spool/sieve/$pc_usu/$usu_dir/expressoV3.script /var/spool/sieve/$pc_usu/$usu_dir/expressoV3.bc';ln -sf /var/spool/sieve/$pc_usu/$usu_dir/expressoV3.bc /var/spool/sieve/$pc_usu/$usu_dir/defaultbc"

rm $ARQ
rm ARQ_M_$USU
echo "FIM $USU"
O administrador desabilitou o acesso público de escrita.
Os seguintes usuários disseram Obrigado: Marcelo costa Toyama, Charliton Medeiros

Respostas no Tópico: sincroniza filtros Sieve ExpressoV2 no ExpressoBR

sincroniza filtros Sieve ExpressoV2 no ExpressoBR Marcio Moriaki Ishikawa 09 Jul 2015 12:21
Moderadores: Emerson Faria Nobre