#!/bin/bash
#
# Nagios NSClient++ CFG maker v0.1
# 
# Queries the server to fill in automatic server cfg files for nagios.  
# This script assumes that NSClient++ is installed on the server.  This can be
# downloaded from: http://nsclient.ready2run.nl/
#
# This code is licensed under the Gnu GPL v3 license.
#
# by Michael Hendrickx (michaelhendrickx.com)
#

NAGIOS_DIR='/usr/local/nagios'
NSCLIENT_PORT=12489
CMD_NT='/libexec/check_nt'
CMD_PING='/libexec/check_ping'

PING_RTA_WARN="1000.0" # warning round trip time average
PING_PLS_WARN="10" # warning level for packet loss (%)
PING_RTA_CRIT="3000.0" # critical round trip time average
PING_PLS_CRIT="50" # critical level for packet loss (%)

# please do not alter anything below this line
# --------------------------------------------------------- <- this one

echo "Nagios NSclient++ (check_nt) CFG maker"
echo 
# check_proc: function to verify if there's a certain process running, and add
#             it when available.
function check_proc {
  proc_name=$1
  proc_fullname=$2
  check=`$NAGIOS_DIR$CMD_NT -H $IP_ADDRESS -p $NSCLIENT_PORT -v PROCSTATE -d SHOWALL -l $proc_name | awk '{ print $2 }'`
  if [ $check = "Running" ]; then
  echo " + adding process: $proc_fullname ($proc_name)"
  cat >> $FILENAME << EOF
define service{
    use                     generic-service
    host_name               $HOST_NAME
    service_description     $proc_fullname
    check_command           check_nt!PROCSTATE!-d SHOWALL -l $proc_name
    }
EOF
  fi
}

# check_svc: function to verify if there's a certain service running, and add
#            it when available.
function check_svc {
  svc_name=$1
  svc_fullname=$2
  check=`$NAGIOS_DIR$CMD_NT -H $IP_ADDRESS -p $NSCLIENT_PORT -v SERVICESTATE -d SHOWALL -l $svc_name | awk '{ print $2 }'`
  if [ $check = "Started" ]; then
  echo " + adding service: $svc_fullname ($svc_name)"
  cat >> $FILENAME << EOF
define service{
    use                     generic-service
    host_name               $HOST_NAME
    service_description     $svc_fullname
    check_command           check_nt!SERVICESTATE!-d SHOWALL -l $svc_name
    }
EOF
  fi
}


# check if the arguments are ok, we need a:
# $0 <hostname> 

if [ $# -lt 1 ]; then
  echo "Incorrect arguments, please use the following:"
  echo "  $0 <hostname>"
  exit
fi

#Getting IP address
HOST_NAME=$1
FILENAME=$HOST_NAME.cfg
IP_ADDRESS=`nslookup $HOST_NAME | grep "Address: " | awk '{ print $2 }'`

# check if actually exists... if not, throw an error
if [ -z $IP_ADDRESS ]; then
  echo " + Error: could not resolve hostname $HOST_NAME"
  echo " + Exiting now."
  echo
  exit
fi

if [ -e $FILENAME ]; then
  echo -e " + Warning: file $FILENAME exists already, do you want to overwrite it (y/n)? \c "
  read overwrite
  if [ $overwrite = "n" ]; then
    exit 0
  fi
fi

# ---------------------------------------------------------
# from this point, all is ok.  We can write our config file
# ---------------------------------------------------------


echo " + logfile: $HOST_NAME.cfg"

# adding server initially
cat > $FILENAME << EOF
# Config for $HOST_NAME
define host {
    use         windows-server
    host_name   $HOST_NAME
    alias       $HOST_NAME
    address     $IP_ADDRESS
    }

EOF

echo -n " + pinging the server.. "
check=`$NAGIOS_DIR$CMD_PING  -H $IP_ADDRESS -w $PING_RTA_WARN,$PING_PLS_WARN% -c $PING_RTA_CRIT,$PING_PLS_CRIT% | awk '{ print $2; } '`
if [ $check = "CRITICAL" ]; then
  echo "fail!"
  echo "Error: $HOST_NAME could not be reached over ping." 
  exit
else
  echo "ok"
cat >> $FILENAME << EOF
define service{ 
    use                     generic-service
    host_name               $HOST_NAME
    service_description     Ping
    check_command           check_ping!-w $PING_RTA_WARN,$PING_PLS_WARN% -c $PING_RTA_CRIT,$PING_PLS_CRIT%
    }
EOF
fi

echo " + checking of nsclient++ is installed"
check=`$NAGIOS_DIR$CMD_NT -p $NSCLIENT_PORT  -H $IP_ADDRESS -v CLIENTVERSION | awk '{ print $1 }' | head -n 1`
if [ $check != "NSClient++" ]; then
  echo " ! Warning: NSClient was not installed on $HOST_NAME."
  echo
  exit
else
cat >> $FILENAME << EOF
define service{ 
    use                     generic-service
    host_name               $HOST_NAME
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }
EOF

# check for HDD free space
for dl in c d e f g h i j k l m; do
	hdd=`$NAGIOS_DIR$CMD_NT -H $IP_ADDRESS -p $NSCLIENT_PORT -v USEDDISKSPACE -l $dl | awk '{ print $5; }' `
    if [ $hdd != "Invalid" ]; then
		echo " + adding hdd $dl:\\"

# TODO: check for reasonable values for warning and critical, having 10% available
#       on a 2TB drive is not the end of the world.

cat >> $FILENAME << EOF
define service{
    use                     generic-service
    host_name               $HOST_NAME
    service_description     $dl:\ Drive Space
    check_command           check_nt!USEDDISKSPACE!-l $dl -w 90 -c 97
    }
EOF
    fi # $hdd != invalid
done # drive loop

# check processes
# check_proc NTRtScan.exe "TrendMicro Antivirus"
check_proc sqlservr.exe "MS SQL Server"
check_proc oracle.exe "Oracle"
check_proc adskflex.exe "Autodesk Licensing Manager"
# check_proc clussvc.exe "Cluster Service"

# check services 
# Windows standard services
check_svc wuauserv "Automatic Updates"
check_svc ClusSvc "Cluster Service"
check_svc DNSCache "DNS Client"
check_svc Eventlog "Event Log"
check_svc Messenger "Messenger"
check_svc NfsSvc "NFS Service"
check_svc RPCLocator "RPC Locator"
check_svc SQLServerAgent "SQL Server Agent"
check_svc lanmanserver "Server Service"
check_svc w32time "Windows Time"
check_svc msftpsvc "FTP Service"
check_svc SNMP "SNMP service"
check_svc smtpsvc "SMTP Service"
check_svc tlntsvr "Telnet Server"
check_svc DHCPServer "DHCP Server"
check_svc DNSServer "DNS Server"
check_svc issadmin "IIS Admin service"
check_svc w3svc "IIS service"

# Apache/Tomcat
check_svc tomcat5 "Apache Tomcat 5"

# VNC Server
check_svc winvnc "VNC Server"

# HP Openview
check_svc ovctrl "HP OpenView Ctrl Service"

# UPS 
check_svc APCPBEAgent "APC PowerChute Agent"
check_svc APCPBEServer "APC PowerChute Server"

# symantec backup exec
check_svc BackupExecRPCService "Backup Exec Server"
check_svc BackupExecAgentAccelarator "Backup Exec Remote Agent"
check_svc SymSnapService "Symantec Volume Snapshot Service"

# HP Insight agents
check_svc CqMgServ "HP Insight Server Agent"
check_svc CpqNicMgmt "HP Insight NIC Agent"
check_svc CqMgStor "HP Insight Storage Agent"
check_svc Cissesrv "HP Smart Array Notification Service"

# Antivirus 
# trend micro
check_svc tmlisten "TrendMicro OfficeScan NT Listener"
check_svc ntrtscan "Trendmicro Antivirus RealTime Scan"
# symantec
check_svc LiveUpdate "Symantec Live Update"
check_svc "Symantec Antivirus" "Symantec Endpoint Protection"


fi # ntclient_version

echo " - done"
echo

