#!/bin/bash

###########################################################################
#                                                                         #
# Copyright (C) 2017, Xunta de Galicia for Consolidación Software Abalar  #
# Project <software.libre@edu.xunta.es>                                   #
# Author: Gonzalo Vázquez Enjamio <gonzalo.vazquez.enjamio.sa@everis.com> #
# Modified by: Alfonso Bilbao Vélez <alfonso.bilbao.velez.sa@everis.com>  #
# Developed by EVERIS S.L.                                                #
#                                                                         #
###########################################################################

#############
# VARIABLES #
#############

LOG_F="/usr/bin/journalctl -t puppet_rsync_background"
RSYNC_SERVER=prd-rsync-0001.xunta.local
DNS_SERVER2=debian.uvigo.es
DNS_SERVER=8.8.8.8

# Mensajes.
SIN_RED="Non hai conexion a internet. \n\nDeberias conectar o computador antes de continuar."


#############
# FUNCIONES #
#############

# Chequear EXIT => !=0 salir
function check_exit(){
        if [ $? -ne 0 ];then
                /usr/bin/logger -p user.error -t puppet_rsync_background "Produciuse un erro durante a $PROCESO" 
		exit
        fi
}

# Comprobar conectividad a internet.
function check_conexion(){
	#/bin/ping -c2 $DNS_SERVER 2> /dev/null
	/usr/bin/nslookup $DNS_SERVER > /dev/null

        if [ $? -eq 0 ];then
		/usr/bin/logger -p user.info -t puppet_rsync_background "Equipo con conectividade de red."

	else
		/usr/bin/logger -p user.info -t puppet_rsync_background  "Equipo sin conectividade de red."
		exit
	fi
}

# Comprobar servidor al que conectarse.
function server_inout(){
	#/bin/ping -c2 ${RSYNC_SERVER} 2> /dev/null
	/usr/bin/nslookup ${RSYNC_SERVER} > /dev/null

	if [ $? -eq 0 ];then ## Dentro de la red corporativa

        	SERVER=$(echo ${RSYNC_SERVER})

	else ## Fuera de la red corporativa

		SERVER=repo-abalar.edu.xunta.gal
		# TODO: borrar (también la variable DNS_SERVER2)
		#/bin/ping -c2 ${DNS_SERVER2} 2> /dev/null
		#if [ $? -eq 0 ]; then
		#	SERVER=$(echo ${DNS_SERVER2})
		#else
		#	/bin/ping -c2 ${DNS_SERVER2} 2> /dev/null
		#	if [ $? -eq 0 ]; then
		#		SERVER="$(dig +short ${DNS_SERVER2})"
		#	fi
		#fi
	fi
}

# Seleccionar puppet_code.
function check_puppet_code(){
        DISTRO=$(lsb_release -c | awk '{print $2}')
        if [ "$DISTRO" = 'jessie' ];then
                RSYNC_REPO="puppet_ext"
        elif [ "$DISTRO" = 'stretch' ]; then
                RSYNC_REPO="puppet_ext7"
        elif [ "$DISTRO" = 'buster' ]; then
                RSYNC_REPO="puppet_ext20"
		elif [ "$DISTRO" = 'bullseye' ]; then
                RSYNC_REPO="puppet_ext11"
		elif [ "$DISTRO" = 'bookworm' ]; then
                RSYNC_REPO="puppet_ext12"
        fi

}

# Seleccionar puppet_code ext.
function check_puppet_ext_code(){
        DISTRO=$(lsb_release -c | awk '{print $2}')
        if [ "$DISTRO" = 'jessie' ];then
                FILE_EXT=".puppetlocal_ext.tar.gz"
        elif [ "$DISTRO" = 'stretch' ];then
                FILE_EXT=".puppetlocal_ext7.tar.gz"
        elif [ "$DISTRO" = 'buster' ]; then
                FILE_EXT=".puppetlocal_ext20.tar.gz"
		elif [ "$DISTRO" = 'bullseye' ]; then
                FILE_EXT=".puppetlocal_ext11.tar.gz"
		elif [ "$DISTRO" = 'bookworm' ]; then
        		FILE_EXT=".puppetlocal_ext12.tar.gz"
        fi

}


# RSYNC puppet code.
function sincronizar(){
	 PROCESO="sincronización"
	 /usr/bin/logger -p user.info -t puppet_rsync_background "Comeza a sincronización."

	 /usr/bin/rsync -prlthz --chown=root:root --chmod=Du=rwx,Dgo=rx,Fu=rwx,Fgo=rx --contimeout=300 --info=progress2 --delete --exclude={'.git','.gitignore'} rsync://$SERVER/$RSYNC_REPO/ /opt/puppetlocal/ | /usr/bin/tee >(systemd-cat -t puppet_rsync_background)
	/usr/bin/logger -p user.info -t puppet_rsync_background "Sincronización finalizada con exito."
	check_exit
}

# Ejecutar puppet.
function puppetizar(){
	PROCESO="aplicación de cambios"
	/usr/bin/logger -p user.info -t puppet_rsync_background "Comeza a aplicación de cambios."
	if [ ${RSYNC_REPO} == 'puppet_ext' ];then  ## Abalar 17
        	/usr/bin/logger -t puppet_rsync_background "Funcion puppetizar, valor de puppet_ext ${RSYNC_REPO}"
	        /usr/bin/puppet apply -v /opt/puppetlocal/manifests/site.pp --manifestdir /opt/puppetlocal/manifests/ --modulepath /opt/puppetlocal/modules/ --fileserver /opt/puppetlocal/fileserver.conf 2>&1 | /usr/bin/tee >(systemd-cat -t puppet_rsync_background)
			/usr/bin/logger -p user.info -t puppet_rsync_background "Cambios realizados con exito."
		check_exit
	else
        	/usr/bin/logger -t puppet_rsync_background "Funcion puppetizar, valor de puppet_ext ${RSYNC_REPO}"
			/usr/bin/puppet apply -v /opt/puppetlocal/manifests/site.pp --modulepath /opt/puppetlocal/modules/ 2>&1 | /usr/bin/tee >(systemd-cat -t puppet_rsync_background)
	        /usr/bin/logger -p user.info -t puppet_rsync_background "Cambios realizados con exito."
	        check_exit
	fi
}

function advertencia(){
	/usr/bin/logger -p user.warning -t puppet_rsync_background "Non existe conexión co servidor: $SERVER"	
}

########
# MAIN #
########

main(){
	# Comprobar conectividad a Internet.
	check_conexion

	# Comprobar servidor.
	server_inout
	#/bin/ping -c2 $SERVER
	/usr/bin/nslookup $SERVER > /dev/null
	
	if [ $? -eq 0 ]; then
		if [ $SERVER == $RSYNC_SERVER ]; then ## Dentro de la red corporativa

			/usr/bin/logger -p user.info -t puppet_rsync_background "Comeza o proceso de actualización en segundo plano."
			#Selección de puppet_code
			check_puppet_code

			# Sincronización
			sincronizar

			# Actualización
			puppetizar

		else ## Fuera de la red corporativa

# Para volver a activar a descarga do .tar do repo-abalar, descomentar o seguinte:

#			# Selección del file puppet_ext_code del mirror
#                       check_puppet_ext_code

#			# Spider
#			/usr/bin/logger -p user.info -t puppet_rsync_background "Comeza a sincronización externa en segundo plano."
#			WGET_SERVER="repo-abalar.edu.xunta.gal/${FILE_EXT}"
#			SPIDER=$(wget --spider -P /opt/ -N ${WGET_SERVER}; echo $?)
#			if [[ ${SPIDER} -ne 4 ]] && [[ ${SPIDER} -ne 8 ]]; then
#				wget -P /opt/ --no-cache -qN ${WGET_SERVER} 2>&1 | tee /tmp/wget.log
#				grep -q "not modified on server" /tmp/wget.log
#				if [ $? -ne 0 ]; then
#					rm -fr /opt/puppetlocal/*
#					tar -xvzf /opt/${FILE_EXT} -C /opt/puppetlocal
#				fi
#			fi

			# Update TODO: update necesario?
			apt-get update

			# Seleccion puppet_code TODO: función necesaria aquí?
			check_puppet_code

			# Actualización
			puppetizar
		fi

	else
		advertencia
	fi
}

main
