#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
#    \\/     M anipulation  |
#-------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM.
#
#     OpenFOAM is free software; you can redistribute it and/or modify it
#     under the terms of the GNU General Public License as published by the
#     Free Software Foundation; either version 2 of the License, or (at your
#     option) any later version.
#
#     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
#     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
#     for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with OpenFOAM; if not, write to the Free Software Foundation,
#     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Script
#     foamDistccd
#
# Description
#     Script to control distccd daemons. (distcc/distccd is a distributed
#     C/C++ compilation frontend). Distccd daemons need to be running
#     on all platforms one wants to build on. The platforms are specified
#     in the DISTCC_HOSTS environment variable.
#
#------------------------------------------------------------------------------

printUsage()
{
    echo "Usage : `basename $0` start|stop|list"
    echo ""
}

RSH='ssh'

if [ ! "$DISTCC_HOSTS" ]; then
    echo "`basename $0`: variable DISTCC_HOSTS not set."
    echo "`basename $0`: please set DISTCC_HOSTS to the list of hosts to use."
    echo "`basename $0`: the format is host1:port host2:port host3:port etc."
    echo ""

    exit 1
fi

if [ $# -ne 1 ]; then
    printUsage
    exit 1
fi


if [ "$1" = 'start' ]; then

    grep -v '^#' /etc/hosts | awk '{print $1, $2 " "}' > ~/filteredHosts.txt

    allowIPS=''
    for host in $DISTCC_HOSTS
    do
        machine=`echo "$host" | awk -F: '{print $1}'`
        iptest=`echo "$machine" | sed -e 's/[0-9.]//g'`
        if [ ! "$iptest" ]; then
            # address only contained 0-9 and '.'. Probably ip address.
            ip=$machine
        else
            # address probably not ip address. Try searching /etc/hosts
            ip=`egrep " $machine " ~/filteredHosts.txt | awk '{print $1}'`
        fi

        if [ ! "$ip" ]; then
            echo "$0 : host specifier $host either is not an ip address or cannot be found in /etc/hosts."
            echo "$0 : Exiting."
            exit 1
        fi

        allowIPS="$allowIPS --allow $ip"
    done
    echo "allowIPS=$allowIPS"

    for host in $DISTCC_HOSTS
    do
        echo ""
        echo "Trying to start distccd on host $host ..."

        machine=`echo "$host" | awk -F: '{print $1}'`
        port=`echo "$host" | awk -F: '{print $2}'`

        if [ "$machine" -a "$port" ]; then
            #echo "Machine:$machine  port:$port"
            echo "distccd --daemon $allowIPS --port $port"' --jobs `egrep "^processor" /proc/cpuinfo | wc -l`'
            $RSH $machine "distccd --verbose --daemon $allowIPS --port $port"' --jobs `egrep "^processor" /proc/cpuinfo | wc -l`'
        else
            echo "$0 : host specifier $host not in correct form machine:port."
            echo "$0 : Exiting."
            exit 1
        fi
    done

elif [ "$1" = 'stop' ]; then

    for host in $DISTCC_HOSTS
    do
        echo ""
        echo "Trying to stop all distccd on host $host ..."

        machine=`echo "$host" | awk -F: '{print $1}'`

        $RSH $machine killall distccd
    done


elif [ "$1" = 'list' ]; then

    for host in $DISTCC_HOSTS
    do
        echo ""
        echo "Trying to find process distccd on host $host ..."

        machine=`echo "$host" | awk -F: '{print $1}'`

        $RSH $machine "ps -ef | grep distccd | grep -v grep"
    done

else

    printUsage
    exit 1

fi

#------------------------------------------------------------------------------