#!/bin/sh


#############################################################################################
# Script file used in S30autoConfigSyslog in rc.d startup file to :
# --> create a dynamic syslog-ng configuration file located in :
#     /etc/syslog-ng/conf.d/logappli.conf
# --> create the logappli.conf.sav configuration file in :
#	  /etc/syslog-ng/conf.d/working/
# --> manage (/read/create/delete/catch old configuration/) the facility configuration files in :
#     /etc/ICTApplication/module/LoggerModule/facility/<module name>.conf 
# --> generate one facility value per module name (start value : 24) 
#     -- saved in logappli.conf file
#############################################################################################




# Delete the old syslog-ng configuration file
rm /etc/syslog-ng/conf.d/logappli.conf > /dev/null 2>/dev/null
rm /etc/syslog-ng/defence.d/defence.conf > /dev/null 2>/dev/null



# Delete the temporary with extension ".new" configuration files
rm /etc/ICTApplication/module/LoggerModule/*.new > /dev/null 2>/dev/null


# Define the first facility value to be used
i=24

########################################################################################
# write_filter_beginning() method :
# --> Write the beginning of the syslog-ng facility configuration filter in :
#     /etc/syslog-ng/conf.d/logappli.conf
########################################################################################

write_filter_beginning(){            

	echo "############################   Facility $1  configuration  ###########################" >> /etc/syslog-ng/conf.d/logappli.conf
	echo "# BEGIN $1"  >> /etc/syslog-ng/conf.d/logappli.conf
}



########################################################################################
# write_filter_end() method :
# --> Write the end of the syslog-ng facility configuration filter in :
#     /etc/syslog-ng/conf.d/logappli.conf
########################################################################################

write_filter_end(){

	# Write the end of the syslog facility configuration file
	if [ $1 == "defence" ]; then 
	echo "log { source(src); filter(f_$1); destination(d_$1);};" >> /etc/syslog-ng/conf.d/logappli.conf

	else
	echo "log { source(src); filter(f_$1); destination(d_$1);};" >> /etc/syslog-ng/conf.d/logappli.conf
	fi
	echo "# END $1" >> /etc/syslog-ng/conf.d/logappli.conf
}


#####################################################################################
# update_config_file() method :
# --> Catch the old configuration in the syslog-ng facility configurations files : 
#     path : /etc/ICTApplication/module/LoggerModule/facility/<module name>.conf
#	  (if it is possible, otherwise create a new default config)
# --> Create a syslog-ng configuration per facility with old/new config parameters 
# Destination of all configuration filters :
#	  syslog-ng configuration file : /etc/syslog-ng/conf.d/logappli.conf 
#####################################################################################

update_config_file(){
    
		index=0
	
		# Path and file name of the facility configuration file to read
		filetoread=/etc/ICTApplication/module/LoggerModule/facility/$1

		# Read the file ...
		while read line; 
      			 do 
				# Convert the numeric value to a string written in the syslog-ng configuration file
				if [ $index -eq 0 ]; then
				filter_level=${line}

				if [ ${line} -eq 0 ]; then 
				filter_value="0"
				filter_level="emerg"
				
				elif [ ${line} -eq 3 ]; then 
				filter_value="3"
				filter_level="err"
				
				elif [ ${line} -eq 4 ]; then 
				filter_value="4"
				filter_level="warning"
				
				elif [ ${line} -eq 6 ]; then 
				filter_value="6"
				filter_level="info"
				
				elif [ ${line} -eq 7 ]; then 
				filter_value="7"
				filter_level="debug"
				
				else 
				# No valid level value found !!
				filter_value="3"
				filter_level="err"
				
				fi
				
		# Particular case : defence filter must not have any facility value 		
		if [ $3 == "defence" ]; then 
			echo "filter f_$3 { level($filter_level..emerg); };" >> /etc/syslog-ng/conf.d/logappli.conf
		else 	
			echo "filter f_$3 { level($filter_level..emerg) and facility($2); };" >> /etc/syslog-ng/conf.d/logappli.conf
		fi			
				fi

		if [ $index -eq 2 ]; then
		redirection=${line}
    	echo "destination d_$3 { $redirection; };" >> /etc/syslog-ng/conf.d/logappli.conf
	    fi

		index=$((index+1))
	
		done < $filetoread

		echo "$filter_value" >> /etc/ICTApplication/module/LoggerModule/facility/$3.new
		echo "$2" >> /etc/ICTApplication/module/LoggerModule/facility/$3.new
		echo "$redirection"  >> /etc/ICTApplication/module/LoggerModule/facility/$3.new
		
		# Write the facility signature field to the file
		echo "facility signature field" >> /etc/ICTApplication/module/LoggerModule/facility/$3.new
		
}

##################################################################################
# create_new_config_file() method :
# --> Create a new complete syslog-ng configuration for one facility
#     with default configurations
# --> Create a new complete facility configuration file with 
#     default configurations
###################################################################################

create_new_config_file(){

	# The facility configuration file does not exists - so we must :
	# - fix the facility filter level to : err
	# - fix the destination syslog stream to /var/log/<facility name>.log

    	
	# Write the destination configuration to the syslog-ng configuration file
	# defence facility has a particular threatment - the default path and file name is : /log/Defence.log
	
	if [ $1 == "defence" ]; then 
    	echo "destination d_$1 { file(\"/log/Defence.log\"); };" >> /etc/syslog-ng/conf.d/logappli.conf
    	else
    	echo "destination d_$1 { file(\"/var/log/$1.log\"); };" >> /etc/syslog-ng/conf.d/logappli.conf
   	fi

	# Write the filter configuration to the syslog-ng configuration file
	# No destination filter for defence facility
	
	if [ $1 == "defence" ]; then
    	echo "filter f_$1 { level(err..emerg); };" >> /etc/syslog-ng/conf.d/logappli.conf
  		else  echo "filter f_$1 { level(err..emerg) and facility($2); };" >> /etc/syslog-ng/conf.d/logappli.conf
	fi

	# Write the default log level to the facility configuration file
	echo "3" >> /etc/ICTApplication/module/LoggerModule/facility/$1.new

	# Write the facility value to the facility configuration file
	echo "$2" >> /etc/ICTApplication/module/LoggerModule/facility/$1.new

  	# Write redirection type to the facility configuration file
	if [ $1 == "defence" ]; then
		echo "file(\"/log/Defence.log\")" >> /etc/ICTApplication/module/LoggerModule/facility/$1.new
		else echo "file(\"/var/log/$1.log\")" >> /etc/ICTApplication/module/LoggerModule/facility/$1.new
	fi
	
	# Write the facility signature fiel to the file
	echo "facility signature field" >> /etc/ICTApplication/module/LoggerModule/facility/$1.new
	
}

##########################################################################
# Configure_file() method :
# --> read/write access to the facility configuration files located in :
#     /etc/ICTApplication/module/LoggerModule/facility/
# --> test the conformity of the founded file (size, signature exists)
# --> call update_config_file method
# --> call create_new_config_file method
###########################################################################

configure_file(){

	# Search for executable files in a particular directory ($1 parameter)
	for f in `find $1 -perm +100 -type f -maxdepth 1 -name \*`
	do

    # take action on each file. $f store current file name
	RESULT=`echo ${f##*/}`

	# Try to find the old facility configuration file, to catch the old debug level
	file=.conf
	filename=$RESULT$file

	write_filter_beginning "$RESULT"

	# Read the old facility configuration file to catch the old configuration for this facility :
  	if [[ -e "/etc/ICTApplication/module/LoggerModule/facility/$filename" ]] 
  	then 
	   # Catch the size of the executable file found
       size=`wc -l  /etc/ICTApplication/module/LoggerModule/facility/$filename  | tail -n 1 | awk '{print $1}'`
 	   
	   # Try to find string "signature" in the syslog facility configuration file 
	   signature=`grep signature /etc/ICTApplication/module/LoggerModule/facility/$filename`
	   
	   # Only for debug
	   #echo "$signature"


       if [[ $size -eq 4 ]] && [[ "$signature" == "facility signature field" ]]
		
		# The facility configuration file exists and is OK (size = 4) - so we must :
		# - Read the programmed level for this facility
		# - Read the programmed syslog redirection
		
	   then  update_config_file "$filename" "$i" "$RESULT"

 	   else	create_new_config_file "$RESULT" "$i"
	   fi
	
	else create_new_config_file "$RESULT" "$i"
	fi  
     
	i=$((i+1))
 	write_filter_end "$RESULT"

     done

}

########################################
#
# start() method :
#
########################################

start()
{

configure_file "/usr/lib/ICTApplication/"
configure_file "/usr/bin/ICTApplication/"



###################################################################################
  	# Particular case :  The WebbApp syslog-ng configuration filter
###################################################################################

       write_filter_beginning WebApp
	
       if [[ -e "/etc/ICTApplication/module/LoggerModule/facility/WebApp.conf" ]]
  	   then size=`wc -l  /etc/ICTApplication/module/LoggerModule/facility/WebApp.conf  | tail -n 1 | awk '{print $1}'`
 
       # Try to read the signature field in the facility configuration file -- position in file : 4, if exists
       signature=`grep signature /etc/ICTApplication/module/LoggerModule/facility/$filename`

        if [[ $size -eq 4 ]] && [[ "$signature" == "facility signature field" ]]
		then
		# The facility configuration file exists and is OK - so we must :
		# Read the programed level for this facility
		# Read the programmed syslog redirection

		update_config_file "WebApp.conf" "$i" "WebApp"

 	   else create_new_config_file "WebApp" "$i"
          fi
	 else create_new_config_file "WebApp" "$i"
	 fi
   
	 write_filter_end WebApp
	



###################################################################################
      # Particular case :  The no_facility syslog-ng configuration filter
###################################################################################      

	write_filter_beginning "no_facility"
	
	if [[ -e "/etc/ICTApplication/module/LoggerModule/facility/no_facility.conf" ]]
  	then size=`wc -l  /etc/ICTApplication/module/LoggerModule/facility/no_facility.conf  | tail -n 1 | awk '{print $1}'`
 
      
        # Try to read the signature field in the facility configuration file -- position in file : 4, if exists
        signature=`grep signature /etc/ICTApplication/module/LoggerModule/facility/$filename`
  
        if [[ $size -eq 4 ]] && [[ "$signature" == "facility signature field" ]]

		# The facility configuration file exists and is OK - so we must :
		# Read the programed level for this facility
		# Read the programmed syslog redirection

	    then  update_config_file "no_facility.conf" "23" "no_facility"
		
 	    else create_new_config_file "no_facility" "23"
          fi
   	 else create_new_config_file "no_facility" "23"
        fi
	 write_filter_end "no_facility"
	
###################################################################################


	# Delete the unused facility configuration files
	rm /etc/ICTApplication/module/LoggerModule/facility/*.conf > /dev/null 2>/dev/null


    FILE=/etc/ICTApplication/module/LoggerModule/facility/
	for f in `find $FILE -type f -maxdepth 1 -name \*`
	do
	f2=`echo ${f//.new/}`
	RESULT=`echo $f2 | sed -e 's,/etc/ICTApplication/module/LoggerModule/facility/\(.*\)$,\1,g'`

	# Rename the new facility configuration file
	cp /etc/ICTApplication/module/LoggerModule/facility/$RESULT.new /etc/ICTApplication/module/LoggerModule/facility/$RESULT.conf
 
       done
       
	# Delete the previous new facility configuration files.
	rm /etc/ICTApplication/module/LoggerModule/facility/*.new > /dev/null 2>/dev/null
	
	
	# Create a new syslog configuration file only to redefine the syslog-ng source parameter by
	# suppressing the syslog-ng internal log pilot : internal()
	
	#cd /etc/syslog-ng/defence.d/
	#echo "source src { unix-stream("/dev/log"); };" >> /etc/syslog-ng/defence.d/defence.conf

	


#################################################################################
       # Restart the syslog deamon to take into account the changes
#################################################################################

/bin/kill -HUP `cat /var/run/syslog-ng.pid 2> /dev/null` 2> /dev/null || true


# Create a copy from syslog-ng configuration file with .conf.sav extension

cp /etc/syslog-ng/conf.d/logappli.conf /etc/syslog-ng/conf.d/working/logappli.conf.sav
cd /etc/syslog-ng/conf.d/working/

# The syslog-ng configuration save file must only be accessible in read mode
chmod 444 logappli.conf.sav

}

# ------------------------------->  the beginning of the script <-----------------------------------

case "$1" in
    start)
    	start
        ;;
esac
