You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1598 lines
45 KiB
Bash
1598 lines
45 KiB
Bash
#!/bin/bash
|
|
#
|
|
# nagios_hpeilo_cfg_generator -- The script aims to automatically generate
|
|
# nagios configuration once discovering the
|
|
# HPE ProLiant Servers.
|
|
# (C) Copyright [2015] Hewlett Packard Enterprise Development Company, L.P.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of version 2 of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program 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 this program; if not, write to:
|
|
# Free Software Foundation, Inc.
|
|
# 51 Franklin Street, Fifth Floor
|
|
# Boston, MA 02110-1301, USA.
|
|
#
|
|
# Written by Adrian Huang <adrian.huang@hp.com>.
|
|
|
|
prefix=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
|
|
|
NagiosLibexec="${prefix}"
|
|
NagiosHpiloEngine="nagios_hpeilo_engine"
|
|
NagiosHpHltStatusHnd="nagios_hpeilo_health_service"
|
|
NagiosHpTrapCmd="nagios_hpeilo_traps"
|
|
HpiloXmlFile="/tmp/ilo_xml_content.xml"
|
|
HpiloXmlTag=(SPN PN UUID)
|
|
HpiloHostgroup="hpeilo-servers"
|
|
HpiloProductOid="1.3.6.1.4.1.232.2.2.4.2"
|
|
HpiloLogFile="/var/log/nagios_hpeilo_cfg_generator.log"
|
|
HpiloSnmpComm="public" # hpeilo ilo community string
|
|
HpiloServices=("System Status" "Fans" "Memory" "Network" "Power Supplies" "Processors" "Storage" "Temperatures")
|
|
HpiloServiceGroup="servicegroup_name"
|
|
|
|
CheckInterval=5 # 5-minute interval
|
|
MaxAttempts=10
|
|
IPV4AddrEntries=4
|
|
|
|
# The mode to discover servers: Active discovery and passive discovery
|
|
ActiveDisc=1
|
|
PassiveDisc=2
|
|
ConfigDisc=3
|
|
|
|
DiscModes=($ActiveDisc $PassiveDisc $ConfigDisc)
|
|
|
|
LockFile="/tmp/nagios_hpeilo.lock"
|
|
TmpFile="/tmp/tmp.txt"
|
|
|
|
# SNMP variables
|
|
SnmpPort=161
|
|
|
|
#Variables
|
|
cfg_file=0
|
|
cfg_interface=0
|
|
|
|
|
|
# Nmap defintion
|
|
NmapMinVersion=5.20
|
|
NmapSnmpPortProto="$SnmpPort/udp"
|
|
NmapLogFile="/tmp/nmap_result.log"
|
|
NmapScanReportStr="Nmap scan report for"
|
|
|
|
#snmptrapd configuration definitions
|
|
SNMPTRAPD_AUTH_COMM="authCommunity log,execute,net public"
|
|
HPILO_CFG_GEN="nagios_hpeilo_cfg_generator"
|
|
HPILO_TRAPS="nagios_hpeilo_traps"
|
|
#NAGIOS_ILO_CONFIG_FILE="hpiLO_nagios_plugin.cfg"
|
|
SNMPTRAPD_AUTH="authCommunity log,execute,net"
|
|
|
|
# Find the path
|
|
NAGIOS_ILO_PLUGINS_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
|
NAGIOS_INST_PATH="${prefix}"
|
|
SNMPTRAPD_CONF=`find /etc -name snmptrapd.conf`
|
|
#NAGIOS_ILO_CONFIG_PATH=`find /usr/local/ -name $NAGIOS_ILO_CONFIG_FILE | xargs dirname`
|
|
# If the snmptrapd.conf is not existed, the default file path is used.
|
|
if [ "$SNMPTRAPD_CONF" = "" ]; then
|
|
SNMPTRAPD_CONF="/etc/snmp/snmptrapd.conf"
|
|
fi
|
|
|
|
#help display
|
|
function print_help() {
|
|
echo -e "-m\n\tThe mode to discover servers."
|
|
echo -e "\t\tMode Number\tDescription"
|
|
echo -e "\t\t-------------------------------"
|
|
echo -e "\t\t1\t\tActive discovery"
|
|
echo -e "\t\t2\t\tPassive discovery"
|
|
echo -e "-i\n\tThe network interface (eth0, ethX) of your host. Note this option must be applied if the mode is active"
|
|
echo -e "-s\n\tThe host/server group definition file"
|
|
echo -e "-o\n\tOverwrite iLO configuration (ilo.cfg) file"
|
|
echo -e "-v\n\tVerbose mode"
|
|
echo -e "-h, --help\n\tPrint this help menu"
|
|
|
|
}
|
|
|
|
#input format
|
|
function usage() {
|
|
echo -e "$0 -m mode_number [-i network_interface] [-s host-group-file] [-o] [-h|--help] [-v]"
|
|
}
|
|
|
|
#nmap comparison
|
|
function compare_version() {
|
|
local IFS=.
|
|
local v1=($1)
|
|
local v2=($2)
|
|
local ret=0
|
|
local idx=
|
|
|
|
if [ ${#v1[@]} -eq ${#v2[@]} ]; then
|
|
|
|
# The number of entries is identical, so go for
|
|
# comparing each version entry
|
|
for((idx=0;idx<${#v1[@]};idx++)); do
|
|
diff=$((v1[idx]-v2[idx]))
|
|
|
|
if [ $diff -ne 0 ]; then
|
|
[ $diff -lt 0 ] && ret=-1 || ret=1
|
|
break;
|
|
fi
|
|
done
|
|
|
|
else
|
|
# Cannot compare! The length of these versions are different.
|
|
ret=-2
|
|
fi
|
|
|
|
echo "$ret"
|
|
}
|
|
|
|
#Remove traphandle in snmptrap.conf, If passive discovery disabled
|
|
function remove_traphandle() {
|
|
if [[ -f $SNMPTRAPD_CONF ]]; then
|
|
cat $SNMPTRAPD_CONF | sed -e "/$HPILO_CFG_GEN/d" | \
|
|
sed -e "/$HPILO_TRAPS/d" > /tmp/tmp.txt
|
|
mv /tmp/tmp.txt $SNMPTRAPD_CONF
|
|
fi
|
|
}
|
|
|
|
#configure snmptrapd file
|
|
function snmptrapd_config() {
|
|
# Get the Nagios status
|
|
`find /etc/init.d/ -name "nagios*" -print` status &> /dev/null
|
|
[ $? -eq 0 ] && echo -e "\t\t\t[Done]" || echo -e "\t\t\t[Failed]"
|
|
|
|
# Check if the Nagios daemon is started.
|
|
if [ $? -ne 0 ]; then
|
|
# The Nagios is not started yet. Start the daemon right away.
|
|
`find /etc/init.d/ -name "nagios*" -print` start
|
|
fi
|
|
|
|
# Add traphandle statements
|
|
if [ ${#HostGroup[@]} -eq 0 ] && [ "$passive_disc" -eq "1" ]; then
|
|
[ "`grep "$SNMPTRAPD_AUTH_COMM" $SNMPTRAPD_CONF 2> /dev/null`" = "" ] && \
|
|
echo $SNMPTRAPD_AUTH_COMM >> $SNMPTRAPD_CONF
|
|
else
|
|
for((idx=0;idx<${#HostGroup_TrapCommStr[@]};idx++)); do
|
|
comm_auth=`echo $SNMPTRAPD_AUTH ${HostGroup_TrapCommStr[$idx]}`
|
|
if [ "$passive_disc" -eq "1" ]; then
|
|
[ "`grep "$comm_auth" $SNMPTRAPD_CONF 2> /dev/null`" = "" ] && \
|
|
echo $comm_auth >> $SNMPTRAPD_CONF
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ "`grep "$HPILO_CFG_GEN" $SNMPTRAPD_CONF`" = "" ] && \
|
|
[ "`grep "$HPILO_TRAPS" $SNMPTRAPD_CONF`" = "" ]; then
|
|
snmptrap_handle
|
|
else
|
|
remove_traphandle
|
|
snmptrap_handle
|
|
fi
|
|
restart_snmptrapd
|
|
}
|
|
|
|
function restart_snmptrapd() {
|
|
if [[ -f $SNMPTRAPD_CONF ]]; then
|
|
echo "Restart snmptrapd"
|
|
# restart snmptrapd
|
|
if [ -f /etc/redhat-release ] ; then
|
|
#rhel
|
|
/sbin/service snmptrapd restart
|
|
else
|
|
killall snmptrapd &> /dev/null
|
|
snmptrapd -C -c $SNMPTRAPD_CONF -Lf /var/log/net-snmptrapd.log
|
|
fi
|
|
|
|
[ $? -eq 0 ] && echo -e "\t\t\t[Done]" || echo -e "\t\t\t[Failed]"
|
|
fi
|
|
}
|
|
|
|
function snmptrap_handle {
|
|
echo "traphandle 1.3.6.1.6.3.1.1.5.1 \
|
|
$NAGIOS_INST_PATH/$HPILO_CFG_GEN -m 2 -s $HostGroupCfgFile" >> $SNMPTRAPD_CONF
|
|
echo "traphandle 1.3.6.1.4.1.232.0.* \
|
|
$NAGIOS_INST_PATH/$HPILO_TRAPS" >> $SNMPTRAPD_CONF
|
|
}
|
|
|
|
#Read host group
|
|
function read_host_group() {
|
|
local host_group_entries=0
|
|
|
|
while read line
|
|
do
|
|
# ignore the space line
|
|
if [ "x${line}" = "x" ]; then
|
|
continue
|
|
fi
|
|
|
|
# ignore the comment lines
|
|
if [ "x$(echo $line | grep -E \"^#\")" != "x" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Get the name of the host group
|
|
HostGroup[$host_group_entries]=`echo $line | awk -F , '{print $1}'`
|
|
|
|
# Get the IP address or Subnet
|
|
HostGroupIPAddr[$host_group_entries]=`echo $line | awk -F , '{print $2}'`
|
|
|
|
host_group_entries=$(($host_group_entries+1))
|
|
|
|
done < "$HostGroupCfgFile"
|
|
}
|
|
|
|
#Read contact group
|
|
function read_contact_group() {
|
|
local contact_group_entries=0
|
|
|
|
while read line
|
|
do
|
|
# ignore the space line
|
|
if [ "x${line}" = "x" ]; then
|
|
continue
|
|
fi
|
|
|
|
# ignore the comment lines
|
|
if [ "x$(echo $line | grep -E \"^#\")" != "x" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Get the name of the host group
|
|
contact_name[$contact_group_entries]=`echo $line | awk -F , '{print $1}'`
|
|
|
|
contact_group_entries=$(($contact_group_entries+1))
|
|
|
|
done < "$HostGroupCfgFile"
|
|
}
|
|
|
|
#Read host group definition file
|
|
######################################
|
|
function read_config_file() {
|
|
local temp=
|
|
local host_group_entries=
|
|
local contact_entries=
|
|
|
|
if [ $mode -eq 2 ] && [ $cfg_file -eq 1 ]; then
|
|
echo
|
|
else
|
|
echo "Reading host-group configuration file : $HostGroupCfgFile"
|
|
|
|
fi
|
|
while read line
|
|
do
|
|
if [ "x${line}" = "x" ]; then
|
|
continue
|
|
fi
|
|
# ignore the comment lines
|
|
if [ "x$(echo $line | grep -E "^#")" != "x" ]; then
|
|
continue
|
|
fi
|
|
config_type=`echo $line | awk '{print $1}'`
|
|
case "$config_type" in
|
|
PASSIVE_DISCOVERY)
|
|
passive_disc=`echo $line | awk '{print $2}'`
|
|
;;
|
|
ACTIVE_DISCOVERY)
|
|
active_disc=`echo $line | awk '{print $2}'`
|
|
;;
|
|
HOSTGROUP:)
|
|
temp=`echo $line | awk -F: '{print $2}'`
|
|
host_group_entries=${#HostGroup[@]}
|
|
# Get the name of the host group
|
|
HostGroup[$host_group_entries]=`echo $temp | awk -F , '{print $1}'`
|
|
# Get the IP address or Subnet
|
|
HostGroupIPAddr[$host_group_entries]=`echo $temp | awk -F , '{print $2}'`
|
|
#Get communitiy string , defualt is public
|
|
HostGroup_ReadCommStr[$host_group_entries]=`echo $temp | awk -F , '{print $3}'`
|
|
HostGroup_TrapCommStr[$host_group_entries]=`echo $temp | awk -F , '{print $4}'`
|
|
if [ "x${HostGroup_ReadCommStr[$host_group_entries]}" = "x" ]; then
|
|
HostGroup_ReadCommStr[$host_group_entries]=$HpiloSnmpComm
|
|
fi
|
|
if [ "x${HostGroup_TrapCommStr[$host_group_entries]}" = "x" ]; then
|
|
HostGroup_TrapCommStr[$host_group_entries]=$HpiloSnmpComm
|
|
fi
|
|
;;
|
|
CHECK_INTERVAL)
|
|
CheckInterval=`echo $line | awk '{print $2}'`
|
|
;;
|
|
NAGIOS_HOSTIP)
|
|
NAGIOS_HOSTIP=`echo $line | awk '{print $2}'`
|
|
;;
|
|
CONTACT:)
|
|
contemp=`echo $line | awk -F: '{print $2}'`
|
|
contact_entries=${#contact_name[@]}
|
|
# Get the name of the contacts
|
|
contact_name[$contact_entries]=`echo $contemp | awk -F , '{print $1}'`
|
|
contact_alias[$contact_entries]=`echo $contemp | awk -F , '{print $2}'`
|
|
contact_mail_id[$contact_entries]=`echo $contemp | awk -F , '{print $3}'`
|
|
;;
|
|
CONTACTGROUP:)
|
|
conGtemp=`echo $line | awk -F: '{print $2}'`
|
|
contactgrp_entries=${#ContactgrpInfo[@]}
|
|
# Get the name of the contact group
|
|
contact_grp_name[contactgrp_entries]=`echo $conGtemp | awk -F , '{print $1}'`
|
|
contact_grp_alias[contactgrp_entries]=`echo $conGtemp | awk -F , '{print $2}'`
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
done < "$HostGroupCfgFile"
|
|
}
|
|
|
|
|
|
##########################
|
|
# $1: Number bit of the subnet mask
|
|
function get_subnet_mask() {
|
|
local number_255_entries=$(($1/8))
|
|
local suffix_bits=$(($1%8))
|
|
local saveIFS=$IFS
|
|
local subnet_mask_tmp=
|
|
local idx=
|
|
|
|
IFS="."
|
|
|
|
# Fill the 255' portions. For 172.16.0.0/23, subnet_mask_tmp should
|
|
# be 255.255.x.x
|
|
for((idx=0;idx<$number_255_entries;idx++)); do
|
|
subnet_mask_tmp[$idx]=255
|
|
done
|
|
|
|
|
|
# Fill the non-255' portions. For 172.16.0.0/23, subnet_mask_tmp should
|
|
# be 255.255.254.0
|
|
if [ $idx -lt $IPV4AddrEntries ]; then
|
|
if [ "$suffix_bits" != "0" ]; then
|
|
subnet_mask_tmp[$idx]=$((255 - ((1 << (8 - $suffix_bits)) -1)))
|
|
else
|
|
subnet_mask_tmp[$idx]=0
|
|
fi
|
|
|
|
idx=$(($idx+1))
|
|
for((;idx<$IPV4AddrEntries;idx++)); do
|
|
subnet_mask_tmp[$idx]=0
|
|
done
|
|
fi
|
|
|
|
# Print the subnet mask. Something like 255.255.254.0.
|
|
echo "${subnet_mask_tmp[*]}"
|
|
|
|
IFS=$saveIFS
|
|
}
|
|
|
|
# $1: host ip address
|
|
# $2: Subnet address and/or number bits of the subnet mask. For example, this
|
|
# field can be 192.168.1.1 or 192.168.1.0/24.
|
|
function is_host_in_ip_range() {
|
|
local host_ip_address=$1
|
|
local ip_address=`echo $2 | awk -F '/' '{print $1}'`
|
|
local ip_address2=`echo $2 | awk -F '-' '{print $2}'`
|
|
local subnet_mask_bits=`echo $2 | awk -F '/' '{print $2}'`
|
|
local bool="False"
|
|
local subnet_mask=
|
|
local idx=0
|
|
|
|
# The IP address is applied only.
|
|
if [ "x${subnet_mask_bits}" = "x" ];then
|
|
if [ "$1" = "$ip_address" ]; then
|
|
bool="True"
|
|
elif [ "x${ip_address2}" != "x" ];then
|
|
ip_address=`echo $2 | awk -F '-' '{print $1}'`
|
|
local OIFS=$IFS
|
|
IFS='.'
|
|
local ip1=($ip_address)
|
|
local ip2=($ip_address2)
|
|
local host_ip=($host_ip_address)
|
|
IFS=$OIFS
|
|
bool="True"
|
|
if [ ${host_ip[0]} -lt ${ip1[0]} ] || [ ${host_ip[0]} -gt ${ip2[0]} ]; then
|
|
bool="False"
|
|
elif [ ${host_ip[1]} -lt ${ip1[1]} ] || [ ${host_ip[1]} -gt ${ip2[1]} ]; then
|
|
bool="False"
|
|
elif [ ${host_ip[2]} -lt ${ip1[2]} ] || [ ${host_ip[2]} -gt ${ip2[2]} ]; then
|
|
bool="False"
|
|
elif [ ${host_ip[2]} -le ${ip1[2]} ] && [ ${host_ip[3]} -lt ${ip1[3]} ] || [ ${host_ip[3]} -gt ${ip2[3]} ]; then
|
|
bool="False"
|
|
fi
|
|
fi
|
|
else # Subnet address + number bits of the subnet mask.
|
|
local field=
|
|
local host_ip_netry=
|
|
local ip_entry=
|
|
local subnet_mask_entry=
|
|
|
|
|
|
# Get the subnet mask format (for example: 255.255.255.0) from
|
|
# the number bits of the subnet mask
|
|
subnet_mask=$(get_subnet_mask $subnet_mask_bits)
|
|
|
|
bool="True"
|
|
|
|
# Check if the host IP address is in this subnet
|
|
for((idx=0;idx<$IPV4AddrEntries;idx++)); do
|
|
field=$(($idx+1))
|
|
host_ip_entry=`echo $host_ip_address | awk -F '.' '{print $'$field'}'`
|
|
ip_entry=`echo $ip_address | awk -F '.' '{print $'$field'}'`
|
|
subnet_mask_entry=`echo $subnet_mask | awk -F '.' '{print $'$field'}'`
|
|
|
|
host_ip_entry=$(($host_ip_entry & subnet_mask_entry))
|
|
ip_entry=$(($ip_entry & subnet_mask_entry))
|
|
|
|
if [ "$host_ip_entry" != "$ip_entry" ]; then
|
|
bool="False"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
echo $bool
|
|
}
|
|
|
|
function read_xml_entity() {
|
|
local IFS=\>
|
|
read -d \< tag value
|
|
}
|
|
|
|
function parse_xml() {
|
|
while read_xml_entity; do
|
|
if [[ $tag = "$1" ]]; then
|
|
break;
|
|
fi
|
|
done < $HpiloXmlFile
|
|
}
|
|
|
|
#$1: The path of nmap
|
|
function check_nmap_version() {
|
|
local local_ver=`$1 --version | grep version | cut -d ' ' -f3`
|
|
local result=
|
|
|
|
result=$(compare_version $local_ver $NmapMinVersion)
|
|
|
|
if [ $result -eq -2 ]; then
|
|
echo "[Error]: Different version length! Cannot compare the nmap version ($local_ver) of your system and the required minimal version ($NmapMinVersion)."
|
|
exit 1
|
|
elif [ $result -eq -1 ]; then
|
|
echo "[Error]: Your local nmap version is '$local_ver'. The minimal version is '$NmapMinVersion'. Please upgrade nmap."
|
|
exit 1
|
|
fi
|
|
|
|
}
|
|
|
|
# $1: The nmap entry for each host
|
|
function parse_nmap_entry() {
|
|
local ip_address=
|
|
local nmap_state=
|
|
local IFS=' '
|
|
|
|
# Get the IP address from each entry
|
|
ip_address=`echo $1 | grep "Nmap scan report for" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`
|
|
|
|
write_log "checking IP: $ip_address"
|
|
|
|
# Get the info of the STATE field
|
|
nmap_state=`echo $1 | grep -w $NmapSnmpPortProto | cut -d ' ' -f2`
|
|
|
|
# The server has the up and running snmp agent
|
|
if [ "$nmap_state" = "open" ]; then
|
|
check_ilo_device $ip_address
|
|
|
|
# New iLO device
|
|
if [ $? -eq 0 ]; then
|
|
write_nagios_cfg_file $ip_address
|
|
|
|
# reload nagios configuration files
|
|
`service $NagiosService reload > /dev/null`
|
|
if [ $VerboseMode -eq 0 ]; then
|
|
write_log -e "The server '${IloXmlTag[0]}' with IP address '$ip_address' is added"
|
|
num_host_added=$(($num_host_added+1))
|
|
fi
|
|
fi
|
|
|
|
fi
|
|
}
|
|
|
|
# $1: The number of hosts has been processed
|
|
# $2: Total hosts
|
|
function update_active_disc_progress() {
|
|
echo -ne "Progress: $(($1*100/$2))% (scanned $1 of $2 hosts)\r"
|
|
}
|
|
|
|
############################################################
|
|
# $1: The number of offline hosts
|
|
# $2: The number of online hosts to discover
|
|
############################################################
|
|
# Template for nmap output: Ahead of "Nmap scan report".
|
|
############################################################
|
|
# Nmap scan report for 16.153.113.5
|
|
# Host is up (0.00058s latency).
|
|
# PORT STATE SERVICE
|
|
# 161/udp open snmp
|
|
# | snmp-sysdescr: Integrated Lights-Out 4 1.30 Mar 18 2013
|
|
# |_ System uptime: 40 days, 11:15:49.94 (349654994 timeticks)
|
|
# MAC Address: 9C:8E:99:6E:0C:FA (Hewlett-Packard Enterprise Company)
|
|
#
|
|
# Nmap scan report for 16.153.113.7
|
|
# Host is up (0.00015s latency).
|
|
# PORT STATE SERVICE
|
|
# 161/udp closed snmp
|
|
# MAC Address: 98:4B:E1:04:F8:7E (Hewlett-Packard Enterprise Company)
|
|
#
|
|
# Nmap scan report for 16.153.113.8
|
|
# Host is up (0.00011s latency).
|
|
# PORT STATE SERVICE
|
|
# 161/udp open|filtered snmp
|
|
# MAC Address: 3C:D9:2B:08:95:92 (Hewlett-Packard Enterprise Company)
|
|
# ............................................
|
|
# ............................................
|
|
##############################################################
|
|
function parse_nmap_report() {
|
|
local line_num_list=
|
|
local entry= # the entry is started from "NmapScanReportStr"
|
|
local cur_et_line=0 # current entry line
|
|
local nx_et_line=0 # next entry line
|
|
|
|
NumHostsProcessed=$(($NumHostsProcessed+$1))
|
|
|
|
# Update process
|
|
update_active_disc_progress "$NumHostsProcessed" "$2"
|
|
|
|
# Collecting the line number for the string ahead of
|
|
# "NmapScanReportStr"
|
|
line_num_list=`grep -n "$NmapScanReportStr" $NmapLogFile | cut -d ':' -f1`
|
|
|
|
# Append the last line number of the file NmapLogFile to
|
|
# line_num_list variable
|
|
line_num_list=`echo $line_num_list;(wc -l $NmapLogFile | cut -d ' ' -f1)`
|
|
for nx_et_line in $line_num_list; do
|
|
if [ $cur_et_line -ne 0 ]; then
|
|
entry=`sed -n "${cur_et_line},$(($nx_et_line-1)) p" $NmapLogFile`
|
|
|
|
parse_nmap_entry "$entry"
|
|
|
|
NumHostsProcessed=$(($NumHostsProcessed+1))
|
|
|
|
# Update process
|
|
update_active_disc_progress "$NumHostsProcessed" "$2"
|
|
fi
|
|
|
|
cur_et_line=$nx_et_line
|
|
done
|
|
|
|
}
|
|
|
|
# $1: IP address
|
|
function get_xml_content() {
|
|
local idx=0
|
|
|
|
# get the xml content from iLO
|
|
`curl http://$1/xmldata?item=all > $HpiloXmlFile 2>/dev/null`
|
|
|
|
for((idx=0;idx<${#HpiloXmlTag[@]};idx++)); do
|
|
parse_xml ${HpiloXmlTag[$idx]}
|
|
|
|
# index '0' stores Product Name
|
|
# index '1' stores iLO Info
|
|
IloXmlTag[$idx]=$value
|
|
done
|
|
|
|
}
|
|
|
|
# $1: file name
|
|
# $2: search pattern
|
|
function search_string() {
|
|
local str=
|
|
|
|
if [ -f $1 ]; then
|
|
str=`grep "$2" $1`
|
|
fi
|
|
|
|
echo -e "$str"
|
|
}
|
|
|
|
# argument 1 ($1): The data to be logged
|
|
function write_log() {
|
|
if [ "$VerboseMode" = "1" ]
|
|
then
|
|
[ $mode -eq $PassiveDisc ] && echo -e "[`date "+%b %d %T"`] $1" >> $HpiloLogFile || echo -e "$1"
|
|
fi
|
|
}
|
|
|
|
#write generic hosts to ilo config file
|
|
function write_nagios_generic_host_section() {
|
|
echo -e "define host {" >> $NagiosIloCfgFile
|
|
echo -e "\tname generic-iLO-host" >> $NagiosIloCfgFile
|
|
echo -e "\tuse generic-host" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_interval $CheckInterval" >> $NagiosIloCfgFile
|
|
echo -e "\tmax_check_attempts $MaxAttempts" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_command check-iLO-host-alive" >> $NagiosIloCfgFile
|
|
echo -e "\taction_url https://\$HOSTADDRESS$" >> $NagiosIloCfgFile
|
|
echo -e "\t_nagiosip $NAGIOS_HOSTIP" >> $NagiosIloCfgFile
|
|
echo -e "\ticon_image_alt HPE Integrated Lights-Out (iLO)" >> $NagiosIloCfgFile
|
|
if [ "x${contact_grp_name}" != "x" ]; then
|
|
echo -e "\tcontact_groups $contact_grp_name" >> $NagiosIloCfgFile
|
|
fi
|
|
echo -e "\tregister 0" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
}
|
|
|
|
# $1: IP address
|
|
function write_nagios_host_section() {
|
|
echo -e "define host {" >> $NagiosIloCfgFile
|
|
echo -e "\thost_name ${IloXmlTag[0]}" >> $NagiosIloCfgFile
|
|
echo -e "\taddress $1" >> $NagiosIloCfgFile
|
|
echo -e "\t_UUID ${IloXmlTag[2]}" >> $NagiosIloCfgFile
|
|
echo -e "\t_iLO_SNMP_community $2" >> $NagiosIloCfgFile
|
|
echo -e "\tuse generic-iLO-host" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
}
|
|
|
|
#write command line format
|
|
function write_nagios_command_section() {
|
|
echo -e "define command {" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_name $NagiosHpiloEngine" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_line $NagiosLibexec/$NagiosHpiloEngine -H \$HOSTADDRESS\$ -C \$_HOSTILO_SNMP_COMMUNITY\$ -o \$ARG1\$" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
|
|
echo -e "define command {" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_name check-iLO-host-alive" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_line $NagiosLibexec/$NagiosHpiloEngine -H \$HOSTADDRESS\$ -C \$_HOSTILO_SNMP_COMMUNITY\$ -o 11" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
|
|
echo -e "define command {" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_name $NagiosHpHltStatusHnd" >> $NagiosIloCfgFile
|
|
echo -e "\tcommand_line $NagiosLibexec/$NagiosHpTrapCmd -A -H \$HOSTADDRESS\$ -C \$_HOSTILO_SNMP_COMMUNITY\$ -o \$ARG1\$" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
|
|
}
|
|
|
|
#write generic services to ilo config file
|
|
function write_nagios_genric_service_section ()
|
|
{
|
|
echo -e "define service {" >> $NagiosIloCfgFile
|
|
echo -e "\tname generic-iLO-service" >> $NagiosIloCfgFile
|
|
echo -e "\tuse generic-service" >> $NagiosIloCfgFile
|
|
echo -e "\tpassive_checks_enabled 1" >> $NagiosIloCfgFile
|
|
echo -e "\tactive_checks_enabled 1" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_interval $CheckInterval" >> $NagiosIloCfgFile
|
|
echo -e "\tregister 0" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
|
|
echo -e "define service {" >> $NagiosIloCfgFile
|
|
echo -e "\tname generic-iLO-Passive-service" >> $NagiosIloCfgFile
|
|
echo -e "\tuse generic-service" >> $NagiosIloCfgFile
|
|
echo -e "\tpassive_checks_enabled 1" >> $NagiosIloCfgFile
|
|
echo -e "\tactive_checks_enabled 1" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_period 24x7" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_interval 2880" >> $NagiosIloCfgFile
|
|
echo -e "\tnormal_check_interval 2880" >> $NagiosIloCfgFile
|
|
echo -e "\tcheck_freshness 1" >> $NagiosIloCfgFile
|
|
echo -e "\tfreshness_threshold 10800" >> $NagiosIloCfgFile
|
|
echo -e "\tregister 0" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
}
|
|
# $1: host group
|
|
function write_nagios_services_section() {
|
|
local idx=0
|
|
|
|
for((idx=0;idx<${#HpiloServices[@]};idx++)); do
|
|
echo -e "define service {" >> $NagiosIloCfgFile
|
|
if [ $idx != 0 ]; then
|
|
echo -e "\tuse generic-iLO-Passive-service" >> $NagiosIloCfgFile
|
|
else
|
|
echo -e "\tuse generic-iLO-service" >> $NagiosIloCfgFile
|
|
fi
|
|
echo -e "\thostgroup_name $1" >> $NagiosIloCfgFile
|
|
echo -e "\tservice_description ${HpiloServices[$idx]}" >> $NagiosIloCfgFile
|
|
|
|
case "$idx" in
|
|
1)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx+1))" >> $NagiosIloCfgFile
|
|
;;
|
|
2)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx+3))" >> $NagiosIloCfgFile
|
|
;;
|
|
3)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx+4))" >> $NagiosIloCfgFile
|
|
;;
|
|
4)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx-3))" >> $NagiosIloCfgFile
|
|
;;
|
|
5)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx+1))" >> $NagiosIloCfgFile
|
|
;;
|
|
6)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx-2))" >> $NagiosIloCfgFile
|
|
;;
|
|
7)
|
|
echo -e "\taction_url http://\$_HOSTNAGIOSIP$/$NagiosService/hpeilo/nagios_hpeilo_service_details.php?ip=\$HOSTADDRESS$&comm=\$_HOSTILO_SNMP_COMMUNITY$&id=$(($idx-4))" >> $NagiosIloCfgFile
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
echo -e "\tcheck_command $NagiosHpHltStatusHnd!$(($idx+1))" >> $NagiosIloCfgFile
|
|
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
done
|
|
}
|
|
|
|
# $1: Host group
|
|
function write_nagios_hostgroup_section() {
|
|
echo -e "define hostgroup {" >> $NagiosIloCfgFile
|
|
echo -e "\thostgroup_name\t$1" >> $NagiosIloCfgFile
|
|
echo -e "\tmembers ${IloXmlTag[0]}" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
}
|
|
|
|
# $1: Service Group
|
|
function write_nagios_servicegroup_section () {
|
|
|
|
for((idx=0;idx<${#HpiloServices[@]};idx++)); do
|
|
echo -e "define servicegroup {" >> $NagiosIloCfgFile
|
|
echo -e "\t$1\t${HpiloServices[$idx]}" >> $NagiosIloCfgFile
|
|
echo -e "\tmembers \t${IloXmlTag[0]},${HpiloServices[$idx]}" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
done
|
|
}
|
|
|
|
function write_nagios_contact_section() {
|
|
for((idx=0;idx<${#contact_name[@]};idx++)); do
|
|
echo -e "define contact {" >> $NagiosIloCfgFile
|
|
echo -e "\tcontact_name\t${contact_name[$idx]}" >> $NagiosIloCfgFile
|
|
echo -e "\talias\t${contact_alias[$idx]}" >> $NagiosIloCfgFile
|
|
echo -e "\temail\t${contact_mail_id[$idx]}" >> $NagiosIloCfgFile
|
|
echo -e "\tuse generic-contact" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
done
|
|
}
|
|
|
|
function write_nagios_contact_group_section() {
|
|
echo -e "define contactgroup {" >> $NagiosIloCfgFile
|
|
echo -e "\tcontactgroup_name $contact_grp_name" >> $NagiosIloCfgFile
|
|
echo -e "\talias $contact_grp_alias" >> $NagiosIloCfgFile
|
|
for((idx=0;idx<${#contact_name[@]};idx++)); do
|
|
if [ "$idx" -eq "0" ]; then
|
|
memberContacts=${contact_name[$idx]}
|
|
else
|
|
memberContacts="$memberContacts,${contact_name[$idx]}"
|
|
fi
|
|
done
|
|
echo -e "\tmembers $memberContacts" >> $NagiosIloCfgFile
|
|
echo -e "}\n" >> $NagiosIloCfgFile
|
|
}
|
|
|
|
|
|
# $1: IP address
|
|
function check_ilo_device() {
|
|
local has_IP_configured=
|
|
local has_UUID=
|
|
local UUID_str=
|
|
|
|
|
|
get_xml_content $1
|
|
|
|
# Check if the device is BMC (HPE iLO)
|
|
if [[ ${IloXmlTag[1]} != *iLO* ]]; then
|
|
write_log "The host '$1' is not a HPE iLO device"
|
|
return 1
|
|
fi
|
|
|
|
if [[ ${IloXmlTag[0]} != *ProLiant* ]]; then
|
|
write_log "The host '$1' is not a HPE ProLiant server"
|
|
return 1
|
|
fi
|
|
# Check if device is Gen8 and above
|
|
if [[ ${IloXmlTag[0]} != *Gen* ]]; then
|
|
write_log "The host '$1' is not supported server"
|
|
return 1
|
|
fi
|
|
|
|
write_log "The product string of the IP '$1' is '${IloXmlTag[0]}'."
|
|
|
|
write_log "Nagios config file $NagiosIloCfgFile"
|
|
has_IP_configured=$(search_string $NagiosIloCfgFile "$1")
|
|
|
|
UUID_str=${IloXmlTag[2]}
|
|
if [ "$UUID_str" != "000" ]; then
|
|
has_UUID=$(search_string $NagiosIloCfgFile "$UUID_str")
|
|
if [ "x$has_UUID" != "x" ]; then
|
|
ip_line=`grep -n -B 1 "$has_UUID" $NagiosIloCfgFile | grep "address" | head -n 1`
|
|
s_ip=`echo $ip_line |awk -F ' ' '{print $3}'`
|
|
if [ "$1" = "$s_ip" ]; then
|
|
write_log "The IP '$1' has been configured"
|
|
return 1
|
|
else
|
|
#update the new IP address
|
|
write_log "The IP $1 has changed to IP $s_ip"
|
|
ip_line=`echo $ip_line |awk -F '-' '{print $1}'`
|
|
sed -i "${ip_line}s/$s_ip/$1/" $NagiosIloCfgFile
|
|
return 1
|
|
fi
|
|
|
|
fi
|
|
elif [ "x${has_IP_configured}" != "x" ]; then
|
|
write_log "The IP '$1' has been configured"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# $1: IP address
|
|
function write_nagios_cfg_file() {
|
|
local found_host_group="False"
|
|
local dup_prefix_hostname=
|
|
local host_group=
|
|
local s_line= # start line
|
|
local services_configured=
|
|
local command_configured=
|
|
local num_srvs_exist=
|
|
local idx=0
|
|
|
|
# Semaphore
|
|
lockfileCMD=`which lockfile 2>/dev/null`
|
|
|
|
if [ $? -eq 0 ]; then
|
|
$lockfileCMD $LockFile
|
|
|
|
if [ $? -ne 0 ]; then
|
|
write_log "ERROR: Can not get the semaphore file (lock file)"
|
|
fi
|
|
fi
|
|
|
|
|
|
# Find the number of existed servers in NagiosIloCfgFile
|
|
num_srvs_exist=`echo -e "$(search_string $NagiosIloCfgFile "${IloXmlTag[0]}")" | grep "host_name" | wc -l `
|
|
|
|
IloXmlTag[0]=${IloXmlTag[0]}-$(($num_srvs_exist+1))
|
|
|
|
|
|
# Read the configured host groups from the configuration file
|
|
#if [ "x${HostGroupCfgFile}" != "x" ]; then
|
|
# if [ -f $HostGroupCfgFile ] && [ ${#HostGroup[@]} -eq 0 ]; then
|
|
# read_host_group
|
|
# echo "Read file"
|
|
|
|
# fi
|
|
#fi
|
|
|
|
for((idx=0;idx<${#HostGroup[@]};idx++)); do
|
|
#found_host_group=$(is_host_in_ip_range $1 "${IPAddrGroup[$idx]}")
|
|
found_host_group=$(is_host_in_ip_range $1 "${HostGroupIPAddr[$idx]}")
|
|
if [ "$found_host_group" = "True" ]; then
|
|
break;
|
|
fi
|
|
done
|
|
|
|
if [ "$found_host_group" = "True" ]; then
|
|
host_group=${HostGroup[$idx]}
|
|
host_read_community=${HostGroup_ReadCommStr[$idx]}
|
|
host_community_str=${HostGroupCommunityStr[$idx]}
|
|
else
|
|
host_group=$HpiloHostgroup
|
|
host_read_community=$HpiloSnmpComm
|
|
fi
|
|
|
|
write_log "The server '${IloXmlTag[0]}' with IP address '$1' is added"
|
|
if [ "x$(cat $NagiosIloCfgFile | grep -w "name generic-iLO-host")" = "x" ]; then
|
|
write_nagios_generic_host_section
|
|
write_nagios_genric_service_section
|
|
fi
|
|
write_nagios_host_section $1 $host_read_community
|
|
|
|
if [ "x$(cat $NagiosIloCfgFile | grep "$host_group")" = "x" ]; then
|
|
# The specific host group is not created yet.
|
|
# Just create a new one.
|
|
write_nagios_hostgroup_section "$host_group"
|
|
else
|
|
# Find the starting line number for the specific host group
|
|
s_line=`grep -n -B 1 "$host_group" $NagiosIloCfgFile | grep "define hostgroup" | head -n 1 | awk -F '-' '{print $1}'`
|
|
|
|
s_line=$(($s_line+2))
|
|
|
|
# append string
|
|
sed -i "$s_line s/\$/, ${IloXmlTag[0]}/" $NagiosIloCfgFile
|
|
fi
|
|
|
|
#Find the specific service group
|
|
if [ "x$(cat $NagiosIloCfgFile | grep "$HpiloServiceGroup")" = "x" ]; then
|
|
#The specific service group is not created yet.
|
|
write_nagios_servicegroup_section "$HpiloServiceGroup"
|
|
else
|
|
#Add host to specific service group
|
|
|
|
for((id=0;id<${#HpiloServices[@]};id++)); do
|
|
s_line=`grep -n "servicegroup_name" $NagiosIloCfgFile | grep "${HpiloServices[$id]}" | head -n 1 | awk -F ':' '{print $1}'`
|
|
s_line=$(($s_line+1))
|
|
sed -i "$s_line s/\$/, ${IloXmlTag[0]},${HpiloServices[$id]}/" $NagiosIloCfgFile
|
|
done
|
|
fi
|
|
|
|
services_configured=`grep -c -w "service_description" $NagiosIloCfgFile`
|
|
if [ $services_configured -ne 8 ]; then
|
|
write_nagios_services_section "$host_group"
|
|
else
|
|
local ishost_group_exist=""
|
|
for((idx=0;idx<${#HpiloServices[@]};idx++)); do
|
|
s_line=`grep -n "service_description *${HpiloServices[$idx]}" $NagiosIloCfgFile | head -n 1 | awk -F ':' '{print $1}'`
|
|
s_line=$(($s_line-1))
|
|
ishost_group_exist=`grep -B 1 "service_description *${HpiloServices[$idx]}" $NagiosIloCfgFile | grep $host_group|wc -l`
|
|
if [ $ishost_group_exist -eq 0 ]; then
|
|
sed -i "$s_line s/\$/, $host_group/" $NagiosIloCfgFile
|
|
fi
|
|
done
|
|
|
|
fi
|
|
|
|
command_configured=$(search_string $NagiosIloCfgFile "command_name")
|
|
|
|
if [ "x${command_configured}" = "x" ]; then
|
|
write_nagios_command_section
|
|
fi
|
|
|
|
contact_configured=$(search_string $NagiosIloCfgFile "contact_name")
|
|
|
|
if [ "x${contact_configured}" = "x" ]; then
|
|
if [ "x${contact_name}" != "x" ]; then
|
|
write_nagios_contact_section
|
|
fi
|
|
fi
|
|
|
|
contactgrp_configured=$(search_string $NagiosIloCfgFile "contactgroup_name")
|
|
|
|
if [ "x${contactgrp_configured}" = "x" ]; then
|
|
if [ "x${contact_grp_name}" != "x" ]; then
|
|
write_nagios_contact_group_section
|
|
fi
|
|
fi
|
|
|
|
rm -f $LockFile
|
|
}
|
|
|
|
#$1: mode number
|
|
function check_mode() {
|
|
local flag=0
|
|
local idx=0
|
|
|
|
# Check if the mode is valid
|
|
for((idx=0;idx<${#DiscModes[@]};idx++)); do
|
|
|
|
# The valid mode ?
|
|
if [ "$1" = "${DiscModes[$idx]}" ]; then
|
|
flag=1
|
|
break
|
|
fi
|
|
|
|
done
|
|
|
|
if [ $flag -eq 0 ] ; then
|
|
echo -ne "Error: The mode number should be "
|
|
|
|
for((idx=0;idx<${#DiscModes[@]};idx++)); do
|
|
echo -ne "${DiscModes[$idx]} "
|
|
done
|
|
|
|
echo -ne "\n"
|
|
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# $1: IP address of the network interface
|
|
# $2: Network mask of the network interface or second ip address in case of ip range formate
|
|
# $3: type of address formate , x.x.x.x or x.x.x.x/yy or x.x.x.x-y.y.y.y
|
|
function get_formatted_addr_range() {
|
|
local addr=
|
|
local mask=
|
|
local addr_head=
|
|
local addr_tail=
|
|
local addr_range=
|
|
local idx=0
|
|
case $3 in
|
|
0)
|
|
for((idx=0;idx<${IPV4AddrEntries};idx++)); do
|
|
# Retrieve each entry of IP address.
|
|
# For example:
|
|
# IP Address is A.B.C.D -> Get A, B, C and D
|
|
addr=`echo $1 | cut -d '.' -f $(($idx+1))`
|
|
mask=`echo $2 | cut -d '.' -f $(($idx+1))`
|
|
|
|
# Caculate the IP address range
|
|
addr_head=$(($addr & $mask))
|
|
addr_tail=$(($addr_head + 255 - $mask))
|
|
|
|
# Convert to the range format
|
|
addr_range[$idx]=`echo $addr_head..$addr_tail`
|
|
done
|
|
ranges[$g_range_idx]=`echo "{${addr_range[0]}}.{${addr_range[1]}}.{${addr_range[2]}}.{${addr_range[3]}}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
;;
|
|
|
|
1)
|
|
local OIFS=$IFS
|
|
IFS='.'
|
|
ip1=($1)
|
|
ip2=($2)
|
|
IFS=$OIFS
|
|
for((idx=0;idx<${IPV4AddrEntries};idx++)); do
|
|
octet[$idx]=`echo "{${ip1[$idx]}..${ip2[$idx]}}"`
|
|
done
|
|
octet3[0]=${ip1[3]}
|
|
octet3[1]=${ip2[3]}
|
|
|
|
for f in $(eval echo ${octet[0]}); do
|
|
for s in $(eval echo ${octet[1]}); do
|
|
for t in $(eval echo ${octet[2]}); do
|
|
for i in ${octet3[@]}; do
|
|
if [ ${ip1[2]} -eq $t ] && [ ${ip2[2]} -eq $t ]; then
|
|
ranges[$g_range_idx]=`echo "{$f..$f}.{$s..$s}.{$t..$t}.{${ip1[3]}-${ip2[3]}}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
break;
|
|
elif [ ${ip1[2]} -eq $t ] && [ ${ip1[3]} -eq $i ]; then
|
|
ranges[$g_range_idx]=`echo "{$f..$f}.{$s..$s}.{$t..$t}.{$i-255}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
elif [ ${ip2[2]} -eq $t ] && [ ${ip2[3]} -eq $i ]; then
|
|
ranges[$g_range_idx]=`echo "{$f..$f}.{$s..$s}.{$t..$t}.{0-$i}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
elif [ ${ip2[2]} -ne $t ] && [ ${ip1[2]} -ne $t ]; then
|
|
ranges[$g_range_idx]=`echo "{$f..$f}.{$s..$s}.{$t..$t}.{0-255}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
fi
|
|
done
|
|
done
|
|
done
|
|
done
|
|
;;
|
|
|
|
2)
|
|
local OIFS=$IFS
|
|
IFS='.'
|
|
ip1=($1)
|
|
ip2=($2)
|
|
IFS=$OIFS
|
|
for((idx=0;idx<${IPV4AddrEntries};idx++)); do
|
|
if [ $idx -eq 3 ]; then
|
|
addr_range[$idx]=`echo ${ip1[$idx]}-${ip2[$idx]}`
|
|
else
|
|
addr_range[$idx]=`echo ${ip1[$idx]}..${ip2[$idx]}`
|
|
fi
|
|
|
|
done
|
|
ranges[$g_range_idx]=`echo "{${addr_range[0]}}.{${addr_range[1]}}.{${addr_range[2]}}.{${addr_range[3]}}"`
|
|
g_range_idx=$(($g_range_idx+1))
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
}
|
|
|
|
# $1: IP address range.
|
|
# The parameter "$1" should be {16..16}.{153..153}.{112..113}.{0..255}
|
|
# The output will be 16.135.112.0-16.153.113.255
|
|
function get_readable_addr_range() {
|
|
local entries=0
|
|
local head=
|
|
local tail=
|
|
local idx=
|
|
local addr=("$@")
|
|
local rangeToDis=`echo ${addr[@]} | sed 's/\-/../g'`
|
|
for i in ${rangeToDis[@]}; do
|
|
local IFS="{}"
|
|
for idx in $i; do
|
|
|
|
# Check if the substring is something like this: x..y
|
|
echo $idx | grep '\.\.' > /dev/null
|
|
|
|
# Yes, the substring contains x..y.
|
|
if [ $? -eq 0 ]; then
|
|
# Get the range field. For example, 16..16, 153..153,
|
|
#112..113, and 0..255
|
|
head[$entries]=`echo $idx | awk -F '\\\.\\\.' '{print $1}'`
|
|
tail[$entries]=`echo $idx | awk -F '\\\.\\\.' '{print $2}'`
|
|
|
|
entries=$(($entries+1))
|
|
fi
|
|
done
|
|
|
|
IFS="."
|
|
#echo "${head[*]}-${tail[*]}"
|
|
printf "%s-%s " "${head[*]}" "${tail[*]}"
|
|
entries=0
|
|
done
|
|
}
|
|
|
|
# $1: The network interface
|
|
function check_net_interface() {
|
|
|
|
local temp=("$@")
|
|
local flag="false"
|
|
local entries=
|
|
local NetAddr=
|
|
local NetMask=
|
|
if [ "x$1" = "x" ]; then
|
|
echo "ERROR: You need to specify the network interface when the active mode is enabled"
|
|
exit 1
|
|
fi
|
|
|
|
for i in ${temp[@]}; do
|
|
|
|
`/sbin/ifconfig $i > /dev/null 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
echo "Please make sure the network interface '$i' is availabe in your host"
|
|
#continue
|
|
exit 1
|
|
fi
|
|
|
|
NetAddr=`ifconfig $i | grep "inet addr" | cut -d ':' -f2 | cut -d ' ' -f1`
|
|
|
|
if [ "x${NetAddr}" != "x" ]; then
|
|
NetMask=`ifconfig $i | grep "Mask" | cut -d ':' -f4`
|
|
else
|
|
echo "Please make sure the network interface '$i' is configured with a valid IP address"
|
|
#continue
|
|
exit 1
|
|
fi
|
|
|
|
|
|
if [ "x${NetMask}" = "x" ]; then
|
|
echo "Please make sure the network interface '$i' is configured with a valid IP address"
|
|
#continue
|
|
exit 1
|
|
fi
|
|
entries=${#IfNetAddr[@]}
|
|
IfNetAddr[$entries]=$NetAddr
|
|
IfNetMask[$entries]=$NetMask
|
|
flag="true"
|
|
#write_log "The network interface '$1' has the IP address '$IfNetAddr' and the netmask '$IfNetMask'"
|
|
echo "The network interface '$i' has the IP address '${IfNetAddr[$entries]}' and the netmask '${IfNetMask[$entries]}'"
|
|
done
|
|
}
|
|
#getIP_from_Subnet
|
|
#$1 -- IP address 192.10.10.2
|
|
#$2 -- subnet mask 255.255.255.128
|
|
#out -- 192.10.10.127
|
|
function getIP_from_Subnet ()
|
|
{
|
|
IFS=. read -r n1 n2 n3 n4 <<< "255.255.255.255"
|
|
IFS=. read -r i1 i2 i3 i4 <<< "$1"
|
|
IFS=. read -r m1 m2 m3 m4 <<< "$2"
|
|
printf "%d.%d.%d.%d\n" "$(( ( n1 ^ m1 ) ^ i1 ))" "$(( ( n2 ^ m2 ) ^ i2 ))" "$(( ( n3 ^ m3 ) ^ i3 ))" "$(( ( n4 ^ m4 ) ^ i4 ))"
|
|
}
|
|
|
|
#subnetmask
|
|
#Ex: 255.255.255.0 or 255.255.0.0
|
|
function getSubnetMask()
|
|
{
|
|
local i
|
|
local subnetmask=""
|
|
local full_octets=$(($1/8))
|
|
local partial_octet=$(($1%8))
|
|
for ((i=0;i<4;i+=1)); do
|
|
if [ $i -lt $full_octets ]; then
|
|
subnetmask+=255
|
|
elif [ $i -eq $full_octets ]; then
|
|
subnetmask+=$((256 - 2**(8-$partial_octet)))
|
|
else
|
|
subnetmask+=0
|
|
fi
|
|
[ $i -lt 3 ] && subnetmask+=.
|
|
done
|
|
|
|
echo $subnetmask
|
|
}
|
|
|
|
#Discover subnetwork IP ranges
|
|
function scan_network() {
|
|
local num_hosts=0
|
|
local num_hosts_alive=0
|
|
local num_hosts_scan=0
|
|
num_host_added=0
|
|
local ranges=
|
|
local subnet_ranges=
|
|
local ip_address=
|
|
|
|
g_range_idx=
|
|
# The expected range is like this:
|
|
# {16..16}.{153..153}.{112..113}.{0..255}
|
|
g_range_idx=0
|
|
if [ $useNetInterface -eq 1 ]; then
|
|
for((idx=0;idx<${#IfNetAddr[@]};idx++)); do
|
|
get_formatted_addr_range ${IfNetAddr[$idx]} ${IfNetMask[$idx]} 0
|
|
done
|
|
else
|
|
#use configured group ip
|
|
for((idx=0;idx<${#HostGroupIPAddr[@]};idx++)); do
|
|
local ipAddr1=`echo ${HostGroupIPAddr[$idx]} | awk -F '/' '{print $1}'`
|
|
local subnet_mask_bits=`echo ${HostGroupIPAddr[$idx]} | awk -F '/' '{print $2}'`
|
|
local ipAddr2=`echo ${HostGroupIPAddr[$idx]} | awk -F '-' '{print $2}'`
|
|
if [ "x${subnet_mask_bits}" != "x" ];then
|
|
local netMask=$(getSubnetMask $subnet_mask_bits)
|
|
if [ $subnet_mask_bits -le 24 ]; then
|
|
get_formatted_addr_range $ipAddr1 $netMask 0
|
|
else
|
|
ipAddr2=$(getIP_from_Subnet $ipAddr1 $netMask)
|
|
if [ $subnet_mask_bits -eq 31 ] ; then
|
|
get_formatted_addr_range $ipAddr1 $ipAddr1 1
|
|
else
|
|
get_formatted_addr_range $ipAddr1 $ipAddr2 1
|
|
fi
|
|
fi
|
|
elif [ "x${ipAddr2}" != "x" ];then
|
|
ipAddr1=`echo ${HostGroupIPAddr[$idx]} | awk -F '-' '{print $1}'`
|
|
get_formatted_addr_range $ipAddr1 $ipAddr2 1
|
|
else
|
|
get_formatted_addr_range $ipAddr1 $ipAddr1 2
|
|
fi
|
|
done
|
|
fi
|
|
|
|
#sort and remove duplicate elements
|
|
ranges=($(printf "%s\n" "${ranges[@]}" | sort -u));
|
|
# Get the Class C network address in order to save time during
|
|
# searching the reachable SNMP servers via the command 'nmap'.
|
|
# The expected range is like this:
|
|
# {16..16}.{153..153}.{112..113}.{0..0}
|
|
for((idx=0;idx<${#ranges[@]};idx++)); do
|
|
subnet_ranges="$subnet_ranges `echo ${ranges[$idx]} | sed -e 's/\..255\}\s*$/..0\}/g'`"
|
|
done
|
|
# Calcluate the number of hosts in this subnet.
|
|
local rangeTocalc=`echo ${ranges[@]} | sed 's/\-/../g'`
|
|
for ip_address in $(eval echo $rangeTocalc);do
|
|
num_hosts=$(($num_hosts+1))
|
|
done
|
|
|
|
echo -e "Scan the network range: $(get_readable_addr_range ${ranges[@]}) with the total hosts '$num_hosts'"
|
|
# Update process: 0%
|
|
#update_active_disc_progress "$num_hosts_scan" "$num_hosts"
|
|
# Get available SNMP-aware servers
|
|
for subnet in $(eval echo $subnet_ranges);do
|
|
|
|
#############################################################
|
|
# In order to save a number of time to find the
|
|
# reachable SNMP-aware servers, the Class C network (256 hosts)
|
|
# is used to perform the 'nmap' utility even though the
|
|
# scanned is under Class A/B network.
|
|
#
|
|
# For example:
|
|
# Network address: 172.16.0.0 netmask: 255.255.0.0.
|
|
# The process searches the network address like this:
|
|
# 172.16.0.0/24
|
|
# 172.16.1.0/24
|
|
# 172.16.2.0/24
|
|
# .............
|
|
# .............
|
|
# 172.16.255.0/24
|
|
#############################################################
|
|
if [ "x$(echo $subnet | grep -)" != "x" ]; then
|
|
subnet=`echo "$subnet" | sed 's/{//g'| sed 's/}//g'`
|
|
else
|
|
subnet=`echo $subnet/24`
|
|
fi
|
|
write_log "Search online hosts from network $subnet"
|
|
# echo "Search online hosts from network $subnet"
|
|
update_active_disc_progress "$num_hosts_scan" "$num_hosts"
|
|
# Search hosts under the specific network
|
|
$NmapBin -sU -p $SnmpPort $subnet > $NmapLogFile 2>/dev/null
|
|
|
|
# Get the number of online hosts
|
|
num_hosts_alive=`grep "hosts\? up" $NmapLogFile | cut -d '(' -f2 | cut -d ')' -f1 | cut -d ' ' -f1`
|
|
num_hosts_scan=`grep "Nmap done" $NmapLogFile | cut -d ' ' -f 3`
|
|
parse_nmap_report $(($num_hosts_scan-$num_hosts_alive)) $num_hosts
|
|
|
|
done
|
|
echo -e "\nTotal hosts '$num_host_added' added of '$num_hosts' hosts"
|
|
# Remove nmap log file
|
|
rm -f $NmapLogFile
|
|
}
|
|
|
|
#nagios config file path
|
|
function get_nagios_cfg_path() {
|
|
local nagios_cfg=
|
|
|
|
# The format might be like:
|
|
# 1) NagiosIloCfgFile=${prefix}/etc/nagios.cfg
|
|
# 2) NAGIOSCFG="/etc/nagios3/nagios.cfg"
|
|
nagios_cfg=`grep -E "=.*etc.*nagios.cfg" /etc/init.d/nagios* | \
|
|
cut -d '=' -f 2`
|
|
|
|
# trim double quotes
|
|
nagios_cfg=`echo $nagios_cfg | tr -d '"'`
|
|
|
|
if [[ $nagios_cfg = *prefix* ]]; then
|
|
# The /etc/init.d/nagios* has the format like this:
|
|
# NagiosIloCfgFile=${prefix}/etc/nagios.cfg
|
|
# So, we need to replace ${prefix} with the actual value
|
|
|
|
# Find the nagios prefix path
|
|
local nagios_prefix=`grep -i "^prefix=" /etc/init.d/nagios* | \
|
|
cut -d '=' -f 2`
|
|
|
|
# ${prefix}/etc/nagios.cfg -> will be etc/nagios.cfg
|
|
local nagios_suffix=`echo $nagios_cfg | cut -d '/' -f 2-`
|
|
|
|
nagios_cfg="${nagios_prefix}/$nagios_suffix"
|
|
nagios_cfg=`echo $nagios_cfg | sed -r 's/\/\//\//g'`
|
|
write_log "nagios_cfg : ${nagios_prefix}/$nagios_suffix"
|
|
|
|
fi
|
|
|
|
local nagios_path=`dirname $nagios_cfg`
|
|
|
|
#check hpeilo folder in nagios installation directory
|
|
if [ -d "$NAGIOS_ILO_PLUGINS_PATH/hpeilo" ]; then
|
|
#move hepilo folder to nagios share directory
|
|
update_nagios_url_path $nagios_path
|
|
fi
|
|
|
|
local nagios_cfg_dir=`grep "^cfg_dir=$nagios_path" $nagios_cfg | \
|
|
tail -n 1 | cut -d '=' -f 2`
|
|
write_log "nagios_cfg_dir : $nagios_cfg_dir"
|
|
# No iLO configuration for the cfg_dir statement? -> Add a new one
|
|
if [[ "x${nagios_cfg_dir}" = "x" ]] || [[ "${nagios_path}/ilo" != "${nagios_cfg_dir}" ]]; then
|
|
# create a folder if the folder does not exist.
|
|
[ -d $nagios_path/ilo ] || mkdir $nagios_path/ilo
|
|
|
|
local line_number=`grep -n "^#cfg_dir=" \
|
|
$nagios_cfg | tail -n 1 | cut -d ':' -f 1`
|
|
#If line number is empty, append the cfg_dir ilo path to EOF.
|
|
if [ "x${line_number}" = "x" ]; then
|
|
line_number=`wc -l $nagios_cfg | cut -d ' ' -f1`
|
|
fi
|
|
|
|
# append a cfg_dir statement
|
|
sed -e "$line_number a cfg_dir=$nagios_path/ilo" $nagios_cfg \
|
|
> $TmpFile
|
|
nagios_cfg_dir="$nagios_path/ilo"
|
|
mv $TmpFile $nagios_cfg
|
|
|
|
fi
|
|
NagiosIloCfgFile="$nagios_path/ilo/ilo.cfg"
|
|
write_log "NagiosIloCfgFile : $NagiosIloCfgFile"
|
|
#if file not exist ,create one and add generic templates.
|
|
if [ ! -f $NagiosIloCfgFile ]; then
|
|
touch $NagiosIloCfgFile
|
|
else
|
|
#if "overwrite flag" is set then move ilo.cfg file
|
|
#to "backup" directory with date appended to it.
|
|
if [ "$overwri_ilocfg" = "1" ]; then
|
|
local iLO_cfg_path=`dirname $NagiosIloCfgFile`
|
|
local iLO_cfg_backup_dir=".backup"
|
|
# create a folder inside the ilo directory for back up of config files.
|
|
if [ ! -d $iLO_cfg_path/$iLO_cfg_backup_dir ]; then
|
|
mkdir $iLO_cfg_path/$iLO_cfg_backup_dir
|
|
#echo "$iLO_cfg_path/$iLO_cfg_backup_dir directory created"
|
|
fi
|
|
if [ -f $NagiosIloCfgFile ]; then
|
|
now=$(date +"%Y-%m-%d-%S") #year-month-day-seconds
|
|
filename=$now-ilo.cfg #2015-01-23-10-ilo.cfg
|
|
mv $NagiosIloCfgFile $iLO_cfg_path/$iLO_cfg_backup_dir/$filename
|
|
fi
|
|
touch $NagiosIloCfgFile
|
|
fi
|
|
fi
|
|
|
|
# Get the name of the nagios service: nagios or nagios3
|
|
NagiosService=`find /etc/init.d/ -name "nagios*" | xargs basename`
|
|
}
|
|
|
|
function update_nagios_url_path() {
|
|
local nagios_share=
|
|
|
|
if [ -f "$1/cgi.cfg" ]; then
|
|
nagios_share=`cat $1/cgi.cfg | grep -i "physical_html_path=" | cut -d '=' -f 2`
|
|
if [ -d "$nagios_share/hpeilo" ]; then
|
|
`rm -rf $nagios_share/hpeilo`
|
|
fi
|
|
`cp $NAGIOS_ILO_PLUGINS_PATH/hpeilo $nagios_share -rf`
|
|
fi
|
|
}
|
|
|
|
# Start here
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "Please run this script with the root user"
|
|
exit 1
|
|
fi
|
|
|
|
# No argument
|
|
if [ $# -eq 0 ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# verbose mode: write the log to the variable HpiloLogFile
|
|
VerboseMode=0
|
|
|
|
# parse the arguments
|
|
while [ "x$1" != "x" ]; do
|
|
option=$1
|
|
|
|
case $option in
|
|
-m)
|
|
|
|
# Get the mode
|
|
shift
|
|
|
|
mode=$1
|
|
;;
|
|
|
|
-i)
|
|
# Get the name of the network interface
|
|
cfg_interface=1
|
|
shift
|
|
|
|
# Check if the name of the network interface is
|
|
# vaild.
|
|
if [ "x$1" = "x" ] ; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
IfName[0]=$1
|
|
;;
|
|
|
|
-s)
|
|
# Get the host group configure file
|
|
cfg_file=1
|
|
shift
|
|
|
|
# Check if the host group configuration file is
|
|
# vaild.
|
|
if [ "x$1" = "x" ] ; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
HostGroupCfgFile=`/bin/readlink -f $1`
|
|
;;
|
|
|
|
-o)
|
|
#Overwrite the discovered hosts/services ilo configuration file
|
|
overwri_ilocfg=1
|
|
;;
|
|
|
|
-h | --help)
|
|
usage
|
|
print_help
|
|
exit 1
|
|
;;
|
|
-v)
|
|
# enable verbose mode
|
|
VerboseMode=1
|
|
;;
|
|
*)
|
|
echo "ERROR: unknown option $option"
|
|
usage
|
|
exit 1
|
|
;;
|
|
|
|
esac
|
|
shift
|
|
done
|
|
|
|
#Discover up and running servers.
|
|
ActiveDiscMode()
|
|
{
|
|
NumHostsProcessed=0
|
|
useNetInterface=0
|
|
|
|
NmapBin=`which nmap 2>/dev/null`
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "[Error]: Cannot find nmap utility. You need to install nmap with the version >= $NmapMinVersion"
|
|
exit 1
|
|
fi
|
|
|
|
CurlBin=`which curl 2>/dev/null`
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "[Error]: Cannot find curl utility. You need to install curl"
|
|
exit 1
|
|
fi
|
|
check_nmap_version "$NmapBin"
|
|
if [ ${#IfName[@]} -ne 0 ]; then
|
|
useNetInterface=1
|
|
check_net_interface ${IfName[@]}
|
|
elif [ "x${HostGroupCfgFile}" = "x" ]; then
|
|
usage
|
|
fi
|
|
|
|
scan_network
|
|
|
|
|
|
|
|
}
|
|
|
|
#remove lock file if exist
|
|
#fix QXCR1001454803 -- [NIAP] nagios daemon start error since redundant host find can't be configured
|
|
#rm -f $LockFile
|
|
|
|
# Check the discovery mode
|
|
check_mode $mode
|
|
|
|
#nagios config path
|
|
get_nagios_cfg_path
|
|
|
|
# Read the configured host groups from the configuration file
|
|
if [ "x${HostGroupCfgFile}" != "x" ]; then
|
|
if [ -f $HostGroupCfgFile ]; then
|
|
read_config_file
|
|
else
|
|
echo "ERROR: Configuration file '$HostGroupCfgFile' not exist."
|
|
exit 1
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
case $mode in
|
|
$ActiveDisc)
|
|
if ([ $cfg_file -eq 1 ] || [ $cfg_interface -eq 1 ]) && [ $mode -eq 1 ]; then
|
|
ActiveDiscMode
|
|
echo
|
|
else
|
|
usage
|
|
exit 1
|
|
fi
|
|
;;
|
|
$PassiveDisc)
|
|
|
|
read IloIP
|
|
read protocol
|
|
|
|
# Get the IP from the protocol info if the IloIP variable
|
|
# is <UNKNOWN>.
|
|
# Example for the protocol variable:
|
|
# UDP: [16.153.112.187]:58240->[16.153.113.255]
|
|
IloIP=`echo $protocol | cut -d '[' -f 2 | cut -d ']' -f 1`
|
|
|
|
check_ilo_device $IloIP
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
write_nagios_cfg_file $IloIP
|
|
|
|
# reload nagios configuration files
|
|
`service $NagiosService reload > /dev/null`
|
|
fi
|
|
exit 0
|
|
|
|
;;
|
|
$ConfigDisc)
|
|
if [ $cfg_file -eq 1 ] && [ $mode -eq 3 ]; then
|
|
echo "Discovery using configuration file"
|
|
if [ $passive_disc = 1 ]; then
|
|
echo "passive configuration enabled"
|
|
#configure snmptrapd file
|
|
snmptrapd_config
|
|
else
|
|
#remove if it's disabled
|
|
echo "passive configuration disabled"
|
|
remove_traphandle
|
|
restart_snmptrapd
|
|
fi
|
|
|
|
if [ $active_disc = 1 ]; then
|
|
echo "active configuration enabled"
|
|
ActiveDiscMode
|
|
fi
|
|
else
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
;;
|
|
*)
|
|
echo "ERROR: unknown mode '$mode'"
|
|
exit 1
|
|
esac
|
|
|
|
# Remove the temporary file
|
|
rm -f $HpiloXmlFile
|
|
rm -f $TmpFile
|