#!/bin/bash
# **********************************************************************
# Babel EnterpriseGeneric Host Agent
# GNU/Linux version 
# (c) 2004-2007 Sancho Lerena <slerena@gmail.com>
# with the help of many people. Please see http://babel.sourceforge.net
# Este codigo esta licenciado bajo la licencia GPL 2.0.
# This code is licensed under GPL 2.0 license.
# **********************************************************************
BABEL_VERSION="1.1.070105"

IFS=$'\n'

if [ -z "$1" ]
then
	echo " "
	echo "FATAL ERROR: I need an argument to Babel Agent home path"
	echo " "
	echo " example:   babel_agent /usr/share/babel [module_name] "
	echo " "
	exit -1
else
	export BABEL_HOME=$1
fi

if [ ! -f $BABEL_HOME/babel_agent.conf ]
then
	echo " "
	echo "FATAL ERROR: Cannot load $BABEL_HOME/babel_agent.conf"
	echo " "
	exit -1
fi

# Get Linux Distro type and version
if [ -f "/etc/SuSE-release" ]
then
	OS_VERSION=`cat /etc/SuSE-release | grep VERSION | cut -f 3 -d " "`
	LINUX_DISTRO=SUSE
else
	if [ -f "/etc/lsb-release" ]
	then
		OS_VERSION=`cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -f 2 -d "="`
		LINUX_DISTRO=UBUNTU
		OS_VERSION="UBUNTU $OS_VERSION"
	else
		if [ -f "/etc/debian_version" ]
		then
			OS_VERSION=`cat /etc/debian_version`
			OS_VERSION="DEBIAN $OS_VERSION"
			LINUX_DISTRO=DEBIAN
		else
			if [ -f "/etc/fedora-release" ]
			then
				OS_VERSION=`cat /etc/fedora-release | cut -f 4 -d " "`
				OS_VERSION="FEDORA $OS_VERSION"
				LINUX_DISTRO=FEDORA
			else
				LINUX_DISTRO=GENERIC
				OS_VERSION=`uname -r`
			fi
		fi
	fi
fi

export LINUX_DISTRO

# Default values
OS_NAME=`uname -s`
POLICYNAME="N/A"
POLICYVERSION="N/A"
DEBUG=0
TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"`
INTERVAL=10080
if [ -z "`echo $LANG | grep '\.'`" ]
then
	ENCODING="iso-8859-1"
else
	ENCODING=`echo $LANG | cut -f 2 -d "."`
fi
SERVER_PORT=22
BABEL_LOGFILE="/var/log/babel_agent.log"
NOMBRE_HOST=`hostname`
TEMP="/tmp"

for a in `cat $BABEL_HOME/babel_agent.conf | grep -v -e "^#" `
do
	a=`echo $a | tr -s " " " "`
	if [ ! -z "`echo $a | grep -e '^logfile'`" ]
	then
		BABEL_LOGFILE=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Babel Logfile is $BABEL_LOGFILE" >> $BABEL_LOGFILE
        fi
 	if [ ! -z "`echo $a | grep -e '^temporal'`" ]
        then
                TEMP=`echo $a | awk '{ print $2 }' `
                echo "$TIMESTAMP - [SETUP] - Temporal Path is $TEMP" >> $BABEL_LOGFILE
        fi
	# Get general configuration parameters from config file
	if [ ! -z "`echo $a | grep -e '^server_ip'`" ]
	then
		SERVER_IP=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Server IP Address \
		is $SERVER_IP" >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^server_path'`" ]
	then
		SERVER_PATH=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Server Path is \
		$SERVER_PATH" >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^interval'`" ]
	then
		INTERVAL=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Interval is \
		$INTERVAL seconds" >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^agent_name'`" ]
	then
		NOMBRE_HOST=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Agent name is \
		$NOMBRE_HOST " >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^os_version'`" ]
	then
		OS_VERSION=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - OS Version is \
		$OS_VERSION " >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^debug'`" ]
	then
		DEBUG=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - DEBUG is \
		$DEBUG " >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^policy_name'`" ]
	then
		POLICYNAME=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Policy name is $POLICYNAME " >> $BABEL_LOGFILE
	fi
	if [ ! -z "`echo $a | grep -e '^policy_version'`" ]
	then
		POLICYVERSION=`echo $a | awk '{ print $2 }' `
		echo "$TIMESTAMP - [SETUP] - Policy version is $POLICYVERSION " >> $BABEL_LOGFILE
	fi
	# Contribution of daggett, from Pandora FMS project
	if [ ! -z "`echo $a | grep -e '^server_port'`" ]
        then
                SERVER_PORT=`echo $a | awk '{ print $2 }' `
                echo "$TIMESTAMP - [SETUP] - Server Port is $SERVER_PORT" >> $BABEL_LOGFILE
        fi
	# Contribution of daggett, from Pandora FMS project
	if [ ! -z "`echo $a | grep -e '^encoding'`" ]
        then
                ENCODING=`echo $a | awk '{ print $2 }' `
                echo "$TIMESTAMP - [SETUP] - Encoding is $ENCODING" >> $BABEL_LOGFILE
        fi
done

# Script banner at start
echo " "
echo "Babel Agent $BABEL_VERSION (c) Sancho Lerena, and others 2005-2007"
echo "This program is licensed under GPL2 Terms. http://babel.sourceforge.net"
echo "Running in $NOMBRE_HOST at $TIMESTAMP"

if [ "$DEBUG" == "1" ]
then
	echo " "
	echo "Warning: Running in DEBUG mode"
	echo " "
fi

while [ 1 ]
do
	# Deleted debug / error info on each run to avoid giant logs
	rm -Rf $BABEL_LOGFILE.err 2> /dev/null

	TIMESTAMP="`date "+%D %T"`"
	SERIAL=`date +"%s"`
	# File names
	export DATA=$TEMP/$NOMBRE_HOST.$SERIAL.data

	# XML header
	echo "<?xml version=\"1.0\" encoding=\"$ENCODING\"?> " > $DATA
	echo "<babeldata>" >> $DATA
	echo "<agent><name><![CDATA[$NOMBRE_HOST]]></name>" >> $DATA
	echo "<version><![CDATA[$BABEL_VERSION]]></version>" >> $DATA
	echo "<timestamp>$TIMESTAMP</timestamp>" >> $DATA
	echo "<os><![CDATA[$OS_NAME]]></os>" >> $DATA
	echo "<interval>$INTERVAL</interval>" >> $DATA
	echo "<os_version><![CDATA[$OS_VERSION]]></os_version>" >> $DATA
	echo "<policy_name><![CDATA[$POLICYNAME]]></policy_name>" >> $DATA
	echo "<policy_version><![CDATA[$POLICYVERSION]]></policy_version>" >> $DATA
	echo "</agent>" >> $DATA

	# Single module execution
	if [ ! -z "$2" ]
	then
		MODULO="$BABEL_HOME/modules/$2.bem"
		if [ $DEBUG = 1 ]
		then
			echo "Processing individual module $2" >> $BABEL_LOGFILE
		fi
		. $MODULO 2>> $BABEL_LOGFILE.err
	else
		# Executing each BEM module (Babel Executable Module)
		for a in `ls -1 $BABEL_HOME/modules/*.bem`
		do
			if [ "$DEBUG" == "1" ]
                	then
				LOG_TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"`
                        	echo "$LOG_TIMESTAMP - Processing module $a" >> $BABEL_LOGFILE
                	fi
			MODULO=`echo $a`
			$MODULO 2>> $BABEL_LOGFILE.err
		done
	fi

	echo "</babeldata>" >> $DATA
	echo "" >> $DATA 

	# Replace & chars in XML (should not to be any) to avoid syntax problems
	sed "s/&/&amp;/g" $DATA > $TEMP/finalxml.tmp
	rm -f $DATA
	mv $TEMP/finalxml.tmp $DATA
	
	if [ "$DEBUG" == "1" ]
	then
		echo "Debug mode. Exitting"
		echo "XML Data packet is on $DATA"
		exit
	fi
	# Copy using SSH to BabelServer
	scp -P $SERVER_PORT $DATA babel@$SERVER_IP:$SERVER_PATH  > /dev/null 2>  $PANDORA_LOGFILE.err
	rm -f $DATA

	# Going to sleep $INTERVAL (given in minutes). 
	# Making a loop for 60 sec/min
	LOOPC=0
	while [ $LOOPC -lt 60 ]
	do
		sleep $INTERVAL
		LOOPC=`expr $LOOPC + 1`
	done
done
