#!/bin/sh
#
# Common environment variables
#

set_constants () {
  MYNAME=`uname -n`
  DATENOW=`date '+%Y%m%d-%H%M%S'`

  BASE=
  ZCBIN=${BASE}/zTools/zConfig/bin
  ZCDOT=${BASE}/zTools/zConfig/dotfiles
  ZCETC=${BASE}/zTools/zConfig/etc
  ZCGNOME=${BASE}/zTools/zConfig/gnome
  ZCKICK=${BASE}/zTools/zConfig/kick
  ZCSYN=${BASE}/zTools/zConfig/syn
  ZCAPPDIR=${BASE}/zTools/zGold/Apps/LinuxApps
  ZPCETC=${BASE}/zTools/zPrivateConfig/etc

  ZDOCKER=${BASE}/zTools/zDocker

  APPDIR=${BASE}/zTools/zGold/Apps/LinuxApps
  THIS_SCRIPT=`basename $0`
  THIS_PATH=`dirname $0`
  LOCK=/var/tmp/${THIS_SCRIPT}.lock
  LOG=/var/tmp/${THIS_SCRIPT}.log
  ERROR=/var/tmp/${THIS_SCRIPT}.error.$$

  APP=${THIS_SCRIPT}
  VERSION=
}


################### shared functions below

myip () {
  MYEXTERNALIP=$(dig +short myip.opendns.com @resolver1.opendns.com)
  MYFULLIP=$(ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}')
  MYNETWORK=$(echo ${MYFULLIP}| cut -f1-3 -d.)
  MYIP=$(echo ${MYFULLIP}| cut -f4 -d.)
  echo "MYEXTERNALIP ${MYEXTERNALIP}"
  echo "MYFULLIP ${MYFULLIP}"
  echo "MYIP ${MYIP}"
  echo -e "MYNETWORK ${MYNETWORK}\n"
  export MYFULLIP MYNETWORK MYIP MYEXTERNALIP
}

check_rsync () {
  if [ -f /bin/rsync ]
  then
    RSYNC=/bin/rsync
  fi

  if [ -f /usr/bin/rsync ]
  then
    RSYNC=/usr/bin/rsync
  else
    echo "No rsync present"
    exit 1
  fi
}

check_keystore () {
  if [ ! -d ${KEYSTORE} ]
  then
    mkdir -p ${KEYSTORE}
  fi
}

check_bastionkey () {
  if [ ! -f ${BASTIONKEY} ]
  then
    ssh-keygen -o -a 100 -t ed25519 -f ${BASTIONKEY} -N "" -C bastion@${NAME}
    cp -p ${BASTIONKEY}.pub ${KEYSTORE}/_b${NAME}.pub
    cp -p ${BASTIONKEY}.pub ${KEYSTORE}/_d${NAME}.pub
  fi
}

check_gitkey () {
  if [ ! -f ${GITKEY} ]
  then
    ssh-keygen -o -a 100 -t ed25519 -f ${GITKEY} -N "" -C git@${NAME}
  fi
}

check_rsynckey () {
  if [ ! -f ${RSYNCKEY} ]
  then
    ssh-keygen -o -a 100 -t ed25519 -f ${RSYNCKEY} -N "" -C rsync@${NAME}
    cp -p ${RSYNCKEY}.pub ${KEYSTORE}/_r${NAME}.pub
  fi
}

check_vibblerkey () {
  if [ ! -f ${VIBBLERKEY} ]
  then
    ssh-keygen -o -a 100 -t ed25519 -f ${VIBBLERKEY} -N "" -C vibbler@${NAME}
    cp -p ${VIBBLERKEY}.pub ${KEYSTORE}/_v${NAME}.pub
  fi
}

check_key () {
  if [ ! -f ${KEYSTORE}/${KEYNAME} ]
  then
    ssh-keygen -o -a 100 -t ed25519 -f ${KEYSTORE}/${KEYNAME} -N "" -C ${KEYNAME}@${MACHINENAME}
  fi
  cp -p ${KEYSTORE}/${KEYNAME}.pub ${KEYSTORE}/${KEYNAME_SHORT}${MACHINENAME}.pub
}

##
##
##
##
##
##

check_lock () {
  echo -e "\n\n--------SCRIPT $0 starting"

  FAILUREVALUE=600
  DATENOW=$(date +'%s')
  DATEFAILED=$((${DATENOW} - ${FAILUREVALUE}))

  if [ -f $LOCK ]
  then
    .  $LOCK
    # if script has no date for some reason then use DATEFAILED and reset eveyrthing
    SCRIPTDATE="${SCRIPTDATE:-$DATEFAILED}"
    EXPIRED=$(($DATENOW - $SCRIPTDATE))

    echo " EXPIRED: $EXPIRED SCRIPTDATE:$SCRIPTDATE DATENOW: $DATENOW DATEFAILED:$DATEFAILED"
    if [ $EXPIRED -gt ${FAILUREVALUE} ]
    then
    rm -f $LOCK ; rm -f $LOCK
    echo "Cleared ${LOCK} for ${MYNAME} "
    killall ${THIS_SCRIPT}; killall ${THIS_SCRIPT}; killall ${THIS_SCRIPT}; killall ${THIS_SCRIPT}; killall ${THIS_SCRIPT}; killall ${THIS_SCRIPT};
    exit 1
    else
    echo "still ${THIS_SCRIPT} running on ${MYNAME} "
    echo "The lock file is ${LOCK}"
    exit 1
    fi
  else
    echo "SCRIPTDATE=`date +'%s'`" > ${LOCK}
  fi
}

rsync_pull_without_key () {
 echo "PORT to be used ${PORT}"
  
 case ${MYNAME} in
  FIRE6666| KHS666| FIRE660 | FIRE661 | FIRE662 | FIRE663)
   ${RSYNC} -aq --progress --port=${PORT} --contimeout=2 --delete-after --delete-excluded \
   --exclude="@*" \
   --exclude=".stversions" \
   --exclude="*AppImage*" \
   --exclude="*appimage*" \
   --exclude="CCTV*" \
   --exclude="*Citrix*" \
   --exclude="*WinApps*" \
   --exclude="*wordpress*" \
   --exclude="*GOLDVirtuals*" \
   $SOURCE::${RSYNCSOURCE} ${RSYNCDEST}
  ;;
  *)
   ${RSYNC} -aq --progress --port=${PORT} --contimeout=2 --delete-after --delete-excluded \
   --exclude="@*" \
   --exclude=".stversions" \
   --exclude="CCTV*" \
   --exclude="*Citrix*" \
   --exclude="*WinApps*" \
   --exclude="*wordpress*" \
   $SOURCE::${RSYNCSOURCE} ${RSYNCDEST}
  ;;
 esac
 
 if [ $? = 0 ]
 then
  echo "rsync was success"
  chmod 4755 ${ZCBIN}/.specialOn
  chmod 4755 ${ZCBIN}/.specialOff
  rm -rf /root/.sshkeys
  fix_cron
  rm ${LOCK}
  break 2
 fi
}

rsync_pull_with_key () {
 echo "RARGS to be used ${RARGS} and port ${PORT}"
  
 case ${MYNAME} in
  FIRE6666| KHS666| FIRE660 | FIRE661 | FIRE662 | FIRE663)
   ${RSYNC} -aq --progress -e "$RARGS" --port=${PORT} --delete-after --delete-excluded \
   --exclude="@*" \
   --exclude=".stversions" \
   --exclude="*AppImage*" \
   --exclude="*appimage*" \
   --exclude="CCTV*" \
   --exclude="*Citrix*" \
   --exclude="*WinApps*" \
   --exclude="*wordpress*" \
   --exclude="*GOLDVirtuals*" \
   $SOURCE::${RSYNCSOURCE} ${RSYNCDEST}
  ;;
  *)
   ${RSYNC} ${RSYNC_OPTS} -e "$RARGS" --port=${PORT} \
   --exclude="@*" \
   --exclude=".stversions" \
   --exclude="CCTV*" \
   --exclude="*Citrix*" \
   --exclude="*WinApps*" \
   --exclude="*wordpress*" \
   $SOURCE::${RSYNCSOURCE} ${RSYNCDEST}
  ;;
 esac
 
 if [ $? = 0 ]
 then
  echo "rsync was success"
  chmod 4755 ${ZCBIN}/.specialOn
  chmod 4755 ${ZCBIN}/.specialOff
  rm -rf /root/.sshkeys
  fix_cron
  rm ${LOCK}
  break 2
 fi
}

fix_cron () {
chmod -R 755 ${RSYNCDEST}
chown -R root:root ${RSYNCDEST}

if [ -f /etc/os-release ]
then
 . /etc/os-release
fi

case ${ID} in
 alpine | debian | ubuntu)
  echo "OS found is ${ID}"
  if [ -s ${ZPCETC}/crontabs/DEBcrontab ]
  then
    su root -c "crontab -u root ${ZPCETC}/crontabs/DEBcrontab"
  fi
  ;;
 centos | fedora)
  echo "OS found is ${ID}"
  if [ -s ${ZPCETC}/crontabs/GOLDcrontab ]
  then
    su root -c "crontab -u root ${ZPCETC}/crontabs/GOLDcrontab"
  fi
  ;;
 *)
  echo "OS NOT RECOGNISED"
  ;;
esac
}


######
# Main script below
#####
KEYSTORE=~/.mykeys
GITKEY=${KEYSTORE}/github
RSYNCKEY=${KEYSTORE}/rsync
BASTIONKEY=${KEYSTORE}/bastion
STATIC=/static


set_constants
check_rsync
NAME=$(uname -n|cut -c2-4)
LAST=$(uname -n| sed -e 's/.*\(.$\)/\1/')
NAME=$(uname -n)
LAST=$(uname -n)

check_keystore


KEYNAME=rsync
KEYNAME_SHORT=${PREFIX}$(echo $KEYNAME|cut -c1-2)${ID}
check_key






#####
# custom code
#####
ZGOLD=/zz/zGold
ZCONFIG=/zTools/zConfig
ZANSIBLE=/zTools/zAnsible
ZWINDOWSSHARE=/zTools/zWindowsShare
ZUSERCONFIG=/zTools/zUserConfig
ZPRIVATECONFIG=/zTools/zPrivateConfig
ZSHARED=/zTools/zShared

case $1 in
 gold)
  RSYNCSOURCE="public"
  RSYNCDEST=${ZGOLD}
  if [ ! -d ${ZGOLD} ]
  then 
   mkdir -p ${ZGOLD}
  fi
 ;;
 windows)
  RSYNCSOURCE="mywindowsshare"
  RSYNCDEST=${ZWINDOWSSHARE}
  if [ ! -d ${ZWINDOWSSHARE} ]
  then 
   mkdir -p ${ZWINDOWSSHARE}
  fi
 ;;
 ansible)
  RSYNCSOURCE="myansible"
  RSYNCDEST=${ZANSIBLE}
  if [ ! -d ${ZANSIBLE} ]
  then 
   mkdir -p ${ZANSIBLE}
  fi
 ;;
 userconfig)
  RSYNCSOURCE="myuserconfig"
  RSYNCDEST=${ZUSERCONFIG}
  if [ ! -d ${ZUSERCONFIG} ]
  then 
   mkdir -p ${ZUSERCONFIG}
  fi
 ;;
 privateconfig)
  RSYNCSOURCE="myprivateconfig"
  RSYNCDEST=${ZPRIVATECONFIG}
  if [ ! -d ${ZPRIVATECONFIG} ]
  then 
   mkdir -p ${ZPRIVATECONFIG}
  fi
 ;;
 zshared)
  RSYNCSOURCE="myzshared"
  RSYNCDEST=${ZSHARED}
  if [ ! -d ${ZSHARED} ]
  then 
   mkdir -p ${ZSHARED}
  fi
 ;;
 myconfig)
  RSYNCSOURCE="myconfig"
  RSYNCDEST=${ZCONFIG}
  if [ ! -d ${ZCONFIG} ]
  then 
   mkdir -p ${ZCONFIG}
  fi
  ;;
 *)
  RSYNCSOURCE="public"
  RSYNCDEST=${ZGOLD}
  if [ ! -d ${ZGOLD} ]
  then 
   mkdir -p ${ZGOLD}
  fi
  ;;
esac

if [ -s /root/.cpullenv ]
then
 . /root/.cpullenv
else
 echo "UPDATE the file /root/.cpullenv"
 echo "DESTINATIONS="xxxxxxxxxxxxx yyyy"" > /root/.cpullenv
 echo "RSYNC_PORT=" >> /root/.cpullenv
 echo "SSH_PORT=" >> /root/.cpullenv
 echo "SSH_USER" >> /root/.cpullenv
 exit 1
fi

cd ${RSYNCDEST}
for i in $DESTINATIONS
do
  echo "\n\n------------------------ Trying $i"
  SOURCE=$i
  USER=${SSH_USER}

  # PORT=${RSYNC_PORT}
  # RSYNC_OPTS="-aqP --progress --delete-after --delete-excluded --contimeout=2"
  # echo "\n*********** Trying ${i} withOUT key on ${PORT} and ${USER} for ${RSYNCDEST} ******"
  # rsync_pull_without_key
  
  PORT=${SSH_PORT}
  RARGS="ssh -i ${RSYNCKEY} -p${PORT}  -l ${USER} -o ConnectTimeout=5 -o CheckHostIP=no -o StrictHostKeyChecking=no"
  RSYNC_OPTS="-aqP --progress --delete-after --delete-excluded"
  echo "\n*********** Trying ${i} with key on ${PORT} and ${USER} for ${RSYNCDEST} ******"
  rsync_pull_with_key
done




#####
rm ${LOCK}
exit 0
