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

show_help() {
    echo "--------------------------------------------------"
    echo "Отправка словарей на удаленную АЗС"
    echo "--------------------------------------------------"
};

function show_html {
  if [ "$HTML_PRINT" == "yes" ]; then
    echo "<script script language=\"JavaScript\" type=\"text/javascript\">"
    echo "<!--"
    echo "document.getElementById('lblcomment').innerHTML = '$1';"
    echo "// -->"
    echo "</script>"
  fi
};

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
IP=$cml_ipadr
SSH_PORT=$cml_port
CML_TAIL=$cml_tail
HTML_PRINT=$cml_html

if [ ! -z "$cml_db" ]; then
  DBNAME=$cml_db
fi

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

#блокировка
LOCK=$VARDIR/tmp/LCK..$AZS.dictsshbuk
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

##проверка на необходимость(выполнение только для подчиненных АЗС)
SQL_TEST_TODO="SELECT id_shop_type FROM sd_ident WHERE id=$AZS"
ANSER_TEST_TODO=$(psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -F' ' -c "$SQL_TEST_TODO")
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 [ "$ANSER_TEST_TODO" != "2" ] && [ "$ANSER_TEST_TODO" != "10" ] && [ "$ANSER_TEST_TODO" != "6" ] && [ "$ANSER_TEST_TODO" != "7" ] && [ "$ANSER_TEST_TODO" != "8" ] ; then
  MSG="exit; отправка справочников не требуется"
  fn_to_log "$(date +%H:%M:%S) $MSG"
  rm -f ${LOCK}
  exit 0
fi

##изменение справочников
SQL_CUR="SELECT num_modification FROM sd_transfer_code WHERE id_shop=$AZS"
CUR_NUM_MOD=$(psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -F' ' -c "$SQL_CUR")
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 [ -z "$(echo $CUR_NUM_MOD)" ]; then
  CUR_NUM_MOD="-1"
  SQL_INSERT="INSERT INTO sd_transfer_code( id_shop, num_modification, lastop) VALUES ( $AZS, -1, now()); INSERT INTO sj_transfer_code( id_shop, num_modification, timeop) VALUES ( $AZS, -1, now());"
  psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQL_INSERT"
fi

SQLM="SELECT max(num_modification) as t FROM udict.gd_tax \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_group_list \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_cennic_type \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_list \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_store \
       UNION \
      SELECT max(num_modification) as t FROM udict.pd_mernic_type \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_section \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_make \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_supplier \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_cancellation_reason \
       UNION \
      SELECT max(num_modification) as t FROM udict.pd_supplier \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_cafe_keys \
        UNION \
      SELECT max(num_modification) as t FROM udict.sd_discount \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_images \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_payments_listsale \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_payments_listsale_group_list \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_payments_listsale_list \
       UNION \
      SELECT max(num_modification) as t FROM sd_ident \
       UNION \
      SELECT max(num_modification) as t FROM pd_products \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_inaction_reasons \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_listmatrix \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_list_specification \
       UNION \
      SELECT max(num_modification) as t FROM udict.sd_inaction_limits \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_chznak_group \
       UNION \
      SELECT max(num_modification) as t FROM udict.gd_list_cennic \
       UNION \
      SELECT max(num_modification) as t FROM udict.pd_products_limits \
       ORDER BY t DESC NULLS LAST LIMIT 1"
MAX_NUM_MOD=$(psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQLM")

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 [ -z "$(echo $MAX_NUM_MOD)" ]; then
  MAX_NUM_MOD="-1"
fi

STEP_MOD=500
COUNT=1
MAX_COUNT=$(echo "($MAX_NUM_MOD - $CUR_NUM_MOD)/$STEP_MOD+1"|bc)

while [ "$CUR_NUM_MOD" -lt "$MAX_NUM_MOD" ]
do
  if [ $(echo "$CUR_NUM_MOD + $STEP_MOD" | bc) -lt $MAX_NUM_MOD ]; then
    TMP_NUM_MOD=$(echo "$CUR_NUM_MOD + $STEP_MOD" | bc)
  else
    TMP_NUM_MOD=$MAX_NUM_MOD
  fi
  
  show_html "Отправка изменений справочников. Блок $COUNT из $MAX_COUNT."
  
  FILERCV=$DATADIR/file.dict.$AZS.$(date "+%y%m%d%H%M%S").sql.gz
  OFILE=$DATADIR/tmp.dict.$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:$DBLOCALNAME" >> $OFILE
  echo "--TARGET:$AZS" >> $OFILE
  
  if [ "$ANSER_TEST_TODO" == "2" ] ; then   # подчиненный
    DICT="tax grp str supplier psupplier mernic section make cennic list cancellationreason keys discount images listsale inactionreasons inactionlimits listmatrix listspecification instoreautocreate productslimit chznak listcennic"
  elif [ "$ANSER_TEST_TODO" == "10" ] ; then # другой МСМ, имеющий часть прав
    DICT="tax grp str supplier psupplier mernic section make cennic list cancellationreason keys discount images listsale inactionreasons inactionlimits productslimit chznak listcennic"
  elif [ "$ANSER_TEST_TODO" == "7" ] ; then # DataMatrix
    DICT="tax grp str supplier psupplier mernic section make cennic list cancellationreason keys discount images listsale inactionreasons inactionlimits listmatrix listspecification"
  elif [ "$ANSER_TEST_TODO" == "6" ] ; then
    DICT="azsident2 tax grp list"           # сервер карт НПТ
  elif [ "$ANSER_TEST_TODO" == "8" ] ; then
    DICT="azsident tax grp list products"   # купоны/талоны НПТ
  else
    DICT=""
  fi

  for i in `echo $DICT`; do
    case "$i" in
      "str" )
      FUNCTION="udict.gf_get_str_out"
    ;;
      "tax" )
      FUNCTION="udict.gf_get_tax_out"
    ;;
      "grp" )
      FUNCTION="udict.gf_get_grp_out"
    ;;
      "supplier" )
      FUNCTION="udict.gf_get_sup_out"
    ;;
      "listmatrix" )
      FUNCTION="udict.gf_get_listmatrix_out"
    ;;
      "psupplier" )
      FUNCTION="pf_get_sup_out"
    ;;
      "mernic" )
      FUNCTION="udict.pf_get_mernic_type_out"
    ;;
      "section" )
      FUNCTION="gf_get_section_out"
    ;;
      "make" )
      FUNCTION="gf_get_make_out"
    ;;
      "cennic" )
      FUNCTION="gf_get_cennic_type_out"
    ;;
      "list" )
      FUNCTION="gf_get_list_out"
    ;;
      "cancellationreason" )
      FUNCTION="gf_get_cancellation_reason_out"
    ;;
      "keys" )
      FUNCTION="gf_get_cafe_keys_out"
    ;;
      "discount" )
      FUNCTION="sf_get_discount_out"
    ;;
      "images" )
      FUNCTION="sf_get_image_out"
    ;;
      "listsale" )
      FUNCTION="sf_get_payments_listsale_out"
    ;;
      "azsident" )
      FUNCTION="sf_get_ident_out"
    ;;
      "azsident2" )
      FUNCTION="sf_get_ident2_out"
    ;;
      "products" )
      FUNCTION="pf_get_products_out"
    ;;
      "inactionreasons" )
      FUNCTION="sf_get_inaction_reasons_out"
    ;;
      "inactionlimits" )
      FUNCTION="sf_get_inaction_limits_out"
    ;;
      "listspecification" )
      FUNCTION="udict.gf_get_list_specification_out"
    ;;
      "instoreautocreate" )
      FUNCTION="ldict.sf_get_instore_autocreate_out"
    ;;
      "productslimit" )
      FUNCTION="udict.pf_get_products_limits_out"
    ;;
      "chznak" )
      FUNCTION="udict.gf_get_chznak_group_out"
    ;;
      "listcennic" )
      FUNCTION="udict.gf_get_list_cennic_out"
    ;;
    esac
  
    SQL="SELECT omes FROM $FUNCTION($AZS, $CUR_NUM_MOD, $TMP_NUM_MOD)"

    psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQL" >> $OFILE
    ERR=$?
    if [ $ERR -ne 0 ]; then
      rm $FILERCV 2>/dev/null
      MSG="exit; ошибка получения списка на отправку изменений справочника($i)"
      echo $MSG >& 2
      fn_to_log "$(date +%H:%M:%S) $MSG"
      rm -f ${LOCK}
      exit 1
    fi
  done
  
  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=$?
  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=$?
  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
  
  TXT=$($BINDIR/sshbuk $CML -cmd "psql $DBNAME -v ON_ERROR_STOP=1 -h $LOCAL_ADDRESS -U $DBUSER -f $OFILE 2>&1 > /dev/null")
  ERR=$?
  if [ $ERR -ne 0 ]; then
#     rm $FILERCV 2>/dev/null
    MSG="exit; ошибка занесения данных изменений справочника"
    echo $MSG >& 2
    echo $TXT >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    fn_to_log "$(date +%H:%M:%S) $TXT"
    rm -f ${LOCK}
    exit 1
  fi
  $BINDIR/sshbuk $CML -cmd "rm $OFILE" 2>/dev/null
  rm $FILERCV 2>/dev/null
  
  ##отметка об отправке
  SQL="UPDATE sd_transfer_code SET num_modification=$TMP_NUM_MOD, lastop=now() WHERE id_shop=$AZS AND num_modification=$CUR_NUM_MOD; INSERT INTO sj_transfer_code (SELECT id_shop, num_modification, lastop FROM sd_transfer_code WHERE id_shop=$AZS AND num_modification=$TMP_NUM_MOD);"
  psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Aqt -P null='null' -c "$SQL"
  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="SELECT count(*) FROM sd_transfer_code WHERE id_shop=$AZS AND num_modification=$TMP_NUM_MOD"
  COUNT_DONE=$(psql $DBLOCALNAME -U $DBUSER -h $LOCAL_ADDRESS -Atq -F' ' -c "$SQL")
  ERR=$?
  if [ $ERR -ne 0 ]; then
    rm $FILERCV 2>/dev/null
    MSG="exit; ошибка отметки изменений справочника(2)"
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) $MSG"
    rm -f ${LOCK}
    exit 1
  fi
  if [ $COUNT_DONE -eq 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

  CUR_NUM_MOD=$TMP_NUM_MOD
  COUNT=$(echo "$COUNT+1" | bc)
done

show_html ""
rm -f ${LOCK}
fn_to_log "$(date +%H:%M:%S) OK"
exit 0
