#!/bin/sh # ********************************************************************** # Pandora FMS - Asyncronous version for OpenWRT / Arduino integration # (c) 2004-2008 Sancho Lerena # (c) 2007 Jorge Loza # Please see Pandora FMS official home at http://pandora.sourceforge.net # This code is licensed under GPL 2.0 licence # ********************************************************************** AGENT_VERSION=2.0-dev AGENT_BUILD=080102 if [ -z "$1" ] then echo " " echo "Fatal error: I need an argument to Pandora FMS Agent config directory" echo " " echo " example: pandora_agent /opt/pandora " echo " " exit -1 else PANDORA_HOME=$1 fi if [ ! -f $PANDORA_HOME/pandora_agent.conf ] then echo " " echo "FATAL ERROR: Cannot load $PANDORA_HOME/pandora_agent.conf" echo " " exit -1 fi # Init internal variables CONTADOR=0 EXECUTE=1 MODULE_END=0 TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"` IFS=" " # Default values CHECKSUM_MODE=1 DEBUG_MODE=0 SERVER_PORT=22 INTERVAL=300 TRANSFER_MODE=ssh if [ -z "`echo $LANG | grep '\.'`" ] then ENCODING="iso-8859-1" else ENCODING=`echo $LANG | cut -f 2 -d "."` fi NOMBRE_HOST="linksys" OS_NAME=`uname -s` PANDORA_LOGFILE=/var/log/pandora_agent.log TEMP=/tmp # Read config file for a in `cat $PANDORA_HOME/pandora_agent.conf | grep -v -e "^#" | grep -v -e "^module" ` do a=`echo $a | tr -s " " " "` # Get general configuration parameters from config file if [ ! -z "`echo $a | grep -e '^logfile'`" ] then PANDORA_LOGFILE=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Pandora Logfile is $PANDORA_LOGFILE" >> $PANDORA_LOGFILE fi 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" >> $PANDORA_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" >> $PANDORA_LOGFILE fi if [ ! -z "`echo $a | grep -e '^temporal'`" ] then TEMP=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Temporal Path is $TEMP" >> $PANDORA_LOGFILE fi if [ ! -z "`echo $a | grep -e '^interval'`" ] then INTERVAL=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Interval is $INTERVAL seconds" >> $PANDORA_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 " >> $PANDORA_LOGFILE fi if [ ! -z "`echo $a | grep -e '^debug'`" ] then DEBUG_MODE=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Debug mode is $DEBUG_MODE " >> $PANDORA_LOGFILE fi if [ ! -z "`echo $a | grep -e '^checksum'`" ] then CHECKSUM_MODE=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Checksum is $CHECKSUM_MODE " >> $PANDORA_LOGFILE fi # Contribution of daggett if [ ! -z "`echo $a | grep -e '^server_port'`" ] then SERVER_PORT=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Server Port is $SERVER_PORT" >> $PANDORA_LOGFILE fi # Contribution of daggett if [ ! -z "`echo $a | grep -e '^encoding'`" ] then ENCODING=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Encoding is $ENCODING" >> $PANDORA_LOGFILE fi if [ ! -z "`echo $a | grep -e '^transfer_mode'`" ] then TRANSFER_MODE=`echo $a | awk '{ print $2 }' ` echo "$TIMESTAMP - [SETUP] - Transfer Mode is $TRANSFER_MODE" >> $PANDORA_LOGFILE fi done # Script banner at start echo "Pandora FMS Agent / OpenWRT $AGENT_VERSION (c) Sancho Lerena, Jorge Loza 2007-2008" echo "This program is licensed under GPL2 Terms. http://pandora.sf.net" echo " " # Make some checks if [ "$TRANSFER_MODE" = "ftp" ] then if [ ! -f $HOME/.netrc ] then echo "(EE) Transfer mode is FTP but there is no usable .netrc file. Aborting." exit fi fi if [ "$DEBUG_MODE" = "1" ] then echo "(**) Warning: Running in DEBUG mode" fi # MAIN Program loop begin DATE_START=`date +%s` SYNC_DATA="`grep "^module_async" $PANDORA_HOME/pandora_agent.conf | wc -l`" if [ $SYNC_DATA -gt 0 ] then while [ 1 ] do GETSYNC_DATA=`$PANDORA_HOME/pandora_getsync` if [ "$GETSYNC_DATA" != "0" ] then pandora_datarun 1 "$GETSYNC_DATA" fi DATE_CURRENT=`date +%s` DATE_DIFF=$(($DATE_CURRENT - $DATE_START)) if [ $DATE_DIFF -gt $INTERVAL ] then pandora_datarun 0 "N/A" fi done else while [ 1 ] do pandora_datarun 0 "N/A" sleep $INTERVAL done fi pandora_datarun () { # Chunkmode 1 for Async, 0 for Sync CHUNKMODE=$1 SYNCDATA=$2 # PREPARE XML DATA FILE BEGIN # Deleted debug / error info on each run to avoid giant logs rm -Rf $PANDORA_LOGFILE.err 2> /dev/null # Date and time, SERIAL is number of seconds since 1/1/1970, for every packet. TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"` SERIAL=`date +"%s"` # File names DATA=$TEMP/$NOMBRE_HOST.$SERIAL.data DATA2=$TEMP/$NOMBRE_HOST.$SERIAL.data_temp CHECKSUM=$TEMP/$NOMBRE_HOST.$SERIAL.checksum PANDORA_FILES="$TEMP/$NOMBRE_HOST.$SERIAL.*" # Makes data packet echo " " > $DATA echo "" >> $DATA pandora_async_chunk "$PANDORA_HOME/pandora_agent.conf" "$DATA2" "$DATA" for a in `cat $PANDORA_HOME/pandora_agent.conf | grep -v -e "^#" | grep -e "^module" ` do a=`echo $a | tr -s " " " "` DIGITALGATE=0 if [ ! -z "`echo $a | grep -e '^module_exec'`" ] then if [ $EXECUTE -eq 0 ] then execution=`echo $a | cut -c 13- ` res=`eval $execution` if [ -z "$flux_string" ] then res=`eval expr $res 2> $PANDORA_LOGFILE.err` fi echo "" >> $DATA2 fi fi if [ ! -z "`echo $a | grep -e '^module_async'`" ] then if [ $CHUNKMODE -eq 1 ] then DIGITALGATE=`echo $a | cut -c 14- ` if [ -z "`echo $SYNCDATA | grep \"$DIGITALGATE\"`" ] then EXECUTE=1 echo "Avoiding execution for DIGITALGATE $DIGITALGATE" fi fi fi if [ ! -z "`echo $a | grep -e '^module_name'`" ] then name=`echo $a | cut -c 13- ` echo "" >> $DATA2 fi if [ ! -z "`echo $a | grep -e '^module_begin'`" ] then echo "" >> $DATA2 EXECUTE=0 fi if [ ! -z "`echo $a | grep -e '^module_max' `" ] then max=`echo $a | awk '{ print $2 }' ` echo "" >> $DATA2 fi if [ ! -z "`echo $a | grep -e '^module_min'`" ] then min=`echo $a | awk '{ print $2 }' ` echo "" >> $DATA2 fi if [ ! -z "`echo $a | grep -e '^module_description'`" ] then desc=`echo $a | cut -c 20- ` echo "" >> $DATA2 fi if [ ! -z "`echo $a | grep -e '^module_end'`" ] then echo "" >> $DATA2 MODULE_END=1 else MODULE_END=0 fi if [ ! -z "`echo $a | grep -e '^module_type'`" ] then mtype=`echo $a | awk '{ print $2 }' ` if [ ! -z "`echo $mtype | grep 'generic_data_string'`" ] then flux_string=1 else flux_string=0 unset flux_string fi echo "" >> $DATA2 fi if [ ! -z "`echo $a | grep '^module_interval'`" ] then # Determine if execution is to be done MODULEINTERVAL=`echo $a | awk '{ print $2 }'` EXECUTE=`expr \( $CONTADOR + 1 \) % $MODULEINTERVAL` fi # If module ends, and execute for this module is enabled # then write if [ $MODULE_END -eq 1 ] then if [ $CHUNKMODE -eq 1 ] then if [ $DIGITALGATE -eq 0 ] then EXECUTE=1 fi fi if [ $EXECUTE -eq 0 ] then cat $DATA2 >> $DATA fi rm -Rf $DATA2 > /dev/null 2> /dev/null # If this is SYNC mode, for each finished module # we should check for pending ASYNC modules # (if defined and any pending to read) if [ $CHUNKMODE -eq 0 ] && [ $SYNC_DATA -gt 0 ] then GETSYNC_DATA=`$PANDORA_HOME/pandora_getsync` if [ "$GETSYNC_DATA" != "0" ] then pandora_datarun 1 "$GETSYNC_DATA" fi fi fi done # Ony for SYNC mode if [ $CHUNKMODE -eq 0 ] then # Count number of agent runs CONTADOR=`expr $CONTADOR + 1` # Keep a limit of 100 for overflow reasons if [ $CONTADOR -eq 100 ] then CONTADOR=0 fi # Call for user-defined script for data adquisition if [ -f "$PANDORA_HOME/pandora_user.conf" ] then /bin/sh $PANDORA_HOME/pandora_user.conf >> $DATA fi # Checking MD5 if [ "$CHECKSUM_MODE" = "1" ] then # Calculate Checksum and prepare MD5 file CHECKSUM_DATA=`md5sum $DATA` echo $CHECKSUM_DATA > $CHECKSUM else CHECKSUM_DATA="No valid checksum" echo $CHECKSUM_DATA > $CHECKSUM fi fi # Finish data packet echo "" >> $DATA echo "" >> $DATA # Replace & chars in XML (should not to be any) to avoid syntax problems sed "s/&/&/g" $DATA > $TEMP/finalxml.tmp rm -f $DATA mv $TEMP/finalxml.tmp $DATA if [ "$DEBUG_MODE" = "1" ] then echo "$TIMESTAMP - Finish writing XML $DATA" >> $PANDORA_LOGFILE echo "(**) Data file is at $DATA - Exiting now" echo " " exit 0 fi # Send packets to server and detele it if [ "$TRANSFER_MODE" = "ssh" ] then scp -i /opt/pandora/ssh $PANDORA_FILES pandora@$SERVER_IP:$SERVER_PATH > /dev/null 2> $PANDORA_LOGFILE.err fi if [ "$TRANSFER_MODE" = "ftp" ] then ftp SERVER_IP > /dev/null 2> $PANDORA_LOGFILE.err fi if [ "$TRANSFER_MODE" = "local" ] then cp $PANDORA_FILES $SERVER_PATH > /dev/null 2> $PANDORA_LOGFILE.err fi # Delete data rm -f $PANDORA_FILES 2> $PANDORA_LOGFILE.err }