#!/bin/bash## importa_destinatarios.sh - Importa os destinatarios dos arquivos txt/csv ou LDAP/AD do cliente## Site : www.tibox.com.br# Autor : Ricardo Felipe Klein <klein@tibox.com.br>## -----------------------------------------------------## Importa os destinatarios dos arquivos txt/csv ou LDAP/AD do cliente# ## Exemplos:# Se importacao proveniente de arquivos e o script deve gerar o CSV# $ ./importa_destinatarios.sh \# --cliente 1 \# --javaopts "-Xms1024m -Xmx1024m" \# --tipo_importacao F \# --email_aviso "suporte@tibox.com.br suporte@cliente1.com.br" \# --precisa_gerar_csv "S" \# --path_arq_cliente "/home/cliente/import" \# --files "arquivo01.txt arquivo02.csv"### Se importacao proveniente de arquivos e o script nao precisa gerar o CSV# $ ./importa_destinatarios.sh \# --cliente 1 \# --javaopts "-Xms1024m -Xmx1024m" \# --tipo_importacao F \# --email_aviso "suporte@tibox.com.br suporte@cliente1.com.br" \# --path_arq_cliente "/home/<cliente>/import" \# --files "arquivo01.txt arquivo02.csv"## Se importacao proveniente de um LDAP/AD# $ ./importa_destinatarios.sh \# --cliente 1 \# --javaopts "-Xms1024m -Xmx1024m" \# --tipo_importacao L \# --email_aviso "suporte@tibox.com.br suporte@cliente1.com.br" \# --arq_yml "/path/to/file/arquivo.yml" \# --connector_jar_path "/path/to/connector" \# --connector_jar_bin "AllertConnector.jar"## -----------------------------------------------------## Historico:## v0.1 2010-05-10, autor: Ricardo Felipe Klein# - Versão inicial# - Envia email de alerta# - Passagem de parametros com --parametro valor## -----------------------------------------------------## Depende:# - BASH# - allert_import.jar# - tree_generator.jar# - gera_import.jar (opcional)# - Permissão de escrita em /var/log/ e /var/run/ (o proprio script cria as pastas dele)# - (parametro --cliente ) Numero do cliente# - (parametro --javaopts ) Opcoes passadas ao java na hora de executar os jars# - (parametro --tipo_importacao ) Tipo de importacao (L)-LDAP/AD (F)-FILES# - (parametro --email_aviso ) Um ou mais enderecos de email que receberao os avisos em caso de problema# - (parametro --path_arq_cliente ) Se importacao FILES passa o path dos arquivos recebidos do cliente# - (parametro --files ) Se importacao FILES passa os nomes dos arquivos utilizados para gerar o CSV# - (parametro --precisa_gerar_csv ) Se importacao FILES passar "S" sempre que precisar usar gera_import ou ex.:interface_porto# - (parametro --arq_yml ) Se importacao LDAP/AD passa o caminho/nome do arquivo YML# - (parametro --connector_jar_path) Se importacao LDAP/AD passa o path do connector.jar# - (parametro --connector_jar_bin ) Se importacao LDAP/AD passa o nome do connector.jar## -----------------------------------------------------## LE PARAMETROS#while test -n "$1"do case "$1" in --files) shift FILES="$1" ;; --javaopts) shift JAVAOPTS="$1" ;; --cliente) shift CLIENTE="$1" ;; --email_aviso) shift EMAIL_AVISO="$1" ;; --tipo_importacao) shift TIPO_IMPORTACAO="$1" ;; --path_arq_cliente) shift PATH_ARQ_CLIENTE="$1" ;; --arq_yml) shift ARQ_YML="$1" ;; --connector_jar_path) shift CONNECTOR_JAR_PATH="$1" ;; --connector_jar_bin) shift CONNECTOR_JAR_BIN="$1" ;; --precisa_gerar_csv) shift PRECISA_GERAR_CSV="$1" ;; --gera_import) shift GERA_IMPORT="$1" ;; esacshiftdone## VARIAVEIS# ANO=$(date +%Y) MES=$(date +%m) DIA=$(date +%d) SCRIPTS_DIR="/root" PID_FILE="/var/run/allert/importa_destinatarios.pid" LOG_FILE="/var/log/allert/importa_destinatarios.log" MESSAGE_BODY="/root/scripts/message_body.txt" SLEEP="2" JAVA="/usr/lib/java/bin/java" ALLERT_IMPORT_DIR="/usr/local/include/import" ALLERT_IMPORT_BIN="$ALLERT_IMPORT_DIR/AllertImport.jar"TREE_GENERATOR_DIR="/usr/local/include/tree"TREE_GENERATOR_BIN="$TREE_GENERATOR_DIR/TreeGenerator.jar" GERA_CSV="$SCRIPTS_DIR/gera_csv_$CLIENTE.sh" IMPORT_DIR="/var/www/allert.com.br/clientes/$CLIENTE/import" CSV="psql -t -A -U postgres -d desk_cms -c \"SELECT ds_arquivo FROM dicionario_arquivos WHERE cd_cliente=$CLIENTE;\" " DIRETORIOS="/var/run/allert /var/log/allert $IMPORT_DIR/OLD"## FUNCOES DE CHECAGEM#checa_email_aviso () { # Se $EMAIL_AVISO = NULL para o processo e exibe mensagem na tela if [ -z "$EMAIL_AVISO" ] then echo "#########################################################" echo " WARNING!!! VOCE NAO PREENCHEU UM EMAIL DE AVISO!!! " echo "#########################################################" exit 1 fi}checa_path_cliente () { # Se $TIPO_IMPORTACAO=F, checa a existencia do $PATH_CLIENTE if [ "$TIPO_IMPORTACAO" = "F" ] && [ "$PRECISA_GERAR_CSV" = "S" ] then if [ -d "$PATH_CLIENTE" ] then echo "" else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! $PATH_CLIENTE nao existe!!! " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi fi}checa_arquivos_cliente () { # Se a variavel $TIPO_IMPORTACAO for igual a F # E $PATH_CLIENTE existir checa os arquivos if [ "$TIPO_IMPORTACAO" = "F" ] && [ "$PRECISA_GERAR_CSV" = "S" ] then if [ -d $PATH_ARQ_CLIENTE ] then ARQUIVO="" cd $PATH_ARQ_CLIENTE for ARQUIVO in $FILES do if [ -f $ARQUIVO ] then # Checa se o arquivo contem dados if [ -s "$ARQUIVO" ] then echo "" else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! - ARQUIVO $ARQUIVO ESTA VAZIO" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! $ARQUIVO NAO EXISTE " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi done fi else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! O PATH $PATH_ARQ_CLIENTE NAO EXISTE " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi}checa_arquivos_csv () { # Verifica os arquivos CSV ARQUIVO="" cd $IMPORT_DIR for ARQUIVO in $CSV do # Checa se arquivo existe if [ -f $ARQUIVO ] then # Se existir, checa se tamanho maior que zero if [ -s $ARQUIVO ] then echo "" else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! $ARQUIVO ESTA VAZIO!!!" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! $ARQUIVO nao existe!!!" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi done}checa_tipo_importacao () { # Verifica se o TIPO_IMPORTACAO = L ou F if [ "$TIPO_IMPORTACAO" != "L" ] && [ "$TIPO_IMPORTACAO" != "F" ] then echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! TIPO_IMPORTACAO precisa ser F ou L !!!" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi}checa_arq_yml () { # Se a variavel $ARQ_YML estiver preenchida, testa o arquivo if [ -n "$ARQ_YML" ] then # Verifica se o $ARQ_YML existe if [ -f "$ARQ_YML" ] then echo "" else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! - ARQUIVO YML NAO EXISTE " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi # Verifica se o $ARQ_YML contem dados if [ -s "$ARQ_YML" ] then echo "" else echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! - ARQUIVO YML VAZIO " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi fi}checa_diretorios () { # Verifica se os diretorios de log e pid existem, senao cria eles for D in $DIRETORIOS; do if [ -d $D ] then echo "" else mkdir -p $D fi done}checa_processo () { # verifica se nao ha nenhum processo ativo if [ -f $PID_FILE ] then echo "`date` - Existe um processo ativo" echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! - EXISTE UM PROCESSO ATIVO " >> $LOG_FILE 2>&1 echo " PID: `cat $PID_FILE` " >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" else echo -e "\n \n" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 echo " `date` - INICIANDO O PROCESSO" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 echo -e "\n \n" >> $LOG_FILE 2>&1 # Cria o PID file e deixa o PID do processo gravado nele echo $$ > $PID_FILE fi}checa_fl_importacao_ativa () { # Executa uma query no banco e verifica a fl_importacao_ativa # Se for igual a "S", temos um problema nesta importacao ou tivemos na ultima FL_IMPORTACAO_ATIVA=`su - postgres -c "psql -A -t -U postgres -d desk_cms -c \"SELECT fl_importacao_ativa FROM sistema WHERE cd_cliente=$CLIENTE; \" " ` if [ "$FL_IMPORTACAO_ATIVA" = "S" ] then echo "#########################################################" >> $LOG_FILE 2>&1 echo "WARNING!!! - FL_IMPORTACAO_ATIVA=S PARA O CLIENTE $CLIENTE" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi}checa_cliente_existe () { # Executa uma query no banco e verifica se o cliente existe # Se a variavel estiver nula eh porque o cliente nao existe CLIENTE_EXISTE=`su - postgres -c "psql -A -t -U postgres -d desk_cms -c \"SELECT cd_cliente FROM clientes WHERE cd_cliente=$CLIENTE; \" " ` if [ -z "$CLIENTE_EXISTE" ] then echo "#########################################################" >> $LOG_FILE 2>&1 echo " WARNING!!! - O CLIENTE $CLIENTE NAO EXISTE" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi}## FUNCOES DE IMPORTACAO#gera_import () { if [ -f $GERA_CSV ] then # Se $TIPO_IMPORTACAO=F if [ "$TIPO_IMPORTACAO" = "F" ] then if [ -f "$PRECISA_GERAR_CSV" = "S" ] then # Gera os arquivos CSV de importacao a partir do sarquivos do cliente # usando o script personalizado de cada cliente sh $GERA_CSV --cliente $CLIENTE --javaopts $JAVAOPTS --path_arq_cliente $PATH_ARQ_CLIENTE --files $FILES --import_dir $IMPORT_DIR else #Apenas Copia os arquivos CSV para o path de importacao for ARQUIVO in $FILES do cp $PATH_ARQ_CLIENTE/$ARQUIVO $IMPORT_DIR done fi fi #if [ "$TIPO_IMPORTACAO" = "F" ] # Se $TIPO_IMPORTACAO=L if [ "$TIPO_IMPORTACAO" = "L" ] then # Gera os arquivos CSV de importacao a partir do sarquivos do cliente # usando o script personalizado de cada cliente sh $GERA_CSV --cliente $CLIENTE --javaopts $JAVAOPTS --arq_yml $ARQ_YML --import_dir $IMPORT_DIR fi #if [ "$TIPO_IMPORTACAO" = "L" ] else #if [ -f $GERA_CSV ] echo "#########################################################" >> $LOG_FILE 2>&1 echo "WARNING!!! - O SCRIPT $GERA_CSV NAO EXISTE" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 ENVIAR_EMAIL="1" fi #if [ -f $GERA_CSV ]}importa_dados() { # importa os dados # Simplesmente executa a importacao jogando toda a saida para o log cd $ALLERT_IMPORT_DIR echo -e "\n" >> $LOG_FILE 2>&1 echo -e "\n" >> $LOG_FILE 2>&1 echo "`date` - IMPORTANDO ESTRUTURAS DO CLIENTE $CLIENTE" >> $LOG_FILE 2>&1 $JAVA $JAVAOPTS -jar $ALLERT_IMPORT_BIN $CLIENTE -e -c -l >> $LOG_FILE 2>&1 echo -e "\n" >> $LOG_FILE 2>&1 sleep $SLEEP echo -e "\n" >> $LOG_FILE 2>&1 echo -e "\n" >> $LOG_FILE 2>&1 echo "`date` - IMPORTANDO DESTINATARIOS DO CLIENTE $CLIENTE" >> $LOG_FILE 2>&1 $JAVA $JAVAOPTS -jar $ALLERT_IMPORT_BIN $CLIENTE -u -c -l >> $LOG_FILE 2>&1 echo -e "\n" >> $LOG_FILE 2>&1 sleep $SLEEP mv $IMPORT_DIR/* $IMPORT_DIR/OLD/}tree_generator () { # Roda o Tree_Generator cd $TREE_GENERATOR_DIR echo "`date` - EXECUTANDO O TREE_GENERATOR PARA O CLIENTE $CLIENTE" >> $LOG_FILE 2>&1 $JAVA $JAVAOPTS -jar $TREE_GENERATOR_BIN $CLIENTE >> $LOG_FILE 2>&1 sleep $SLEEP}## FUNCOES EXTRA#fim () { # Grava o fim no log echo -e "\n \n" >> $LOG_FILE 2>&1 echo "`date` - THAT'S ALL FOLKS" >> $LOG_FILE 2>&1 echo "#==============================#" >> $LOG_FILE 2>&1 echo -e "\n \n \n" >> $LOG_FILE 2>&1 # Deleta o PID_FILE rm -rf $PID_FILE}envia_email () { # Em caso de erro (condicoes em cada checagem) envia email para os destinatarios especificados echo "Em anexo, arquivo de log do cliente $CLIENTE" > $MESSAGE_BODY for EMAIL in $EMAIL_AVISO; do mail -s "$ANO$MES$DIA Cliente $CLIENTE" -a $LOG_FILE $EMAIL < $MESSAGE_BODY done}dos2unix_arquivos () { # Garante que todos os arquivos estarao com o filetype=UNIX if [ "$TIPO_IMPORTACAO" = "L" ] then dos2unix $ARQ_YML fi if [ "$TIPO_IMPORTACAO" = "F" ] then for ARQUIVO in $FILES do dos2unix $PATH_ARQ_CLIENTE/$ARQUIVO done for ARQUIVO in $CSV do dos2unix $ARQUIVO done fi}faz_rollback () { # Em caso de erros na importacao executa um restore do backup echo -e "\n\n\n" echo "#########################################################" >> $LOG_FILE 2>&1 echo "WARNING!!! - EFETUANDO RESTORE DE BACKUP" >> $LOG_FILE 2>&1 echo "`date`" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 # Dropa e recria a base vazia su - postgres -c "psql -U postgres -c \"DROP DATABASE desk_cms;\" " su - postgres -c "psql -U postgres -c \"CREATE DATABASE desk_cms WITH OWNER=desk_cms ENCODING='LATIN1';\"" # Copia o backup do dia para a pasta do postgres dando permissao de leitura para o user postgres nele BKP_FILE="desk_cms-$ANO$MES$DIA.dump" cp /var/backup/$ANO$MES$DIA/$BKP_FILE /var/lib/pgsql/ chown postgres.postgres /var/lib/pgsql/$BKP_FILE # Efetua o restore su - postgres -c "pg_restore -d desk_cms -F c $BKP_FILE" # Remove o arquivo da pasta do postgres rm -rf /var/lib/pgsql/$BKP_FILE echo "#########################################################" >> $LOG_FILE 2>&1 echo "`date`" >> $LOG_FILE 2>&1 echo "WARNING!!! - RESTORE DO BACKUP EFETUADO" >> $LOG_FILE 2>&1 echo "ARQUIVO UTILIZADO: $BKP_FILE" >> $LOG_FILE 2>&1 echo "#########################################################" >> $LOG_FILE 2>&1 echo -e "\n\n\n"}## PROCESSO## Garante que a flag ENVIAR_EMAIL esta vazia antes de iniciar o processo.ENVIAR_EMAIL=""PROCESSOS_DE_CHECAGEM="checa_diretorios checa_processo checa_email_aviso checa_cliente_existe checa_arq_yml checa_tipo_importacao checa_path_cliente checa_arquivos checa_fl_importacao_ativa"PROCESSO=""for PROCESSO in $PROCESSOS_DE_CHECAGEMdo $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then envia_email exit 1 fidonedos2unix_arquivosgera_importPROCESSOS_DE_CHECAGEM="checa_arquivos_csv"PROCESSO=""for PROCESSO in $PROCESSOS_DE_CHECAGEMdo $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then envia_email exit 1 fidoneimporta_dadostree_generatorPROCESSOS_DE_CHECAGEM="checa_fl_importacao_ativa"PROCESSO=""for PROCESSO in $PROCESSOS_DE_CHECAGEMdo $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then faz_rollback envia_email exit 1 fidonefimif [ "$ENVIAR_EMAIL" = "1" ]then envia_email exit 1fi