Blame synfig-studio/synfigstudio-cph-monitor

Carlos Lopez a09598
#!/bin/bash
Carlos Lopez a09598
Carlos Lopez a09598
# Synfig Crash Monitor script
5dc077
# Copyright (c) 2009-2010 Konstantin Dmitriev
5dc077
#
Carlos Lopez a09598
#	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
#	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
#	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
#	the License, or (at your option) any later version.
Carlos Lopez a09598
#
Carlos Lopez a09598
#	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
#	General Public License for more details.
Carlos Lopez a09598
Carlos Lopez a09598
set -e
Carlos Lopez a09598
trap writelog INT
Carlos Lopez a09598
Carlos Lopez a09598
init()
Carlos Lopez a09598
{
Carlos Lopez a09598
echo "SynfigStudio Crash Monitor is a tool to collect statistics about synfig crashes."
Carlos Lopez a09598
echo "All information is collected locally in ~/.synfig/cph directory."
Carlos Lopez a09598
echo
Carlos Lopez a09598
STARTED=0
Carlos Lopez a09598
RUNTIME=0
Carlos Lopez a09598
VERSION=''
Carlos Lopez a09598
RELEASE=''
Carlos Lopez a09598
BRANCH=''
Carlos Lopez a09598
REVISION_ID=''
Carlos Lopez a09598
CRASH=0
Carlos Lopez a09598
[ ! -d ~/.synfig/cph ] && mkdir -p ~/.synfig/cph || true
Carlos Lopez a09598
Carlos Lopez a09598
# Detect if crash monitor is already started
Carlos Lopez a09598
PDIR=${0%`basename $0`}
Carlos Lopez a09598
LCK_FILE=~/.synfig/cph/`basename $0`.lck
Carlos Lopez a09598
if [ -f "${LCK_FILE}" ]; then
Carlos Lopez a09598
	MYPID=`head -n 1 "${LCK_FILE}"`
Carlos Lopez a09598
	if ! ( ps -p ${MYPID} | grep ${MYPID} >/dev/null ); then
Carlos Lopez a09598
		# The process is not running
Carlos Lopez a09598
		# Echo current PID into lock file
Carlos Lopez a09598
		echo $$ > "${LCK_FILE}"
Carlos Lopez a09598
	else
Carlos Lopez a09598
		echo "`basename $0` is already running [${MYPID}]. Aborting."
Carlos Lopez a09598
		sleep 5
Carlos Lopez a09598
		exit 0
Carlos Lopez a09598
	fi
Carlos Lopez a09598
else
Carlos Lopez a09598
	# The process is not running
Carlos Lopez a09598
	# Echo current PID into lock file
Carlos Lopez a09598
	echo $$ > "${LCK_FILE}"
Carlos Lopez a09598
fi
Carlos Lopez a09598
echo `date +%H:%M` "Synfig Crash Monitor started."
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
writelog()
Carlos Lopez a09598
{
Carlos Lopez a09598
	if [[ $STARTED != 0 ]]; then
Carlos Lopez a09598
		if [[ $CRASH == 0 ]]; then
Carlos Lopez a09598
			echo `date +%H:%M` "Synfig exited normally. Session time: $RUNTIME."
Carlos Lopez a09598
		else
Carlos Lopez a09598
			echo `date +%H:%M` "Crash detected. Version $VERSION.$RELEASE.$BRANCH, session time: $RUNTIME."
Carlos Lopez a09598
		fi
Carlos Lopez a09598
		if [ -e ~/.synfig/cph/log ]; then
Carlos Lopez a09598
			#check if dump needed
Carlos Lopez a09598
			CURRENTDATE=`date +%Y-%m-%d`
Carlos Lopez a09598
			LOGMODDATE=`stat -c %y ~/.synfig/cph/log`
Carlos Lopez a09598
			LOGMODDATE=${LOGMODDATE%% *}
Carlos Lopez a09598
			if [[ $LOGMODDATE != $CURRENTDATE ]]; then
Carlos Lopez a09598
				dumpstats
Carlos Lopez a09598
			fi
Carlos Lopez a09598
		fi
Carlos Lopez a09598
		#write log
Carlos Lopez a09598
		echo $VERSION/$BRANCH/$RELEASE/$REVISION_ID $RUNTIME $CRASH >> ~/.synfig/cph/log
Carlos Lopez a09598
		CRASH=0
Carlos Lopez a09598
		RUNTIME=0
Carlos Lopez a09598
	else
Carlos Lopez a09598
		echo
Carlos Lopez a09598
	fi
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
dumpstats()
Carlos Lopez a09598
{
Carlos Lopez a09598
	echo `date +%H:%M` 'Dumping stats for previous session...'
Carlos Lopez a09598
	LOGMODDATE=`stat -c %y ~/.synfig/cph/log`
Carlos Lopez a09598
	LOGMODDATE=${LOGMODDATE%% *}
Carlos Lopez a09598
	#get versions
Carlos Lopez a09598
	VERSIONS=''
Carlos Lopez a09598
	while read LINE; do
Carlos Lopez a09598
		FOUND=0
Carlos Lopez a09598
		for VER in $VERSIONS; do
Carlos Lopez a09598
			if [[ $VER == ${LINE%% *} ]]; then
Carlos Lopez a09598
				FOUND=1
Carlos Lopez a09598
				break
Carlos Lopez a09598
			fi
Carlos Lopez a09598
		done
Carlos Lopez a09598
		[[ $FOUND == 0 ]] && VERSIONS="$VERSIONS ${LINE%% *}"
Carlos Lopez a09598
	done < ~/.synfig/cph/log
Carlos Lopez a09598
	echo "   Logged versions: ${VERSIONS}"
Carlos Lopez a09598
	for VER in $VERSIONS; do
Carlos Lopez a09598
		#generating random record ID
Carlos Lopez a09598
		ID=$( echo `date` `ps` | md5sum | md5sum )
Carlos Lopez a09598
		ID="${ID:2:16}"
Carlos Lopez a09598
		#summarizing time and counting crashes
Carlos Lopez a09598
		CRASHCOUNT=0
Carlos Lopez a09598
		TIMECOUNT=0
Carlos Lopez a09598
		while read LINE; do
Carlos Lopez a09598
			if [[ ${LINE%% *} == $VER ]]; then
Carlos Lopez a09598
				TIMECOUNT=`expr $TIMECOUNT + $(echo $LINE| cut -f 2 -d ' ')` || true
Carlos Lopez a09598
				CRASHCOUNT=`expr $CRASHCOUNT + $(echo $LINE| cut -f 3 -d ' ')` || true
Carlos Lopez a09598
			fi
Carlos Lopez a09598
		done < ~/.synfig/cph/log
Carlos Lopez a09598
		echo "   $LOGMODDATE $ID $VER $TIMECOUNT $CRASHCOUNT"
Carlos Lopez a09598
		echo "$LOGMODDATE $ID $VER $TIMECOUNT $CRASHCOUNT" >> ~/.synfig/cph/stats
Carlos Lopez a09598
	done
Carlos Lopez a09598
	rm -f ~/.synfig/cph/log
Carlos Lopez a09598
	echo '   Done.'
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
mainloop()
Carlos Lopez a09598
{
Carlos Lopez a09598
	while true; do
Carlos Lopez a09598
		if ( ps --no-headers -f -Csynfigstudio |egrep "^`whoami`" > /dev/null ) ; then
Carlos Lopez a09598
			#synfigstudio process exist
Carlos Lopez a09598
			if [[ $STARTED == 0 ]]; then
Carlos Lopez a09598
				STARTED=1
Carlos Lopez a09598
				RUNTIME=0
Carlos Lopez a09598
				#get version
5dc077
 				P=$(ps --no-headers -Csynfigstudio -o uid,cmd |egrep "^ *`id -u`" | egrep -v "<defunct>" | tr -s ' ' | sed "s|^ *`id -u` *||" | sed "s|/bin/sh *||" | head -n 1)</defunct>
Carlos Lopez a09598
				echo 
Carlos Lopez a09598
				if [ ! -e $P ]; then
Carlos Lopez a09598
					P=`which $P`
Carlos Lopez a09598
				fi
Carlos Lopez a09598
				P=`dirname $P`
Carlos Lopez a09598
				VERSION=`$P/synfig --info|head -n 1|cut -d '-' -f 2`
Carlos Lopez a09598
				RELEASE=`$P/synfig --info|egrep "Revision:"|cut -d ' ' -f 2`
Carlos Lopez a09598
				BRANCH=`$P/synfig --info|egrep "Branch:"|cut -d ' ' -f 2-3`
Carlos Lopez a09598
				REVISION_ID=`$P/synfig --info|egrep "Revision ID:"|cut -d ' ' -f 3`
Carlos Lopez a09598
				if [[ $BRANCH == '(no branch)' ]]; then
Carlos Lopez a09598
					BRANCH=$REVISION_ID
Carlos Lopez a09598
				fi
Carlos Lopez a09598
				echo `date +%H:%M` "Synfig $VERSION.$RELEASE.$BRANCH.$REVISION_ID started."
Carlos Lopez a09598
				echo `date +%H:%M` "Assuming Synfig installed in $P."
Carlos Lopez a09598
			else
Carlos Lopez a09598
				let RUNTIME=$RUNTIME+1
Carlos Lopez a09598
			fi
Carlos Lopez a09598
		else
Carlos Lopez a09598
			#no synfigstudio process exist
Carlos Lopez a09598
			if [[ $STARTED == 1 ]]; then
Carlos Lopez a09598
				#detect crash
Carlos Lopez a09598
				if [ -e ~/.synfig/fifo ]; then
Carlos Lopez a09598
					CRASH=1
Carlos Lopez a09598
				fi
Carlos Lopez a09598
				writelog
Carlos Lopez a09598
				CRASH=0
Carlos Lopez a09598
				STARTED=0
Carlos Lopez a09598
			fi
Carlos Lopez a09598
		fi
Carlos Lopez a09598
		sleep 1
Carlos Lopez a09598
	done
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
init
Carlos Lopez a09598
mainloop