#!/bin/sh
# ATSlog version 2.1.1 build 664 www.atslog.com
# Copyright (C) 2003-2007 Denis CyxoB www.yamiyam.dp.ua
#
# chkconfig: 345 96 04
# description:  This is a daemon for reading PBX logs
#
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:.
NOWDATE=`LANG=en_US;date`
BASENAME=`basename $0`
prefix=/usr/local
ATSLOGDpid=""

# Readin config file                              
if [ -r ${prefix}/etc/atslog.conf ]; then
    . ${prefix}/etc/atslog.conf

#  $LANG - ң   .
    if [ -f $sharedir/$langdir/$LANG ]; then
	. $sharedir/$langdir/$LANG
    elif [ -f $sharedir/$langdir/en_US ]; then
	. $sharedir/$langdir/en_US
    else
	echo "Can't open language file"
	exit 1
    fi
else
    echo "Can't open config file"
    exit 1
fi                                                

checkstatus(){
    ATSLOGDpid=""
    if [ -f $pidfile ] ; then
        PID=`cat $pidfile`
        if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
	    ATSLOGDpid=$PID
        fi
    fi
    return 0
}
						
#   
PATH=$PATH:$bindir:$sharedir

checkstatus

case "$debug" in
    [Yy][Ee][Ss])
        notwriteoutput="$logdir/$notwritelog"
    ;;
    *)
        notwriteoutput="/dev/null"
    ;;
esac

# creating log directory
if [ ! -d $logdir ]; then
    mkdir -p $logdir
    chmod 700 $logdir
fi

# ,  tcp ,    /dev/
TCPPORT=$(expr $port : ".*tcp:.*\$")
if [ $TCPPORT = 0 ];then
    port="/dev/"${port}
fi

#   
#
#       ,  -   syslog
echomess(){
    if [ ! -z "$ATSLOGDpid"  ];then
	ECHOATSLOGDpid="[${ATSLOGDpid}]"
    else
	ECHOATSLOGDpid=""
    fi
    if [ -n "$ECHOMESSAGE" ];then
	MESSAGE=$ECHOMESSAGE
    else
	if [ -n "$syslogfacility" ]; then
	    MESSAGE=$ERRORMESSAGE
	    logger -p $syslogfacility "${masterscript}${ECHOATSLOGDpid}: $MESSAGE"
	fi
    fi
    echo "${masterscript}: $MESSAGE"
    echo "$NOWDATE ${masterscript}${ECHOATSLOGDpid}: $MESSAGE" >> $logdir/$startlogfile
    ECHOMESSAGE=""
    ERRORMESSAGE=""
}

func_restart(){
# .
    stoploging
    if [ $? -eq 0 ]
    then
	echo "$msg7"
    else
	echo "$msg8"
    fi
    checkstatus
    startloging
    if [ $? -eq 0 ]
    then
	echo "$msg5"
    else
	echo "$msg23"
    fi
}

#        -
startloging(){
    if [ -n "$ATSLOGDpid" ];then
    	ECHOMESSAGE=$msg1
	echomess
	return 1
    else
	# ,     -  .
	#   ,       .
	#   , ,  
        #       
        #    .
        #       ! :)

	for textlog in $curcallslogfile $callslogfile
	do
    	    if [ -s $logdir/$textlog ];then
		LASTSTRING=`tail -n1 $logdir/$textlog`
		if [ -n "$LASTSTRING" ];then
    		    echo "" >> $logdir/$textlog
		fi
    	    else
		touch $logdir/$textlog
	    fi
	done

	#  
	case "$fastwrite" in
	    [Yy][Ee][Ss])
		$bindir/$atslogdb --fastwrite
		TORETURN=$?
	    ;;
	    *)
		case "$debug" in
		    [Yy][Ee][Ss])
			$bindir/$atslogd -P $pidfile -o -f $stopbits -p $parity -c $charsize -s $speed -D $logdir -F $curcallslogfile -L $logdir/$startlogfile -b $port 1>> $logdir/$notwritelog 
			TORETURN=$?
		    ;;
		    *)
			$bindir/$atslogd -P $pidfile -f $stopbits -p $parity -c $charsize -s $speed -D $logdir -F $curcallslogfile -L $logdir/$startlogfile -b $port 1>/dev/null
			TORETURN=$?
		    ;;
		esac
	    ;;
	esac
    fi
    sleep 1;
    checkstatus
    if [ -z ATSLOGDpid ];then
	TORETURN=1; # atslogd not started
	ERRORMESSAGE=$msg4
	echomess
    fi
    return $TORETURN
}

#        -
stoploging(){
    if [ -n "$ATSLOGDpid" ];then
	if [ -f $pidfile ];then
	    rm -f $pidfile
	fi
	kill $ATSLOGDpid 1>/dev/null 2>/dev/null
	RETURNKILL=$?
	if [ $RETURNKILL -eq 0 ]
	then
            echo "$NOWDATE ${atslogd}[$ATSLOGDpid]: $msg2" >> $logdir/$startlogfile
	    ATSLOGDpid=""
	    return 0
	else
	    echo $ATSLOGDpid > $pidfile
	    ERRORMESSAGE=$msg3
	    echomess
	    return $RETURNKILL
	fi
    else
	ERRORMESSAGE=$msg4
	echomess
	return 1
    fi
}

case "$1" in
start)
    startloging
    if [ $? -eq 0 ]
    then
	echo "$msg5"
    else
	echo "$msg23"
	exit 1
    fi
    ;;
stop)
    stoploging
    if [ $? -eq 0 ]
    then
	echo "$msg7"
    else
	echo "$msg8"
	exit 1
    fi
    ;;
restart)
    func_restart
    ;;
reload)
    # Reload
    if [ -n "$ATSLOGDpid" ];then
        kill -HUP $ATSLOGDpid
    fi
    ;;
writedb)
    #     SQL 

    #       ,
    #  $curcallslogfile  .
	if [ -s $logdir/$curcallslogfile ];then
	    case "$fastwrite" in
	        [Yy][Ee][Ss])
		    if [ -n "$ATSLOGDpid" ];then
			echo "$msg24"
			exit 1
		    fi
	    esac
	    echo "$msg11"

	    #  ,      .
	    mv $logdir/$curcallslogfile $logdir/$curcallslogfile.tmp
	    #  ,     -.
	    TORETURN=0
	    if [ -n "$ATSLOGDpid" ];then
		kill -HUP $ATSLOGDpid
		TORETURN=$?
	    else
		touch $logdir/$curcallslogfile
	    fi

	    if [ $TORETURN -eq 0 ]
	    then
		ECHOMESSAGE=$msg12
		echomess

# Call to script atslogdb.pl
		cat $logdir/$curcallslogfile.tmp 2>/dev/null | $bindir/$atslogdb 1>> $notwriteoutput 2>/dev/null
    		if [ $? -eq 0 ]
		then
		    cat $logdir/$curcallslogfile.tmp >> $logdir/$callslogfile
		    if [ $? -eq 0 ]
		    then
    			rm $logdir/$curcallslogfile.tmp
			ECHOMESSAGE=$msg13
			echomess
		    else
    			ECHOMESSAGE=$msg34
			echomess
			ECHOMESSAGE=$msg35
			echomess
			exit 1
		    fi
		else
		    ECHOMESSAGE=$msg34
		    echomess
		    ECHOMESSAGE=$msg28
		    echomess
		    exit 1
		fi
	    else
		# ..   ,  Σ   ,
		#  ,      !
		if [ ! -s $logdir/$curcallslogfile -a -s $logdir/$curcallslogfile.tmp ];then
		    mv $logdir/$curcallslogfile.tmp $logdir/$curcallslogfile
		fi
		ERRORMESSAGE=$msg25
		echomess
		exit 1
	    fi
	else
	    ECHOMESSAGE=$msg14
    	    echomess
        fi
    ;;
rotate)
    # Log rotate

    if [ $howmonth -gt 1 ];then
    # Rotating
	    echo "$msg15"
	    echo -n "$msg16"
    	    i=$howmonth
    	    while [ $i -ge 1 ]
	    do
		for logf in $callslogfile $notwritelog $startlogfile
		do
    	    	    if [ -s $logdir/$logf ];then
    	    		if [ -r $logdir/$logf.$i.bz2 ];then
			    nextM=$(($i+1))
			    if [ $nextM -le $howmonth ];then
				mv $logdir/$logf.$i.bz2 $logdir/$logf.$nextM.bz2 ; echo -n "."
			    fi
			fi
		    fi
		done
		i=$(($i-1))
	    done
	    echo " $msg17"

	    echo -n "$msg18"
	    
	    # rotating calls.log
	    if [ -s $logdir/$callslogfile ] || [ -s $logdir/$startlogfile ];then
	    	if [ -s $logdir/$callslogfile ]; then 
			mv $logdir/$callslogfile $logdir/$callslogfile.tmp
		fi
	    	if [ -s $logdir/$startlogfile ]; then 
			mv $logdir/$startlogfile $logdir/$startlogfile.tmp
		fi
		# sending HUP to the atslogd to recreate log files
		if [ -n "$ATSLOGDpid" ];then
		    kill -HUP $ATSLOGDpid
		else
		    touch $logdir/$callslogfile
		fi
		if [ -s $logdir/$callslogfile.tmp ]; then
			echo "$NOWDATE ${masterscript}[$ATSLOGDpid]: $callslogfile rotate" >> $logdir/$startlogfile
			bzip2 -z $logdir/$callslogfile.tmp
			mv $logdir/$callslogfile.tmp.bz2 $logdir/$callslogfile.1.bz2
	        	echo -n "."
		fi
		if [ -s $logdir/$startlogfile.tmp ]; then
			echo "$NOWDATE ${masterscript}[$ATSLOGDpid]: $startlogfile rotate" >> $logdir/$startlogfile
			bzip2 -z $logdir/$startlogfile.tmp
			mv $logdir/$startlogfile.tmp.bz2 $logdir/$startlogfile.1.bz2
	        	echo -n "."
		fi
	    fi

	    
	    for logfn in $notwritelog 
	    do
		if [ -s $logdir/$logfn ];then
		    echo "$NOWDATE ${masterscript}[$ATSLOGDpid]: $logfn rotate" >> $logdir/$startlogfile
		    bzip2 -z $logdir/$logfn
		    mv $logdir/$logfn.bz2 $logdir/$logfn.1.bz2
		    touch $logdir/$logfn
		    echo -n "."
		fi
	    done
	    echo " $msg17"
    else
	echo "$msg19"
    fi
    ;;
alltodb)
    #      - (
    # )   SQL .
    echo "$msg20"
    echo -n "$msg21"
    i=$howmonth
    LASTERROR=0
    while [ $i -ge 1 ]
    do
	if [ -s $logdir/$callslogfile.$i.bz2 ];then
	    bzcat $logdir/$callslogfile.$i.bz2 | $bindir/$atslogdb 1>> $notwriteoutput
	    if [ $? -eq 0 ]
	    then
		echo -n "."
	    else
		LASTERROR=1
	    fi
	fi
	i=$(($i-1))
    done

    if [ -s $logdir/$callslogfile ];then
	cat $logdir/$callslogfile | $bindir/$atslogdb 1>> $notwriteoutput
	if [ $? -eq 0 ]
	then
	    echo -n "."
	else
	    LASTERROR=1
	fi
    fi

    if [ -s $logdir/$curcallslogfile ];then
	cat $logdir/$curcallslogfile | $bindir/$atslogdb 1>> $notwriteoutput
	if [ $? -eq 0 ]
	then
	    echo -n "."
	else
	    LASTERROR=1
	fi
    fi
    if [ $LASTERROR -eq 0 ]
    then                
        echo " $msg17"
    else                
        echo "$msg23"
    fi                  
    ;;
cleardb)
    #   SQL 
    #
    $bindir/$cleardb yes
    ;;
status)
    if [ -n "$ATSLOGDpid" ];then
	echo "$atslogd $msg26 $ATSLOGDpid"
    else
	echo "$atslogd $msg27"
    fi
        ;;    
*)
    echo "atslogmaster version 2.1.1 build 664"
    if [ -n "$ATSLOGDpid" ];then
	echo "$atslogd $msg26 $ATSLOGDpid"
    else
	echo "$atslogd $msg27"
	EXITSTATUS=1
    fi
    echo "Usage: $BASENAME {start|stop|restart|reload|status|writedb|rotate|alltodb|cleardb}"
    ;;
esac
exit $EXITSTATUS
