PowerShell: Disco duro libre y notificaciones PUSH
Un nuevo año, una nueva semana, y un nuevo artículo sobre PowerShell. En el artículo anterior se hablaba sobre un sistema que enviaba mensajes de email cuando un website de una lista no estaba online. Eso está bien para casos en los que se necesita un informe de estado periódico. Pero si lo que interesa es actuar sobre una emergencia… que está ocurriendo en este mismo instante, tal vez sea necesario tomar una aproximación más inmediata.
En el script de hoy, el objetivo es saber si una máquina de la granja de servidores de la empresa se está quedando sin espacio libre en disco. Para ello se hará uso de una consulta WMI, el programador de tareas de Windows y un servicio PUSH de notificaciones a teléfonos móviles.
El código
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function Send-SlackMessage([string]$message, [string]$userName){ $postSlackMessage = @{token="Aqui va el token que Slack te ha generado";channel="#tests";text=$message;username=$userName;icon_url="http://y-aqui-va-la-url-del-icono-del-mensaje-slack/server.png"} $body = Invoke-RestMethod -Uri https://slack.com/api/chat.postMessage -Body $postSlackMessage -method Post } #Lista de unidades $drives = gwmi win32_volume -Filter 'drivetype = 3' #Porcentaje mínimo de espacio libre $warn=20 #Procesar $drives | foreach{ if($_.Capacity -eq 0){ continue } $percent=($_.FreeSpace /$_.Capacity)*100 if(($percent -lt $warn) -and ($_.driveletter.Length -gt 0)){ $percent="{0:N2}" -f $percent $message="El disco $($_.label) ($($_.driveletter)) esta al $percent% de espacio libre" Send-SlackMessage -message $message -userName $_.__SERVER } } |
Paso a Paso
Acceso a información de discos locales
Desde powershell, esto se puede ver fácilmente con el siguiente comando: “gwmi win32_volume -Filter ‘drivetype = 3’”, que devuelve una lista detallada de parámetros para cada uno de los discos del sistema. Esto constituye la primera pieza del puzzle que toca resolver.
El DriveType indica el tipo de disco que se desea consultar. En este caso, el DriveType = 3 hace un filtrado para mostrar únicamente los discos duros locales. Para cada uno de los discos que devuelve, se quiere procesar los que tengan una capacidad superior a 0 para descartar cualquier unidad de CD/DVD que pudiera haber pasado el filtro.
Entran en escena los servicios PUSH
Hay multitud de proveedores de servicios PUSH, como PushOver, Slack, PushBullet, NotifyMyAndroid… Cada uno tiene sus ventajas e inconvenientes: Los hay con diferentes modelos de licenciamiento, desde licencia por plataforma en la que se instale, hasta la compra de paquetes de mensajes cuando se llega al límite máximo de mensajes mensuales.
De todos los nombrados anteriormente, hay uno que tiene cliente móvil para las tres grandes plataformas (Android, IOS y Windows Phone) y que además tiene la segunda pieza necesaria: una API REST con la que poder enviar notificaciones: Slack
De la API, que incluye funciones para infinidad de tareas, la parte interesante es la que envía un mensaje al chat. Por limpieza y reusabilidad del código, esta parte se ha separado en una función aparte llamada “Send-SlackMessage” que acepta como parámetros el canal al que se desea enviar el mensaje, el nombre de usuario que aparece como “agente publicador”, y el mensaje en sí. Esta función se puede sacar del código y utilizar como notificador en cualquier otro script PowerShell, como procesos que tardan horas en completar, o cualquier otra situación en la que se considere que sea necesario recibir notificaciones.
La parte más importante, y de la que depende que todo esto pueda funcionar, es el token de cliente. En este caso, desde la web de Slack se puede solicitar un token de usuario desde el que enviar notificaciones de una forma muy sencilla y automatizada, sin necesidad de tener que implementar ningún tipo de esquema de autenticación.
¿Por algún motivo el token queda expuesto y empiezan a llegar mensajes de spam? Simplemente se genera un nuevo token, y listo.
Programando tareas
Nada de esto tendría sentido si no hay una forma de hacer una comprobación periódica del estado del disco. Esto se puede lograr muy fácilmente con el Task Scheduler de Windows. En primer lugar se programa el trigger para que se ejecute diariamente cada 10 minutos.
Y en segundo lugar se especifica la acción a realizar. En este caso, lanzar una PowerShell –file “nombreFichero.ps1”, que es donde está guardado el script que acompaña a este artículo.
Comprobación y Conclusiones
Finalmente, toca comprobar que todo ha funcionado correctamente, y que la notificación se ha recibido en los diferentes medios (Android, Windows Phone, PC,…)
Como se puede ver, aunque Slack proporciona clientes para todas las plataformas la interfaz de usuario y la organización de los mensajes cambia dependiendo de la plataforma.
En conclusión, mediante el uso de sistemas de mensajería Push, se pueden enviar notificaciones a canales específicos lo que permite avisar a un equipo completo de trabajo de que algo está pasando con los servidores, al tiempo que la bandeja de entrada de correo electrónico se puede mantener algo más limpia de mensajes. Esto puede permitir una interacción más ágil entre los miembros de un equipo para coordinarse en la resolución del problema.