#!/bin/bash
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@

export TRAF_CONFIG="/etc/trafodion/trafodion_config"
source $TRAF_CONFIG

export NODES=""

while [[ $# -gt 0 ]]; do
    case "$1" in
        --nodes)
            NODES=$2
            shift
            ;;
        *)
            echo "***ERROR: unknown parameter '$1'"
            print_usage
            exit -1
    esac
    shift
done



for node in $NODES
do
    sudo su $TRAF_USER --command "ssh -q -oStrictHostKeyChecking=no $node hostname" 2>&1 > /dev/null
    sudo su $TRAF_USER --command "ssh -q -oStrictHostKeyChecking=no localhost hostname" 2>&1 > /dev/null
    if [ $? -ne 0 ]; then
        echo "***ERROR: Unable to ssh to node $node"
        exit -1
    fi

    for nodes in $NODES
    do
       sudo su $TRAF_USER --command "ssh -q -oStrictHostKeyChecking=no $node ssh -q -oStrictHostKeyChecking=no $nodes hostname" 2>&1 > /dev/null
       if [ $? -ne 0 ]; then
          echo "***ERROR: Unable to ssh to node $node"
          exit -1
       fi
    done
done


