#!/bin/bash

MODULE="$1"

#Container gateway
ENTRYPOINT_UID=1010
CONTAINER_SH_COMMAND="su -s /bin/sh \$(id -un ${ENTRYPOINT_UID})"

SS_HOME=/opt/SecureSpan
GW_HOME="${SS_HOME}"/Gateway
GW_RUNTIME="${GW_HOME}"/runtime
GW_NODE_DEFAULT="${GW_HOME}"/node/default
CONTROLLER_HOME="${SS_HOME}"/Controller
PMS_HOME="${SS_HOME}"/PatchManagement
PATCHES_HOME="${CONTROLLER_HOME}"/var/patches
PMS_PATCHES_HOME="${PMS_HOME}"/var/patches
APPLIANCE_HOME="${SS_HOME}"/Appliance

#Define and create output folders
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY="${BASE_OUTPUT_DIR}"/"${MODULE}"
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_RPMS="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/rpms
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DPKGS="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/dpkgs
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/modules
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/config
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/logs
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSG="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS}"/gateway_logs
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSPC="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS}"/controller_logs
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_PMS="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS}"/pms_logs
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/patches
GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DUMPS="${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"/dumps

# Pull in collector support functions
. "${COLLECTOR_HOME}"/collectorlib

preModule "$MODULE"

#Begin data collection
mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}"
if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY}" ]
then
    # gateway rpm/dpkg related info
    if [ -f /etc/debian_version ]
    then
        mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DPKGS}"
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DPKGS}" ]
        then
            logAndRunCmd "dpkg --list 'ssg*' &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DPKGS}\"/dpkgs_version.txt"
            logAndRunCmd "dpkg --status ssg ssg-appliance ssg-platform &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DPKGS}\"/dpkgs_verification.txt"
        else
            echo "Unable to create dpkgs output directory"
        fi
    else
        mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_RPMS}"
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_RPMS}" ]
        then
            logAndRunCmd "rpm -qa | grep -e ssg -e ssem &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_RPMS}\"/rpms_version.txt"
            logAndRunCmd "rpm -q --verify ssg ssg-appliance ssem ssg-platform ssg-nshieldpci &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_RPMS}\"/rpms_verification.txt"
        else
            echo "Unable to create rpms output directory"
        fi
    fi

    # gateway modules info
    mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}"
    if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}" ]
    then
        logAndRunCmd "ls -halt \"${GW_RUNTIME}\"/modules/assertions/ &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}\"/assertions.txt"
        logAndRunCmd "ls -halt \"${GW_RUNTIME}\"/modules/lib/ &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}\"/lib.txt"
        if [ -d $GW_RUNTIME/bc/ ]
        then
          logAndRunCmd "ls -halt \"${GW_RUNTIME}\"/bc/ &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}\"/bc_lib.txt"
        fi
        if [ -d $GW_RUNTIME/bcfips/ ]
        then
          logAndRunCmd "ls -halt \"${GW_RUNTIME}\"/bcfips/ &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_MODULES}\"/bcfips_lib.txt"
        fi
    else
        echo "Unable to create modules output directory"
    fi

    # gateway configuration files
    mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}"
    if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}" ]
    then
        logAndRunCmd "ls -l \"${GW_NODE_DEFAULT}\"/etc/conf/omp.dat &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\"/omp_dat_permissions.txt"
        logAndRunCmd "cp \"${GW_NODE_DEFAULT}\"/etc/conf/node.properties \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${GW_NODE_DEFAULT}\"/etc/conf/system.properties \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${GW_NODE_DEFAULT}\"/etc/conf/ssglog.properties \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${APPLIANCE_HOME}\"/config/ssgsysconfig.log \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${GW_RUNTIME}\"/etc/profile.d/ssgruntimedefs.sh \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${GW_RUNTIME}\"/etc/profile.d/appliancedefs.sh \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
        logAndRunCmd "cp \"${GW_RUNTIME}\"/etc/ssg.security* \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_CONFIG}\""
    else
        echo "Unable to create config output directory"
    fi

    # logs
    mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS}"
    if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS}" ]
    then
        mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSG}"
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSG}" ]
        then
            logAndRunCmd "cp \"${GW_NODE_DEFAULT}\"/var/logs/*.log \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSG}\""
            logAndRunCmd "cp \"${GW_NODE_DEFAULT}\"/var/logs/ssg_gc.log.* \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSG}\""
        else
            echo "Unable to create gateway_logs output directory"
        fi

        mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSPC}"
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSPC}" ]
        then
            logAndRunCmd "cp \"${CONTROLLER_HOME}\"/var/logs/*.log \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_SSPC}\""
        else
            echo "Unable to create controller_logs output directory"
        fi

        mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_PMS}"
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_PMS}" ]
        then
            logAndRunCmd "cp \"${PMS_HOME}\"/var/logs/*.log \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_LOGS_PMS}\""
        else
            echo "Unable to create pms_logs output directory"
        fi
    else
        echo "Unable to create logs output directory"
    fi

    # patches info
    mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}"
    if [ -f /etc/debian_version ]
    then
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}" ]
        then
            logAndRunCmd "cp \"${PMS_PATCHES_HOME}\"/*.status \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}\""
            logAndRunCmd "ls -halt \"${PMS_PATCHES_HOME}\"/*.L7P &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}\"/patches.txt"
        else
            echo "Unable to create patches output directory: ${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}"
        fi
    else
        if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}" ]
        then
            logAndRunCmd "cp \"${PATCHES_HOME}\"/*.status \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}\""
            logAndRunCmd "ls -halt \"${PATCHES_HOME}\"/*.L7P &> \"${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}\"/patches.txt"
        else
            echo "Unable to create patches output directory: ${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_PATCHES}"
        fi
    fi

    # gateway thread dumps, taking 4 samples at 15s intervals
    mkdir -p "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DUMPS}"
    if [ -w "${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DUMPS}" ]
    then
        setGatewayPID
        if [ -n "$GATEWAYPID" ]
        then
            # Capture thread dump
            for i in {1..4}
            do
                echo "|-- Taking thread-dump sample $i."
                if [[ -f "${JAVA_HOME}/jcmd/bin/jcmd" ]] ; then
                    logAndRunCmd "/bin/sh -c '${JAVA_HOME}/jcmd/bin/jcmd ${GATEWAYPID} Thread.print' > ${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DUMPS}/threadDump-sample-${i}.tdump"
                else
                    logAndRunCmd "/bin/sh -c '${JAVA_HOME}/bin/jstack -l ${GATEWAYPID}' > ${GATEWAY_MODULE_BASE_OUTPUT_DIRECTORY_DUMPS}/threadDump-sample-${i}.tdump"
                fi
                sleep 15
            done
        fi
    else
        echo "Unable to create thread dumps output directory"
    fi
else
    echo "Unable to create gateway output directory"
fi

postModule "$MODULE"
