From ffca5a9a316ae358f89ca8771ac4c5f50be57edf Mon Sep 17 00:00:00 2001 From: Juan Ferrer Toribio Date: Sun, 20 Oct 2024 11:54:28 +0200 Subject: [PATCH] Plugins updated --- README.md | 5 +- check_backup/v1/check_backup.py | 28 ---- check_backup/v1/check_backup_cisco.py | 80 ----------- check_backup/v1/check_backup_huawei.py | 50 ------- check_backup/v1/check_backup_mikrotik.py | 77 ----------- check_backup/v1/check_backup_opnsense.py | 50 ------- check_backup/v2/check_backup_base_v2.py | 37 ----- check_backup/v2/check_backup_cisco_v2.py | 37 ----- check_backup/v2/check_backup_huawei_v2.py | 37 ----- ...ck_backup_huawei_wireless-controller_v2.py | 37 ----- check_backup/v2/check_backup_mikrotik_v2.py | 55 -------- check_backup/v2/check_backup_opnsense_v2.py | 37 ----- check_papago/check_papago_condensation | 67 --------- check_papago/check_papago_humidity | 67 --------- check_papago/check_papago_temperature | 67 --------- plugins/check_backup/check.sh | 50 +++++++ plugins/check_backup/config.sh | 3 + plugins/check_backup/devices.yml | 3 + plugins/check_chrony | 127 ++++++++++++++++++ {check_mem => plugins}/check_freemem | 8 +- plugins/check_papago | 76 +++++++++++ plugins/check_smartdisk.sh | 22 +++ plugins/check_zfs.pl | 120 +++++++++++++++++ 23 files changed, 406 insertions(+), 734 deletions(-) delete mode 100644 check_backup/v1/check_backup.py delete mode 100644 check_backup/v1/check_backup_cisco.py delete mode 100644 check_backup/v1/check_backup_huawei.py delete mode 100644 check_backup/v1/check_backup_mikrotik.py delete mode 100644 check_backup/v1/check_backup_opnsense.py delete mode 100644 check_backup/v2/check_backup_base_v2.py delete mode 100644 check_backup/v2/check_backup_cisco_v2.py delete mode 100644 check_backup/v2/check_backup_huawei_v2.py delete mode 100644 check_backup/v2/check_backup_huawei_wireless-controller_v2.py delete mode 100644 check_backup/v2/check_backup_mikrotik_v2.py delete mode 100644 check_backup/v2/check_backup_opnsense_v2.py delete mode 100755 check_papago/check_papago_condensation delete mode 100755 check_papago/check_papago_humidity delete mode 100755 check_papago/check_papago_temperature create mode 100755 plugins/check_backup/check.sh create mode 100644 plugins/check_backup/config.sh create mode 100644 plugins/check_backup/devices.yml create mode 100755 plugins/check_chrony rename {check_mem => plugins}/check_freemem (80%) create mode 100755 plugins/check_papago create mode 100755 plugins/check_smartdisk.sh create mode 100755 plugins/check_zfs.pl diff --git a/README.md b/README.md index a782eff..747f955 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# CUSTOM NAGIOS CHECK PLUGINS -In this repo , you can find custom checks plugins for Nagios , developed in bash or python. +# Verdnatura Nagios plugins + +Collection of custom plugins used by Verdnatura. diff --git a/check_backup/v1/check_backup.py b/check_backup/v1/check_backup.py deleted file mode 100644 index 23a1e9b..0000000 --- a/check_backup/v1/check_backup.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -########################### -# Estado: En progreso # -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### - -import subprocess -import os -import sys -from datetime import datetime - -def verificar_backup(): - # lógica para verificar archivos de backup con la fecha de hoy - directorio_backup = "/srv/tftp/backup" - fecha_hoy = datetime.now().strftime('%Y%m%d') - archivos_backup = [f for f in os.listdir(directorio_backup) if f.endswith('.bak') and f.startswith(fecha_hoy)] - - if archivos_backup: - mensaje = "Archivos de backup de hoy encontrados: " + ', '.join(archivos_backup) - print("OK:", mensaje) - sys.exit(0) # OK - else: - mensaje = "No se encontraron archivos de backup de hoy." - print("CRITICAL:", mensaje) - sys.exit(2) # Critical - -verificar_backup() diff --git a/check_backup/v1/check_backup_cisco.py b/check_backup/v1/check_backup_cisco.py deleted file mode 100644 index 461d30f..0000000 --- a/check_backup/v1/check_backup_cisco.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### - -import subprocess -import os -import sys -from datetime import datetime - -def verificar_backup(): - # Lista de nombres de archivos específicos - nombres_archivos = ["sw19", "sw20", "sw21", "hol-sw1"] - # Variable fecha actual - fecha_actual = datetime.now().strftime('%Y%m%d') - # Variable directorio backups - directorio_backup = "/srv/tftp/backup" - - # archivos que deberian existir running config - archivos_deberian_existir_running_config = [nombre + '-running-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-running-config-' + fecha_actual ] - - # archivos que deberian existir boot - archivos_deberian_existir_boot = [nombre + '-boot-' + fecha_actual for nombre in nombres_archivos if nombre + '-boot-' + fecha_actual ] - - # lista concatenada archivos_deberian_existir running_config + boot - lista_concatenada_archivos_deberian_existir = archivos_deberian_existir_running_config + archivos_deberian_existir_boot - - # debug deberian existir running config - #print("archivosQueDeberianExistir _running_config:", archivos_deberian_existir_running_config) # debug - # debug deberian existir boot - #print("archivosQueDeberianExistir _boot:", archivos_deberian_existir_boot) # debug - # debug lista concatenada archivos_deberian_existir running_config + boot - #print("archivos_deberian_existir running_config + boot:", lista_concatenada_archivos_deberian_existir) # debug - - # archivos encontrados / existentes _running_config - archivos_encontrados_running_config = [nombre + '-running-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-running-config-' + fecha_actual in os.listdir(directorio_backup)] - - # archivos encontrados / existentes _boot - archivos_encontrados_boot = [nombre + '-boot-' + fecha_actual for nombre in nombres_archivos if nombre + '-boot-' + fecha_actual in os.listdir(directorio_backup)] - - # lista concatenada archivos encontrados / existentes running_config + boot - lista_concatenada_archivos_encontrados = archivos_encontrados_running_config + archivos_encontrados_boot - - # debug archivos encontrados / existentes _running_config - #print("archivosEncontrados:", archivos_encontrados_running_config) # debug - # debug archivos encontrados / existentes _boot - #print("archivosEncontrados:", archivos_encontrados_boot) # debug - # debug lista concatenada archivos encontrados / existentes running_config + boot - #print("archivosEncontrados running_config + boot:", lista_concatenada_archivos_encontrados) # debug - - # archivos no encontrados / no existentes _running_config - archivos_no_encontrados_running_config = [nombre + '-running-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-running-config-' + fecha_actual not in os.listdir(directorio_backup)] - - # archivos no encontrados / no existentes _boot - archivos_no_encontrados_boot = [nombre + '-boot-' + fecha_actual for nombre in nombres_archivos if nombre + '-boot-' + fecha_actual not in os.listdir(directorio_backup)] - - # lista concatenada archivos encontrados / existentes running_config + boot - lista_concatenada_archivos_no_encontrados = archivos_no_encontrados_running_config + archivos_no_encontrados_boot - - # debug archivos no encontrados / no existentes _running_config - #print("archivosNoEncontrados_running_config:", archivos_no_encontrados_running_config) # debug - # debug archivos no encontrados / no existentes _boot - #print("archivosNoEncontrados_boot:", archivos_no_encontrados_boot) # debug - # debug lista concatenada archivos no encontrados / no existentes running_config + boot - #print("archivosNoEncontrados running_config + boot:", lista_concatenada_archivos_no_encontrados) # debug - - # lógica para verificar la existencia de archivos específicos para la fecha de hoy - if lista_concatenada_archivos_deberian_existir != lista_concatenada_archivos_encontrados: - mensaje = f"No se encontraron archivos de backup para la fecha {fecha_actual} o falta alguno , archivos encontrados {lista_concatenada_archivos_encontrados} , archivos que deberian existir {lista_concatenada_archivos_deberian_existir} , Archivos no encontrados: {lista_concatenada_archivos_no_encontrados} , Revisar backups en /srv/tftp/backup ." - print("CRITICAL:", mensaje) - sys.exit(2) # Critical - else: - mensaje = f"Archivos de backup encontrados {', '.join(lista_concatenada_archivos_encontrados)} ." - print("OK:", mensaje) - sys.exit(0) # OK - -verificar_backup() diff --git a/check_backup/v1/check_backup_huawei.py b/check_backup/v1/check_backup_huawei.py deleted file mode 100644 index b8580a3..0000000 --- a/check_backup/v1/check_backup_huawei.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### - -import subprocess -import os -import sys -from datetime import datetime - -def verificar_backup(): - # Lista de nombres de archivos específicos - nombres_archivos = ["sw1", "sw2", "sw3", "sw5", "sw6", "sw7", "sw8", "sw9", "sw10", "sw11", "sw12", "sw13", "sw14", "sw15", "sw16", "sw18", "sw24"] - # Variable fecha actual - fecha_actual = datetime.now().strftime('%Y%m%d') - # Variable directorio backups - directorio_backup = "/srv/tftp/backup" - - # archivos que deberian existir - archivos_deberian_existir = [nombre + '-vrpcfg-' + fecha_actual + '.zip' for nombre in nombres_archivos if nombre + '-vrpcfg-' + fecha_actual + '.zip'] - - # debug - #print("archivosQueDeberianExistir:", archivos_deberian_existir) # debug - - # archivos encontrados / existentes - archivos_encontrados = [nombre + '-vrpcfg-' + fecha_actual + '.zip' for nombre in nombres_archivos if nombre + '-vrpcfg-' + fecha_actual + '.zip' in os.listdir(directorio_backup)] - - # archivos no encontrados / no existentes - archivos_no_encontrados = [nombre + '-vrpcfg-' + fecha_actual + '.zip' for nombre in nombres_archivos if nombre + '-vrpcfg-' + fecha_actual + '.zip' not in os.listdir(directorio_backup)] - - # debug - #print("archivosEncontrados:", archivos_encontrados) # debug - - # debug - #print("archivosNoEncontrados:", archivos_no_encontrados) # debug - - # lógica para verificar la existencia de archivos específicos para la fecha de hoy - if archivos_deberian_existir != archivos_encontrados: - mensaje = f"No se encontraron archivos de backup para la fecha {fecha_actual} o falta alguno , archivos encontrados {archivos_encontrados} , archivos que deberian existir {archivos_deberian_existir} , Archivos no encontrados: {archivos_no_encontrados} , Revisar backups en /srv/tftp/backup ." - print("CRITICAL:", mensaje) - sys.exit(2) # Critical - else: - mensaje = f"Archivos de backup encontrados {', '.join(archivos_encontrados)} ." - print("OK:", mensaje) - sys.exit(0) # OK - -verificar_backup() diff --git a/check_backup/v1/check_backup_mikrotik.py b/check_backup/v1/check_backup_mikrotik.py deleted file mode 100644 index 55ed9e6..0000000 --- a/check_backup/v1/check_backup_mikrotik.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### - -import subprocess -import os -import sys -from datetime import datetime - -def verificar_backup(): - # Lista de nombres de archivos específicos - nombres_archivos = ["madrid", "holland"] - # Variable fecha actual - fecha_actual = datetime.now().strftime('%Y%m%d') - # Variable directorio backups - directorio_backup = "/srv/tftp/backup" - - # archivos backup que deberian existir - archivos_backup_deberian_existir = [nombre + '-backup-' + fecha_actual + '.backup' for nombre in nombres_archivos if nombre + '-backup-' + fecha_actual + '.backup'] - - # debug - #print("archivosQueDeberianExistir:", archivos_backup_deberian_existir) # debug - - # archivos backupscript que deberian existir - archivos_backupscript_deberian_existir = [nombre + '-backupscript-' + fecha_actual + '.rsc' for nombre in nombres_archivos if nombre + '-backupscript-' + fecha_actual + '.rsc'] - - # debug - #print("archivosQueDeberianExistir:", archivos_backupscript_deberian_existir) # debug - - # lista concatenada archivos_deberian_existir backup + backupscript - lista_concatenada_archivos_deberian_existir = archivos_backup_deberian_existir + archivos_backupscript_deberian_existir - - # archivos backup encontrados / existentes - archivos_backup_encontrados = [nombre + '-backup-' + fecha_actual + '.backup' for nombre in nombres_archivos if nombre + '-backup-' + fecha_actual + '.backup' in os.listdir(directorio_backup)] - - # debug - #print("archivosEncontrados:", archivos_backup_encontrados) # debug - - # archivos backupscript encontrados / existentes - archivos_backupscript_encontrados = [nombre + '-backupscript-' + fecha_actual + '.rsc' for nombre in nombres_archivos if nombre + '-backupscript-' + fecha_actual + '.rsc' in os.listdir(directorio_backup)] - - # debug - #print("archivosEncontrados:", archivos_backupscript_encontrados) # debug - - # lista concatenada archivos_encontrados backup + backupscript - lista_concatenada_archivos_encontrados = archivos_backup_encontrados + archivos_backupscript_encontrados - - # archivos backup no encontrados / existentes - archivos_backup_no_encontrados = [nombre + '-backup-' + fecha_actual + '.backup' for nombre in nombres_archivos if nombre + '-backup-' + fecha_actual + '.backup' not in os.listdir(directorio_backup)] - - # debug - #print("archivosbackupNoEncontrados:", archivos_backup_no_encontrados) # debug - - # archivos backupscript no encontrados / existentes - archivos_backupscript_no_encontrados = [nombre + '-backupscript-' + fecha_actual + '.rsc' for nombre in nombres_archivos if nombre + '-backupscript-' + fecha_actual + '.rsc' not in os.listdir(directorio_backup)] - - # debug - #print("archivosbackupscriptNoEncontrados:", archivos_backupscript_no_encontrados) # debug - - # lista concatenada archivos_no_encontrados backup + backupscript - lista_concatenada_archivos_no_encontrados = archivos_backup_no_encontrados + archivos_backupscript_no_encontrados - - # lógica para verificar la existencia de archivos específicos para la fecha de hoy - if lista_concatenada_archivos_deberian_existir != lista_concatenada_archivos_encontrados: - mensaje = f"No se encontraron archivos de backup para la fecha {fecha_actual} o falta alguno , archivos encontrados {lista_concatenada_archivos_encontrados} , archivos que deberian existir {lista_concatenada_archivos_deberian_existir} , Archivos no encontrados: {lista_concatenada_archivos_no_encontrados} , Revisar backups en /srv/tftp/backup ." - print("CRITICAL:", mensaje) - sys.exit(2) # Critical - else: - mensaje = f"Archivos de backup encontrados {', '.join(lista_concatenada_archivos_encontrados)} ." - print("OK:", mensaje) - sys.exit(0) # OK - -verificar_backup() diff --git a/check_backup/v1/check_backup_opnsense.py b/check_backup/v1/check_backup_opnsense.py deleted file mode 100644 index b07e329..0000000 --- a/check_backup/v1/check_backup_opnsense.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### - -import subprocess -import os -import sys -from datetime import datetime - -def verificar_backup(): - # Lista de nombres de archivos específicos - nombres_archivos = ["gw1"] - # Variable fecha actual - fecha_actual = datetime.now().strftime('%Y%m%d') - # Variable directorio backups - directorio_backup = "/srv/tftp/backup" - - # archivos que deberian existir - archivos_deberian_existir = [nombre + '-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-config-' + fecha_actual] - - # debug - #print("archivosQueDeberianExistir:", archivos_deberian_existir) # debug - - # archivos encontrados / existentes - archivos_encontrados = [nombre + '-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-config-' + fecha_actual in os.listdir(directorio_backup)] - - # debug - #print("archivosEncontrados:", archivos_encontrados) # debug - - # archivos no encontrados / no existentes - archivos_no_encontrados = [nombre + '-config-' + fecha_actual for nombre in nombres_archivos if nombre + '-config-' + fecha_actual not in os.listdir(directorio_backup)] - - # debug - #print("archivosNoEncontrados:", archivos_no_encontrados) # debug - - # lógica para verificar la existencia de archivos específicos para la fecha de hoy - if archivos_deberian_existir != archivos_encontrados: - mensaje = f"No se encontraron archivos de backup para la fecha {fecha_actual} o falta alguno , archivos encontrados {archivos_encontrados} , archivos que deberian existir {archivos_deberian_existir} , Archivos no encontrados: {archivos_no_encontrados} , Revisar backups en /srv/tftp/backup ." - print("CRITICAL:", mensaje) - sys.exit(2) # Critical - else: - mensaje = f"Archivos de backup encontrados {', '.join(archivos_encontrados)} ." - print("OK:", mensaje) - sys.exit(0) # OK - -verificar_backup() diff --git a/check_backup/v2/check_backup_base_v2.py b/check_backup/v2/check_backup_base_v2.py deleted file mode 100644 index 490235c..0000000 --- a/check_backup/v2/check_backup_base_v2.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y-%m-%d") - missing_files = [] - - # Comprobar todos los archivos esperados - for base_name in filenames: - expected_filename = f"{base_name}-{today}.tar.gz" - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames) - sys.exit(result) diff --git a/check_backup/v2/check_backup_cisco_v2.py b/check_backup/v2/check_backup_cisco_v2.py deleted file mode 100644 index 258559f..0000000 --- a/check_backup/v2/check_backup_cisco_v2.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y%m%d") - missing_files = [] - - # Comprobar todos los archivos esperados - for base_name in filenames: - expected_filename = f"{base_name}-{today}" - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames) - sys.exit(result) diff --git a/check_backup/v2/check_backup_huawei_v2.py b/check_backup/v2/check_backup_huawei_v2.py deleted file mode 100644 index 13cb6db..0000000 --- a/check_backup/v2/check_backup_huawei_v2.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y%m%d") - missing_files = [] - - # Comprobar todos los archivos esperados - for base_name in filenames: - expected_filename = f"{base_name}-{today}.zip" - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames) - sys.exit(result) diff --git a/check_backup/v2/check_backup_huawei_wireless-controller_v2.py b/check_backup/v2/check_backup_huawei_wireless-controller_v2.py deleted file mode 100644 index 13cb6db..0000000 --- a/check_backup/v2/check_backup_huawei_wireless-controller_v2.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y%m%d") - missing_files = [] - - # Comprobar todos los archivos esperados - for base_name in filenames: - expected_filename = f"{base_name}-{today}.zip" - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames) - sys.exit(result) diff --git a/check_backup/v2/check_backup_mikrotik_v2.py b/check_backup/v2/check_backup_mikrotik_v2.py deleted file mode 100644 index 3737184..0000000 --- a/check_backup/v2/check_backup_mikrotik_v2.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames, extensions): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y%m%d") - missing_files = [] - - # lista de nombres de archivos a excluir de la comprobacion - excluded_files_one = ["holland-backupscript", "madrid-backupscript", "barcelona-backupscript"] - excluded_files_two = ["holland-backup", "madrid-backup", "barcelona-backup"] - - # Lista de nombres de archivo a excluir que NO existen ej. holland-backupscript-fecha.backup - excluded_names_one = [f"{file_name}-{today}.backup" for file_name in excluded_files_one] - # Lista de nombres de archivo a excluir que NO existen ej. holland-backup-fecha.backup - excluded_names_two = [f"{file_name}-{today}.rsc" for file_name in excluded_files_two] - # Suma de arrays con lista de nombres de archivos a excluir - excluded_names = excluded_names_one + excluded_names_two - - # Comprobar todos los archivos esperados - for base_name in filenames: - for extension in extensions: - expected_filename = f"{base_name}-{today}.{extension}" - - # si el nombre base esta en la lista de nombres excluidos , continuar con el siguiente nombre - if expected_filename in excluded_names: - continue - - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - extensions = ['rsc', 'backup'] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames, extensions) - sys.exit(result) diff --git a/check_backup/v2/check_backup_opnsense_v2.py b/check_backup/v2/check_backup_opnsense_v2.py deleted file mode 100644 index 258559f..0000000 --- a/check_backup/v2/check_backup_opnsense_v2.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -import os -import datetime -import sys - -def check_backups(directory, filenames): - # Obtener la fecha actual en formato año-mes-día - today = datetime.datetime.now().strftime("%Y%m%d") - missing_files = [] - - # Comprobar todos los archivos esperados - for base_name in filenames: - expected_filename = f"{base_name}-{today}" - full_path = os.path.join(directory, expected_filename) - - if not os.path.exists(full_path): - missing_files.append(expected_filename) - - if missing_files: - print(f"CRITICAL: Missing backup files in {directory}: " + ", ".join(missing_files)) - return 2 # Código de salida para CRITICAL - - print("OK: All backup files exist.") - return 0 # Código de salida para OK - -if __name__ == "__main__": - # Chequear si se proporcionaron suficientes argumentos - if len(sys.argv) < 3: - print("Usage: {} [ ...]".format(sys.argv[0])) - sys.exit(3) # Código de salida para UNKNOWN - - backup_directory = sys.argv[1] - filenames = sys.argv[2:] - - # Llamar a la función de comprobación y salir con el código de estado adecuado - result = check_backups(backup_directory, filenames) - sys.exit(result) diff --git a/check_papago/check_papago_condensation b/check_papago/check_papago_condensation deleted file mode 100755 index e647e67..0000000 --- a/check_papago/check_papago_condensation +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 29/04/2024 # -########################### - -import sys -import requests -import xml.etree.ElementTree as ET - -def obtener_condensacion_cpd(url, nombre_rack, umbral_warning, umbral_critical): - try: - # Realizar la solicitud HTTP al dispositivo - response = requests.get(url) - # Verificar si la solicitud fue exitosa - if response.status_code == 200: - # Parsear el XML recibido - root = ET.fromstring(response.text) - # Buscar el elemento 'status' que contiene la ubicación del CPD - status_cpd = root.find(".//status") - if status_cpd is not None: - ubicacion_cpd = status_cpd.get('location', 'Desconocido') - # Buscar el elemento 'sns' con el nombre del rack especificado - rack_cpd = root.find(f".//sns[@name='{nombre_rack}']") - if rack_cpd is not None: - # Obtener el valor de la condensación del CPD - condensacion_cpd = float(rack_cpd.get('val3')) - # Comprobar los umbrales - if condensacion_cpd >= umbral_critical: - print(f"CRITICAL: Condensación del {ubicacion_cpd} {nombre_rack} ({condensacion_cpd}°C) excede el umbral crítico ({umbral_critical}°C)") - sys.exit(2) - elif condensacion_cpd >= umbral_warning: - print(f"WARNING: Condensación del {ubicacion_cpd} {nombre_rack} ({condensacion_cpd}°C) excede el umbral de advertencia ({umbral_warning}°C)") - sys.exit(1) - else: - print(f"OK: Condensación del {ubicacion_cpd} {nombre_rack}: {condensacion_cpd}°C") - sys.exit(0) - else: - print(f"Error: No se encontró el rack '{nombre_rack}' en el XML.") - sys.exit(3) - else: - print("Error: No se encontró el elemento 'status' en el XML.") - sys.exit(3) - else: - print("Error: No se pudo obtener el XML del dispositivo.") - sys.exit(3) - except Exception as e: - print(f"Error: {e}") - sys.exit(3) - -if __name__ == "__main__": - # Verificar la cantidad de argumentos - if len(sys.argv) != 5: - print("Uso: python script.py ") - sys.exit(3) - - # Argumentos de línea de comandos - ip_dispositivo = sys.argv[1] - nombre_rack = sys.argv[2] - umbral_warning = float(sys.argv[3]) - umbral_critical = float(sys.argv[4]) - - # URL del dispositivo que proporciona el XML - url_dispositivo = f"http://{ip_dispositivo}/fresh.xml" - obtener_condensacion_cpd(url_dispositivo, nombre_rack, umbral_warning, umbral_critical) diff --git a/check_papago/check_papago_humidity b/check_papago/check_papago_humidity deleted file mode 100755 index 0fef7d8..0000000 --- a/check_papago/check_papago_humidity +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 29/04/2024 # -########################### - -import sys -import requests -import xml.etree.ElementTree as ET - -def obtener_humedad_cpd(url, nombre_rack, umbral_warning, umbral_critical): - try: - # Realizar la solicitud HTTP al dispositivo - response = requests.get(url) - # Verificar si la solicitud fue exitosa - if response.status_code == 200: - # Parsear el XML recibido - root = ET.fromstring(response.text) - # Buscar el elemento 'status' que contiene la ubicación del CPD - status_cpd = root.find(".//status") - if status_cpd is not None: - ubicacion_cpd = status_cpd.get('location', 'Desconocido') - # Buscar el elemento 'sns' con el nombre del rack especificado - rack_cpd = root.find(f".//sns[@name='{nombre_rack}']") - if rack_cpd is not None: - # Obtener el valor de la humedad del CPD - humedad_cpd = float(rack_cpd.get('val2')) - # Comprobar los umbrales - if humedad_cpd >= umbral_critical: - print(f"CRITICAL: Humedad del {ubicacion_cpd} {nombre_rack} ({humedad_cpd}%) excede el umbral crítico ({umbral_critical}%)") - sys.exit(2) - elif humedad_cpd >= umbral_warning: - print(f"WARNING: Humedad del {ubicacion_cpd} {nombre_rack} ({humedad_cpd}%) excede el umbral de advertencia ({umbral_warning}%)") - sys.exit(1) - else: - print(f"OK: Humedad del {ubicacion_cpd} {nombre_rack}: {humedad_cpd}%") - sys.exit(0) - else: - print(f"Error: No se encontró el rack '{nombre_rack}' en el XML.") - sys.exit(3) - else: - print("Error: No se encontró el elemento 'status' en el XML.") - sys.exit(3) - else: - print("Error: No se pudo obtener el XML del dispositivo.") - sys.exit(3) - except Exception as e: - print(f"Error: {e}") - sys.exit(3) - -if __name__ == "__main__": - # Verificar la cantidad de argumentos - if len(sys.argv) != 5: - print("Uso: python script.py ") - sys.exit(3) - - # Argumentos de línea de comandos - ip_dispositivo = sys.argv[1] - nombre_rack = sys.argv[2] - umbral_warning = float(sys.argv[3]) - umbral_critical = float(sys.argv[4]) - - # URL del dispositivo que proporciona el XML - url_dispositivo = f"http://{ip_dispositivo}/fresh.xml" - obtener_humedad_cpd(url_dispositivo, nombre_rack, umbral_warning, umbral_critical) diff --git a/check_papago/check_papago_temperature b/check_papago/check_papago_temperature deleted file mode 100755 index 328b11a..0000000 --- a/check_papago/check_papago_temperature +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -########################### -# Author: Rubenb # -# Fecha: 29/04/2024 # -########################### - -import sys -import requests -import xml.etree.ElementTree as ET - -def obtener_temperatura_cpd(url, nombre_rack, umbral_warning, umbral_critical): - try: - # Realizar la solicitud HTTP al dispositivo - response = requests.get(url) - # Verificar si la solicitud fue exitosa - if response.status_code == 200: - # Parsear el XML recibido - root = ET.fromstring(response.text) - # Buscar el elemento 'status' que contiene la ubicación del CPD - status_cpd = root.find(".//status") - if status_cpd is not None: - ubicacion_cpd = status_cpd.get('location', 'Desconocido') - # Buscar el elemento 'sns' con el nombre del rack especificado - rack_cpd = root.find(f".//sns[@name='{nombre_rack}']") - if rack_cpd is not None: - # Obtener el valor de la temperatura del CPD - temperatura_cpd = float(rack_cpd.get('val')) - # Comprobar los umbrales - if temperatura_cpd >= umbral_critical: - print(f"CRITICAL: Temperatura del {ubicacion_cpd} {nombre_rack} ({temperatura_cpd}°C) excede el umbral crítico ({umbral_critical}°C)") - sys.exit(2) - elif temperatura_cpd >= umbral_warning: - print(f"WARNING: Temperatura del {ubicacion_cpd} {nombre_rack} ({temperatura_cpd}°C) excede el umbral de advertencia ({umbral_warning}°C)") - sys.exit(1) - else: - print(f"OK: Temperatura del {ubicacion_cpd} {nombre_rack}: {temperatura_cpd}°C") - sys.exit(0) - else: - print(f"Error: No se encontró el rack '{nombre_rack}' en el XML.") - sys.exit(3) - else: - print("Error: No se encontró el elemento 'status' en el XML.") - sys.exit(3) - else: - print("Error: No se pudo obtener el XML del dispositivo.") - sys.exit(3) - except Exception as e: - print(f"Error: {e}") - sys.exit(3) - -if __name__ == "__main__": - # Verificar la cantidad de argumentos - if len(sys.argv) != 5: - print("Uso: python script.py ") - sys.exit(3) - - # Argumentos de línea de comandos - ip_dispositivo = sys.argv[1] - nombre_rack = sys.argv[2] - umbral_warning = float(sys.argv[3]) - umbral_critical = float(sys.argv[4]) - - # URL del dispositivo que proporciona el XML - url_dispositivo = f"http://{ip_dispositivo}/fresh.xml" - obtener_temperatura_cpd(url_dispositivo, nombre_rack, umbral_warning, umbral_critical) diff --git a/plugins/check_backup/check.sh b/plugins/check_backup/check.sh new file mode 100755 index 0000000..82bd24e --- /dev/null +++ b/plugins/check_backup/check.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +MY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$MY_DIR/config.sh" + +DAY=$(date +%Y-%m-%d) +MISSING_BACKUPS=() +N_CHECKED=0 +N_PRESENT=0 +N_FILES=0 + +mapfile -t ZONES < <(yq -c -r '.devices | keys[]' "$DEV_FILE") +for ZONE in "${ZONES[@]}"; do + ZONE_JQ=$(yq -c ".devices.$ZONE" "$DEV_FILE") + mapfile -t NAMES < <(yq -c -r 'keys[]' <<< "$ZONE_JQ") + for NAME in "${NAMES[@]}"; do + DEVICE_PATH="$BACKUP_PATH/$ZONE/$NAME" + MISSING="true" + + if [ -d "$DEVICE_PATH" ]; then + DEVICE_N_FILES=$(find "$DEVICE_PATH" -name "${NAME}_${DAY}_*" ! -name "*.log" | wc -l) + N_FILES=$((N_FILES+DEVICE_N_FILES)) + + if [ "$DEVICE_N_FILES" -ge "1" ]; then + MISSING="false" + fi + fi + + if [ "$MISSING" = "true" ]; then + MISSING_BACKUPS+=("$ZONE.$NAME") + else + N_PRESENT=$((N_PRESENT+1)) + fi + + N_CHECKED=$((N_CHECKED+1)) + done +done + +N_MISSING=${#MISSING_BACKUPS[@]} +PERF_DATA="day=$DAY backup_path='$BACKUP_PATH' checked=$N_CHECKED present=$N_PRESENT present_files=$N_FILES" + +if [ "$N_MISSING" -gt "0" ]; then + CRITICAL_DATA="missing=$N_MISSING missing_backups='${MISSING_BACKUPS[@]}'" + echo "CRITICAL - $N_MISSING missing of $N_CHECKED backups | $PERF_DATA $CRITICAL_DATA" + exit 2 +else + echo "OK - All $N_CHECKED backups present | $PERF_DATA" + exit 0 +fi diff --git a/plugins/check_backup/config.sh b/plugins/check_backup/config.sh new file mode 100644 index 0000000..fdbe11a --- /dev/null +++ b/plugins/check_backup/config.sh @@ -0,0 +1,3 @@ +DEV_FILE="$MY_DIR/devices.yml" +BACKUP_DIR="backup" +BACKUP_PATH="/srv/tftp/$BACKUP_DIR" diff --git a/plugins/check_backup/devices.yml b/plugins/check_backup/devices.yml new file mode 100644 index 0000000..c8b24f6 --- /dev/null +++ b/plugins/check_backup/devices.yml @@ -0,0 +1,3 @@ +devices: + dc: + gw1: {host: gw1.local.domain} diff --git a/plugins/check_chrony b/plugins/check_chrony new file mode 100755 index 0000000..bd8cd5d --- /dev/null +++ b/plugins/check_chrony @@ -0,0 +1,127 @@ +#!/usr/bin/env perl +#=============================================================================== +# DESCRIPTION: Icinga2 / Nagios Check for chrony time sync status and offset +# +# OPTIONS: -h : Help +# -w [warning threshold in seconds] +# -c [critical threshold in seconds] +# +# REQUIREMENTS: Chrony, perl version 5.10.1+ +# +# AUTHOR: Dennis Ullrich (request@decstasy.de) +# +# BUGS ETC: https://github.com/Decstasy/check_chrony +# +# LICENSE: GPL v3 (GNU General Public License, Version 3) +# see https://www.gnu.org/licenses/gpl-3.0.txt +#=============================================================================== + +use 5.10.1; +use strict; +use warnings; +use utf8; +use Getopt::Std; + +# +# Variables +# +my $chronyDaemonName = "chronyd"; +my $leapOk = "Normal"; + +my $rc = 3; +my $msg= ""; +my $perfdata = ""; + +# +# Subroutines +# + +sub help { + print "check_chrony [options] + -w [warning threshold in seconds] + -c [critical threshold in seconds] + e.g.: check_chrony -w 0.6 -c 2\n"; + exit(3); +} + +# Script exit with Nagios / Icinga typical output +sub _exit { + my ( $return, $line ) = @_; + my @state = ( "OK", "WARNING", "CRITICAL", "UNKNOWN" ); + print "$state[$return]: $line\n"; + exit( $return ); +} + +# Checks if a process with $_[0] as name exists +sub proc_exists { + my $PID = `ps -C $_[0] -o pid=`; + if ( ${^CHILD_ERROR_NATIVE} == 0 ){ + return 1; + } + return 0; +} + +# +# Options +# + +my %options=(); +getopts( "hw:c:", \%options ); + +# Check input +if ( keys %options == 0 || defined $options{h} ){ + &help; +} + +for my $key ( keys %options ){ + if ( $options{$key} !~ /^[\d\.]+$/ ){ + &_exit( 3, "Value of option -$key is not a valid number!" ); + } +} + +# +# Check chrony process +# + +&_exit( 2, "$chronyDaemonName is not running!" ) if not &proc_exists( $chronyDaemonName ); + +# +# Get tracking data +# + +my $chronyOutput = `chronyc tracking`; +&_exit( 3, "Chronyc tracking command failed!" ) if ${^CHILD_ERROR_NATIVE} != 0; + +my ( $offset, $dir ) = $chronyOutput =~ /(?:System\stime)[^\d]+([\d\.]+)(?:.*?)(fast|slow)/; +my ( $leap ) = $chronyOutput =~ /(?:Leap)[^\:]+(?::\s+)([\w\h]+)/; + +# +# Check stuff +# + +# Check offset +if ( $offset >= $options{"c"} ){ + $rc = 2; # Critical +} +elsif ( $offset >= $options{"w"} ){ + $rc = 1; # Warning +} +else { + $rc = 0; # Ok +} + +# Prepare offset performace data +$offset = $dir =~ "slow" ? "-$offset" : "+$offset"; +$msg = sprintf( "Time offset of %+.9f seconds to reference.", $offset); +$perfdata = sprintf( "|offset=%.9fs;%.9f;%.9f", ${offset}, $options{'w'}, $options{'c'}); + +# Check leap +if( $leap !~ $leapOk ){ + &_exit( 2, "Chrony leap status \"$leap\" is not equal to \"$leapOk\"! $msg $perfdata" ); +} + +# +# Return stuff +# + +&_exit($rc, "$msg $perfdata"); diff --git a/check_mem/check_freemem b/plugins/check_freemem similarity index 80% rename from check_mem/check_freemem rename to plugins/check_freemem index 7934916..ffbcabf 100644 --- a/check_mem/check_freemem +++ b/plugins/check_freemem @@ -1,10 +1,6 @@ #!/usr/bin/env bash -########################### -# Estado: Ok # -# Author: Rubenb # -# Fecha: 04/01/2024 # -########################### +# Author: Ruben Blanco mLine=`free | awk 'NR==2'` mTotal=`echo $mLine| awk '{print $2}'` @@ -30,4 +26,4 @@ then nagios_func "WARNING"; exit 1; else nagios_func "OK"; exit 0; -fi \ No newline at end of file +fi diff --git a/plugins/check_papago b/plugins/check_papago new file mode 100755 index 0000000..60554ac --- /dev/null +++ b/plugins/check_papago @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Author: Ruben Bueno (2024-04-29) +Modified by: Juan Ferrer (2024-09-03) +""" + +import sys +import requests +import xml.etree.ElementTree as ET + +def papago_check_value(host, name, attribute, warning, critical): + try: + match attribute: + case "temp": + xml_attribute = "val" + unit_name = "Temperature" + unit = "ºC" + case "hd": + xml_attribute = "val2" + unit_name = "Humidity" + unit = "%" + case "cond": + xml_attribute = "val3" + unit_name = "Condensation" + unit = "ºC" + case _: + raise ValueError(f"Unknown passed attribute '{attribute}'.") + + response = requests.get(f"http://{host}/fresh.xml") + + if response.status_code != 200: + raise ValueError("Failed to get device XML.") + + root = ET.fromstring(response.text) + status = root.find(".//status") + + if status is None: + raise ValueError("The 'status' element was not found on XML.") + + location = status.get('location', 'Unknown') + data = root.find(f".//sns[@name='{name}']") + + if data is None: + raise ValueError(f"The name element '{name}' was not found on XML.") + + check_value = float(data.get(xml_attribute)) + perf_data = f"check_value={check_value} location={location}" + check_msg = f"{unit_name} of {check_value}{unit} in {location} {name}" + + if check_value >= critical: + print(f"CRITICAL - {check_msg} exceeds the critical threshold of {critical}{unit} | {perf_data}") + sys.exit(2) + elif check_value >= warning: + print(f"WARNING - {check_msg} exceeds the warning threshold of {warning}{unit} | {perf_data}") + sys.exit(1) + else: + print(f"OK - {check_msg} | {perf_data}") + sys.exit(0) + + except Exception as e: + print(f"UNKNOWN - Error: {e}") + sys.exit(3) + +if __name__ == "__main__": + if len(sys.argv) != 6: + print("Usage: check_papago ") + sys.exit(3) + + host = sys.argv[1] + name = sys.argv[2] + attribute = sys.argv[3] + warning = float(sys.argv[4]) + critical = float(sys.argv[5]) + papago_check_value(host, name, attribute, warning, critical) diff --git a/plugins/check_smartdisk.sh b/plugins/check_smartdisk.sh new file mode 100755 index 0000000..605ea12 --- /dev/null +++ b/plugins/check_smartdisk.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Checks status of disks SMART + +STATUS_LABEL="SMART Health Status:" +STATUS_OK="$STATUS_LABEL OK" + +if [[ "$#" == "0" ]]; then + echo "Usage: $0 [ ... ]" + exit +fi + +for DISK in "$@" +do + STATUS=$(sudo /usr/sbin/smartctl -H -d scsi "$DISK" | grep "$STATUS_LABEL") + + if [ "$STATUS" != "$STATUS_OK" ]; then + echo "CRITICAL: $DISK: $STATUS" + exit 2 + fi +done + +echo "OK: $STATUS_OK" diff --git a/plugins/check_zfs.pl b/plugins/check_zfs.pl new file mode 100755 index 0000000..88dc1d9 --- /dev/null +++ b/plugins/check_zfs.pl @@ -0,0 +1,120 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use English; + +$ENV{'PATH'} = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; + +use constant N_OK => 0; +use constant N_WARNING => 1; +use constant N_CRITICAL => 2; +use constant N_MSG => [ "OK", "WARNING", "CRITICAL" ]; + +my @zpool = (); + +sub get_pools() { + local *P; + my $zpool_cmd = $EUID == 0 ? "zpool" : "sudo zpool"; + open(P, $zpool_cmd . " list -H 2>&1 |") or &nagios_response("Could not find zpool command", N_CRITICAL); + while (

) { + chomp; + my @ret = split(/\s+/, $_); + push(@zpool, { + 'name' => $ret[0], + 'health' => $ret[-2], + 'size' => $ret[1], + 'alloc' => $ret[2], + 'free' => $ret[3] + }); + } + close(P); + my $rc = $?; + if ($rc != 0) { + &nagios_response("zpool list command failed (rc=$rc)", N_CRITICAL); + } +} + +sub get_status() +{ + my $storage = shift || "unknown"; + my $cat = 0; + my $res = {}; + local *P; + my $zpool_cmd = $EUID == 0 ? "zpool" : "sudo zpool"; + open(P, $zpool_cmd . " status $storage 2>&1 |") or &nagios_response("Could not find zpool command", N_CRITICAL); + while (

) { + chomp; + if ($_ =~ /^\s*([^\s]+):\s*(.*)$/) { + $cat = $1; + $res->{"$cat"} = (); + if ($2) { + push(@{$res->{"$cat"}}, $2); + } + } elsif ($cat && $_ =~ /^\s+(.+)$/) { + push(@{$res->{"$cat"}}, $1); + } + } + close(P); + my $rc = $?; + if ($rc != 0) { + &nagios_response("zpool status command failed (rc=$rc)", N_CRITICAL); + } + return $res; +} + +sub nagios_response() +{ + my $msg = shift || "Unknown"; + my $exit_status = shift; + if (!defined($exit_status)) { + $exit_status = N_CRITICAL; + } + printf("%s %s\n", N_MSG->[$exit_status], $msg); + exit($exit_status); +} + +sub main() { + + &get_pools(); + my $exit_status = N_OK; + my @out = (); + foreach my $pool (@zpool) { + if ($pool->{'health'} eq 'DEGRADED') { + $exit_status = N_WARNING; + my $extinfo = &get_status($pool->{'name'}); + my $scanned = 0; + my $total = 0; + my $speed = 0; + my $left = 0; + my $percent = 0; + my $resilvered = 0; + if (defined($extinfo->{'scan'})) { + foreach my $line (@{$extinfo->{'scan'}}) { + if ($line =~ /^\s*([^\s]+)\s+scanned out of\s+([^\s]+)\s+at\s+([^\s]+),\s*([^\s]+)\s+to go/) { + $scanned = $1; + $total = $2; + $speed = $3; + $left = $4; + } elsif ($line =~ /^\s*([^\s]+)\s+resilvered,\s*([^\s]+)\s+done/) { + $resilvered = $1; + $percent = $2; + } + } + } + if ($scanned && length($scanned) > 2) { + push(@out, sprintf("%s(RESILVER %s,%s,%s)", $pool->{'name'}, $percent, $speed, $left)); + } else { + push(@out, sprintf("%s(%s %s/%s)", $pool->{'name'}, $pool->{'health'}, $pool->{'alloc'}, $pool->{'size'})); + } + } elsif ($pool->{'health'} ne 'ONLINE') { + $exit_status = N_WARNING; + push(@out, sprintf("%s(%s %s/%s)", $pool->{'name'}, $pool->{'health'}, $pool->{'alloc'}, $pool->{'size'})); + } else { + push(@out, sprintf("%s(%s %s/%s)", $pool->{'name'}, $pool->{'health'}, $pool->{'alloc'}, $pool->{'size'})); + } + } + &nagios_response(join(",", @out), $exit_status); +} + +&main();