#! /bin/bash
# TextLib - tl_backup
# 1633: GOOGLE_DRIVE kezeles

trap 'echo "Lelove tl_backup"; rm -f $BACKUPPID; exit' SIGINT
trap 'echo   "Exit tl_backup"; rm -f $BACKUPPID; exit'   EXIT

. /usr/share/textlib/exe/tl_setpar

unset PIDNOKILL

PidRun $BACKUPPID tl_backup
if [ -f $BACKUPPID ]; then
    echo $BACKUPPID mar letezik! $par
    set PIDNOKILL=1
    exit 1
fi
echo $$ > $BACKUPPID

IDOPONT=$(date +"%y/%m/%d %H:%M:%S")
DATUM=$(date +%y-%m-%d_%H_%M)
EV=$(date +%Y)
HONAP=$(date +%m)
START_TXT="***** TextLib biztonsagi mentes$par: $IDOPONT"
START_LOG="$START_TXT\nLogfile$par: $BACKUPLOG"
NO_CFG="HIBA: nincs $BACKUPCFG !"
TGZDATA='\0037\0213\0010\0000\0255\0003\0050\0132\0000\0003\0355\0301\0001\0015\0000\0000\0000\0302\0240\0367\0117\0155\0016\0067\0240\0000\0000\0000\0000\0000\0000\0000\0000\0000\0200\0067\0003\0232\0336\0035\0047\0000\0050\0000\0000'
TGZLEN=45

# Elozo honap mi volt?
if [[ "$HONAP" == "01" ]]; then
    E_HONAP=12; E_EV=$(($EV-1));
else
    E_HONAP=$(( 1$HONAP - 101 )); E_EV=$EV
    if [[ $E_HONAP -lt 10 ]]; then
       E_HONAP="0$E_HONAP"
    fi
fi

# Biztosan textlib group-belieknek irhato legyen
if [ ! -f $BACKUPLOG ]; then
    echo -e "***** Logfile$par start *****\n" > $BACKUPLOG
fi
chown :textlib $BACKUPLOG > /dev/null 2>&1
chmod g+w $BACKUPLOG > /dev/null 2>&1

echo -e "\n\n$START_TXT" >> $BACKUPLOG

# Beallitasok beolvasasa
if [ ! -f $BACKUPCFG ]; then
   echo "$NO_CFG"
   echo -e "\n$NO_CFG" >> $BACKUPLOG
   rm -f $BACKUPPID
   exit 1;
else
  . $BACKUPCFG
fi

# Ha nem akar debug kiirast, ne legyen
if [ "$DEBUGFILE" == "" ]; then
    DEBUGFILE="/dev/null";
else
    echo "Debug informaciok: $DEBUGFILE" >> $BACKUPLOG
    echo -e "**** tl_backup debug$par: `date`\n" > $DEBUGFILE
    echo "DEBUG=$DEBUGFILE"
fi

echo -e "\n\n$START_TXT" >> $DEBUGFILE

echo -e "\nElozo (EV,HO): $E_EV, $E_HONAP" >> $DEBUGFILE

E_UZENET_OK="TextLib$par bizt. mentes OK"
E_UZENET_BAJ="TextLib$par bizt. mentes HIBA!"

E_ME=`whoami`
E_BODY2="TextLib$par biztonsagi mentese rendben megtortent!"
E_BODY_BAJ="Hiba a TextLib$par biztonsagi mentese kozben!"
E_BODY_NO="A TextLib$par biztonsagi mentes helye nincs beallitva!"
E_BODY_RUN="TextLib$par program fut, mentes leallitva:"
E_BODY_ABORT="Biztonsagi mentes$par felbe lett szakitva!"
E_NO_SSH="SSH kapcsolattal baj van (rossz jelszo?)\n$USERNEV@$SERVER $T_HOVA ($E_ME)"
E_BODY_BADSSH="Tavoli dir nem irhato\n$USERNEV@$SERVER $T_HOVA"
E_BODY_NOWRITABLE="Helyi dir nem irhato: $H_HOVA"
E_HAVI_ERR="Havi mentes$par hiba ($?): $H_HOVA"
E_MENT_ERR="Mentes$par hiba: $H_HOVA"
E_NO_HELYI="Tavoli mentes$par nem lehet helyi nelkul!"
FNAME="tldb${ext}-$DATUM.tar.gz"
HNAME="tldb${ext}_${E_EV}_${E_HONAP}.tar.gz"
FMASK="tldb${ext}-*.tar.gz"
HMASK="tldb${ext}_*.tar.gz"
ALLMASK="tldb${ext}*.tar.gz"
E_BODY=""

# ss - tavoli parancs vegrehajtas
# amit az kiir, az megy a valtozoba, ahonnan ez hivodott
function ss() {
    ssh -o "NumberOfPasswordPrompts 0" $SSHPAR $USERNEV@$SERVER "$1 $2 $3 $4 $5 $6 $7 $8 $9"
}

# fajl merete
function flen() {
  TEMP=( $( ls -ln $1 ) )
  SS=${TEMP[4]}
  echo "$SS"
}
# tavoli fajl merete
function ssflen() {
  TEMP=( $(ss "ls -ln $1") )
  SIZE=${TEMP[4]}
  echo "$SIZE"
}

# SendMail = elkuldi a mailt, ha kell ;
# ki is irja BACKUPLOG-ba ugyanazt
# $1 - subject
function SendMail() {
  echo -e "$E_BODY" >> $BACKUPLOG
  if $E_MAIL; then
     echo -e "$START_LOG\n$E_BODY" | mail -s "$1 - $IDOPONT" $E_MAIL_CIM
     echo -e "\nE-mail kuldve $E_MAIL_CIM cimre\n" >> $BACKUPLOG
  fi
}

# FatalError - kilepes sulyos hibaval
function FatalError() {
  E_BODY="$E_BODY\n\n$1"
  SendMail "$E_UZENET_BAJ"
  rm -f $BACKUPPID
  exit 1
}

#
function abort() {
   FatalError "$E_BODY_ABORT"
}

### Felesleges file-okat kiirtja.
# $1: filemask, $2: ennyi maradjon, $3: google drive
function FolosIrt() {

  if [ "$1" == "" ]; then echo "folos1 ures" >> $DEBUGFILE; return; fi
  if [ "$2" == "" ]; then echo "folos2 ures" >> $DEBUGFILE; return; fi

  echo "FolosIrt ($1 , $2, $3) " >> $DEBUGFILE

  NUM=`ls $1 2> /dev/null | wc -w`
  echo "FolosIrt NUM = $NUM " >> $DEBUGFILE
  if (( $2 >= 1 && $NUM > $2 )) ; then
     DIFF=$(($NUM-$2))
     LIST=`ls -r $1 | tail -n $DIFF`
     echo -e "Felesleges:\n$LIST" >> $DEBUGFILE
     if [ "$3" == "1" ] 
     then 
        echo "$DIFF helyi file kicsinyites (google drive):" >> $DEBUGFILE
        for i in $LIST
        do
           SIZE=$(flen $i)
           if [ "$SIZE" -gt "$TGZLEN" ]; then 
             echo "  - helyi file kicsinyit: $i ($SIZE byte volt)" >> $DEBUGFILE
             echo -n -e "$TGZDATA" > $i
           else
             echo "  - helyi file mar kicsi: $i ($SIZE byte volt)" >> $DEBUGFILE
           fi
        done
     else
        echo "$DIFF helyi file kitorlese: $LIST" >> $DEBUGFILE
        rm -f $LIST
     fi
  else
     echo "Nincs helyi kiirtando file" >> $DEBUGFILE
  fi
}

### Felesleges file-okat kiirtja tavolrol
# $1: filemask, $2: ennyi maradjon, $3: google drive
function TavoliFolosIrt() {

  if [ "$1" == "" ]; then echo "tavoli folos1 ures" >> $DEBUGFILE; return; fi
  if [ "$2" == "" ]; then echo "tavoli folos2 ures" >> $DEBUGFILE; return; fi

  echo "TavoliFolosIrt ($1, $2, $3)" >> $DEBUGFILE

  NUM=`ss "ls $1 2> /dev/null | wc -w"`
  if [ "$NUM" != "" ]; then
    if (( $2>=1 && $NUM > $2 )) ; then
       DIFF=$(($NUM-$2))
       LIST=`ss "ls -r $1 | tail -n $DIFF"`
       echo -e "Felesleges:\n$LIST" >> $DEBUGFILE
       if [ "$3" == "1" ] 
       then 
          echo "$DIFF tavoli file kicsinyites (google drive):" >> $DEBUGFILE
          for i in $LIST
          do
            SIZE=$(ssflen $i)
            if [ "$SIZE" -gt "$TGZLEN" ]; then
               echo "  - tavoli file kicsinyit: $i ($SIZE byte volt)" >> $DEBUGFILE
               ss "echo -n -e \"${TGZDATA}\" > $i"
            else
               echo "  - tavoli file mar kicsi: $i ($SIZE byte volt)" >> $DEBUGFILE
            fi
          done
       else 
          echo "$DIFF tavoli file kitorlese: $LIST" >> $DEBUGFILE
          ss "rm -f" $LIST
       fi
    fi
  else
       echo "Nincs kiirtando tavoli file" >> $DEBUGFILE
  fi
}

### Havi mentest csinalja
function HaviMentes() {

   ## Kellenek havi mentesek?
   if [ "$H_HAVI_MAXMENT" == "0" ]; then
      echo "H_HAVI_MAXMENT 0" >> $DEBUGFILE
      return
   fi
   if [ "$H_HAVI_MAXMENT" == "" ];  then
      echo "H_HAVI_MAXMENT nincs" >> $DEBUGFILE
      return
   fi

   echo "*** Check helyi havi$par: $HNAME" >> $DEBUGFILE
   if ! test -e $H_HOVA/$HNAME; then
      H_MENTES="$H_MENTES\n        $H_HOVA/$HNAME"
      # Adatbazis es naplok mentese ebbe bele
      DBFILES=$MENTPATH/tl_*
      ls -l $MENTPATH/tj*.anf > /dev/null 2>&1
      if [ $? == 0 ]; then
         NAPLOK=$MENTPATH/tj*.anf
      else
         NAPLOK=
         echo "Nincs mentendo regi naplo!" >> $DEBUGFILE
      fi
      echo "tar -Pczf $H_HOVA/$HNAME $DBFILES $NAPLOK " >> $DEBUGFILE
      tar -Pczf $H_HOVA/$HNAME $DBFILES $NAPLOK
      if [ "$?" == "0" ]; then
           chgrp textlib $H_HOVA/$HNAME
           chmod 660 $H_HOVA/$HNAME
           ls -l $H_HOVA/$HNAME >> $DEBUGFILE
           if [ "$NAPLOK" != "" ]; then
             echo "Regi naplok kitorlese:" >> $DEBUGFILE
             echo "$NAPLOK" >> $DEBUGFILE
             rm -f $NAPLOK
           fi
      else
           FatalError "$E_HAVI_ERR"
           return
      fi
   else
      echo "Megvan mar az elozo havi mentes ($HNAME)" >> $DEBUGFILE
   fi
   FolosIrt "$H_HOVA/$HMASK" "$H_HAVI_MAXMENT" "$H_GOOGLE_DRIVE"
}

### Tavoli havi mentes - ha kell, es van mar helyben
function TavoliHaviMentes() {

    if [ "$T_HAVI_MAXMENT" == "0" ]; then
       echo "T_HAVI_MAXMENT 0" >> $DEBUGFILE
       return;
    fi
    if [ "$T_HAVI_MAXMENT" == "" ]; then
       echo "T_HAVI_MAXMENT nincs" >> $DEBUGFILE
       return;
    fi

    # Megvan-e mar a tavoli gepen ez a havi mentes?
    echo "*** Check tavoli havi$par: $HNAME" >> $DEBUGFILE
    if ss "test -e $T_HOVA/$HNAME"; then
        echo "Megvan mar a tavoli havi mentes ($HNAME)" >> $DEBUGFILE
    else
      # Masoljuk at a havi mentest
      scp -o "NumberOfPasswordPrompts 0" $SCPPAR $HONNAN/$HNAME $USERNEV@$SERVER:$T_HOVA/$HNAME >> $BACKUPLOG 2>&1
      if [ "$?" == "0" ] ; then
       echo "SCP havi mentes - OK" >> $DEBUGFILE
       MENTES_T=true;
       T_MENTES="$T_MENTES\n        $USERNEV@$SERVER:$T_HOVA/$HNAME"
      else
       E_BODY2="SCP hiba ($?) tavoli havi mentes kozben"
       echo "$E_BODY2" >> $DEBUGFILE
       echo "$E_BODY2" >> $BACKUPLOG
      fi
    fi
    TavoliFolosIrt "$T_HOVA/$HMASK" "$T_HAVI_MAXMENT" "$T_GOOGLE_DRIVE"
}

### Mentes elott ellenorzesek

# Be van-e allitva valami mentesi hely?
if ! $HELYI && ! $TAVOLI; then
   FatalError "$E_BODY_NO"
fi

# A naplozo lehet, hogy fut, mert epp indul a TLSRV. Varunk kicsit.
cnt=0; cntmax=30;
PidRun $NAPLOPID g-naplo.exe
if [ -f $NAPLOPID ]; then
   echo "Naplozo fut. Varunk..." >> $DEBUGFILE
   echo "Naplozo fut. Varunk..." >> $BACKUPLOG
fi
while [ $cnt -le $cntmax -a -f $NAPLOPID ]; do
       sleep 5
       cnt=$[$cnt+1]
done
PidRun $NAPLOPID g-naplo.exe
if [ -f $NAPLOPID ]; then
   ps ax | grep naplo >> $BACKUPLOG
   ps ax | grep naplo >> $DEBUGFILE
   FatalError "$E_BODY_RUN $PRG"
else
   if [ "$cnt" != "0" ]; then
     echo "Naplozo lefutott." >> $DEBUGFILE
     echo "Naplozo lefutott." >> $BACKUPLOG
   fi
fi

### Indulhat a mentes

MENTES_H=false;
MENTES_T=false;
H_MENTES="Helyi$par: nincs"
T_MENTES="Tavoli$par: nincs"
unset HONNAN
unset H_LISTL
unset T_LISTL

### Elrendezni a helyi mentest

echo -e "\n****** Helyi mentes$par: $HELYI, $H_MAXMENT, $H_HAVI_MAXMENT;" >> $DEBUGFILE

if $HELYI; then
        # Lehet-e irni oda egyaltalan?
        if ! test -w $H_HOVA; then
           FatalError "$E_BODY_NOWRITABLE"
        fi
        # Megcsinalni az uj mentest
        echo "tar -Pczf $H_HOVA/$FNAME $MENTPATH/tl_* " >> $DEBUGFILE
        tar -Pczf $H_HOVA/$FNAME $MENTPATH/tl_*
        if [ "$?" == "0" ]; then
          chgrp textlib $H_HOVA/$FNAME
          chmod 660 $H_HOVA/$FNAME
          ls -l $H_HOVA/$FNAME >> $DEBUGFILE
          MENTES_H=true
          HONNAN=$H_HOVA
          H_MENTES="Helyi$par:\n  $H_HOVA/$FNAME"
          # Ha tul sok mentes lenne mar ezzel, akkor torlunk
          FolosIrt "$H_HOVA/$FMASK" "$H_MAXMENT" "$H_GOOGLE_DRIVE"
          HaviMentes
      else
          FatalError "$E_MENT_ERR"
      fi
fi

E_BODY="$E_BODY\n$H_MENTES"
H_LISTL=`ls -l $H_HOVA/$ALLMASK 2> /dev/null`
H_LISTL="Helyi mentesek$par: (max. $H_MAXMENT napi, $H_HAVI_MAXMENT havi)\n$H_LISTL"
echo -e "$H_LISTL" >> $DEBUGFILE
IDOPONT=$(date +"%y/%m/%d %H:%M:%S")
echo -e "** Helyi mentes OK: $IDOPONT" >> $DEBUGFILE

### Elrendezni a tavoli mentest

echo -e "\n****** Tavoli mentes$par: $TAVOLI, $T_MAXMENT, $T_HAVI_MAXMENT;" >> $DEBUGFILE

if $TAVOLI; then

    echo "$USERNEV@$SERVER, SSHPAR: $SSHPAR, SCPPAR:$SCPPAR, $T_HOVA" >> $DEBUGFILE

    # Ha nincs helyi mentes...
    if ! $HELYI; then
       FatalError "$E_NO_HELYI"
    fi

    # Ha tavoli gepen nem tudok futtatni programot
    if ! ss "whoami > /dev/null 2> /dev/null"; then
        FatalError "$E_NO_SSH"
    fi

    # Ha nincs tavoli dir, vagy nem irhato...
    if ! ss "test -w $T_HOVA"; then
        FatalError "$E_BODY_BADSSH"
    fi

    # Ha van honnan masolni... Kell legyen!
    if [ "$HONNAN" == "" ] ; then
        FatalError "Nincs HONNAN?"
    fi

    # Mentesek atmasolasa a tavoli gepre
    scp -o "NumberOfPasswordPrompts 0" $SCPPAR $HONNAN/$FNAME $USERNEV@$SERVER:$T_HOVA/$FNAME >> $BACKUPLOG 2>&1
    if [ "$?" == "0" ] ; then
       echo "SCP napi mentes - OK" >> $DEBUGFILE
       MENTES_T=true;
       T_MENTES="Tavoli$par:\n $USERNEV@$SERVER:$T_HOVA/$FNAME"
       TavoliFolosIrt "$T_HOVA/$FMASK" "$T_MAXMENT" "$T_GOOGLE_DRIVE"
    else
         E_BODY2="SCP hiba ($?) tavoli napi mentes kozben";
         echo "$E_BODY2" >> $DEBUGFILE
         echo "$E_BODY2" >> $BACKUPLOG
    fi

    TavoliHaviMentes

    T_LISTL=`ss "ls -l $T_HOVA/$ALLMASK 2> /dev/null"`
    T_LISTL="Tavoli mentesek$par: (max. $T_MAXMENT napi, $T_HAVI_MAXMENT havi)\n$T_LISTL"
    echo -e "$T_LISTL" >> $DEBUGFILE
    IDOPONT=$(date +"%y/%m/%d %H:%M:%S")
    echo -e "** Tavoli mentes OK: $IDOPONT" >> $DEBUGFILE
fi

IDOPONT=$(date +"%y/%m/%d %H:%M:%S")
echo -e "\n****** Email$par: $IDOPONT" >> $DEBUGFILE

E_BODY="$E_BODY\n$T_MENTES"

if $MENTES_H || $MENTES_T; then
    E_BODY="$E_BODY\n\n$E_BODY2\n\n$H_LISTL\n\n$T_LISTL"
    SendMail "$E_UZENET_OK"
else
    E_BODY="$E_BODY\n\n$E_BODY_BAJ\n\n$H_LISTL\n\n$T_LISTL"
    SendMail "$E_UZENET_BAJ"
fi

IDOPONT=$(date +"%y/%m/%d %H:%M:%S")
echo -e "\n****** Email$par: OK. $IDOPONT" >> $DEBUGFILE

rm -f $BACKUPPID

#vege
