#!/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 @@@
#
#
# Script for display data in the Trafodion configuration database

function Usage
{
    echo "Usage: ${0##/*/} -c | -h | -l[<nid>] | -n[<name>] | -p[<proc>] | -q | -r | -s[<name>] | -u | -x[<name>] | -z"
    echo
    echo "-a                Displays all sqconfig.db values"
    echo "-c                Displays cluster wide registry values"
    echo "-h                Displays this help message"
    echo "-l[<nid>]         Displays all [or specific] logical node configuration values"
    echo "-n[<name>]        Displays all [or specific] node configuration values"
    echo "-p[<proc>]        Displays specific process registry values"
    echo "-s[<name>]        Displays all [or specific] spare node specific configuration values"
    echo "-u                Displays unique strings"
    echo "-x[<name>]        Displays all [or specific] physical node configuration values"
    echo "-z                Displays persist templates"
}

function monRegClusterData
{

# Monitor registry: cluster keys and values
sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select k.keyName, "=", d.dataValue from monRegKeyName k, monRegClusterData d where k.keyId = d.keyId;
.quit
EOF

}

function monNodeSpecificConfig
{

# Node configuration: for specific node

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "nid=", l.lNid \
   , ", pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", cores=", l.firstCore, "-", l.lastCore \
   , ", processors=", l.processors \
   , ", roles=", l.roles \
  from pnode p, lnode l \
    where p.pNid = l.pNid and p.nodeName = "$1";
select "pnid=", s.pNid \
   , ", node-name=", s.nodeName \
   , ", cores=", s.firstCore, "-", s.lastCore \
   , ", spares=", s.spNid \
  from snode s, pnode p \
    where s.pNid = p.pNid \
      and s.nodeName = "$1";
select "pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", excluded-cores=", p.excFirstCore, "-", p.excLastCore \
  from pnode p \
    where (p.excFirstCore != -1 or p.excLastCore != -1) \
      and p.nodeName = "$1";
.quit
EOF

}

function monNodeConfig
{

# Node configuration: for all nodes

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "nid=", l.lNid \
   , ", pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", cores=", l.firstCore, "-", l.lastCore \
   , ", processors=", l.processors \
   , ", roles=", l.roles \
  from pnode p, lnode l \
    where p.pNid = l.pNid;
.quit
EOF

echo "Spare nodes:"
sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", s.pNid \
   , ", node-name=", s.nodeName \
   , ", cores=", s.firstCore, "-", s.lastCore \
   , ", spares=", s.spNid \
  from pnode p, snode s \
    where p.pNid = s.pNid;
.quit
EOF

echo "Excluded cores nodes:"
sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", excluded-cores=", p.excFirstCore, " ", p.excLastCore \
  from pnode p \
    where p.excFirstCore != -1 or p.excLastCore != -1;
.quit
EOF

}

function monLNodeSpecificConfig
{

# Logical Node configuration: for specific node

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "nid=", l.lNid \
   , ", pnid=", l.pNid \
   , ", cores=", l.firstCore, "-", l.lastCore \
   , ", processors=", l.processors \
   , ", roles=", l.roles \
  from lnode l \
    where l.lNid = "$1";
.quit
EOF

}

function monLNodeConfig
{

# Node configuration: for all nodes

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "nid=", l.lNid \
   , ", pnid=", l.pNid \
   , ", cores=", l.firstCore, "-", l.lastCore \
   , ", processors=", l.processors \
   , ", roles=", l.roles \
  from lnode l;
.quit
EOF

}

function monSNodeSpecificConfig
{

# Spare Node configuration: for specific node

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", s.pNid \
   , ", node-name=", s.nodeName \
   , ", cores=", s.firstCore, "-", s.lastCore \
   , ", spares=", s.spNid \
  from snode s \
    where s.nodeName = "$1";
.quit
EOF

}

function monSNodeConfig
{

# Spare Node configuration: for all nodes

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", s.pNid \
   , ", node-name=", s.nodeName \
   , ", cores=", s.firstCore, "-", s.lastCore \
   , ", spares=", s.spNid \
  from snode s;
.quit
EOF

}

function monPNodeSpecificConfig
{

# Physical Node configuration: for specific node

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", excluded-cores=", p.excFirstCore, " ", p.excLastCore \
  from pnode p \
    where p.nodeName = "$1";
.quit
EOF

}

function monPNodeConfig
{

# Physical Node configuration: for all nodes

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select "pnid=", p.pNid \
   , ", node-name=", p.nodeName \
   , ", excluded-cores=", p.excFirstCore, " ", p.excLastCore \
  from pnode p;
.quit
EOF

}

function monRegSpecificProcData
{

# Monitor registry: process keys and values for a specific process

sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select p.procName, ": ", k.keyName, "=", d.dataValue from monRegProcName p, monRegKeyName k, monRegProcData d where p.procId = d.procId and k.keyId = d.keyId and p.procName = "$1";
.quit
EOF

}

function monRegProcData
{

# Monitor registry: process keys and values
sqlite3 sqconfig.db <<EOF
.separator ""
.headers on
.mode list
select p.procName, ": ", k.keyName, "=", d.dataValue from monRegProcName p, monRegKeyName k, monRegProcData d where p.procId = d.procId and k.keyId = d.keyId;
.quit
EOF

}

function persistentData
{

sqlite3 sqconfig.db <<EOF
.headers on
select * from monRegPersistData;
EOF

}

function uniqueStrings
{

sqlite3 sqconfig.db <<EOF
.headers on
select * from monRegUniqueStrings;
EOF

}

# options may be followed by one colon to indicate they have a required argument
#if ! options=$(getopt -o achl::n::p::s::ux::z -- "$@")
if ! options=$(getopt -o achl::n::s::ux::z -- "$@")
then
    # something went wrong, getopt will put out an error message for us
    Usage
    exit 1
fi

eval set -- $options

if [[ $# == 1 ]]; then
   Usage
fi

while [ $# -gt 0 ]
do
    case $1 in
        -a)
            echo "********************"
            echo "Physical Nodes Table"
            echo "********************"
            monPNodeConfig
            echo
            echo "*******************"
            echo "Logical Nodes Table"
            echo "*******************"
            monLNodeConfig
            echo
            echo "***************"
            echo "SpareNode Nodes"
            echo "***************"
            monSNodeConfig
            echo
            echo "*****"
            echo "Nodes"
            echo "*****"
            monNodeConfig
            echo
            echo "******************"
            echo "Registry - cluster"
            echo "******************"
            monRegClusterData
            echo
            echo "***********************"
            echo "Registry - process data"
            echo "***********************"
            monRegProcData
            echo
            echo "*************************"
            echo "Registry - unique strings"
            echo "*************************"
            uniqueStrings
            echo
            echo "***************************"
            echo "Registry - persist template"
            echo "***************************"
            persistentData
            ;;
        -c)
            monRegClusterData
            ;;

        -h)
            Usage
            ;;

        -l)
            if [[ -n "$2" ]];
            then
                monLNodeSpecificConfig $2
            else
                monLNodeConfig
            fi
            ;;

        -n)
            if [[ -n "$2" ]];
            then
                monNodeSpecificConfig $2
            else
                monNodeConfig
            fi
            ;;

        -p)
            if [[ -n "$2" ]];
            then
                monRegSpecificProcData $2
            else
                monRegProcData
            fi
            ;;

        -s)
            if [[ -n "$2" ]];
            then
                monSNodeSpecificConfig $2
            else
                monSNodeConfig
            fi
            ;;

        -u)
            uniqueStrings
            ;;

        -x)
            if [[ -n "$2" ]];
            then
                monPNodeSpecificConfig $2
            else
                monPNodeConfig
            fi
            ;;

        -z)
            persistentData
            ;;

    esac
    shift
done
