Suporte Broadcast - Batch Script para Alertar Queda de Conexão em Sistemas Broadcast

Esse projeto teve como objetivo criar um alerta visual em caso de perda de conexão com algum equipamento na cadeia de transmissão.

Basicamente o que é feito: É criado uma lista representado uma fila circular de equipamentos. A cada minuto um equipamento desta fila é chamado e então um comando ping é enviado.
Em caso de normalidade, a tela do prompt permanece na cor azul. Em caso de problema, a tela do prompt fica vermelha, o status mostrado do equipamento muda de OK para PROBLEM e um arquivo de log é gerado.

Esse processo fica preso em Loop pela fila circular, até que o usuário encerre o programa. Abaixo segue o código usado para o script. Alguns IPs e Nomes foram ocultados por questão de segurança.

@echo off
rem ------------------------------------------------------------------------
rem Script: informa.bat
rem Objetivo: Testar a conexão de equipamentos e alertar em caso de falha.
rem Autor(es): Alex Souza Marques / Wander Correa
rem Data: 30-05-2018
rem ------------------------------------------------------------------------

title INFORMA
mode 80,60
color 1F
set "num_pings=3"
set "reg_pings=1"
set "log_file=informa.txt"
set "wait_for=10"

rem ------------------------------------------------------------------------
set "ibuc_a_tv_xxx_status=OK"
set "ibuc_b_tv_xxx_status=OK"
set "modu_a_tv_xxx_status=OK"
set "modu_b_tv_xxx_status=OK"
set "enco_a_tv_xxx_status=OK"
set "enco_b_tv_xxx_status=OK"

set "ibuc_a_tv_yyy_status=OK"
set "ibuc_b_tv_yyy_status=OK"
set "modu_a_tv_yyy_status=OK"
set "modu_b_tv_yyy_status=OK"
set "enco_a_tv_yyy_status=OK"
set "enco_b_tv_yyy_status=OK"
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
set "ibuc_a_tv_xxx_host=xxx.xxx.xxx.xxx"
set "ibuc_b_tv_xxx_host=xxx.xxx.xxx.xxx"
set "modu_a_tv_xxx_host=xxx.xxx.xxx.xxx"
set "modu_b_tv_xxx_host=xxx.xxx.xxx.xxx"
set "enco_a_tv_xxx_host=xxx.xxx.xxx.xxx"
set "enco_b_tv_xxx_host=xxx.xxx.xxx.xxx"

set "ibuc_a_tv_yyy_host=yyy.yyy.yyy.yyy"
set "ibuc_b_tv_yyy_host=yyy.yyy.yyy.yyy"
set "modu_a_tv_yyy_host=yyy.yyy.yyy.yyy"
set "modu_b_tv_yyy_host=yyy.yyy.yyy.yyy"
set "enco_a_tv_yyy_host=yyy.yyy.yyy.yyy"
set "enco_b_tv_yyy_host=yyy.yyy.yyy.yyy"
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
rem --------------------------- MAIN PROGRAM -------------------------------
rem ------------------------------------------------------------------------
:loop
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. IBUC-A TV XXX
ping -n %num_pings% %ibuc_a_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "ibuc_a_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### IBUC-A TV XXX### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %ibuc_a_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "ibuc_a_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. IBUC-B TV XXX
ping -n %num_pings% %ibuc_b_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "ibuc_b_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### IBUC-B TV XXX ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file% 
ping -n %reg_pings% %ibuc_b_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "ibuc_b_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. MODULADOR-A TV XXX
ping -n %num_pings% %modu_a_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "modu_a_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### MODULADOR-A TV XXX ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %modu_a_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "modu_a_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. MODULADOR-B TV XXX
ping -n %num_pings% %modu_b_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "modu_b_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### MODULADOR-B TV XXX ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %modu_b_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "modu_b_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. ENCODER-A TV XXX
ping -n %num_pings% %enco_a_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "enco_a_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### ENCODER-A TV XXX ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %enco_a_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "enco_a_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. ENCODER-B TV XXX
ping -n %num_pings% %enco_b_tv_xxx_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "enco_b_tv_xxx_status=OK"
) else (
echo. >> %log_file%
echo. ### ENCODER-B TV XXX ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %enco_b_tv_xxx_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "enco_b_tv_xxx_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. IBUC-A TV YYY
ping -n %num_pings% %ibuc_a_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "ibuc_a_tv_yyy_status=OK"
) else (
echo. >> %log_file%
echo. ### IBUC-A TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %ibuc_a_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "ibuc_a_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. IBUC-B TV YYY
ping -n %num_pings% %ibuc_b_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "ibuc_b_tv_yyy_status=OK"
) else (
echo. >> %log_file%
echo. ### IBUC-B TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %ibuc_b_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "ibuc_b_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. MODULADOR-A TV YYY
ping -n %num_pings% %modu_a_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "modu_a_tv_yyy_status=OK"
) else (
echo. >>  %log_file%
echo. ### MODULADOR-A TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %modu_a_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "modu_a_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. MODULADOR-B TV YYY
ping -n %num_pings% %modu_b_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "modu_b_tv_yyy_status=OK"
) else (
echo. >> %log_file%
echo. ### MODULADOR-B TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %modu_b_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "modu_b_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. ENCODER-A TV YYY
ping -n %num_pings% %enco_a_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "enco_a_tv_yyy_status=OK"
) else (
echo. >> %log_file%
echo. ### ENCODER-A TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %enco_a_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "enco_a_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
call:status_frame
call:color_frame
call:get_date
rem ----------------------------------------------------------------
echo. ENCODER-B TV YYY
ping -n %num_pings% %enco_b_tv_yyy_host% | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo. SUCCESS
set "enco_b_tv_yyy_status=OK"
) else (
echo. >> %log_file%
echo. ### IENCODER-B TV YYY ### >> %log_file%
echo. %date_time% >> %log_file%
echo. >> %log_file%
ping -n %reg_pings% %enco_b_tv_yyy_host% >> %log_file%
echo. ------------------------------------------------------------------------------ >> %log_file%
echo. FAILURE
set "enco_b_tv_yyy_status=PROBLEM"
)
ping -n %wait_for% 127.0.0.1 > nul
rem ----------------------------------------------------------------

cls
goto loop
rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------
:status_frame
echo. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
echo. "___________                            .__                 .__        "
echo. "\_   _____/ ____    ____   ____   ____ |  |__ _____ _______|__|____   "
echo. " |    __)_ /    \  / ___\_/ __ \ /    \|  |  \\__  \\_  __ \  \__  \  "
echo. " |        \   |  \/ /_/  >  ___/|   |  \   Y  \/ __ \|  | \/  |/ __ \_"
echo. "/_______  /___|  /\___  / \___  >___|  /___|  (____  /__|  |__(____  /"
echo. "        \/     \//_____/      \/     \/     \/     \/              \/ "
echo. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
echo.
echo  \$\$\$\$                     \$\$\$\$\$\$'
echo   \$\$\$\$\.\$\$\$                 \$\$\$\$\$\$\$\$.
echo   \$\$\$\$\$\$'\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
echo   \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
echo     \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
echo   A\$\$\$\$\$\$\$\$\$....0¯)`\$\$;\$\$\$\$\$....0¯)  , ,
echo   \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$L / /
echo   \$\$\$\$\$\$\$\$\$\$_\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$./ /
echo   \$\$\$\$\$\$\$\$\$_\$\$\$\$\$'\$\$\$\$\$\$\$\$.\$\$.\$\$\$`\$\$./
echo   \$\$\$\$\$\$\$\$\$_\$\$\$\$\$\$\$'\$\$\$\$\$.\$\$\$\$.\$\$\$`\$\$---"
echo  \$\$\$\$\$\$\$\$\$\$_\$\$\$\$\$\$\$\$\$\$\$\$\$\$____\$\$\$\$\$\$`
echo  \$\$\$\$\$\$\$\$\$\$\$\$_\$\$\$\$\$\$\$\$\$\$\$\$\$_\$\$\$\$\$\$
echo  \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$___^|  /'___^|  /\$
echo  \$\$\$\$\$\$\$\$\$\$\$\$\$\$_____^| /_____^| /\$
echo  \$\$\$\$\$\$\$\$\$\$\$\$\$__eeee^|/____\$\$^|/
echo  \$\$\$\$\$\$\$\$\$\$\$\$\$__,___,____\$\$
echo  \$\$\$\$\$\$\$\$\$\$\$\$\$\$__,___,____\$\$
echo  \$\$\$\$\$\$\$\$\$\$\$\$ \$\$___/^|___,__\$/^|
echo  \$\$\$\$\$\$\$\$\$\$\$   \$\$_/ ^|,_____/ ^| 
 echo  \$\$\$\$\$\$\$\$\$\$     $/  ^|_____/  ^|\$
echo E\$\$\$\$\$\$\$\$       \$\$\$\$\$\$\$\$\$\$\$\$\$
echo  \$\$\$\$\$\$\$\$         \$\$\$\$\$\$\$\$\$\$X
echo.
rem ----------------------------------------------------------------
echo.-------------------------------------------------------------------------
echo.# IBUC      A TV XXX: %ibuc_a_tv_xxx_status%                                             #
echo.# IBUC      B TV XXX: %ibuc_b_tv_xxx_status%                                             #
echo.# MODULADOR A TV XXX: %modu_a_tv_xxx_status%                                             #
echo.# MODULADOR B TV XXX: %modu_b_tv_xxx_status%                                             #
echo.# ENCODER   A TV XXX: %enco_a_tv_xxx_status%                                             #
echo.# ENCODER   B TV XXX: %enco_b_tv_xxx_status%                                             #
echo.#                                                                       #
echo.# IBUC      A TV  YYY : %ibuc_a_tv_yyy_status%                                             #
echo.# IBUC      B TV  YYY : %ibuc_b_tv_yyy_status%                                             #
echo.# MODULADOR A TV  YYY : %modu_a_tv_yyy_status%                                             #
echo.# MODULADOR B TV  YYY : %modu_b_tv_yyy_status%                                             #
echo.# ENCODER   A TV  YYY : %enco_a_tv_yyy_status%                                             #
echo.# ENCODER   B TV  YYY : %enco_b_tv_yyy_status%                                             #
echo.-------------------------------------------------------------------------
rem ----------------------------------------------------------------
exit /b
rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------
:color_frame
if %ibuc_a_tv_xxx_status% == PROBLEM (
color C1
) else (
if %ibuc_b_tv_xxx_status% == PROBLEM (
color C1
) else (
if %modu_a_tv_xxx_status% == PROBLEM (
color C1
) else (
if %modu_b_tv_xxx_status% == PROBLEM (
color C1
) else (
if %enco_a_tv_xxx_status% == PROBLEM (
color C1
) else (
if %enco_b_tv_xxx_status% == PROBLEM (
color C1
) else (
if %ibuc_a_tv_yyy_status% == PROBLEM (
color C1
) else (
if %ibuc_b_tv_yyy_status% == PROBLEM (
color C1
) else (
if %modu_a_tv_yyy_status% == PROBLEM (
color C1
) else (
if %modu_b_tv_yyy_status% == PROBLEM (
color C1
) else (
if %enco_a_tv_yyy_status% == PROBLEM (
color C1
) else (
if %enco_b_tv_yyy_status% == PROBLEM (
color C1
) else (
color 1F
)
)
)
)
)
)
)
)
)
)
)
)
exit /b
rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------
:get_date
echo.
if "%time:~0,1%" LSS "1" (
  set date_time=DATA: %date:~0,2%/%date:~3,2%/20%date:~6,4% // HORA: 0%time:~1,1%h %time:~3,2%min %time:~6,2%s
) else (
  set date_time=DATA: %date:~0,2%/%date:~3,2%/20%date:~6,4% // HORA: %time:~1,1%h %time:~3,2%min %time:~6,2%s
)
echo %date_time%
echo.
exit /b
rem ------------------------------------------------------------------------
rem ------------------------------------------------------------------------

rem ------------------------------------------------------------------------
rem OBSERVACOES:
rem 
rem 06/06/2018 - Incluido todos os equipamentos das cadeias de tramissao da
rem              Tv XXX e da Tv XXX. 
rem              Criado duas sub-rotinas: status_frame e color_frame. A 
rem              primeira trata os status dos equipamentos enquanto que a 
rem              segunda controla a cor do prompt, matendo um alerta visual.
rem              Alex S. Marques.
rem 
rem 07/06/2018 - Incluido a sub-rotina get_date para usar informacoes de 
rem              data e hora no script.
rem              Atualizado modo de registro no arquivo de log e a interface
rem              do programa.
rem              Alex S. Marques.
rem ------------------------------------------------------------------------

Algumas limitações impediram o encurtamento do script devido a limitações do PC que ele roda. Mas ele foi testado nos Windows XP, 7, 8 e 10, não apresentado problemas. Atualmente está rodando por quase 20 dias sem apresentar problemas. 

Futuramente pretendo adicionar um beep para que o alarme seja visual e sonoro e também adicionar o envio automatizado de e-mail, coisa já está na fase de testes.

Algumas opções de personalização foram encontrados na internet como a pantera


O código informado irá produzir a seguinte interface:


Interface esta que fica vermelha em caso de problema.

Uma Central Técnica pode ser responsável pelo monitoramento e controle de uma quantidade gigantesca de equipamentos. Com esse projeto pode-se reunir a monitoração de vários equipamentos em uma única janela.

Nem todo tipo de problema será identificado dessa forma, mas se alguma falha no equipamento o fizer perder conexão, como já aconteceu no IBUC-B do meu trabalho, onde uma falha o fez desligar, o tempo de resposta para uma ação preventiva poderá ser consideravelmente encurtado. 

Atualizações no projeto serão postadas sempre que possível.


Comentários