User Tools

Site Tools


pages:scripts:zertifix

zertifix

#!/usr/bin/env bash

# Script for: * Generating a list of iLOs and to save it as a file.
#             * Work on that list of iLOs to generate CSRs 
#               and to save the CSRs to a filesystem.
#
# This script should have been able to do a lot more than it is able to do yet,
# but unfortunately there was not enough time and a lot of things went wrong.
# 
# Please keep in mind that ACME has to get a lot of things together before this
# script will go anywhere...
#     * Order a new cluster of Insta Certifier appliances
#     * Set them up
#     * Get a license for the REST-API of Insta Certifier
#     * and so on...


# Debug option. Uncomment to activate
# set -x;


# --------------------------------------------------
# SETUP THE SCRIPT
# --------------------------------------------------

# Include the configuration file if it can be found
if [[ -e ../etc/zertifix_conf.sh ]];
then
	source ../etc/zertifix_conf.sh;
else 
	echo "Configuration file not found!";
	exit 1;
fi

# Include functions
if [[ -e $SCRIPT_LIB/zertifix_include_lib.sh ]];
then
	source "${SCRIPT_LIB}/zertifix_include_lib.sh";
else
        echo "Library not found!";
	exit 1;
fi


# --------------------------------------------------
# PARSE THE ARGUMENTS PASSED TO THE SCRIPT
# --------------------------------------------------

f_parse_args "$@";

# Debug option
f_echo_args "$@";



# --------------------------------------------------
# RUN THE SCRIPT
# --------------------------------------------------

f_run_controller;

exit 0;

#!/usr/bin/env bash
# Config for zertifix

# -----------------------------------------------------------------------------
# CONFIGURATION VARIABLES
# -----------------------------------------------------------------------------

# Full path to zertifix script location
SCRIPT_HOME="/home/nq10004071/scripts/zertifix";

# Name of the file which will contain the FQDNs of the iLOs
ILO_FQDN_LIST_NAME="ilo_fqdn.lst";

# FQDN of the Red Hat Satellite server
SATELLITE_FQDN="hostname.lala.lala.domain.com";

# Name of the directory (in the scripts var-directory) which contains 
# the hostlists and the backups of hostlists
DIR_HOSTLISTS_NAME="hostlists";

# Number of days to keep hostlists (retention time)
HOSTLISTS_RETENTION_TIME="186";

# The username and the password which will be used by hpilo_cli to 
# connect to the iLOs
ILO_USER="Administrator";
ILO_PASS="*************";

# Name of the directory (in the scripts var-directory) which contains 
# the directory structure for storing the CSRs
DIR_CSRS_NAME="CSRs";

# CSR fields
CSR_COUNTRY="DE";
CSR_STATE="Bayern";
CSR_LOCALITY="Munich";
CSR_ORGANIZATION="ACME";
CSR_ORGANIZATIONAL_UNIT="ST";

# Name of the directory, below script-var, containing the todo list files
DIR_TODO_LIST_DIR_NAME="TODO";


# -----------------------------------------------------------------------------
# DO NOT EDIT BELOW HERE - EXCEPT YOU KNOW WHAT YOU ARE DOING
# -----------------------------------------------------------------------------

# Build etc-path for the script
SCRIPT_ETC="${SCRIPT_HOME}/etc";
# Build lib-path for the script
SCRIPT_LIB="${SCRIPT_HOME}/lib";
# Build var-path for the script
SCRIPT_VAR="${SCRIPT_HOME}/var";
# Build bin-path for the script
SCRIPT_BIN="${SCRIPT_HOME}/bin";
# Build full path to the directory containing the lists of iLO-FQDNs
DIR_ILO_FQDN_LISTS_PATH="${SCRIPT_VAR}/${DIR_HOSTLISTS_NAME}";
# Build full path to the file containing the list of iLO-FQDNs
ILO_FQDN_LIST_FULL_PATH="${DIR_ILO_FQDN_LISTS_PATH}/${ILO_FQDN_LIST_NAME}";
# Build the path to the directory containing the directory structure
# which will contain the CSRs
CSRS_ROOT_DIR="${SCRIPT_VAR}/${DIR_CSRS_NAME}";
# Build the path to the directory containing the files for the todo list
# which will contain the todo list files
DIR_TODO_LIST_DIR_PATH="${SCRIPT_VAR}/${DIR_TODO_LIST_DIR_NAME}";

#!/usr/bin/env bash

# see https://github.com/mattbryson/bash-arg-parse/blob/master/arg_parse_example
# https://github.com/mattbryson/bash-arg-parse/blob/master/LICENSE
# MIT License (MIT)

# -----------------------------------------------------------------------------
# Function:    f_usage
#
# Description: This function prints short instructions for usage of the script.
#
# Arguments:   none
#
# Output:      none
#
# Return code: none
# -----------------------------------------------------------------------------

function f_usage ()
{
    echo "   $(tput setab 1)$(tput setaf 7)$(tput bold)";
    echo "                                                                                                       ";
    echo "   ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION !   ";
    echo "                                                                                                       ";
    echo "                                                                                                       ";
    echo "   zertifix requires the package python-hpilo-3.9-6.el7.noarch : iLO automation from python or shell   ";
    echo "   to work!                                                                                            ";
    echo "                                                                                                       ";
    echo "                                                                                                       ";
    echo "   ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION ! ATTENTION !   ";
    echo "                                                                                                       $(tput sgr0)";
    echo "   ";
    echo "   ";
    echo "   ";
    echo "   $(tput bold)Description:$(tput sgr0)";
    echo "   $(tput bold)------------$(tput sgr0)";
    echo "   ";
    echo "   At the moment zertifix is able to manage the following things:";
    echo "       - create a list with FQDNs of iLOs";
    echo "       - create CSRs on the iLOS and collect them";
    echo "   ";
    echo "   ";
    echo "   ";
    echo "   $(tput bold)usage:$(tput sgr0) zertifix -t task -m mode | -h | <positional_argument1 positional_argument2 ...] ";
    echo "   $(tput bold)------$(tput sgr0)";
    echo "   ";
    echo "   ";
    echo "     -t | --task            : Desired task <hostlist|csr>";
    echo "   ";
    echo "     -m | --mode            : Desired mode:";
    echo "                              * the task hostlist has two modes: <generate|backup>";
    echo "                                   * generate   : generates a list with FQDNs of iLOs.";
    echo "                                   * backup     : creates a backup of the file containing";
    echo "                                                  the list with FQDNs of iLOs.";
    echo "   ";
    echo "                              * the task csr has two modes: <generate|backup>";
    echo "                                   * generate   : generates the CSRs and puts them into";
    echo "                                                  the directory structure under var/CSRs";
    echo "                                   * todo       : creates a backup of the file containing";
    echo "                                                  the list with FQDNs of iLOs.";
    echo "   ";
    echo "     -h | --help            : Prints this message";
    echo "   ";
    echo "   ";
    echo "   ";
    echo "   ";
    echo "   $(tput bold)Usage examples:$(tput sgr0)";
    echo "   $(tput bold)---------------$(tput sgr0)";
    echo "   ";
    echo "       To print the help:";
    echo "       zertifix --help";
    echo "   ";
    echo "       To generate a list with iLOs:";
    echo "       zertifix --task hostlist --mode generate";
    echo "   ";
    exit 1;
}


# -----------------------------------------------------------------------------
# Function:             f_parse_args
#
# Description:          This function parses the named arguments passed to the script
#                       and puts them into variables. It also takes the positional
#                       arguments and puts them into an array "args".
#
# Named arguments:      -d, --debug: Debug mode
#                       -t, --task: The task
#                       -m, --mode: The mode
#                       -p, --paramaters: The parameters
#
# Positional arguments: 1: I do not know yet #TODO
#                       2: I do not know yet #TODO
#                       3: I do not know yet #TODO
#
# Output:      none
#
# Return code: none
# -----------------------------------------------------------------------------

function f_parse_args ()
{
  # positional args
  args=()

  # named args
  while [ "$1" != "" ]; do
      case "$1" in
          -d | --debug)       debug="$2";      shift;;
          -t | --task )       task="$2";       shift;;
          -m | --mode )       mode="$2";       shift;;
          -p | --parameters ) parameters="$2"; shift;;
          -h | --help )       f_usage;         exit;; # quit and show usage
          * )                 args+=("$1")            # if no match, add it to the positional args
      esac
      shift # move to next kv pair
  done

  # restore positional args
  set -- "${args[@]}"

  # set positionals to vars
#  positional_1="${args[0]}"
#  positional_2="${args[1]}"
#  positional_3="${args[2]}"



  # validate required args
  if [[ -z "${task}" || -z "${mode}" ]]; then
      # TODO
      echo "Invalid arguments"
      f_usage
      exit 1;
  fi

  # set defaults
  if [[ -z "$debug" ]]; then
      debug="no";
  fi
}



# -----------------------------------------------------------------------------
# Function:    f_echo_args
#
# Description: This function prints the arguments parsed by this script in
#              human readable form for debugging purposes.
#
# Arguments:   none
#
# Output:      String - The arguments 
#
# Return code: none
# -----------------------------------------------------------------------------

function f_echo_args ()
{
  if [ "$debug" == "yes" ];
  then
    local counter="1";
    echo -e "\n\nThe arguments have been parsed as:\n";
    echo "named arg: debug:      $debug";
    echo "named arg: task:       $task";
    echo "named arg: mode:       $mode";
    echo "named arg: parameters: $parameters";
    for positional_arg in "${args[@]}"
    do
      echo "positional argument ${counter}: ${positional_arg}";
      let "counter++";
    done
fi
}

#!/usr/bin/env bash

# CONTROLLER
function f_run_controller ()
{
	case "$task" in
	"hostlist")
                echo "task: ${task}";
                case "$mode" in
                "generate")
                        # generate a list containing FQDNs of iLOs
                        echo "mode: ${mode}";
                        f_hostlist_generate;
                        ;;
                "backup")
                        # backup the list containing FQDNs of iLOs
                        echo "mode: ${mode}";
                        f_hostlist_backup;
                        ;;
                *)
			echo "mode: ${mode}";
                        echo "something went wrong!";
                        exit 1;
                        ;;
                esac
                ;;
	"csr")
		echo "task: ${task}";
		case "$mode" in
		"generate")
			echo "mode: ${mode}";
                        # create the directory structure to contain the CSRs
                        # and fetch the CSRs
			f_csr_generate;
			;;
		*)
			echo "mode: ${mode}";
			echo "something went wrong!";
			exit 1;
			;;
		esac
		;;
	"help")
		echo "task: ${task}";
                f_print_usage;
                exit 1;
                ;;
	*)
		echo "task: ${task}";
		echo "something went wrong!";
                echo "";
                f_print_usage;
		exit 1;
		;;
	esac
}

#!/usr/bin/env bash

# -----------------------------------------------------------------------------
# GLOBAL VARIABLES
# -----------------------------------------------------------------------------

# initialize the array A_ILO_HOSTNAMES
A_ILO_HOSTNAMES="";

# -----------------------------------------------------------------------------
# FUNCTIONS
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
# Function:    f_csr_hostlist_check_existence
#
# Description: This function checks if the file containing the list of iLOs
#              is existing and isn't empty.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success (file exists)
#              1 - failure (file doesn't exist)
# -----------------------------------------------------------------------------

function f_csr_hostlist_check_existence ()
{
	local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";


	# check if the file is existing and not empty
	f_file_check_existence_non_empty "${L_ILO_FQDN_LIST_FULL_PATH}";

	return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_csr_read_hostlist
#
# Description: This function reads the file containing the list of iLOs
#              line by line and adds it's contents to the global array
#              A_ILO_HOSTNAMES.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success (file exists)
#              1 - failure (file doesn't exist)
# -----------------------------------------------------------------------------

function f_csr_read_hostlist ()
{
	local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";


	# read the file containing the list with FQDNs of iLOs into an array
	readarray A_ILO_HOSTNAMES < "$L_ILO_FQDN_LIST_FULL_PATH";

	return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_csr_create_directory_structure
#
# Description: This function creates the necessary directory structure to store
# the CSRs in.
#
#
# Parameters:  none
#
# Output:      none
#
# Return code: none
# -----------------------------------------------------------------------------

function f_csr_create_directory_structure ()
{
    # walk through the array elements
    for L_FQDN in "${A_ILO_HOSTNAMES[@]}";
    do
        # strip non printable characters from the variable
        L_FQDN=$(tr -dc '[[:print:]]' <<< "${L_FQDN}");

        # create directory "script-var/CSRs/FQDN" if it doesn't already exist
        if [ ! -d "${CSRS_ROOT_DIR}/${L_FQDN}" ];
        then
            mkdir -p "${CSRS_ROOT_DIR}/${L_FQDN}" \
                && echo "INFO: created directory ${CSRS_ROOT_DIR}/${L_FQDN}" \
                || { echo "ERROR: couldn't create directory ${CSRS_ROOT_DIR}/${L_FQDN}"; exit 1; }
        fi
    done
}


# -----------------------------------------------------------------------------
# Function:    f_csr_fetch
#
# Description: This function sends a query to create a CSR to the FQDN which
#              gets passed to this function as the first argument.
#              The reply of the iLO gets stored in a global variable
#              "ILO_REPLY".
#
# Arguments:   1 - String - FQDN of an iLO
#
# Output:      none - This function sets the global variable "ILO_REPLY".
#
# Return code: none
# -----------------------------------------------------------------------------

function f_csr_fetch ()
{
    local L_FQDN="$1";
    local L_ILO_USER="${ILO_USER}";
    local L_ILO_PASS="${ILO_PASS}";
    local L_CSR_COUNTRY="${CSR_COUNTRY}";
    local L_CSR_STATE="${CSR_STATE}";
    local L_CSR_LOCALITY="${CSR_LOCALITY}";
    local L_CSR_ORGANIZATION="${CSR_ORGANIZATION}";
    local L_CSR_ORGANIZATIONAL_UNIT="${CSR_ORGANIZATIONAL_UNIT}";
    local L_CSR_STRING="";
    local L_ILO_REPLY="";


    # send the query to trigger the creation of a CSR to an iLO
    # via the tool "hpilo_cli"
    hpilo_cli -l ${L_ILO_USER} -p ${L_ILO_PASS} ${L_FQDN} \
                                certificate_signing_request \
                                country=${L_CSR_COUNTRY} \
                                state=${L_CSR_STATE} \
                                locality=${L_CSR_LOCALITY} \
                                organization="${L_CSR_ORGANIZATION}" \
                                organizational_unit=${L_CSR_ORGANIZATIONAL_UNIT} \
                                common_name=${L_FQDN} \
                                2> /dev/null;
}


# -----------------------------------------------------------------------------
# Function:    f_csr_check_for_todo_directory
#
# Description: This function checks if the todo directory exists.
#              If its not existing it will be created.
#
# Arguments:   none
#
# Output:      none
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_csr_check_for_todo_directory ()
{
    local L_FULL_PATH_TO_TODO_DIRECTORY="${DIR_TODO_LIST_DIR_PATH}";
    local L_STATUS="";


    # check if the todo directory exists and create it if it doesn't exist.
    if [ ! -d "${L_FULL_PATH_TO_TODO_DIRECTORY}" ];
    then
        mkdir -p "${L_FULL_PATH_TO_TODO_DIRECTORY}";
        L_STATUS=$?;
    fi
        
return $L_STATUS;
}

# -----------------------------------------------------------------------------
# Function:    f_csr_write_csr_to_file
#
# Description: This function creates
#
# Arguments:   1 - String - FQDN of an iLO
#
# Output:      none - This function sets the global variable "ILO_REPLY".
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_csr_write_csr_to_file ()
{
    local L_ILO_REPLY="$1";
    local L_FQDN="$2";
    local L_FULL_PATH_TO_CSR_FILE="${CSRS_ROOT_DIR}/${L_FQDN}/${L_FQDN}.csr";

    echo "${L_ILO_REPLY}" > "${L_FULL_PATH_TO_CSR_FILE}";

    # strip the first two lines from the file so that is only
    # the CSR left
    sed -i 1,1d "${L_FULL_PATH_TO_CSR_FILE}";

    if [ -e "${L_FULL_PATH_TO_CSR_FILE}" ];
    then
        echo "INFO: CSR written to ${L_FULL_PATH_TO_CSR_FILE}";
    else
        echo "ERROR: couldn't write CSR to ${L_FULL_PATH_TO_CSR_FILE}";
        exit 1;
    fi
    
return $?;
}

# -----------------------------------------------------------------------------
# Function:    f_csr_create_todo_files
#
# Description: This function creates the todo files
#
# Arguments:   none
#
# Output:      none - This function sets the global variable "ILO_REPLY".
#
# Return code: none
# -----------------------------------------------------------------------------

function f_csr_create_todo_files ()
{
    local L_FQDN="";
    local L_A_ILO_HOSTNAMES=("${A_ILO_HOSTNAMES[@]}");
    local L_FULL_PATH_TO_TODO_FILE="";
    

    for L_FQDN in "${A_ILO_HOSTNAMES[@]}";
    do
        # strip non printable characters from the variable
        L_FQDN=$(tr -dc '[[:print:]]' <<< "${L_FQDN}");

        # Build the full path to the todo file
        L_FULL_PATH_TO_TODO_FILE="${DIR_TODO_LIST_DIR_PATH}/${L_FQDN}";

        # if it doesn't already exist create the file
        if [ ! -e "${L_FULL_PATH_TO_TODO_FILE}" ];
        then
            touch "${L_FULL_PATH_TO_TODO_FILE}" \
                && echo "INFO: created todo file ${L_FULL_PATH_TO_TODO_FILE}" \
                || { echo "ERROR: couldn't create todo file ${L_FULL_PATH_TO_TODO_FILE}"; exit 1; }
        fi
    done
}


# -----------------------------------------------------------------------------
# Function:    f_csr_delete_todo_file
#
# Description: This function deletes a todo file
#
# Arguments:   1 - String - FQDN of an iLO
#
# Output:      none - This function sets the global variable "ILO_REPLY".
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_csr_delete_todo_file ()
{
    local L_FQDN="$1";
    local L_FULL_PATH_TO_TODO_FILE="${DIR_TODO_LIST_DIR_PATH}/${L_FQDN}";

    # strip non printable characters from the variable
    L_FQDN=$(tr -dc '[[:print:]]' <<< "${L_FQDN}");

    # delete a file (with the FQDN as the filename) as a todo list item.
    rm "${L_FULL_PATH_TO_TODO_FILE}" \
        && echo "INFO: deleted todo file ${L_FULL_PATH_TO_TODO_FILE}" \
        || { echo "ERROR: couldn't delete todo file ${L_FULL_PATH_TO_TODO_FILE}"; exit 1; }

return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_csr_generate
#
# Description: This function connects to the configured Red Hat Satellite
#              server. There it fetches a list of Red Hat VMs running on 
#              ProLiant hardware and then uses this list to generate a list of
#              FQDNs of iLOs which are built into those ProLiants.
#
# Parameters:  none
#
# Output:      none - The function sets the global variable ILO_FQDN_LIST
#
# Return code: none
# -----------------------------------------------------------------------------

function f_csr_generate ()
{
    local L_FQDN="";
    local L_ILO_COUNT="0";
    local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";
    local L_ILO_REPLY="";
    local L_FULL_PATH_TO_TODO_FILE="";
    local L_CSR_STATUS="0";
    local L_TODO_COUNTER="1";


    # check if the todo directory exists and create it if not.
    f_csr_check_for_todo_directory \
        && echo "INFO: todo directory exists." \
        || { echo "ERROR: todo directory doesn't exist or something went wrong trying to create it."; exit 1; }


    # Check if the file containing the list of iLOs exists
    # and if it exists, read the hostlist into an array
    f_csr_hostlist_check_existence \
        && f_csr_read_hostlist \
        || { echo "ERROR: hostlist couldn't be read into the array"; exit 1; }


    # Count how many iLOs will be contacted to create CSRs and throw a message
    L_ILO_COUNT=$(wc -l < "${L_ILO_FQDN_LIST_FULL_PATH}");
    echo "INFO: ${L_ILO_COUNT} iLOs will be queried in the FIRST PASS.";


    # Build the TODO list
    f_csr_create_todo_files;


    # create the directory structure to store the CSRs in
    f_csr_create_directory_structure \
        && echo "INFO: CSR storage directory structure created." \
        || { echo "ERROR: directory structure couldn't be created"; exit 1; }


    # loop over the array with hostnames
    for L_FQDN in "${A_ILO_HOSTNAMES[@]}";
    do
        # reset L_CSR_STATUS
        L_CSR_STATUS="0";

        # strip non printable characters from the variable
        L_FQDN=$(tr -dc '[[:print:]]' <<< "${L_FQDN}");
        
        # tell the user that we are contacting an iLO
        echo "   ";
        echo "INFO: connecting to ${L_FQDN} (FIRST PASS: ${L_TODO_COUNTER} of ${L_ILO_COUNT})";
        # increment counter
        L_TODO_COUNTER=$((L_TODO_COUNTER+1))
        # connect to the iLO, send the request and collect what it will reply
        L_ILO_REPLY=$(f_csr_fetch "${L_FQDN}");

        # walk through what the iLO has replied, line by line, to find out if 
        # the CSR has already been created.
        for L_LINE in "${L_ILO_REPLY}";
        do
            # we grep for the string "END CERTIFICATE REQUEST" because in case
            # the iLO hasn't created the CSR yet, the reply will not contain
            # that string.
            grep -q "END CERTIFICATE REQUEST" <<< "${L_LINE}";
            L_GREP_STATUS="$?";
            
            # if the grep above finds what it is searching for, we have
            # an already existing CSR on the iLO and we have to write it to
            # a file.
            if [ $L_GREP_STATUS -eq 0 ];
            then
                # Inform that we have a CSR
                echo "INFO: CSR already exists on ${L_FQDN}";
                
                # delete the todo file
                f_csr_delete_todo_file "${L_FQDN}";

                # set L_CSR_STATUS to 1
                L_CSR_STATUS="1";
            fi
        done

        # if we have found an already existing CSR, write it to a file
        # and inform if we haven't found a CSR yet
        if [ "$L_CSR_STATUS" -eq 1 ];
        then
            f_csr_write_csr_to_file "${L_ILO_REPLY}" "${L_FQDN}";
        else
            # Inform that we don't have a CSR yet
            echo "INFO: CSR doesn't exist on ${L_FQDN}";
        fi

    done

    
    # Build array with iLO FQDNs which have to be connected to again 
    # to fetch the CSR (SECOND PASS)
    IFS=$'\n' A_STILL_TODO=($(ls ${DIR_TODO_LIST_DIR_PATH}/));


    # Count how many iLOs will be contacted again to collect CSRs
    # and throw a message
    L_ILO_COUNT=${#A_STILL_TODO[@]};
    echo "   ";
    echo "INFO: ${L_ILO_COUNT} iLOs will be queried in the SECOND PASS.";

    # reset L_TODO_COUNTER
    L_TODO_COUNTER="1";


    # loop over the array with iLOs from which we haven't collected a CSR yet
    for L_FQDN in "${A_STILL_TODO[@]}";
    do
        # reset L_CSR_STATUS
        L_CSR_STATUS="0";

        # strip non printable characters from the variable
        L_FQDN=$(tr -dc '[[:print:]]' <<< "${L_FQDN}");
        
        # tell the user that we are contacting an iLO
        echo "   ";
        echo "INFO: connecting again to ${L_FQDN} (SECOND PASS: ${L_TODO_COUNTER} of ${L_ILO_COUNT})";
        # increment counter
        L_TODO_COUNTER=$((L_TODO_COUNTER+1))
        # connect to the iLO, send the request and collect what it will reply
        L_ILO_REPLY=$(f_csr_fetch "${L_FQDN}");

        # walk through what the iLO has replied, line by line, to find out if 
        # the CSR has already been created.
        for L_LINE in "${L_ILO_REPLY}";
        do
            # we grep for the string "END CERTIFICATE REQUEST" because in case
            # the iLO hasn't created the CSR yet, the reply will not contain
            # that string.
            grep -q "END CERTIFICATE REQUEST" <<< "${L_LINE}";
            L_GREP_STATUS="$?";
            
            # if the grep above finds what it is searching for, we have
            # an already existing CSR on the iLO and we have to write it to
            # a file.
            if [ $L_GREP_STATUS -eq 0 ];
            then
                # Inform that we have a CSR
                echo "INFO: CSR already exists on ${L_FQDN}";
                
                # delete the todo file
                f_csr_delete_todo_file "${L_FQDN}";

                # set L_CSR_STATUS to 1
                L_CSR_STATUS="1";
            fi
        done

        # if we have found an already existing CSR, write it to a file
        # and inform if we haven't found a CSR yet
        if [ "$L_CSR_STATUS" -eq 1 ];
        then
            f_csr_write_csr_to_file "${L_ILO_REPLY}" "${L_FQDN}";
        else
            # Inform that we don't have a CSR yet
            echo "WARNING: couldn't get a CSR for ${L_FQDN}";
        fi

    done


    # Build array with iLO FQDNs which we failed to create a CSR for
    IFS=$'\n' A_FAILED_ILOS=($(ls ${DIR_TODO_LIST_DIR_PATH}/));
    L_ILO_COUNT=${#A_FAILED_ILOS[@]};

    if [ $L_ILO_COUNT -ne 0 ];
    then
        # inform about failed hosts
        echo "   ";
        echo "WARNING:";
        echo "This script has failed to generate CSRs for the following FQDNs:";
        echo "   ";
        for L_FQDN in "${A_FAILED_ILOS[@]}";
        do
            echo "${L_FQDN}";
        done
    fi

exit 0;
}

#!/usr/bin/env bash

# -----------------------------------------------------------------------------
# Function:    f_file_check_existence_non_empty
#
# Description: This function checks if a file exists and is non empty.
#
# Arguments:   1 - full path to file
#
# Output:      none
#
# Return code: 0 - success (file exists and is not empty)
#              1 - failure (file doesn't exist or is empty)
# -----------------------------------------------------------------------------

function f_file_check_existence_non_empty ()
{
        local L_FULL_PATH_TO_FILE="$1";
        if [ -s "${L_FULL_PATH_TO_FILE}" ]
	then
		return 0;
	else
		return 1;
	fi
}


# -----------------------------------------------------------------------------
# Function:    f_formatted_date
#
# Description: This function generates a formatted string containing the
#              date and time of now (YYYYMMDD-HHMMSS)
#
# Arguments:   none
#
# Output:      String - formatted date
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_formatted_date ()
{
        local L_FORMATTED_DATE;

        L_FORMATTED_DATE=$(date +"%Y%m%d-%H%M%S");
        if [ $? -eq 0 ]
        then
        	echo "${L_FORMATTED_DATE}"; 
                return 0;
        else
                return 1;
        fi
}

#!/usr/bin/env bash

# -----------------------------------------------------------------------------
# GLOBAL VARIABLES
# -----------------------------------------------------------------------------

ILO_FQDN_LIST=""; 	# Generated list with FQDNs of iLOs




# -----------------------------------------------------------------------------
# FUNCTIONS
# -----------------------------------------------------------------------------


# -----------------------------------------------------------------------------
# Function:    f_hostlist_get
#
# Description: This function connects to the configured Red Hat Satellite
#              server. There it fetches a list of Red Hat VMs running on 
#              ProLiant hardware and then uses this list to generate a list of
#              FQDNs of iLOs which are built into those ProLiants.
#
# Parameters:  none
#
# Output:      none - The function sets the global variable ILO_FQDN_LIST
#
# Return code: none
# -----------------------------------------------------------------------------

function f_hostlist_get ()
{
	local L_SATELLITE_FQDN="${SATELLITE_FQDN}";
	local L_REMOTE_OUTPUT;
	local L_DEV_HOSTS_FQDN_LIST;
	local L_DE_HOSTS_FQDN_LIST;
	local L_FQDN_LIST;

	# connect via ssh and fetch a CSV which contains RHELs running on ProLiants at Location.
	# As an alternative this could be accomplished also with the REST-API which returns JSON:
	# $L_REMOTE_OUTPUT1=$(curl --insecure -u USERNAME:PASSWORD -H 'Accept:application/json' https://demucvmr94.de.pri.domain.com/api/v2/hosts?search=+model++~+ProLiant+and++location++~+vmr);
	L_REMOTE_OUTPUT=$(ssh -q "${L_SATELLITE_FQDN}" "sudo hammer --csv --csv-separator ';' host list --search 'location ~ vmr and model ~ ProLiant'");
	
	# Build a list with the FQDNs of the iLOs which belong to the RHEL systems
	# in "dev.de.pri.domain.com".
	# Drop first line, grep for ".dev.de.pri.domain.com", get only contents of second field,
	# replace ".dev.de.pri.domain.com" with "-adm.de.pri.domain.com".
	L_DEV_HOSTS_FQDN_LIST="$(echo "${L_REMOTE_OUTPUT}" | tail -n +2 | grep "\.dev\.de\.pri\.domain\.com" | awk --field-separator=";" '{print $2}' | sed 's/\.dev\.de\.pri\.domain\.com/-adm\.de\.pri\.domain\.com/')";

	# Build a list with the FQDNs of the iLOs which belong to the RHEL systems
    # in "de.pri.domain.com".
	# Drop the first line, drop all lines containing ".dev.de.pri.domain.com", get only contents of
	# the second field, replace ".de.pri.domain.com" with "-adm.de.pri.domain.com".
    L_DE_HOSTS_FQDN_LIST=$(echo "${L_REMOTE_OUTPUT}" | tail -n +2 | egrep -v "\.dev\.de\.pri\.domain\.com" | awk --field-separator=";" '{print $2}' | sed 's/\.de\.pri\.domain\.com/-adm\.de\.pri\.domain\.com/');

	# Set ILO_FQDN_LIST to the full list with all iLO FQDNs
	# by concatenating L_DEV_HOSTS_FQDN_LIST and L_DE_HOSTS_FQDN_LIST.
	ILO_FQDN_LIST=$(echo -e "${L_DEV_HOSTS_FQDN_LIST}\n${L_DE_HOSTS_FQDN_LIST}");
}

# -----------------------------------------------------------------------------
# Function:    f_hostlist_write
#
# Description: This function takes the contents of ILO_FQDN_LIST and writes it
#              to the path defined by ILO_FQDN_LIST_FULL_PATH.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_hostlist_write ()
{
	local L_ILO_FQDN_LIST="${ILO_FQDN_LIST}";
	local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";
	
	# echo the contents of L_ILO_FQDN_LIST and redirect stdout to
	# the file which will contain the list
	echo -e "${L_ILO_FQDN_LIST}" > "${L_ILO_FQDN_LIST_FULL_PATH}";

	return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_hostlist_check_existence
#
# Description: This function checks if the file containing the list of iLOs
#              is existing and isn't empty.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success (file exists)
#              1 - failure (file doesn't exist)
# -----------------------------------------------------------------------------

function f_hostlist_check_existence ()
{
	local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";

	# check if the file is existing and not empty
	f_file_check_existence_non_empty "${L_ILO_FQDN_LIST_FULL_PATH}";

	return $?;
}



# -----------------------------------------------------------------------------
# Function:    f_hostlist_backup
#
# Description: This function creates a backup of the file which contains the
#              list of iLO FQDNs.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success (file exists)
#              1 - failure (file doesn't exist)
# -----------------------------------------------------------------------------

function f_hostlist_backup ()
{
        local L_ILO_FQDN_LIST_FULL_PATH="${ILO_FQDN_LIST_FULL_PATH}";
		local L_FORMATTED_DATE=$(f_formatted_date);
	
		# copy the list with iLO-FQDNs to <filename>-YYYYMMDD-HHMMSS
        cp -a "${L_ILO_FQDN_LIST_FULL_PATH}" "${L_ILO_FQDN_LIST_FULL_PATH}-${L_FORMATTED_DATE}";

        return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_hostlist_cleanup_backups
#
# Description: This function cleans up the backups by deleting files which are
#              older than 186 days.
#
# Parameters:  none
#
# Output:      none
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_hostlist_cleanup_backups ()
{
        local L_DIR_ILO_FQDN_LISTS_PATH="${DIR_ILO_FQDN_LISTS_PATH}";
	
        find "${L_DIR_ILO_FQDN_LISTS_PATH}" -mtime "${HOSTLISTS_RETENTION_TIME}" -type f -delete;

        return $?;
}


# -----------------------------------------------------------------------------
# Function:    f_hostlist_generate
#
# Description: This function 
#
# Parameters:  none
#
# Output:      The function generates the file ilo_hostlist.lst in the scripts
#              var-directory.
#
# Return code: 0 - success
#              1 - failure
# -----------------------------------------------------------------------------

function f_hostlist_generate ()
{
	# fetch a list containing the FQDNs of our iLOs
	f_hostlist_get;
    
	# check if the file, to which the list should be written, already exists
	f_hostlist_check_existence;

	# back it up if the file already exists
	if [ $? -eq 0 ]
	then
		f_hostlist_backup;
	fi

	# write the list out to a file
	f_hostlist_write;

	# cleanup old hostlists
	f_hostlist_cleanup_backups;
}

#!/usr/bin/env bash

# ----------------------------------------------------------------------
# This file includes all necessary files from the script's lib-directory
# ----------------------------------------------------------------------

# List of files which should get included
LIB_SCRIPTS="zertifix_arguments_parser.sh 
zertifix_generic_functions.sh 
zertifix_hostlist_functions.sh 
zertifix_csr_functions.sh 
zertifix_controller.sh";
	
# Include all files listed above in a loop
for LIB_INCLUDE in ${LIB_SCRIPTS}
do
	source "${SCRIPT_LIB}/${LIB_INCLUDE}";
done;

-----BEGIN CERTIFICATE REQUEST-----
MIIDBTCCAe0CAQAwgYUxJTAjBgNVBAMMHGRlbXVjMWRyMDEtYWRtLmRlLnByaS5v
Mi5jb20 POSSIBLY MAYBE OR THE OTHER WAY AROUND uaWNhIEdlcahbnkas
R21iSDEPMA0Ga1UEBwwGTXVuaWNoMQ8wDQYDVQQIDAZCYXllcm4xCzAJBgNVBAYT
AkRFMIIBIjAN FAKE DATA CgKCAQEA3kPs03 POSSIBLY sdf8ljjZEEN3r+jVf
HNTBN3qQz3NBN FITZE FITZE FATZE FITZE FITZE FATZ 0XZ1psFwt4ATncd
i5ei2+Q9v3WrTHM524jcTbp1UAfS3vG5ptsD7Li9PMovKUxJtswAs0PRmVpRc5pO
BB7dnsi+Uw8cKAUYXT7lA+3OcfPLPpKMkFpTNMU2gyJ4yBdLo3XTLOZSEfNTOzKc
NKv4mY5ze3hWp THISISJUSTATEST G3mtqDN80hqcV0Guxoa9AOoL LAlaLAlaA
E8IDFX7Y5WAZZnQXv0c+pHrW1uT2Xkb+qr0b2Qz4bICrrd7LdDp6n2uMMh8OCyKi
v7n+hdf8psöfgj09870ilkjö-älöd0LKJÖLßkjäG=öÖööäöäÖdjsg999ZW11YzFk
cjAxLWFkbS5kZS5wcmkubzIuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQBDEYy7QzNR
WSmmvgRG1hws1vzPP9amTiGaW38H9NMbyuQ0AXkn7R/eCGH2awsjidjA+M5V86/c
m6qIyEnMYcfSoFN5 ARFF DEAD:BEEF::   safdaK2aPzX8d1wmTcmsrUfEc/tW
AfA09pD/n+P7bSAVJEt67ekWgjkPR0cabGTdxBQcjaDNsKOAQae/sW4r642hN/gY
amZuPgSWI/dW+kHlg94Pr0npww9sK2X8FrBENvIuYX2yHyO75nnjmO2MtgZU51hL
bKjGBh1zxyGrfsf8iösg90=FA=Fioafj909sfolllksfß0sfllkk9987lN7+Ux7z
KpsHHLR05B/L
-----END CERTIFICATE REQUEST-----

countrytown1dr01-something.country.subdomain.domain.tld
countrytown1dr30-something.country.subdomain.domain.tld
countrytown1dr33-something.country.subdomain.domain.tld
countrytown1dr34-something.country.subdomain.domain.tld
countrytown1dr35-something.country.subdomain.domain.tld
countrytown1dr36-something.country.subdomain.domain.tld
countrytown1dr37-something.country.subdomain.domain.tld
countrytown1dr38-something.country.subdomain.domain.tld
countrytown1dv10-something.country.subdomain.domain.tld
countrytown1dv11-something.country.subdomain.domain.tld
countrytown1dv12-something.country.subdomain.domain.tld
countrytown1dv13-something.country.subdomain.domain.tld
countrytown1dv60-something.country.subdomain.domain.tld
countrytown5dr01-something.country.subdomain.domain.tld
countrytown5dr10-something.country.subdomain.domain.tld
countrytown5dr11-something.country.subdomain.domain.tld
countrytown5dr12-something.country.subdomain.domain.tld
countrytown5dr13-something.country.subdomain.domain.tld
countrytown5dv17-something.country.subdomain.domain.tld
countrytown1dv08-something.country.subdomain.domain.tld
countrytown1dv09-something.country.subdomain.domain.tld
countrytown1mr100-something.country.subdomain.domain.tld
countrytown1mr99-something.country.subdomain.domain.tld
countrytown1pr01-something.country.subdomain.domain.tld
countrytown1pr02-something.country.subdomain.domain.tld
countrytown1pr03-something.country.subdomain.domain.tld
countrytown1pr14-something.country.subdomain.domain.tld
countrytown1pr15-something.country.subdomain.domain.tld
countrytown1pr16-something.country.subdomain.domain.tld
countrytown1pr17-something.country.subdomain.domain.tld
countrytown1pr18-something.country.subdomain.domain.tld
countrytown1pr19-something.country.subdomain.domain.tld
countrytown1pr20-something.country.subdomain.domain.tld
countrytown1pr21-something.country.subdomain.domain.tld
countrytown1pr22-something.country.subdomain.domain.tld
countrytown1pr23-something.country.subdomain.domain.tld
countrytown1pr24-something.country.subdomain.domain.tld
countrytown1pr25-something.country.subdomain.domain.tld
countrytown1pr26-something.country.subdomain.domain.tld
countrytown1pr27-something.country.subdomain.domain.tld
countrytown1pr28-something.country.subdomain.domain.tld
countrytown1pr29-something.country.subdomain.domain.tld
countrytown1pr30-something.country.subdomain.domain.tld
countrytown1pr31-something.country.subdomain.domain.tld
countrytown1pr32-something.country.subdomain.domain.tld
countrytown1pr33-something.country.subdomain.domain.tld
countrytown1pr34-something.country.subdomain.domain.tld
countrytown1pr35-something.country.subdomain.domain.tld
countrytown1pr36-something.country.subdomain.domain.tld
countrytown1pr37-something.country.subdomain.domain.tld
countrytown1pr38-something.country.subdomain.domain.tld
countrytown1pr43-something.country.subdomain.domain.tld
countrytown1pr44-something.country.subdomain.domain.tld
countrytown1tr30-something.country.subdomain.domain.tld
countrytown1tr31-something.country.subdomain.domain.tld
countrytown1tr32-something.country.subdomain.domain.tld
countrytown1tr33-something.country.subdomain.domain.tld
countrytown1tr34-something.country.subdomain.domain.tld
countrytown1tr35-something.country.subdomain.domain.tld
countrytown1tr40-something.country.subdomain.domain.tld
countrytown1tr41-something.country.subdomain.domain.tld
countrytown1tr43-something.country.subdomain.domain.tld
countrytown1tr44-something.country.subdomain.domain.tld
countrytown1tr45-something.country.subdomain.domain.tld
countrytown1ub09-something.country.subdomain.domain.tld
countrytown1ub10-something.country.subdomain.domain.tld
countrytown5pr03-something.country.subdomain.domain.tld
countrytown5pr14-something.country.subdomain.domain.tld
countrytown5pr15-something.country.subdomain.domain.tld
countrytown5pr16-something.country.subdomain.domain.tld
countrytown5pr17-something.country.subdomain.domain.tld
countrytown5pr18-something.country.subdomain.domain.tld
countrytown5pr19-something.country.subdomain.domain.tld
countrytown5pr20-something.country.subdomain.domain.tld
countrytown5pr21-something.country.subdomain.domain.tld
countrytown5pr22-something.country.subdomain.domain.tld
countrytown5pr23-something.country.subdomain.domain.tld
countrytown5pr24-something.country.subdomain.domain.tld
countrytown5pr25-something.country.subdomain.domain.tld
countrytown5pr26-something.country.subdomain.domain.tld
countrytown5pr27-something.country.subdomain.domain.tld
countrytown5pr28-something.country.subdomain.domain.tld
countrytown5pr29-something.country.subdomain.domain.tld
countrytown5pr30-something.country.subdomain.domain.tld
countrytown5pr31-something.country.subdomain.domain.tld
countrytown5pr32-something.country.subdomain.domain.tld
countrytown5pr33-something.country.subdomain.domain.tld
countrytown5pr34-something.country.subdomain.domain.tld
countrytown5pr35-something.country.subdomain.domain.tld
countrytown5pr36-something.country.subdomain.domain.tld
countrytown5pr37-something.country.subdomain.domain.tld
countrytown5pr38-something.country.subdomain.domain.tld
countrytown5pr39-something.country.subdomain.domain.tld
countrytown5pr40-something.country.subdomain.domain.tld
countrytown5pr41-something.country.subdomain.domain.tld
countrytown5pr42-something.country.subdomain.domain.tld
countrytown5pr43-something.country.subdomain.domain.tld
countrytown5pr44-something.country.subdomain.domain.tld
countrytown5pr45-something.country.subdomain.domain.tld
countrytown5pr46-something.country.subdomain.domain.tld
countrytown5sv12-something.country.subdomain.domain.tld
countrytown5sv13-something.country.subdomain.domain.tld
countrytown5sv15-something.country.subdomain.domain.tld
countrytown5sv16-something.country.subdomain.domain.tld
countrytown5sv17-something.country.subdomain.domain.tld
countrytown5sv18-something.country.subdomain.domain.tld
countrytown5sv19-something.country.subdomain.domain.tld
countrytown5sv24-something.country.subdomain.domain.tld
countrytown5sv27-something.country.subdomain.domain.tld
countrytown5sv37-something.country.subdomain.domain.tld
countrytown5sv-unix01-something.country.subdomain.domain.tld
countrytown5sv-unix02-something.country.subdomain.domain.tld
countrytown5tr01-something.country.subdomain.domain.tld
countrytown5tr02-something.country.subdomain.domain.tld
countrytown5tr03-something.country.subdomain.domain.tld
countrytown5tr04-something.country.subdomain.domain.tld
countrytown5ub09-something.country.subdomain.domain.tld
countrytown5ub10-something.country.subdomain.domain.tld
countrywsthsv01-something.country.subdomain.domain.tld
countrywsthsv02-something.country.subdomain.domain.tld
countrywsthsv03-something.country.subdomain.domain.tld
countrywsthsv04-something.country.subdomain.domain.tld
countrywsthsv05-something.country.subdomain.domain.tld
countrywsthsv06-something.country.subdomain.domain.tld
countrywsthsv07-something.country.subdomain.domain.tld
countrywstisv01-something.country.subdomain.domain.tld
countrywstisv02-something.country.subdomain.domain.tld
countrywstisv03-something.country.subdomain.domain.tld
countrywstisv04-something.country.subdomain.domain.tld
countrywstisv05-something.country.subdomain.domain.tld
countrywstisv06-something.country.subdomain.domain.tld
countrywstisv07-something.country.subdomain.domain.tld

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
pages/scripts/zertifix.txt · Last modified: 2022/12/31 02:33 by Heiko Mischer