Invoke-NagiosRequest.ps1

<#
.Synopsis
   This script allows the user execute cgi commands to a Nagios site by using
   the Invoke-WebRequest cmdlet.
.DESCRIPTION
   The purpose of the script is to automate the process of disabling/enabling
   nagios notifications and/or checks for Nagios hosts and their services.
    
   The script utilizes Invoke-WebRequest to post to the nagios cmd.cgi.
 
   Paramaters:
        $computername - what nagios refers to as host for which you wish to
        enable/disable checks and notifications. Hosts are case-sensitive.
 
        $action - integer of nagios cmd.cgi for the action you wish to take
 
            Disable checks of all services on this host
            $action=16
 
            Enable checks of all services on this host
            $action=15
 
            Disable notifications for all services on this host
            $action=29
 
            Enable notifications for all services on this host
            $action=28
 
            Acknowledge service problem
            $action=34
 
            Force service check
            $action=7
 
        $NagiosCoreUrl - the base url of your nagios installation (i.e. http://nagios.domain.com/nagios)
 
        $username - the htaccess username
 
        $password - the htaccess password
 
.NOTES
    Author: Jason Wasser
    Modified: 5/19/2015
    Version: 1.8
    Currently the script only supports enabling/disabling of active checks and
    notifications.
     
    Changelog:
    version 1.8
        * Added Disable-NagiosServiceNotifications and Enable-NagiosServiceNotifications
        * Added Disable-NagiosGlobalNotifications and Enable-NagiosGlobalNotifications
    version 1.7
        * Added logic for hostgroups and service groups
    version 1.6
        * Converted to Functions and script module
    version 1.52
        * Added host problem acknowledgement.
    version 1.51
        * Added logic for user not entering a password.
    version 1.5
        * Added service problem acknowledgement.
        * Added force service check.
        * Added disabling/enabling service checks for host groups
        * Added disabling/enabling service checks for service groups.
    version 1.0
        * Initial re-write of Set-NagiosCLI.ps1 now using Invoke-WebRequest.
 
      
    Future developments could include scheduled downtimes.
     
    Known Issues:
        * To run the script as a scheduled task as a service account will require running
        Internet Explorer once as the user.
     
.EXAMPLE
   .\Invoke-NagiosRequest.ps1 -computername server1 -action 29 -NagiosCoreUrl http://nagios.domain.com/nagios -username nagiosadmin
   This will disable notifications for all services on host server1 including the host.
.EXAMPLE
   .\Invoke-NagiosRequest.ps1 -computername server1 -action 28 -NagiosCoreUrl http://nagios.domain.com/nagios -username nagiosadmin
   This will enable notifications for all services on host server1 including the host.
.EXAMPLE
   .\Invoke-NagiosRequest.ps1 -computername server1 -action 16 -NagiosCoreUrl http://nagios.domain.com/nagios -username nagiosadmin
   This will disable checks for all services on host server1 including the host.
.EXAMPLE
   .\Invoke-NagiosRequest.ps1 -computername server1 -action 15 -NagiosCoreUrl http://nagios.domain.com/nagios -username nagiosadmin
   This will enable checks for all services on host server1 including the host.
.EXAMPLE
   .\Invoke-NagiosRequest.ps1 -computername (get-content c:\temp\computerlist.txt) -action 29 -NagiosCoreUrl http://nagios.domain.com/nagios -username nagiosadmin
   This will disable notifications for a list of computers found in the c:\temp\computerlist.txt file.
 
#>

#requires -version 3.0
Function Invoke-NagiosRequest {
    [CmdletBinding(DefaultParameterSetName='ByHost')]
    Param
    (
        # Nagios Host
        [Parameter(Mandatory=$false,
                    ValueFromPipeline=$true,
                    ValueFromPipelineByPropertyName=$true,
                    Position=0,
                    HelpMessage = "What nagios refers to host(s) for which you wish to enable/disable checks and notifications.
                    Nagios is case-sensitive for hosts (i.e. server01 != SERVER01)."
,
                    ParameterSetName='ByHost')]
        [alias('host')]
        [string[]]$ComputerName,

        # Nagios cmd.cgi action by number
        [Parameter(Mandatory=$true,Position=1,
            HelpMessage = "Integer of nagios cmd.cgi for the action you wish to take
 
                Disable checks of all services on this host
                action=16
 
                Enable checks of all services on this host
                action=15
 
                Disable notifications for a service on this host
                action=23
 
                Enable notifications for a service on this host
                action=22
 
                Disable notifications for all services on this host
                action=29
 
                Enable notifications for all services on this host
                action=28
             
                Acknowledge host alert
                action=33
             
                Acknowledge service alert
                action=34
             
                Force service check
                action=7
 
                Disable checks of all services on host group
                action=68
 
                Enable checks of all services on host group
                action=67
 
                Disable checks of all services in a service group
                action=114
 
                Enable checks of all services in a service group
                action=113
                "
)]
        [ValidateSet(7,11,12,15,16,22,23,28,29,33,34,67,68,113,114)]
        [int]$action,

        [Parameter(Mandatory=$false)]
        [string]$service,

        [Parameter(Mandatory=$false)]
        [string]$servicegroup,

        [Parameter(Mandatory=$false)]
        [string]$comment,

        [Parameter(Mandatory=$false)]
        [string]$hostgroup,

        # Nagios base url
        [Parameter(Mandatory=$false,Position=2,HelpMessage="The base url of your nagios installation (i.e. http://nagios.domain.com/nagios)")]
        [string]$NagiosCoreUrl,

        # Nagios username
        [Parameter(Mandatory=$false,Position=3)]
        [string]$username,

        # Nagios password
        [Parameter(Mandatory=$false,Position=4)]
        [string]$password

    )

    Begin
    {
        # Function for making the actual CGI POST command.
        Function Submit-NagiosRequest {
            Param (
                [string]$NagiosObject
                )
            Write-Output "###########################################################################"
            Write-Output "Submitting cgi command to Nagios for $NagiosObject"
            $WebRequest = Invoke-WebRequest -Uri $uri -Credential $Credential -Body $formFields -Method POST -ContentType 'application/x-www-form-urlencoded'
        
            # If there was a problem with the hostname or other problem the errorMessage DIV field will be displayed. If not display the infoMessage of success.
            $Message = $WebRequest.ParsedHtml.getElementsByTagName("div") | Where-Object "classname" -Match "errorMessage|infoMessage" | select -ExpandProperty innerText
            if ($Message) {
                $Message 
                }     
            Write-Output "###########################################################################"
            }
        
        # Building URI for Nagios CGI
        $cgiurl="/cgi-bin/cmd.cgi"
        $uri = $NagiosCoreUrl + $cgiurl
        
        # Credential verification
        if (!$Credential) {
            $Credential = Get-UserLogin -username $username -Password $password
            }
    }

    Process
    {
        # Here we need to separate out the Nagios commands that potential
        # loop through a list of nagios hosts for the enabling/disabling
        # of checks and notifications from the other commands such as host
        # groups, service groups, acknowledgements, and future development.

        switch -Regex ($action) {
             # List of action integers that are not computer/host based
            "67|68" {
                foreach ($hg in $hostgroup) {
                    switch ($action) {
                        # Enable checks of all services on host group
                        67 {
                            if (!$hg) {
                                $hg = Read-Host "Please enter the hostgroup (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;hostgroup=$hg;ahas=$true;cmd_mod=2}
                            }
                        # Disable checks of all services on host group
                        68 {
                            if (!$hg) {
                                $hg = Read-Host "Please enter the hostgroup (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;hostgroup=$hg;ahas=$true;cmd_mod=2}
                            }
                        }
                        Submit-NagiosRequest -NagiosObject $hg
                    }
                }
            "^113$|^114$" {
                foreach ($sg in $servicegroup) {
                    switch ($action) {
                        # Enable checks of all services in a service group
                        113 {
                            if (!$sg) {
                                $sg = Read-Host "Please enter the service group (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;servicegroup=$sg;ahas=$false;cmd_mod=2}
                            }
                        # Disable checks of all services in a service group
                        114 {
                            if (!$sg) {
                                $sg = Read-Host "Please enter the service group (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;servicegroup=$sg;ahas=$false;cmd_mod=2}
                            }
                        }
                        Submit-NagiosRequest -NagiosObject $sg
                    }
                }
            "^11$|^12$" {
                    Write-Verbose "Enabling/Disabling Global Nagios Notifications"
                    $formFields = @{cmd_typ=$action;cmd_mod=2}
                    Submit-NagiosRequest -NagiosObject 'GlobalNotifications'
                }
            default {
                # For all other host/computer commands.
                if (!$ComputerName) {
                    $ComputerName = Read-Host "Please enter a Nagios host name (case-sensitive)"
                    }
                foreach ($computer in $ComputerName) {
                    $computer = $computer.ToUpper()
                    switch -Regex ($action) {
                        # Acknowledge Host Problesm
                        33 {
                            if (!$comment){
                                $comment = Read-Host "Please enter a comment for acknowledgement"
                                }
                            $formFields = @{cmd_typ=$action;host=$computer;service=$service;cmd_mod=2;com_data=$comment;sticky_ack=$true;send_notification=$true}
                            }
                        # Acknowledge Service Problem
                        34 {
                            if (!$service) {
                                $service = Read-Host "Please enter the service name (case-sensitive)"
                                }
                            if (!$comment){
                                $comment = Read-Host "Please enter a comment for acknowledgement"
                                }
                            $formFields = @{cmd_typ=$action;host=$computer;service=$service;cmd_mod=2;com_data=$comment;sticky_ack=$true;send_notification=$true}
                            }
                        # Force service check
                        7 {
                            if (!$service) {
                                $service = Read-Host "Please enter the service name (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;host=$computer;service=$service;cmd_mod=2;start_time=(Get-Date -Format "MM-dd-yyyy HH:mm:ss");force_check=$true}
                            }
                        "22|23" {
                            if (!$service) {
                                $service = Read-Host "Please enter the service name (case-sensitive)"
                                }
                            $formFields = @{cmd_typ=$action;host=$computer;service=$service;cmd_mod=2}
                            }
                
                        # All other commands for enabling/disabling checks or notifications for hosts
                        default {
                            $formFields = @{cmd_typ=$action;host=$computer;ahas=$true;cmd_mod=2}
                            }
                        }
                    Submit-NagiosRequest -NagiosObject $computer
                    }
                }
            }
        }
    End
    {
    }
}
# End of Invoke-NagiosRequest Function
########################################################################################################