David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.

lunes, 10 de octubre de 2016

Control de conectividad en batch de Windows o en PowerShell, tu decides, fácil o más fácil...

Muchas veces tenemos que controlar si un script se lanza o no dependiendo de si hay conectividad con la unidad de red, el servidor o simplemente a internet.

Un apaño muy típico mio, y realmente rápido y facil de hacer, pasa por controlarlo desde el batch de windows para posteriormente ejecutar el comando que sea, aunque esto se puede hacer desde powershell de forma muy sencilla. Veamoslo primero desde un .bat y vamos a hacerlo a lo artesanal, así repasamos algunos conceptos básicos como volcar y buscar en un archivo .txt o los bucles for, así le añadimos un poco de lío.

REM deshabilitamos el echo y retardamos la carga de las variables, para los bucles for

@echo off
setlocal enabledelayedexpansion

:: Establecer variables

REM En este caso vamos a separar los almacenamientos de los servidores

set ADMIN_UDs_Red=almacenamiento01 almacenamiento02 almacenamiento03
set ADMIN_Servers=servidor01 servidor02 servidor03

REM Vamos a volcar el resultado a un log, controlamos la ruta para crearla si es necesario y el nombre del log depende de la fecha, para poder lanzarlo a diario cuando llegamos al trabajo. Vamos a borrar su contenido con el echo. >

set ruta=C:\Connectivity_Logs
if not exist %ruta% mkdir %ruta%
set rutalog=%ruta%\%date:~6,4%%date:~3,2%%date:~0,2%_Connectivity_Test.log
echo. >%rutalog%

REM Nos vamos a apoyar en un par de archivos txt y una variable que me permita controlar que si hay una ip que no tiene conectividad mande un mail

set pinged=%ruta%\ping.txt
set pinged2=%ruta%\ping2.txt
set ENVIOMAIL=NO

:: Lanzar comprobaciones

REM Volcamos una cabecera en el .log

echo. >>%rutalog%
echo ************************* >>%rutalog%
echo *** CONNECTIVITY TEST *** >>%rutalog%
echo ************************* >>%rutalog%
echo. >>%rutalog%

REM Recorremos las unidades de red de la variable ADMIN_UDs

for %%a in (%ADMIN_UDs_Red%) do (
echo Checking %%a

REM Hacemos un ping y volcamos el resultado al primer .txt

PING -w 3000 %%a > %pinged%

REM Buscamos si en el primer .txt hay indicios de conectividad y volcamos al segundo .txt

@find /C "TTL=" %pinged% > %pinged2%

REM Ahora la variable estado es la que marcará la conectividad, viendo el número que se ha volcado al segundo .txt si no es 0 es que ha encontrado alguna coincidencia, en este caso por como hemos hecho el ping será 1

set estado=[nOK]
for /F "tokens=1,2,3" %%h in (%pinged2%) do (
set control=%%j
if "%%h" EQU "----------" (
if "!control!" NEQ "0" set estado=OK
)
)

REM Volcamos el resultado al .log

echo Checked ... %%a: !estado! >>%rutalog%

REM En caso de no haber conectividad en cualquiera de las ips activa el envio de un mail

if !ENVIOMAIL! EQU NO (
if !estado! EQU [nOK] set ENVIOMAIL=SI
)
)

REM Realizamos exactamente lo mismo con la lista de servidores

for %%a in (%ADMIN_Servers%) do (
echo Checking %%a
PING -w 3000 %%a > %pinged%
@find /C "TTL=" %pinged% > %pinged2%
set estado=[nOK]
for /F "tokens=1,2,3" %%h in (%pinged2%) do (
set control=%%j
if "%%h" EQU "----------" (
if "!control!" NEQ "0" set estado=OK
)
)
echo Checked ... %%a: !estado! >>%rutalog%
if !ENVIOMAIL! EQU NO (
if !estado! EQU [nOK] set ENVIOMAIL=SI
)
)

REM Volcamos un pie de log para constatar que hemos terminado con el

echo. >>%rutalog%
echo ************************* >>%rutalog%
echo ***        END        *** >>%rutalog%
echo ************************* >>%rutalog%

REM Borramos los ficheros .txt en los que nos hemos apoyado.

del %pinged%
del %pinged2%

REM Aqui controlariamos el envio del mail, en este caso solo hago un echo.

ECHO %ENVIOMAIL%
PAUSE

Si quieres saber como enviar el mail, mira esta entrada: Enviar un mail con PowerShell

Bien, esto sería mas fácil haciéndolo desde powershell, ya que con un único comando obtenemos true o false al comprobar la conectividad y lo almacenamos en una variable:

a$=test-connection -computername <nombre_servidor> -quiet

En este caso la variable a$ tendrá el resultado true o false de la comprobación de conexión.
Por ejemplo, para saber si tenemos conectividad a internet, podemos lanzar directamente el comando en la consola de windows powershell:

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Reservados todos los derechos.

PS C:\> test-connection -computername google.com -quiet
True
PS C:\>

Si consultamos la ayuda, podemos ver que admite algunas variantes, por ejemplo si queremos comprobar varios equipos:

test-connection -computername server01, server02, server12 -credential domain01\user01

Incluso personalizando los parametros del ping

test-connection -computername Server01 -count 3 -delay 2 -TTL 256 -buffersize 256 -throttle 32

Podríamos ir mas allá y concatenar la condición de conexión con un servidor a si esta es true lanzar una sesión interactiva:

if (test-connection -computername Server01 -quiet) {new-pssession Server01}

Veamos como lo realiza:

PS C:\> if (test-connection -computername servidor01 -quiet) {new-pssession servidor01}

 Id Name       ComputerName   State                   ConfigurationName      Availability
 -- ----            -----------------      -----------------     ------------                      -----------
  1 Session1    servidor01          Opened                Microsoft.PowerShell   Available

PS C:\>

Nos ha creado la sesión en el servidor, introducimos el número de id en el comando Enter-PSSession 1 y cambiamos a esa sesión interactiva para lanzar comandos en el propio servidor:

PS C:\> Enter-PSSession 1
[servidor01]: PS C:\Users\usuario01\Documents>

Para gustos colores yo a veces prefiero coger scripts que ya tengo hechos y no perder ni un segundo y otras veces me apetece recordar un poco comandos y métodos olvidados.

Piensa en variantes de este método, si cambias el listado de servidores o almacenamientos por lista de dominios controlas si hay conectividad hacia los dominios que administras, o los que consultas de normal, etcétera.

SaluDOS.