#!/bin/sh

if test $# -lt 1; then
    echo "Projects management script of OpenSCADA mostly designed to call from OpenSCADA but also can be used independently.
The script is mostly software platform specific and relates now for Linux.
openscada-proj list
openscada-proj proc|create|remove {ProjName}
 Commands:
  list   - allowed projects list;
  proc   - proceed for copy RO projects to WR, create desktop links, process core dumps;
  create - create new projects or copy RO projects to WR, create desktop links;
  remove - remove project.
  update - update from 0.8.0 LTS.
 Arguments:
  ProjName - project name;
 Environments:
  dPrj     - directory of projects OpenSCADA, can be RO;
  dPrjUser - directory of projects OpenSCADA of the user, WR;
  dSysCfg  - directory of system configuration;
  dData    - directory of system data;
";
    exit 0;
fi

dPrjUser=${dPrjUser=~/.openscada}
if test "x$dPrj" = "x"; then dPrj=/usr/share/openscada; fi
if test "x$dSysCfg" = "x"; then dSysCfg=/etc; fi
if test "x$dData" = "x"; then dData=/usr/share; fi

case "$1" in
  list)
    if test ! -w $dPrj; then
	echo "=== User projects ==="
	for fit in `ls $dPrjUser`; do
	    if test -d $dPrjUser/$fit && test -f $dPrjUser/$fit/oscada.xml; then echo "$fit"; fi
	done
	echo "=== Common projects ==="
    fi
    for fit in `ls $dPrj`; do
	if test -d $dPrj/$fit && test -f $dSysCfg/oscada_$fit.xml -o -f $dPrj/$fit/oscada.xml; then echo "$fit"; fi
    done
    ;;
  proc|create)
    if test $# -lt 2; then echo "Not enough arguments!"; exit 1; fi
    prjNm=$2
    dPrjRez=$dPrj/$prjNm

    #User projects directory processing
    if test -n "$dPrjUser" -a ! -d $dPrjUser; then mkdir $dPrjUser; fi
    if test ! -d $dPrjRez -o ! -w $dPrjRez && test -n "$dPrjUser" -a -w $dPrjUser; then
	dPrjRez=$dPrjUser/$prjNm
	if test -d $dPrj/LibsDB -a ! -d $dPrjUser/LibsDB; then cp -R $dPrj/LibsDB $dPrjUser; fi
	if test ! -d $dPrjRez -a -d $dPrj/$prjNm; then
	    mkdir -p $dPrjRez
	    cp -R $dPrj/$prjNm/* $dPrjRez;
	    if test ! -e $dPrjRez/oscada.xml; then cp $dSysCfg/oscada_$prjNm.xml $dPrjRez/oscada.xml; fi
	fi
    fi

    #Generic projects directory processing
    if test ! -d $dPrjRez && test $1 = create -o -w $dSysCfg/oscada_$prjNm.xml; then mkdir -p $dPrjRez; fi
    if test -d $dPrjRez; then
	if test ! -e $dPrjRez/oscada.xml -a ! -w $dSysCfg/oscada_$prjNm.xml; then cp $dSysCfg/oscada_start.xml $dPrjRez/oscada.xml; fi
	if test ! -d $dPrjRez/LibsDB -a ! -L $dPrjRez/LibsDB; then ln -s ../LibsDB $dPrjRez/LibsDB; fi
	if test ! -d $dPrjRez/LibsDB -a ! -L $dPrjRez/LibsDB; then cp -R $dPrjRez/../LibsDB $dPrjRez/LibsDB; fi
	if test ! -d $dPrjRez/ARCHIVES/MESS; then mkdir -p $dPrjRez/ARCHIVES/MESS; fi
	if test ! -d $dPrjRez/ARCHIVES/VAL; then mkdir -p $dPrjRez/ARCHIVES/VAL; fi
	if test -n "$(which xdg-user-dir)" && test -n "$(xdg-user-dir DESKTOP)" -a $1 = create; then
	    DESKTOP_DIR="$(xdg-user-dir DESKTOP)"
	    if test -n "$DESKTOP_DIR"  -a ! -f "$DESKTOP_DIR/openscada_$prjNm.desktop"; then
		cp $dData/applications/openscada.desktop "$DESKTOP_DIR/openscada_$prjNm.desktop"
		sed -i "s/Exec=/Exec=env OSCADA_ProjName=$prjNm /" "$DESKTOP_DIR/openscada_$prjNm.desktop"
		sed -i "s/\(^\(Generic\|\)Name\(=\|\\[.*\\]=\).*\)/\1: $prjNm/" "$DESKTOP_DIR/openscada_$prjNm.desktop"
	    fi
	fi

	# Check for lost lock at it PID and openscada process in whole
	if test -f $dPrjRez/lock; then
	    pid=`cat $dPrjRez/lock | sed -r 's/^0*([0-9]+).*/\1/'`
	    if ! ps -A -o "pid cmd" | grep "^ *$pid.*openscada" > /dev/null; then rm $dPrjRez/lock; fi
	fi

	# Core dump files "core[.*]" into work directory process
	if test -n "$(which gdb 2> /dev/null)"; then
	    cd $dPrjRez
	    for fit in `ls core* 2> /dev/null`; do
		echo "Core dump process for back trace purchase to file ${prjNm}_${fit}_$(date +%F_%H.%M).crash"
		gdb /usr/bin/openscada --core ${fit} --batch --quiet -ex "thread apply all bt full" -ex "quit" > ${prjNm}_${fit}_$(date +%F_%H.%M).crash
		rm -f ${fit}
	    done
	fi
    fi
    ;;
  remove)
    if test $# -lt 2; then echo "Not enough arguments!"; exit 1; fi
    prjNm=$2
    prjDir=

    if test -n "$dPrjUser" -a -d $dPrjUser; then
	for fit in `ls $dPrjUser`; do
	    if test -d $dPrjUser/$fit && test -f $dPrjUser/$fit/oscada.xml && test $fit = $prjNm; then
		prjDir=$dPrjUser/$fit
		break
	    fi
	done
    else
	for fit in `ls $dPrj`; do
	    if test -d $dPrj/$fit && test -f $dSysCfg/oscada_$fit.xml -o -f $dPrj/$fit/oscada.xml && test $fit = $prjNm; then
		prjDir=$dPrj/$fit
		break
	    fi
	done
    fi

    if test "x$prjDir" != "x"; then
	rm -r $prjDir

	# Remove the desktop link
	if test -n "$(which xdg-user-dir)" && test -n "$(xdg-user-dir DESKTOP)"; then
	    DESKTOP_DIR="$(xdg-user-dir DESKTOP)"
	    if test -n "$DESKTOP_DIR" -a -f "$DESKTOP_DIR/openscada_$prjNm.desktop"; then
		rm $DESKTOP_DIR/openscada_$prjNm.desktop
	    fi
	fi
    else exit 1;
    fi
    ;;
  update)
    if test $# -lt 2; then echo "Not enough arguments!"; exit 1; fi
    prjNm=$2
    # OpenSCADA user folder presence
    if test -z "$dPrjUser" -o ! -d $dPrjUser; then exit 1; fi
    # Source directory checking whether it <prjNm> or "DATA"
    if test -d $dPrjUser/$prjNm; then
	if test ! -f $dPrjUser/$prjNm/oscada.xml; then srcDir=$prjNm; fi
    elif test -d $dPrjUser/DATA -o -d $dPrjUser/.openscada_old/DATA; then srcDir=DATA; fi
    if test -z "$srcDir"; then exit 1; fi

    # Saving the old release data to ".openscada_old"
    if test ! -d $dPrjUser/.openscada_old; then
	mkdir $dPrjUser/.openscada_old
	mv $dPrjUser/LibsDB $dPrjUser/ARCHIVES $dPrjUser/DATA $dPrjUser/*.xml $dPrjUser/*.db $dPrjUser/icons $dPrjUser/.openscada_old/
	cp -R $dPrj/LibsDB $dPrjUser/LibsDB
    fi
    # New project folder creating
    if test ! -d $dPrjUser/$prjNm; then
	mkdir $dPrjUser/$prjNm
	cp $dPrjUser/.openscada_old/DATA/* $dPrjUser/$prjNm
    fi
    # Other elements copying
    cp $dSysCfg/oscada_start.xml $dPrjUser/$prjNm/oscada.xml
    if test ! -f $dPrjUser/$prjNm/St.db -a -f $dPrjUser/$prjNm/MainSt.db; then
	mv $dPrjUser/$prjNm/MainSt.db $dPrjUser/$prjNm/St.db
    fi
    cp -R $dPrjUser/.openscada_old/ARCHIVES $dPrjUser/$prjNm
    ln -s ../LibsDB $dPrjUser/$prjNm/LibsDB
    ln -s ./ $dPrjUser/$prjNm/$prjNm
    ;;
esac

exit 0
