Nagios: Crear un nuevo check en powershell invocado desde nsclient

NAgios – NSCA check

Desarrollo del nuevo check

Es importante respetar los códigos de salida y la sintáxis de nagios par que nuesrto nuevo chequeo pueda ser visualizado correctamente desde nagios.

En el caso de estar usando también pnp4nagios, o cualquier otro addon capaz de hacer una gráfica , hay que respetar también la sintáxis de performance data.

Para definir los argumentos de entrada a un powershell, en el comienzo del script se define su nombre, posición y si es necesario:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$ApplicationPool
   )

Para definir el código de salida, se ha usado definición de variables:

Set-Variable OK 0 -option Constant
Set-Variable WARNING 1 -option Constant
Set-Variable CRITICAL 2 -option Constant
Set-Variable UNKNOWN 3 -option Constant

(...)
exit $CRITICAL

En mi caso, he desarrollado un plugin para poder conocer el estado de un pool de aplicaciones en un servidor IIS. El código completo está aquí.

Publicarlo a través de NSClient++

Con nuestro nuevo script escrito y funcionando, es momento de configurar nsclient++ para poder acceder desde nuestro nagios.

En primer lugar, en la carpeta de scripts C:\Program Files\NSClient++\scripts copiamos nuestro nuevo check con extensión ps1.

El funcionamiento de NSClient++ para los external scripts, hace que todos ellos se invoquen a través del cmd de windows. Por lo tanto, debemos especificar en la linea, que es powershell quien debe ejecutar nuestro nuevo check.

[/settings/external scripts/scripts]

check_default_app_pool = powershell.exe scripts\check_iis8_app_pool_state.ps1 DefaultAppPool

 

Instalación de NSCLient++.

 

 

Crear un servicio web REST con ASP 1.0 clásico

Evidentemente, la tecnología escogida no es una nuestra elección; viene dada por los requisitos, y, a pesar de todas las justificaciones esgrimidas no ha sido posible cambiarlo.

Servidor web

Nuestro servidor web es un W 2003 con las características IIS activadas.

En la carpeta INETPUB, hemos creado como primer paso una carpeta para javascript donde hemos puesto las librerías JSON y JQUERY (en versión 1).

Recoger parámetros en Javascript desde la URL

La url que se invoca es algo como:

http://www.anyserver.com/mypage.asp?Details=products

En nuestra página ASP, vamos a usar las funciones de purl para sacar valores de la línea de parámetros

Verificar parámetros con expresiones regulares.

...
<script src="js/purl.js" language="javascript" type="text/javascript"></script>
...
<script type="text/javascript">
ip=$.url().param("ip") </script>

Coger parámetros en Classic ASP 1.0 desde url o cabecera

Esta es la forma de recogerlo de URL

IP = Request.QueryString("IP")

Si hay una cabecera propia, hay que anteponer http_ para poder extraerla, cómo explican en el foro de microsoft:

If a client request includes a header other than those specified in the IIS Server Variables table, you can retrieve the value of that header by preceding the header name with “HTTP_” in the call to Request.ServerVariables. For example, if the client sends a header such as SomeNewHeader:SomeNewValue, you can retrieve SomeNewValue by using the following synta

<% Request.ServerVariables("HTTP_SomeNewHeader") %>

Nosotros nos hemos hecho una función, para aceptar parámetros por url y por cabecera indistintamente:

Function GetParam (strTarget)
Dim param
param = Request.ServerVariables("HTTP_"&strTarget)
if (Len(param) = 0) then
param = Request.QueryString (strTarget)
End if
GetParam=param 'Return value
End Function

Respuesta del servidor

Todas las respuestas se hacen en forma de texto:

response.write Linea 1 & vbcrlf
response.write Linea 2 & vbcrlf

Gestión de logs desde Classic ASP 1.0
Hemos usado el código de Digital Colony, por que es inmejorable.

En la carpeta donde se guardan los logs, se debe dar permisos al usuario ASPNET de lectura y escritura.

Conexión a base de datos desde Classic ASP 1.0

Vamos a usar esta solución para prevenir inyección de sql en la base de datos.

Además, hemos creado un usuario con privilegios sólo de escritura sobre la base de datos, para prevenir cambios o consultas sobre otras base de datos.

strConnect = "DRIVER={SQL Server};SERVER=server\instance;DATABASE=my_Db;UID=my_uid;PWD=my_pwd;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = strConnect
conn.Open
(...)
conn.Close

Transacciones en base de datos desde ASP 1.0

Algunas de nuestras conexiones, las vamos a hacer dentro de una transacción:

conn.BeginTrans
(...)
conn.CommitTrans

 Función ExecuteScalar contra la base de datos desde Classic ASP 1.0

Hemos creado una función para recoger el primer resultado de una sentencia select.

Function executeScalar (strCommand)
Set command = CreateObject("ADODB.Command")
command.ActiveConnection = conn
command.CommandText = strCommand
Set rs = command.Execute ()
if not rs.EOF then
rs.movefirst
executeScalar = rs.fields(0)
else
executeScalar  = 0
End IF
Set rs = nothing
Set command = nothing
End Function

Gestión de errores de ASP

Para nuestro servicio Rest, hemos escogido la gestión más simple de las que proponen desde  codeguru:

En la cabecera de la página ASP:
<%
' Error Handler
' Turn on page buffering:
Response.Buffer = True
' Turn On Error Handling:
' On Error Resume Next so that errors don't stop page execution
On Error Resume Next
%>

(…) Código ASP de la página

Al final, se captura el error, se limpia la respuesta y se responde con el texto que se espere.

<%
' Error Handler
If Err.Number <> 0 Then
'Clear response buffer
Response.Clear
End If
%>

Más información

Vamos a comenzar por repasar los siguientes foros de información: