#!/bin/bash
CFGFILE=/etc/opt/sshbuk/sshbuk.vars
## настройки по-умолчанию (можно переопределить ключами в ком. строке)
DBLOCALUSER=$USER
DBLOCALNAME=ubuk
DBUSER=db_report
DBNAME=ubuk
REMOTE_CMD=bukdbmescopy
LOCAL_ADDRESS=127.0.0.1

show_help() {
    echo "--------------------------------------------------"
    echo "Копирование сообщений с/на удаленной АЗС"
    echo "--------------------------------------------------"
};

if [ -f $CFGFILE ]; then
    . $CFGFILE
else
    echo "Не найден файл \"$CFGFILE\"" >& 2
    exit 1
fi

if [ -f $BINDIR/sshbuk.fn ]; then
    . $BINDIR/sshbuk.fn
else
    echo "Не найден файл \"sshbuk.fn\"" >& 2
    exit 1
fi

fn_make_log $LOGDIR
fn_to_log ""
fn_to_log "$(date +%H:%M:%S) $(basename $0) \"$@\""

## анализ командной строки
fn_command_line "$@"
AZS=$cml_target
AZS2=$cml_target2
IDLOCAL=$cml_azs
IP=$cml_ipadr
SSH_PORT=$cml_port
CML_TAIL=$cml_tail
TO_AZS=$cml_toazs

## в ком. строке должны быть заданы АЗС и диапозон
if [ -z "$AZS" ]; then
    show_help
    fn_to_log "$(date +%H:%M:%S) exit 1"
    exit 1
fi

#блокировка
LOCK=$VARDIR/tmp/LCK..$AZS.messshbuk
PID=$$
if [ -f ${LOCK} ]; then
  rpid=`head -n 1 ${LOCK}`
  rcmd=`tail -n 1 ${LOCK}`
  z=`ps ax | grep "${rcmd}" | grep -v grep | grep "${rpid}" | wc -l`;
  if [ ${z} -gt 0 ] ; then
    fn_to_log "$(date +%H:%M:%S) Задание уже запущено"
    exit 0;
  fi
fi

echo ${PID} > ${LOCK?}
echo $0 >> ${LOCK?}

CML=
if [ ! -z "$IP" ]; then
    CML=$CML" -ip $IP"
fi
if [ ! -z "$SSH_PORT" ]; then
    CML=$CML" -port $SSH_PORT"
fi
if [ ! -z "$cml_user" ]; then
    CML=$CML" -user $cml_user"
fi
if [ ! -z "$AZS" ]; then
    CML=$CML" -azs $AZS"
fi

if [ ! -z "$cml_to_azs" ]; then
  if [ -z "$IDLOCAL" ]; then
    SQL="select * FROM sf_get_cur_id_shop()"
    IDLOCAL=$(psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -c "$SQL")
    ERR=$?
    if [ $ERR -ne 0 ]; then
      MSG="exit; ошибка получнения номера АЗС"
      echo $MSG >& 2
      fn_to_log "$(date +%H:%M:%S) $MSG"
      rm -f ${LOCK}
      exit 1
    fi
  fi
  
  SQL="select min(id),max(id) from td_tosend where target=$AZS AND id_shop=$IDLOCAL"
  TRDIA=$(psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -c "$SQL")
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка получнения идентификаторов сообщений"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  if [ "$TRDIA" == "|" ]; then
    echo "Сообщения отсутствуют"
    rm -f ${LOCK}
    exit 0
  fi
  TR1=`echo "$TRDIA" | cut -d '|' -f1`
  TR2=`echo "$TRDIA" | cut -d '|' -f2`

  FILERCV=$DATADIR/file.$AZS.$(date "+%y%m%d%H%M%S").sql.gz
  OFILE=$DATADIR/tmp.$AZS.$(date "+%y%m%d%H%M%S").sql
  
  if [ -f $FILERCV ]; then rm $FILERCV; fi
  if [ -f $OFILE ]; then rm $OFILE; fi

  ### вывести в выходной файл необходимую информацию
  echo "--DBNAME:$DBNAME" >> $OFILE
  echo "--IDSHOP:$IDLOCAL" >> $OFILE
  echo "--TARGET:$AZS" >> $OFILE
  echo "--TRBEG:$TR1" >> $OFILE
  echo "--TREND:$TR2" >> $OFILE

  echo "copy td_get (id, id_shop, target, qtable, qtype, qtext, qwhere) FROM stdin;" >> $OFILE
  SQL="SELECT id, id_shop, target, qtable, qtype, qtext, qwhere FROM td_tosend WHERE target=$AZS AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQL" >> $OFILE
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка получнения списка сообщений"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  echo "\." >> $OFILE
  sed -i -e "s/|/\t/g" $OFILE 

  gzip -c $OFILE > $FILERCV
  if [ -f $OFILE ]; then rm $OFILE; fi

  # размер архива не должен быть нулевым
  SIZE=$(ls -s $FILERCV | awk '{print $1}')
  if [ -z "$SIZE" -o "$SIZE" == "0" ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка архива: SIZE=\"$SIZE\""
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  ##отправка файла
  $BINDIR/sshbuk $CML -c2a -op $DATADIR -f $FILERCV
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка отправки файла"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  ##выполнение файла
  $BINDIR/sshbuk $CML -cmd "gunzip -c $FILERCV | psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER  &>/dev/null"
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка разархивации и запуска"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  ##очистка базы
  SQL="INSERT INTO tj_sent (id,id_shop,target,qtable,qtype,qtext,qwhere,error) \
  (SELECT id,id_shop,target,qtable,qtype,qtext,qwhere,0 FROM td_tosend WHERE \
  target=$AZS AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2 \
  AND id NOT IN (SELECT id FROM tj_sent WHERE id_shop=$IDLOCAL))"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -q -c "$SQL"
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка переноса отправленых сообщений"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  
  SQL="DELETE FROM td_tosend WHERE target=$AZS AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -q -c "$SQL" 

  #rm $FILERCV 2>/dev/null
fi

if [ ! -z "$cml_to_azstran" ]; then
  if [ -z "$IDLOCAL" ]; then
    MSG="exit; ошибка указания локальной точки"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  if [ -z "$AZS2" ]; then
    MSG="exit; ошибка указания конечной точки"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  if [ "$AZS" == "$AZS2" ]; then
    MSG="exit; ошибка указания конечной точки и локальной"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  
  SQL="select min(id),max(id) from td_tosend where target=$AZS2 AND id_shop=$IDLOCAL"
  TRDIA=$(psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -c "$SQL")
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка получнения идентификаторов сообщений(2)"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  if [ "$TRDIA" == "|" ]; then
    echo "Сообщения отсутствуют"
    rm -f ${LOCK}
    exit 0
  fi
  TR1=`echo "$TRDIA" | cut -d '|' -f1`
  TR2=`echo "$TRDIA" | cut -d '|' -f2`

  FILERCV=$DATADIR/file.$AZS.$(date "+%y%m%d%H%M%S").sql.gz
  OFILE=$DATADIR/tmp.$AZS.$(date "+%y%m%d%H%M%S").sql
  
  if [ -f $FILERCV ]; then rm $FILERCV; fi
  if [ -f $OFILE ]; then rm $OFILE; fi

  ### вывести в выходной файл необходимую информацию
  echo "--DBNAME:$DBNAME" >> $OFILE
  echo "--IDSHOP:$IDLOCAL" >> $OFILE
  echo "--TARGET:$AZS" >> $OFILE
  echo "--TRBEG:$TR1" >> $OFILE
  echo "--TREND:$TR2" >> $OFILE

  echo "copy td_tosend (id, id_shop, target, qtable, qtype, qtext, qwhere) FROM stdin;" >> $OFILE
  SQL="SELECT id, id_shop, target, qtable, qtype, qtext, qwhere FROM td_tosend WHERE target=$AZS2 AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQL" >> $OFILE
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка получнения списка сообщений(2)"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  echo "\." >> $OFILE
  sed -i -e "s/|/\t/g" $OFILE 

  gzip -c $OFILE > $FILERCV
  if [ -f $OFILE ]; then rm $OFILE; fi

  # размер архива не должен быть нулевым
  SIZE=$(ls -s $FILERCV | awk '{print $1}')
  if [ -z "$SIZE" -o "$SIZE" == "0" ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка архива: SIZE=\"$SIZE\""
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  ##отправка файла
  $BINDIR/sshbuk $CML -c2a -op $DATADIR -f $FILERCV
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка отправки файла"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  ##выполнение файла
  $BINDIR/sshbuk $CML -cmd "gunzip -c $FILERCV > $OFILE"
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка разархивации"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  $BINDIR/sshbuk $CML -cmd "psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER -f $OFILE"
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка занесения данных"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  $BINDIR/sshbuk $CML -cmd "rm $OFILE" 2>/dev/null

  ##очистка базы
  SQL="INSERT INTO tj_sent (id,id_shop,target,qtable,qtype,qtext,qwhere,error) \
  (SELECT id,id_shop,target,qtable,qtype,qtext,qwhere,0 FROM td_tosend WHERE \
  target=$AZS2 AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2 \
  AND id NOT IN (SELECT id FROM tj_sent WHERE id_shop=$IDLOCAL))"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -q -c "$SQL"
  ERR=$?
  if [ $ERR -ne 0 ]; then
    MSG="exit; ошибка переноса отправленых сообщений(2)"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  
  SQL="DELETE FROM td_tosend WHERE target=$AZS2 AND id_shop=$IDLOCAL AND id>=$TR1 AND id<=$TR2"
  psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -q -c "$SQL"

  #rm $FILERCV 2>/dev/null
fi

if [ ! -z "$cml_from_azs" ]; then
  if [ -z "$IDLOCAL" ]; then
    SQL="select * FROM sf_get_cur_id_shop()"
    IDLOCAL=$(psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -c "$SQL")
  fi
  
  SQL="select min(id),max(id) from td_tosend where target=$IDLOCAL AND id_shop=$AZS"
  TRDIA=$($BINDIR/sshbuk $CML -cmd "psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER -Atq -c \"$SQL\"")
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка запуска удаленной команды"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  if [ "$TRDIA" == "|" ]; then
    echo "Сообщения отсутствуют"
    rm -f ${LOCK}
    exit 0
  fi
  TR1=`echo "$TRDIA" | cut -d '|' -f1`
  TR2=`echo "$TRDIA" | cut -d '|' -f2`

  FILERCV=$DATADIR/file.$IDLOCAL.$(date "+%y%m%d%H%M%S").sql.gz
  OFILE=$DATADIR/tmp.$IDLOCAL.$(date "+%y%m%d%H%M%S").sql
  
  $BINDIR/sshbuk $CML -cmd "rm $FILERCV; rm $OFILE" 2>/dev/null

  ### вывести в выходной файл необходимую информацию
  $BINDIR/sshbuk $CML -cmd "echo --DBNAME:$DBNAME >> $OFILE ; echo --IDSHOP:$AZS >> $OFILE ; echo --TARGET:$IDLOCAL >> $OFILE ; echo --TRBEG:$TR1 >> $OFILE ; echo --TREND:$TR2 >> $OFILE"
  
  $BINDIR/sshbuk $CML -cmd "echo \"copy td_get (id, id_shop, target, qtable, qtype, qtext, qwhere) FROM stdin; \" >> $OFILE"

  SQL="SELECT id, id_shop, target, qtable, qtype, qtext, qwhere FROM td_tosend WHERE target=$IDLOCAL AND id_shop=$AZS AND id>=$TR1 AND id<=$TR2"
  $BINDIR/sshbuk $CML -cmd "psql $DBNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c \"$SQL\" >> $OFILE"
  $BINDIR/sshbuk $CML -cmd "echo \"\.\" >> $OFILE"
  $BINDIR/sshbuk $CML -cmd "sed -i -e \"s/|/\t/g\" $OFILE "

  $BINDIR/sshbuk $CML -cmd "gzip -c $OFILE > $FILERCV"
  $BINDIR/sshbuk $CML -cmd "rm $OFILE" 2>/dev/null

  ##отправка файла
  $BINDIR/sshbuk $CML -a2c -op $DATADIR -f $FILERCV 2>/dev/null
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка приема файла"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  # размер архива не должен быть нулевым
  SIZE=$(ls -s $FILERCV | awk '{print $1}')
  if [ -z "$SIZE" -o "$SIZE" == "0" ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка архива: SIZE=\"$SIZE\""
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi

  gunzip -c $FILERCV > $OFILE 
  psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER -f $OFILE
  ERR=$?
  fn_to_log "$(date +%H:%M:%S) sshbuk=$ERR"
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка занесения данных"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  rm $OFILE 2>/dev/null
    
  ##очистка базы
  SQL="INSERT INTO tj_sent (id,id_shop,target,qtable,qtype,qtext,qwhere,error) \
  (SELECT id,id_shop,target,qtable,qtype,qtext,qwhere,0 FROM td_tosend WHERE \
  target=$IDLOCAL AND id_shop=$AZS AND id>=$TR1 AND id<=$TR2 \
  AND id NOT IN (SELECT id FROM tj_sent WHERE id_shop=$IDLOCAL))"
  $BINDIR/sshbuk $CML -cmd "psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER -q -c \"$SQL\""
  
  SQL="DELETE FROM td_tosend WHERE target=$IDLOCAL AND id_shop=$AZS AND id>=$TR1 AND id<=$TR2"
  $BINDIR/sshbuk $CML -cmd "psql $DBNAME -h $LOCAL_ADDRESS -U $DBUSER -q -c \"$SQL\""

  #rm $FILERCV 2>/dev/null
fi

rm -f ${LOCK}
exit 0
