#!/bin/bash
##
## This is the linux fwcontrol script created to deal with Server and Booster version 4.1.1
## Created by Steve Lind on Dec 12 2010
##
INITSCRIPT="/usr/local/etc/filewave/fw-server"
BOOSTER_INITSCRIPT="/usr/local/etc/filewave/fw-booster"
SUPERVISORD_INITSCRIPT="/etc/init.d/fw-server"

# Check that $LANG is set. Django 1.4 will complain if it is not the case.
if [ -z $LANG ]; then
	export LANG="`locale -a | grep -i en_us | tail -n 1`"
	echo "No LANG set. Using '$LANG' as the default." >&2
fi

###############
###Functions###
###############

function syntaxErr
{
	/bin/echo ""
	/bin/echo "|----------------------|"
	/bin/echo "| Welcome to fwcontrol |"
	/bin/echo "|----------------------|"
	/bin/echo ""
	/bin/echo "Usage: (sudo) fwcontrol <component> <command>"
	/bin/echo ""
	/bin/echo "Examples:"
	/bin/echo ""
	/bin/echo "sudo fwcontrol server stop"
	/bin/echo "sudo fwcontrol client start"
	/bin/echo "sudo fwcontrol booster restart"
	/bin/echo "sudo fwcontrol booster connectedclients"
	/bin/echo "sudo fwcontrol client version"
	/bin/echo "fwcontrol fwgui showKiosk"
    /bin/echo "fwcontrol dashboard start"
	/bin/echo ""
	/bin/echo "MDM:"
	/bin/echo ""
	/bin/echo "sudo fwcontrol mdm adduser [new_user_name]"
	/bin/echo "sudo fwcontrol mdm adddeuser [new_user_name] [realm (default is \"Enroll IOS Device\")]"
	/bin/echo "sudo fwcontrol mdm adddepuser [new_user_name] [realm (default is \"Enroll IOS Device\")]"
	/bin/echo "sudo fwcontrol mdm addadminuser"
	/bin/echo ""
	/bin/echo "Additional Commands:"
	/bin/echo ""
	/bin/echo "sudo fwcontrol server dbcompact"
	/bin/echo "sudo fwcontrol server restore [version]"
	/bin/echo "sudo fwcontrol server resetinventory"
	/bin/echo "sudo fwcontrol server generateSelfSignedCert --create --cn=fqdn [--country COUNTRY] [--state STATE] [--locality LOCALITY] [--organization ORGANIZATION] [--ou ORGANIZATIONAL_UNIT] [--email EMAIL] [--ignore_name_mismatch]"
	/bin/echo "sudo fwcontrol server generateSelfSignedCert --show-pending"
    /bin/echo "sudo fwcontrol server generateSelfSignedCert --install"
	/bin/echo "sudo fwcontrol client status"
	/bin/echo "sudo fwcontrol apache start|stop|restart"
	/bin/echo "sudo fwcontrol postgres start|stop|restart"
	/bin/echo "sudo fwcontrol redis start|stop|restart"
	/bin/echo "sudo fwcontrol nats start|stop|restart"
	/bin/echo "sudo fwcontrol scheduler start|stop|restart"
	/bin/echo "sudo fwcontrol client_monitor start|stop|restart"
	if [ "$(/usr/local/filewave/python/bin/python /usr/local/filewave/django/check_model_update_version.pyc)" = 2 ]; then
		/bin/echo "sudo fwcontrol model_update_service start|stop|restart"
	fi
	/bin/echo ""
}

function valid_ip()
{
    local  ip=$1
    local  stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}

## nats (booster or server)

function stopNats()
{
    if [ -e "$INITSCRIPT" ]; then
         "$INITSCRIPT" stopNats
    fi
    if [ -e "$BOOSTER_INITSCRIPT" ]; then
         "$BOOSTER_INITSCRIPT" stopNats
    fi
}

function startNats()
{
    if [ -e "$INITSCRIPT" ]; then
         "$INITSCRIPT" startNats
    fi
    if [ -e "$BOOSTER_INITSCRIPT" ]; then
         "$BOOSTER_INITSCRIPT" startNats
    fi
}

function restartNats()
{
    if [ -e "$INITSCRIPT" ]; then
         "$INITSCRIPT" restartNats
    fi
    if [ -e "$BOOSTER_INITSCRIPT" ]; then
         "$BOOSTER_INITSCRIPT" restartNats
    fi
}


##Postgres

startPostgres()
{
	"$INITSCRIPT" startPostgres
}

stopPostgres()
{
	"$INITSCRIPT" stopPostgres
}

restartPostgres()
{
	"$INITSCRIPT" restartPostgres
}

## Client Monitor

function startClientMonitor()
{
    "$INITSCRIPT" startClientMonitor
}

function stopClientMonitor()
{
    "$INITSCRIPT" stopClientMonitor
}

function restartClientMonitor()
{
    "$INITSCRIPT" restartClientMonitor
}

## Model Update

function startModelUpdateService()
{
	if [ "$(/usr/local/filewave/python/bin/python /usr/local/filewave/django/check_model_update_version.pyc)" = 2 ]; then
    	"$INITSCRIPT" startModelUpdateService
	fi
}

function stopModelUpdateService()
{
	if [ "$(/usr/local/filewave/python/bin/python /usr/local/filewave/django/check_model_update_version.pyc)" = 2 ]; then
    	"$INITSCRIPT" stopModelUpdateService
	fi
}

function restartModelUpdateService()
{
	if [ "$(/usr/local/filewave/python/bin/python /usr/local/filewave/django/check_model_update_version.pyc)" = 2 ]; then
    	"$INITSCRIPT" restartModelUpdateService
	fi
}

##Server

#
# the following functions 'echo' their output, rather than returning it - since
# PID values can be greater than 128 (the limit of values sent via 'return')
#

function startServer
{
	"$INITSCRIPT" start
}

function stopServer
{
	"$INITSCRIPT" stop
}

function restartServer
{
	"$INITSCRIPT" restart
}

function openServerFirewall()
{
	"$INITSCRIPT" openfirewall
}

function closeServerFirewall()
{
	"$INITSCRIPT" closefirewall
}

function dbCompact
{
	"$INITSCRIPT" compact
}

function dbMigrate
{
	"$INITSCRIPT" migrate
}

restoreModel()
{
	/usr/local/sbin/fwxserver -restore $1
}

dbResetInventory()
{
    /usr/local/sbin/fwxserver -resetInventory
}

function versionServer
{
	"$INITSCRIPT" version
}


# MDM

function addMDMUser()
{
	if [ ! -e '/usr/local/filewave/apache/passwd/passwords' ]; then
		touch '/usr/local/filewave/apache/passwd/passwords'
	fi

	/usr/local/filewave/apache/bin/htpasswd /usr/local/filewave/apache/passwd/passwords $1
}

function addDEUser()
{
	[ -e '/usr/local/filewave/apache/passwd/passwords.digest' ] || PARAMS="-c"

	REALM=$2
	[ ! -z $REALM ] || REALM="Enroll IOS Device" #default value

	/usr/local/filewave/apache/bin/htdigest $PARAMS /usr/local/filewave/apache/passwd/passwords.digest "$REALM" $1
}

function addDjangoUser()
{
	/usr/local/filewave/python/bin/python /usr/local/filewave/django/manage.pyc createsuperuser
}

function restartMDMGracefully()
{
	/usr/local/filewave/apache/bin/apachectl graceful
	restartClientMonitor
}

## Booster

function startBooster
{
	$BOOSTER_INITSCRIPT start
}

function stopBooster()
{
	$BOOSTER_INITSCRIPT stop
}

function restartBooster()
{
	$BOOSTER_INITSCRIPT restart
}

function startDashboard()
{
    $INITSCRIPT startDashboard		
}

function stopDashboard()
{
    $INITSCRIPT stopDashboard
}

function restartDashboard()
{
    $INITSCRIPT restartDashboard
}


function startGrafana()
{
    $INITSCRIPT startGrafana
}

function stopGrafana()
{
    $INITSCRIPT stopGrafana
}

function restartGrafana()
{
	  stopGrafana
		startGrafana
}



function versionBooster
{
	$BOOSTER_INITSCRIPT version
}

function statusBooster
{
	$BOOSTER_INITSCRIPT status
}

function openBoosterFirewall()
{
	$BOOSTER_INITSCRIPT openfirewall
}

function closeBoosterFirewall()
{
	$BOOSTER_INITSCRIPT closefirewall
}

connectedClients()
{
	ss -an | grep 20014
}

function generateSelfSignedCert()
{
	/usr/local/filewave/python/bin/python /usr/local/filewave/django/manage.pyc create_mdm_self_signed_cert "$@"
	RESULT=$?
	if [[ $RESULT -eq 0 && $@ == *"--install"* ]];
	then
    	echo "running restart apache command"
	    /usr/local/filewave/apache/bin/apachectl
	    restartClientMonitor
	fi
	# take care of permissions - certs and logs that may have been changed by sudo python
	chown apache:apache /usr/local/filewave/certs/* /usr/local/filewave/log/*
}


##########################
##Command Interpretation##
##########################

if [ "$1" = "scheduler" ]; then
	case "$2"
	in
		"start")
			echo "running start scheduler command"
			$INITSCRIPT startScheduler
			;;
		"stop")
			echo "running stop scheduler command"
			$INITSCRIPT stopScheduler
			;;
		"restart")
			echo "running restart scheduler command"
			$INITSCRIPT restartScheduler
			;;
			*) syntaxErr
			;;
	esac
elif [ "$1" = "apache" ]; then
	case "$2"
	in
		"start")
			echo "running start apache command"
			$INITSCRIPT startApache
			;;
		"stop")
			echo "running stop apache command"
			$INITSCRIPT stopApache
			;;
		"restart")
			echo "running restart apache command"
			$INITSCRIPT restartApache
			;;
			*) syntaxErr
			;;
	esac
elif [ "$1" = "postgres" ]; then
	case "$2"
	in
		"start")
			echo "running start postgres command"
			startPostgres
			;;
		"stop")
			echo "running stop postgres command"
			stopPostgres
			;;
		"restart")
			echo "running restart postgres command"
			restartPostgres
			;;
		*) syntaxErr
			;;
	esac
elif [ "$1" = "redis" ]; then
	case "$2" in
		start)   "$INITSCRIPT" startRedis ;;
		stop)    "$INITSCRIPT" stopRedis ;;
		restart) "$INITSCRIPT" restartRedis ;;
		*) syntaxErr ;;
	esac
elif [ "$1" = "nats" ]; then
	case "$2" in
		start)   startNats ;;
		stop)    stopNats ;;
		restart) restartNats ;;
		*) syntaxErr ;;
	esac
elif [ "$1" = "client_monitor" ]; then
	if [ "$2" = "start" ]; then
		startClientMonitor
	elif [ "$2" = "stop" ]; then
		stopClientMonitor
	elif [ "$2" = "restart" ]; then
		restartClientMonitor
	else
		syntaxErr
	fi

elif [[ "$1" = "model_update_service" ]] && [ "$(/usr/local/filewave/python/bin/python /usr/local/filewave/django/check_model_update_version.pyc)" = 2 ]; then
	if [ "$2" = "start" ]; then
		startModelUpdateService
	elif [ "$2" = "stop" ]; then
		stopModelUpdateService
	elif [ "$2" = "restart" ]; then
		restartModelUpdateService
	else
		syntaxErr
	fi
elif [ "$1" = "server" ]; then
	if [ -x "/usr/local/sbin/fwxserver" ]; then
		if [ "$2" = "start" ]; then
			startServer
		elif [ "$2" = "stop" ]; then
			stopServer
		elif [ "$2" = "restart" ]; then
			restartServer
		elif [ "$2" = "openfirewall" ]; then
			openServerFirewall
		elif [ "$2" = "closefirewall" ]; then
			closeServerFirewall
		elif [ "$2" = "version" ]; then
			versionServer
		elif [ "$2" = "dbcompact" ]; then
			dbCompact
		elif [ "$2" = "restore" -a ! -z "$3" ]; then
			restoreModel $3
		elif [ "$2" = "migrate" ]; then
			dbMigrate
		elif [ "$2" = "resetinventory" ]; then
			dbResetInventory
        elif [ "$2" = "generateSelfSignedCert" ]; then
            shift; shift;
            generateSelfSignedCert "$@"
		else
			syntaxErr
		fi
	else
		echo "The FileWave server is not installed."
	fi

elif [ "$1" = "mdm" ]; then
	if [ -x "/usr/local/filewave/apache/bin/httpd" ]; then
		if [ "$2" = "adduser" -a ! -z "$3" ]; then
			addMDMUser $3
		elif [ "$2" = "adddeuser" -a ! -z "$3" ]; then
			addDEUser $3 $4
		elif [ "$2" = "adddepuser" -a ! -z "$3" ]; then
			addDEUser $3 $4
		elif [ "$2" = "addadminuser" ]; then
			addDjangoUser $3
		elif [ "$2" = "graceful" ]; then
			restartMDMGracefully
		else
			syntaxErr
		fi
	else
		echo "The FileWave MDM server is not installed."
	fi

elif [ "$1" = "booster" ]; then
	if [ -x "/usr/local/sbin/fwbooster" ]; then
	if [ "$2" = "start" ]; then
		startBooster
	elif [ "$2" = "stop" ]; then
		stopBooster
	elif [ "$2" = "restart" ]; then
		restartBooster
	elif [ "$2" = "openfirewall" ]; then
		openBoosterFirewall
	elif [ "$2" = "closefirewall" ]; then
		closeBoosterFirewall
	elif [ "$2" = "version" ]; then
		versionBooster
	elif [ "$2" = "running" ]; then
		statusBooster
	elif [ "$2" = "connectedclients" ]; then
		connectedClients
	else
		syntaxErr
	fi
	else
	echo "The FileWave booster is not installed."
	fi
elif [ "$1" = "dashboard" ]; then
    case "$2"
    in
        "start")
            startDashboard
            ;;
        "stop")
            stopDashboard
            ;;
        "restart")
            restartDashboard
            ;;
        *) syntaxErr
            ;;
        esac
elif [ "$1" = "grafana" ]; then
	case "$2"
	in
		"start")
			startGrafana
			;;
		"stop")
			stopGrafana
			;;
		"restart")
			restartGrafana
			;;
			*) syntaxErr
			;;
	esac

else syntaxErr

fi

exit 0
