#!/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 # # ----------------------------------------------------- # # 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//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" ;; esac shift done # # 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_CHECAGEM do $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then envia_email exit 1 fi done dos2unix_arquivos gera_import PROCESSOS_DE_CHECAGEM="checa_arquivos_csv" PROCESSO="" for PROCESSO in $PROCESSOS_DE_CHECAGEM do $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then envia_email exit 1 fi done importa_dados tree_generator PROCESSOS_DE_CHECAGEM="checa_fl_importacao_ativa" PROCESSO="" for PROCESSO in $PROCESSOS_DE_CHECAGEM do $PROCESSO if [ "$ENVIAR_EMAIL" = "1" ] then faz_rollback envia_email exit 1 fi done fim if [ "$ENVIAR_EMAIL" = "1" ] then envia_email exit 1 fi