#!/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=@prefix@ ATSLOGDpid="" # Readin config file if [ -r @sysconfdir@/atslog.conf ]; then . @sysconfdir@/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