#!/bin/bash

# Pandora FMS Server Installer (c) 2008-2010 Artica ST
# Linux Version (generic), for SuSe and Debian/Ubuntu only
# other Linux distros could not work properly without modifications
# Please see http://www.pandorafms.org
# v3.1 Build 100223
# This code is licensed under GPL 2.0 license.
# **********************************************************************


MODE=$1
SECOPT=$2
PANDORA_SPOOL=/var/spool/pandora
PANDORA_HOME=/usr/share/pandora_server
PANDORA_CFG_DIR=/etc/pandora
PANDORA_LOG=/var/log/pandora
PANDORA_SERVER=/etc/init.d/pandora_server
TENTACLE_SERVER=/etc/init.d/tentacle_serverd
PANDORA_CFG_FILE=/etc/pandora/pandora_server.conf


get_distro () {
	# Get Linux Distro type and version
	# We assume we are on Linux unless told otherwise
	LINUX=YES
	if [ -f "/etc/SuSE-release" ]
	then
		OS_VERSION=`cat /etc/SuSE-release | grep VERSION | cut -f 3 -d " "`
		LINUX_DISTRO=SUSE
	elif [ -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"
	elif [ -f "/etc/debian_version" ]
	then
		OS_VERSION=`cat /etc/debian_version`
		OS_VERSION="DEBIAN $OS_VERSION"
		LINUX_DISTRO=DEBIAN
	elif [ -f "/etc/fedora-release" ]
	then
		OS_VERSION=`cat /etc/fedora-release | cut -f 4 -d " "`
		OS_VERSION="FEDORA $OS_VERSION"
		LINUX_DISTRO=FEDORA
	elif [ `uname -s` == "Darwin" ]
	then
		# For future reference, Darwin doesn't have /etc/init.d but uses LaunchDaemons
		LINUX_DISTRO="Darwin"
		OS_VERSION=`uname -r`
		LINUX=NO
	elif [ `uname -s` == "AIX" ]
	then
		# For future reference, AIX doesn't have /etc/init.d
		LINUX_DISTRO="AIX"
		OS_VERSION=`uname -r`
		LINUX=NO
	elif [ `uname -s` == "SunOS" ]
	then
		# Some Solaris and other Unices don't have /etc/init.d, some have /usr/spool instead of /var/spool
		LINUX_DISTRO="Solaris"
		OS_VERSION=`uname -r`
		LINUX=NO
	elif [ `uname -s` == "Linux" ]
	then
		# Test for Linux to make sure we're on Linux
		LINUX_DISTRO="GENERIC"
		OS_VERSION=`uname -r`
	else
		# Default to Linux is false, test for real Linux above - that way we don't assume we can just plunk down files everywhere
		LINUX_DISTRO=`uname -s`
		OS_VERSION=`uname -r`
		LINUX=NO
	fi
	echo "$LINUX_DISTRO:$OS_VERSION:$LINUX"
}


install () {

	perl Makefile.PL > output 2>&1 #&& sleep 2 && cat output | grep "found" | wc -l 
	DEPENDENCIAS=`cat output | grep "found" | wc -l`
	if [ $DEPENDENCIAS -gt 0 ]
	then
		echo "You are missing the following dependencies"
		echo " "
		cat output | awk -F ": prerequisite" '{print $2}' | awk -F " " '{print $1}'
		echo "The complete installation guide is at: "http://www.openideas.info/wiki/index.php?title=Pandora_2.0:Documentation_en:Install_Server#Pandora_FMS_Server_installation" "
		echo " "
		echo "Debian-based distribution do:"
		echo "	# apt-get install snmp snmpd libtime-format-perl libxml-simple-perl libnetaddr-ip-perl libdbi-perl libxml-simple-perl libnetaddr-ip-perl libhtml-parser-perl wmi-client xprobe2 libmail-sendmail-perl"
		echo " "
		echo "For CentOS / RHEL do: "
		echo " "
		echo "	# yum install perl-XML-SAX* perl-Tie* perl-XML-Simple* perl-IO-Socket* perl-Time-modules* perl-NetAddr-IP* perl-DateTime* perl-ExtUtils perl-DBI nmap xprobe2"
		echo " "
		echo "For OpenSUSE / SLES do : "
		echo " "
		echo "	# zypper install install nmap perl-DBD-mysql perl-DBI perl-Date-Calc perl-HTML-Parser 
perl-HTML-Encoding perl-HTML-Tree perl-IO-Socket-Multicast perl-Mail-Sendmail perl-NetAddr-IP 
perl-TimeDate perl-XML-Simple perl-libwww-perl mysql-client"
		echo " "
		echo "	You also will need to install xprobe2 and wmiclient from rpm (download from our website)"
		echo " "
		echo "To get it from source through CPAN do"
		echo " "
		echo "	$ cpan Digest::MD5 Time::Local DBI XML::Simple IO::Socket Time::HiRes Time::Format NetAddr::IP Mail::Sendmail Net::Traceroute::PurePerl HTML::Entities"
		echo " "
		rm output
	else

		# This returns a multiple value string, separated with ":" -> $LINUX_DISTRO:$OS_VERSION:$LINUX	
		GET_DISTRO="`get_distro`"
		DISTRO=`echo $GET_DISTRO | cut -f 1 -d ":"`
		OS_VERSION=`echo $GET_DISTRO | cut -f 2 -d ":"`
		LINUX=`echo $GET_DISTRO | cut -f 3 -d ":"`	
	
		if [ "$DISTRO" == "UBUNTU" ]
		then
			echo "UBUNTU distribution detected"
		elif [ "$DISTRO" == "SUSE" ]
		then
			echo "SUSE distribution detected"
		fi
		
		echo "Installing binaries and libraries"
		make
		make install
		
	    echo "Checking binaries at /usr/local/bin -> /usr/bin"
		if [ ! -e "/usr/bin/pandora_server" ]
		then
			if [ ! -e "/usr/local/bin/pandora_server" ]
			then
				echo "ERROR compiling Pandora FMS Server from sources. Aborting"
				exit 1
			fi
			ln -s /usr/local/bin/pandora_server /usr/bin
			ln -s /usr/local/bin/pandora_exec /usr/bin		
		fi

		echo "Creating common Pandora FMS directories"
		id pandora
		if [ $? -eq 0 ]; then
			echo " "
			echo "User pandora does exist, make sure the SSH directories are correct"
		else
			echo "Are you sure we can create a standard 'pandora' user locally? [y/N]"
			read AREYOUSURE
			if [ "$AREYOUSURE" == "y" ]; then
				useradd pandora 
				mkdir /home/pandora 2> /dev/null
				mkdir /home/pandora/.ssh 2> /dev/null
				chown -R pandora /home/pandora 
			else
				echo "Please create the 'pandora' user manually according to your authentication scheme then restart the installation"
				echo "Aborting..."
				exit 1
			fi
		fi

		mkdir $PANDORA_SPOOL 2> /dev/null
		mkdir $PANDORA_SPOOL/data_in 2> /dev/null
		mkdir $PANDORA_SPOOL/data_in/conf 2> /dev/null
		mkdir $PANDORA_SPOOL/data_in/md5 2> /dev/null
		mkdir $PANDORA_LOG 2> /dev/null	

		echo "Giving proper permission to /var/spool/pandora"
		id -g www-data > /dev/null
		if [ $? -eq 0 ]
		then
			chown -R pandora:www-data $PANDORA_SPOOL
		else
			id -g www > /dev/null
			if [ $? -eq 0 ]
			then
				chown -R pandora:www $PANDORA_SPOOL
			else
				id -g apache > /dev/null
				if [ $? -eq 0 ]
				then
					chown -R pandora:apache $PANDORA_SPOOL
				else
					echo "No web server user found, some functionality might not perform correctly"
					chown -R pandora:root $PANDORA_SPOOL
				fi
			fi
		fi
		
		
		echo "Creating setup directory in /etc/pandora"
		mkdir $PANDORA_CFG_DIR 2> /dev/null
		if [ -e $PANDORA_CFG_FILE ]
		then
			OLDFILENAMETMP=`date +"%Y-%m-%d"`
			echo "Old installation detected, backing up pandora_server.conf.$ODFILENAMETMP"
			mv $PANDORA_CFG_FILE $PANDORA_CFG_FILE.$OLDFILENAMETMP
		fi
		echo cp conf/pandora_server.conf $PANDORA_CFG_DIR
		cp conf/pandora_server.conf $PANDORA_CFG_DIR
		chmod 770 $PANDORA_CFG_FILE

		echo "Installing Pandora Server manual"
		cp man/man1/pandora_server.1.gz /usr/share/man/man1
		
		if [ "$LINUX" == "YES" ]
		then
			echo "Copying the daemon script into /etc/init.d/pandora_server"
			cp util/pandora_server /etc/init.d/		
			
			if [ "$DISTRO" == "UBUNTU" ] || [ "$DISTRO" == "DEBIAN" ]
			then
			
				echo "Linking startup script to /etc/rc2.d"
				update-rc.d pandora_server defaults
			else
				if [ "$DISTRO" == "SUSE" ]
				then
					echo "Creating startup daemons"
					insserv pandora_server
				else
					# Pandora FMS Server install (Other Distros)
					INITLV=`cat /etc/inittab | grep "[0-9]\:initdefault" | cut -f 2 -d ":"`
					if [ -z "$INITLV" ]
					then
						INITLV=2
					fi
					echo "Linking startup script to /etc/rc.d/rc$INITLV.d"
					ln -s $PANDORA_SERVER /etc/rc.d/rc$INITLV.d/S90pandora_server
				fi
			fi
		fi

		if [ -d /etc/logrotate.d ]; then
			echo "Creating logrotate.d entry for Pandora FMS log management"
			cp util/pandora_logrotate /etc/logrotate.d/pandora
		else
			echo "Please add a log rotation schedule manually to your log rotation daemon (if any)"
		fi
	
		if [ "$LINUX" == "YES" ]
		then
			if [ "$SECOPT" != "--no-tentacle" ]
			then
				if [ "$DISTRO" == "UBUNTU" ] || [ "$DISTRO" == "DEBIAN" ]
				then
					# Tentacle server install (Ubuntu)
					echo "Installing tentacle server"
					cp bin/tentacle_server /usr/bin
					cp util/tentacle_serverd $TENTACLE_SERVER
   				    update-rc.d tentacle_serverd defaults
				else
					if [ "$DISTRO" == "SUSE" ]
					then
						echo "Creating Tentacle startup daemon"
						cp bin/tentacle_server /usr/bin
						cp util/tentacle_serverd /etc/init.d/tentacle_serverd
						insserv tentacle_serverd
					else
						# Tentacle server install (Other Distros)
						echo "Installing tentacle server in /etc/rc.d/rc$INITLV.d/S80tentacle_serverd"
						cp bin/tentacle_server /usr/bin
						cp util/tentacle_serverd /etc/init.d/tentacle_serverd
						ln -s $TENTACLE_SERVER /etc/rc.d/rc$INITLV.d/S80tentacle_serverd
					fi
				fi

				echo "Installing Tentacle Server manual"
				cp man/man1/tentacle_server.1.gz /usr/share/man/man1
			fi
		fi

		echo "Creating Pandora FMS distribution directory in /usr/share/pandora_server"
		mkdir $PANDORA_HOME 2> /dev/null
		cp -R util $PANDORA_HOME
		
		if [ -d /etc/cron.daily ]
		then
			echo "Creating the Cron script to run daily Pandora DB tool"
			echo "#!/bin/bash" > /etc/cron.daily/pandora_db	
			echo "perl /usr/share/pandora_server/util/pandora_db.pl /etc/pandora/pandora_server.conf" >> /etc/cron.daily/pandora_db	
			chmod +x /etc/cron.daily/pandora_db
		else
			echo "You're probably not using cron for automatic scheduling. You should schedule the following command to run frequently (daily) on your master server:"
			echo "	perl /usr/share/pandora_server/util/pandora_db.pl /etc/pandora/pandora_server.conf"
		fi
		echo
		echo "Now you have to edit your /etc/pandora/pandora_server.conf file to change the database password (default is pandora) with the one set in include/config.php of your Pandora FMS Console."
		echo "After setting password you can start your Pandora FMS Server!!"
		rm output

		if [ -d "/etc/logrotate.d" ]
		then
			echo "Managing Pandora FMS logs with logrotate (Distro independent)"
			cp -aRf util/pandora_logrotate /etc/logrotate.d/pandora
		fi
	fi

}

uninstall () {
	GET_DISTRO="`get_distro`"
	DISTRO=`echo $GET_DISTRO | cut -f 1 -d ":"`
	if [ "`uname -s`" != "Linux" ]; then
			echo "This is not a Linux-based distro. Uninstaller is currently not working for your OS"
	fi
	echo "Removing Pandora Servers"
	rm -Rf $PANDORA_SPOOL/data_in/

	echo "If the user Pandora is not being used for any other operations, please delete using the following commands:"
	echo "	userdel pandora"
	echo "	rm -Rf /home/pandora/"

	## Just to clarify here. Some people (like me) are using the pandora user 
	## for other purposes and/or using an LDAP-based user management
	## I would hate to have a script clear out this users' information without any notification

	rm -Rf $PANDORA_LOG 2> /dev/null 
	rm -Rf $PANDORA_CFG_FILE 2> /dev/null
	rm -Rf $PANDORA_SERVER 2> /dev/null 
	rm -Rf /usr/bin/pandora_server 2> /dev/null
	rm -Rf /usr/bin/pandora_exec 2> /dev/null
	rm -Rf $PANDORA_HOME
	rm -Rf /etc/cron.daily/pandora_db
	rm -Rf /etc/logrotate.d/pandora
	if [ "$DISTRO" == "UBUNTU" ] || [ "$DISTRO" == "DEBIAN" ]
	then
		update-rc.d -f pandora_server remove
		update-rc.d -f tentacle_serverd remove
	fi
	rm -Rf /etc/rc2.d/S90pandora_server 2> /dev/null 
	rm -Rf /etc/rc.d/rc3.d/S90pandora_server 2> /dev/null 
	echo "Done"
}

help () {
	echo "	--install	To install Pandora FMS Servers on this system (You have to be root)"
	echo "	--uninstall	To uninstall and remove Pandora FMS Servers on this System"
	echo " "
	echo " Additional parameters (after --install) "
	echo " "
	echo "	--no-tentacle	Skip tentacle server installation (by default tentacle server installed)"
	echo " "
}

# Script banner at start
echo " "
echo "Pandora FMS 3.1 Server Installer (c) 2008-2010 Artica ST"
echo "This program is licensed under GPL2 Terms. http://pandorafms.org"
echo " "

case "$MODE" in

'--install')
	install
	exit
	;;

'--uninstall')
	uninstall
	exit
	;;

*)
	help
esac