Linux server.edchosting.com 4.18.0-553.79.1.lve.el7h.x86_64 #1 SMP Wed Oct 15 16:34:46 UTC 2025 x86_64
LiteSpeed
Server IP : 75.98.162.185 & Your IP : 216.73.216.163
Domains :
Cant Read [ /etc/named.conf ]
User : goons4good
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
lib64 /
nagios /
plugins /
Delete
Unzip
Name
Size
Permission
Date
Action
eventhandlers
[ DIR ]
drwxr-xr-x
2024-03-10 06:52
a2_csf_modsecsync.mvps.mdedi
1.27
KB
-rwxr-xr-x
2025-09-10 09:31
a2_customerview.sh.shared
1.21
KB
-rwxr-xr-x
2025-09-10 09:31
a2_nf_conntrack_count.sh.all
977
B
-rwxr-xr-x
2025-09-10 09:31
a2_postgresql-monitor.shared
1.23
KB
-rwxr-xr-x
2025-09-10 09:31
a2_ram.shared.mdedi.bmi
611
B
-rwxr-xr-x
2025-09-10 09:31
a2_sssd_service_check.sh.all
1.4
KB
-rwxr-xr-x
2025-09-10 09:31
a2_system-updates.all
2.18
KB
-rwxr-xr-x
2025-09-10 09:31
a2_temperature_check.shared.bmi
3.17
KB
-rwxr-xr-x
2025-09-10 09:31
a2_user_mem.shared
1.13
KB
-rwxr-xr-x
2025-09-10 09:31
a2_yum_processes.shared
835
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_backup_network
844
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_backups
2.64
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_cagefs.shared.mvps.mdedi
762
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_cagefs_503_errors
2.96
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_cpdavd_cpu.sh
701
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_cpu_throttle.shared
1.61
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_dbgov.shared
1.23
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_dedi_nvme.mdedi
894
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_devnull-perms.shared
161
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_dimm.shared
1.49
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_disk.sh
2.05
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_dmi.sh.all
2.38
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_dnsdist_cache.sh
298
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_dnsdist_health.sh
270
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_dnsdist_pools.sh
414
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_dnsdist_proc.sh
210
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_dovecot
191
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_extra_ips.shared
854
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_fsstate.sh.all
2.28
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_fw.sh.internal
2.11
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_fw.sh.shared
1.04
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_grub.sh.all
1.22
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_httpdconf.shared
1.16
KB
-rwxr-xr-x
2025-04-15 08:48
check_a2_ifspeed.shared
784
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_imap_auth
1.2
KB
-rwxr-xr-x
2025-02-19 06:03
check_a2_imunify_service
910
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_ipaliases.shared
443
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_ipastatus.sh
2.16
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_ipmi_ip.sh.shared
565
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_jbk_client_limits.sh
1.13
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_jetbackup.sh
12.08
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_largelogs.shared
966
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_le_certs.sh.saltmaster1
1.02
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_load.php
618
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_long_mysql_queries
1.22
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_mailqueue.mvps.mdedi
1.26
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_memlimits-on.shared
458
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_mod-passenger.shared
516
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_monitor-randomize_sqlroot_password_cron.shared.mvps.mdedi
322
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_mysql-monitor.shared.mvps.mdedi
2.62
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_mysql-replication.sh
1.33
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_mysql_tmp_size
242
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_olderdrive_health.all
2.25
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_omni_mysql_backup.sh
1.15
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_omni_pxe_https_check.sh
1.27
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_omni_saltmaster1_authcheck.sh
2.76
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_omni_website.sh
1.01
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_outbound_nat.sh
436
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_packets.mvps
1.73
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_pdns
462
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_php_versions.shared
3.04
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_redis_opcache.shared
1.39
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_salt_minion_service
196
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_salt_running.all
1.83
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_saltmaster_api.sh
1.13
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_smart.py.all
15.54
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_softy_version.sh.shared.mvps.mdedi
1.09
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_vps_memory.sh
411
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_vz7-ikvm_backup.sh
1.2
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_whm_ssl
874
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_whmcs_db_mysql-replication.sh
2.19
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_whmcs_nginx_connections.sh
745
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_whmcs_phpfpm_status.sh
1.6
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_whmcs_th_network.sh
773
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_whmcs_virtualizor.sh
534
B
-rwxr-xr-x
2025-09-10 09:31
check_a2_xen_guest_vm.sh.flexdedi
3.11
KB
-rwxr-xr-x
2025-09-10 09:31
check_a2_zpool.sh
1.31
KB
-rwxr-xr-x
2025-09-10 09:31
check_aad_ldaps
2.09
KB
-rwxr-xr-x
2025-11-03 05:31
check_apache_status.pl
6.09
KB
-rwxr-xr-x
2025-09-10 09:31
check_backup_zpool
17.68
KB
-rwxr-xr-x
2025-09-10 09:31
check_backuply.py
5.77
KB
-rwxr-xr-x
2025-09-10 09:31
check_backups.php
576
B
-rwxr-xr-x
2025-09-10 09:31
check_breeze
2.29
KB
-rwxr-xr-x
2024-04-11 07:27
check_by_ssh
61.16
KB
-rwxr-xr-x
2024-04-11 07:27
check_clamd
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_cluster
40.35
KB
-rwxr-xr-x
2024-04-11 07:27
check_cpu
467
B
-rwxr-xr-x
2025-09-10 09:31
check_cpu_interrupts
353
B
-rwxr-xr-x
2025-09-10 09:31
check_cpu_steal
313
B
-rwxr-xr-x
2025-09-10 09:31
check_crond
227
B
-rwxr-xr-x
2025-09-10 09:31
check_csf
535
B
-rwxr-xr-x
2025-09-10 09:31
check_dhcp
56.75
KB
-rwsr-x---
2024-04-11 07:27
check_dig
56.83
KB
-rwxr-xr-x
2024-04-11 07:27
check_disk
86.26
KB
-rwxr-xr-x
2024-04-11 07:27
check_disk_smb
9.9
KB
-rwxr-xr-x
2024-04-11 07:27
check_dns
249
B
-rwxr-xr-x
2025-09-10 09:31
check_dummy
31.76
KB
-rwxr-xr-x
2024-04-11 07:27
check_elastic
10.49
KB
-rwxr-xr-x
2025-09-10 09:31
check_elasticsearch
335
B
-rwxr-xr-x
2025-09-10 09:31
check_enhance_backup
495
B
-rwxr-xr-x
2025-09-10 09:31
check_exim
184
B
-rwxr-xr-x
2025-09-10 09:31
check_exim_spam.sh
3.44
KB
-rwxr-xr-x
2025-09-10 09:31
check_eximqueue.sh
1.11
KB
-rwxr-xr-x
2025-09-10 09:31
check_file_age
4.95
KB
-rwxr-xr-x
2024-04-11 07:27
check_flexlm
6.35
KB
-rwxr-xr-x
2024-04-11 07:27
check_fping
56.76
KB
-rwsr-x---
2024-04-11 07:27
check_ftp
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_ftpd
199
B
-rwxr-xr-x
2025-09-10 09:31
check_game
44.5
KB
-rwxr-xr-x
2024-04-11 07:27
check_hpjd
52.5
KB
-rwxr-xr-x
2024-04-11 07:27
check_http
106.2
KB
-rwxr-xr-x
2024-04-11 07:27
check_icmp
68.39
KB
-rwsr-x---
2024-04-11 07:27
check_ide_smart
44.57
KB
-rwsr-x---
2024-04-11 07:27
check_imap
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_iowait
587
B
-rwxr-xr-x
2025-09-10 09:31
check_ipaliases.py
2.14
KB
-rwxr-xr-x
2025-09-10 09:31
check_ipmi_sensor
39.45
KB
-rwxr-xr-x
2025-09-10 09:31
check_ircd
6.82
KB
-rwxr-xr-x
2024-04-11 07:27
check_jabber
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_jetbackup.py
12.8
KB
-rwxr-xr-x
2025-09-10 09:31
check_jetbackup_alerts
5.35
KB
-rwxr-xr-x
2025-09-10 09:31
check_jetbackup_license.sh
581
B
-rwxr-xr-x
2025-09-10 09:31
check_jetbackup_mongodb
915
B
-rwxr-xr-x
2025-09-10 09:31
check_jetbackup_queue
4.83
KB
-rwxr-xr-x
2025-09-10 09:31
check_kernel
393
B
-rwxr-xr-x
2025-09-10 09:31
check_ldap
61.07
KB
-rwxr-xr-x
2024-04-11 07:27
check_ldaps
61.07
KB
-rwxr-xr-x
2024-04-11 07:27
check_litespeed
2.43
KB
-rwxr-xr-x
2025-09-10 09:31
check_load
48.39
KB
-rwxr-xr-x
2024-04-11 07:27
check_load.php
422
B
-rwxr-xr-x
2025-09-10 09:31
check_load.py
401
B
-rwxr-xr-x
2025-09-10 09:31
check_local_users
2.01
MB
-rwxr-xr-x
2025-09-10 09:31
check_log
7.99
KB
-rwxr-xr-x
2024-04-11 07:27
check_lvm_thinpools
2.48
KB
-rwxr-xr-x
2025-09-10 09:31
check_mailq
25
KB
-rwxr-xr-x
2024-04-11 07:27
check_managed.sh
5.85
KB
-rwxr-xr-x
2025-09-10 09:31
check_md5files
1.2
KB
-rwxr-xr-x
2025-09-10 09:31
check_md_raid
782
B
-rwxr-xr-x
2025-09-10 09:31
check_megaraid_sas
6.75
KB
-rwxr-xr-x
2025-09-10 09:31
check_memcached
184
B
-rwxr-xr-x
2025-09-10 09:31
check_meminfo
2.79
KB
-rwxr-xr-x
2025-09-10 09:31
check_memory
330
B
-rwxr-xr-x
2025-09-10 09:31
check_memory.py
1.06
KB
-rwxr-xr-x
2025-09-10 09:31
check_mrtg
44.42
KB
-rwxr-xr-x
2024-04-11 07:27
check_mrtgtraf
44.36
KB
-rwxr-xr-x
2024-04-11 07:27
check_mysql
52.91
KB
-rwxr-xr-x
2024-04-11 07:27
check_mysql_all.sh
6.53
KB
-rwxr-xr-x
2025-09-10 09:31
check_mysql_connections
5.89
KB
-rwxr-xr-x
2025-09-10 09:31
check_mysql_engines
603
B
-rwxr-xr-x
2025-09-10 09:31
check_mysql_log
170
B
-rwxr-xr-x
2025-09-10 09:31
check_mysql_memory
733
B
-rwxr-xr-x
2025-09-10 09:31
check_mysql_processes
346
B
-rwxr-xr-x
2025-09-10 09:31
check_mysql_query
48.71
KB
-rwxr-xr-x
2024-04-11 07:27
check_nagios
44.34
KB
-rwxr-xr-x
2024-04-11 07:27
check_nimbus.sh
2.25
KB
-rwxr-xr-x
2025-09-10 09:31
check_nntp
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_nntps
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_nscp_api
5.84
MB
-rwxr-xr-x
2024-10-29 07:19
check_nt
56.65
KB
-rwxr-xr-x
2024-04-11 07:27
check_ntp
56.84
KB
-rwxr-xr-x
2024-04-11 07:27
check_ntp.pl
14.53
KB
-rwxr-xr-x
2024-04-11 07:27
check_ntp_peer
56.91
KB
-rwxr-xr-x
2024-04-11 07:27
check_ntp_time
52.84
KB
-rwxr-xr-x
2024-04-11 07:27
check_nwstat
68.52
KB
-rwxr-xr-x
2024-04-11 07:27
check_oracle
9.27
KB
-rwxr-xr-x
2024-04-11 07:27
check_overcr
48.49
KB
-rwxr-xr-x
2024-04-11 07:27
check_partitions
434
B
-rwxr-xr-x
2025-09-10 09:31
check_pgsql
56.95
KB
-rwxr-xr-x
2024-04-11 07:27
check_ping
60.77
KB
-rwxr-xr-x
2024-04-11 07:27
check_pop
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_postfix
193
B
-rwxr-xr-x
2025-09-10 09:31
check_postfix_queue
930
B
-rwxr-xr-x
2025-09-10 09:31
check_postgres
445.78
KB
-rwxr-xr-x
2025-09-10 09:31
check_procs
60.99
KB
-rwxr-xr-x
2024-04-11 07:27
check_proxmox.sh
928
B
-rwxr-xr-x
2025-09-10 09:31
check_proxmox_backups.sh
1.86
KB
-rwxr-xr-x
2025-09-10 09:31
check_qps_dnsdist.sh
1.68
KB
-rwxr-xr-x
2025-09-10 09:31
check_real
48.59
KB
-rwxr-xr-x
2024-04-11 07:27
check_redis.sh
175
B
-rwxr-xr-x
2025-09-10 09:31
check_resolver.py
3.27
KB
-rwxr-xr-x
2025-09-10 09:31
check_rpc
9.45
KB
-rwxr-xr-x
2024-04-11 07:27
check_rpmdb
690
B
-rwxr-xr-x
2025-09-10 09:31
check_sensors
1.59
KB
-rwxr-xr-x
2024-04-11 07:27
check_service.sh
9.94
KB
-rwxr-xr-x
2025-09-10 09:31
check_simap
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_smart.pl
35.16
KB
-rwxr-xr-x
2025-09-10 09:31
check_smartarray.py
10.07
KB
-rwxr-xr-x
2025-09-10 09:31
check_smartermail_queue
1.5
KB
-rwxr-xr-x
2025-09-10 09:31
check_smtp
69.23
KB
-rwxr-xr-x
2024-04-11 07:27
check_snmp
77.59
KB
-rwxr-xr-x
2024-04-11 07:27
check_spop
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_ssh
48.59
KB
-rwxr-xr-x
2024-04-11 07:27
check_ssmtp
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_sssd
1.32
KB
-rwxr-xr-x
2025-09-10 09:31
check_supervisord.py
15.71
KB
-rwxr-xr-x
2025-09-10 09:31
check_swap
44.33
KB
-rwxr-xr-x
2024-04-11 07:27
check_tcp
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_time
48.55
KB
-rwxr-xr-x
2024-04-11 07:27
check_tmp
210
B
-rwxr-xr-x
2025-09-10 09:31
check_udp
61.13
KB
-rwxr-xr-x
2024-04-11 07:27
check_ups
52.61
KB
-rwxr-xr-x
2024-04-11 07:27
check_users
40.2
KB
-rwxr-xr-x
2024-04-11 07:27
check_vm_status.sh
635
B
-rwxr-xr-x
2025-09-10 09:31
check_wave
3.19
KB
-rwxr-xr-x
2024-04-11 07:27
check_webserver_status
2.93
KB
-rwxr-xr-x
2025-09-10 09:31
check_yum_updates
600
B
-rwxr-xr-x
2025-09-10 09:31
check_zfs
17.68
KB
-rwxr-xr-x
2025-09-10 09:31
check_zpool_usage.sh
885
B
-rwxr-xr-x
2025-09-10 09:31
md5list
61
B
-rw-r--r--
2025-09-10 09:31
negate
40.18
KB
-rwxr-xr-x
2024-04-11 07:27
urlize
35.97
KB
-rwxr-xr-x
2024-04-11 07:27
utils.pm
2.05
KB
-rw-r--r--
2024-04-11 07:27
utils.sh
2.73
KB
-rwxr-xr-x
2024-04-11 07:27
vz7_check_a2_backup_timer_enabled.sh
605
B
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_backups-check.sh
8.4
KB
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_backups-running.sh
2.18
KB
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_fw.sh
1.37
KB
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_ifspeed.sh
1.04
KB
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_license.sh
749
B
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_template_count.sh
856
B
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_templates_mount.sh
940
B
-rwxr-xr-x
2025-09-10 09:31
vz7_check_a2_zombie-procs.sh
768
B
-rwxr-xr-x
2025-09-10 09:31
vz7_check_nfs_kill.sh
1000
B
-rwxr-xr-x
2025-09-10 09:31
Save
Rename
#!/usr/bin/python3 ######################################################################## ## ## Written by Zachary LaCelle ## Copyright 2016-2020 ## Licensed under GPL (see below) ## ## Nagios script to monitor ZFS pools/filesystems ## in Linux. ## ## Tested operating systems/ZFS versions: ## * See README.md ## ## This program is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see <http://www.gnu.org/licenses/>. ## ######################################################################## from sys import exit from sys import version import subprocess import argparse import logging import sys from array import * from types import * from os import geteuid import os # This check only works in a subset of the actual times we need it, but it is a good effort regardless. def pythonVersionCheck(): # Python 3.5 is current released version on Ubuntu 16.04, the oldest version supported. LTS remains supported through 2021. MinimumPython_MajorVersionNumber = 3 MinimumPython_MinorVersion = 5 majorMinor = sys.version_info[:2] major = majorMinor[0] minor = majorMinor[1] if ((major < MinimumPython_MajorVersionNumber) or (major == MinimumPython_MajorVersionNumber and minor < MinimumPython_MinorVersion)): # Note -- We WANT This string syntax, as callers may not have newer ones if running older versions of Python! exit("Error, script needs needs Python %s.%s or later. Detected Python version %s.%s." % (MinimumPython_MajorVersionNumber, MinimumPython_MinorVersion, major, minor)) ## Check for reasonably modern version of Python. ## We do this as soon as we can in the code / run so we can be sure of seeing it. pythonVersionCheck(); ## # Commands to run # CHANGE THESE IF YOU NEED TO ## sudoCommand='/usr/bin/sudo' zpoolCommand='/sbin/zpool' zfsCommand='/sbin/zfs' ## # Variables to print at the end ## nagiosStatus=('OK','WARNING','CRITICAL','UNKNOWN') stateNum=0 msg='' perfdata='' ## # Filled from command line arguments ## checkCapacity=False capWarnThreshold=50 capCritThreshold=80 checkFragmentation=False fragWarnThreshold=50 fragCritThreshold=80 useSudoToRunZfsCommands=True logging.basicConfig(stream=sys.stdout, format='%(message)s', level=logging.WARNING); def CheckArgBounds( valueArr, minVal, maxVal ): for value in valueArr: if value < minVal: return False elif value > maxVal: return False return True def ConvertToGB( valueStr ): value = valueStr[:-1] value = value.replace(',', '.') if valueStr.endswith('G'): return float(value) elif valueStr.endswith('T'): gigs=float(value)*1024 return float(gigs) elif valueStr.endswith('M'): gigs=float(value) / 1024.0 return float(gigs) elif valueStr.endswith('K'): gigs=float(value) / (1024.0 * 1024.0) return float(gigs) def RaiseStateNum( stateNumIn, stateNum ): if stateNumIn > stateNum: return stateNumIn return stateNum def CheckIfFileExists(parser, commandToCheck): commandExists = os.path.isfile(commandToCheck) if (not commandExists): global stateNum stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : can't find command %s.", nagiosStatus[stateNum], commandToCheck) exit(stateNum) def CheckForExistenceOfCommands(parser): CheckIfFileExists(parser, sudoCommand) CheckIfFileExists(parser, zpoolCommand) CheckIfFileExists(parser, zfsCommand) def LogWarningRootProcessWarningAndExit(contextString, stateNum, optionalException=None): # If the script is failing to run because of this line, you are likely running too old a version of Python. I wish it were possible to make the script just print this # clearly rather than crash, but it's not possible: https://stackoverflow.com/questions/446052/how-can-i-check-for-python-version-in-a-program-that-uses-new-language-features # The version check done above helps in some cases, but won't fix when this f-string language feature fails to compile. warningString = f'{nagiosStatus[stateNum]} : process must be run as root. Possible solution: add the following to your visudo: nagios ALL=NOPASSWD: Context: {contextString}, then run check script with --nosudo option.' if optionalException is not None: warningString = f'{warningString} Exception: {optionalException}'; logging.warning(warningString) exit(stateNum) def GetArgsForZfsCommand(zfsCommandAndArgsList): if (useSudoToRunZfsCommands): # Prepend command with "sudo -n" for noninteractive (will not ask for password, will just error if there's a problem) return [sudoCommand, '-n'] + zfsCommandAndArgsList; else: # Will just attempt to run the command without sudo return zfsCommandAndArgsList; ################################################################################### ## # Parse command line args ## parser = argparse.ArgumentParser( prog='check_zfs', description='Check the ZFS pool specified by an argument.', epilog='Note that monitor flags (e.g. capacity) require 2 arguments: warning threshold, and critical threshold') parser.add_argument('--capacity', help="monitor utilization of zpool (%%, int [0-100])", type=int, nargs=2) parser.add_argument('--fragmentation', help="monitor fragmentation of zpool (%%, int [0-100])", type=int, nargs=2) parser.add_argument('--nosudo', required=False, action='store_true', help="do not attempt to sudo first when running zfs commands, instead just run them. The nagios user will need permissions to run these commands if used, so edit the sudoers file - see visudo to do this.") parser.add_argument('pool', help="name of the zpool to check", type=str) args = parser.parse_args() retVal = True if args.capacity is not None: checkCapacity=True capWarnThreshold=args.capacity[0] capCritThreshold=args.capacity[1] capArr = array('i', [capWarnThreshold, capCritThreshold]) retVal = CheckArgBounds(capArr, 0, 100) if retVal is False: stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : Capacity thresholds must be between 0 and 100 (as a percent).", nagiosStatus[stateNum]) parser.print_help() exit(stateNum) retVal = True if args.fragmentation is not None: checkFragmentation=True fragWarnThreshold=args.fragmentation[0] fragCritThreshold=args.fragmentation[1] fragArr = array('i', [fragWarnThreshold, fragCritThreshold]) retVal = CheckArgBounds(fragArr, 0, 100) if retVal is False: stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : Fragmentation thresholds must be between 0 and 100 (as a percent).", nagiosStatus[stateNum]) parser.print_help() exit(stateNum) useSudoToRunZfsCommands = not args.nosudo ## Make sure the commands we need are available to be later run CheckForExistenceOfCommands(parser); ################################################################################### ################################################################################### ## # Verify that we're running as root. This should render redundant some checks # below, but we'll leave them there in case of bugs and to make this more readable. #if geteuid() != 0: # stateNum = RaiseStateNum(3, stateNum) # print nagiosStatus[stateNum] + ": process must be run as root. Did you for get sudo? If not, possible solution: add the following toyour visudo: nagios ALL=NOPASSWD: /sbin/zfs" # exit(stateNum) ################################################################################### ## # Get generic info about the ZFS environment zfsEntries = [] fullCommand = GetArgsForZfsCommand([zfsCommand, 'list']) try: childProcess = subprocess.Popen(fullCommand, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError as osException: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Generic info about ZFS Environment - exception", stateNum, osException); zfsString = childProcess.communicate()[0] zfsRetval = childProcess.returncode if zfsRetval == 1: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Generic info - child process - retval", stateNum); logging.warning("%s : process must be run as root. Possible solution: add the following to your visudo: nagios ALL=NOPASSWD: /sbin/zfs", nagiosStatus[stateNum]) zfsLines = zfsString.splitlines() for idx, line in enumerate(zfsLines): if idx != 0: zfsEntry=line.split() zfsEntries.append(zfsEntry) # Make sure the pool we specified is valid validPool=False for entry in zfsEntries: if entry[0].decode() == args.pool: validPool=True if not validPool: stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : Pool %s is invalid. Please select a valid pool.", nagiosStatus[stateNum], args.pool) exit(stateNum) ################################################################################### ## # Get info on zpool fullCommand = GetArgsForZfsCommand([zpoolCommand, 'list', args.pool]) try: childProcess = subprocess.Popen(fullCommand, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError as osException: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Zpool command - exception", stateNum, osException); zpoolString = childProcess.communicate()[0] zpoolRetval = childProcess.returncode if zpoolRetval == 1: stateNum = RaiseStateNum(3, stateNum) commandDebugString = f"Zpool command - retval. Original command: \"{fullCommand}\""; LogWarningRootProcessWarningAndExit(commandDebugString, stateNum); zpoolLines=zpoolString.splitlines() zpoolMeta=zpoolLines[0].decode().split() zpoolMetaStr=','.join(zpoolMeta) zpoolEntry=zpoolLines[1].decode().split() zpoolEntryStr=','.join(zpoolEntry) name='' size='' alloc='' free='' expandsz='' frag='' cap='' dedup='' health='' altroot='' for idx, fieldName in enumerate(zpoolMeta): if fieldName=='NAME': name=zpoolEntry[idx] elif fieldName=='SIZE': size=zpoolEntry[idx] elif fieldName=='ALLOC': alloc=zpoolEntry[idx] elif fieldName=='FREE': free=zpoolEntry[idx] elif fieldName=='EXPANDSZ': expandsz=zpoolEntry[idx] elif fieldName=='FRAG': frag=zpoolEntry[idx] elif fieldName=='CAP': cap=zpoolEntry[idx] elif fieldName=='DEDUP': dedup=zpoolEntry[idx] elif fieldName=='HEALTH': health=zpoolEntry[idx] elif fieldName=='ALTROOT': altroot=zpoolEntry[idx] if name=='': stateNum = RaiseStateNum(3, stateNum) logging.warning("%s: Missing required field in zpool output: NAME", nagiosStatus[stateNum]) exit(stateNum) if health=='': stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : Missing required field in zpool output: HEALTH", nagiosStatus[stateNum]) exit(stateNum) if checkCapacity and cap=='': stateNum = RaiseStateNum(3, stateNum) logging.warning("%s Cannot monitor capacity without zpool output: CAP. Outputs are %s", nagiosStatus[stateNum], zpoolMetaStr) exit(stateNum) if checkFragmentation and frag=='': stateNum = RaiseStateNum(3, stateNum) logging.warning("%s : Cannot monitor fragmentation without zpool output: FRAG. Outputs are ", nagiosStatus[stateNum], zpoolMetaStr) exit(stateNum) # Get compressratio on zpool checkForCompression = GetArgsForZfsCommand([zfsCommand, 'get', 'compression', args.pool]) try: childProcess = subprocess.Popen(checkForCompression, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError as osException: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Compression Ratio on ZPool - exception", stateNum, osException); zpoolString = childProcess.communicate()[0] zpoolRetval = childProcess.returncode if zpoolRetval == 1: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Compression Ratio on ZPool - Retval", stateNum); zpoolLines=zpoolString.splitlines() zpoolMeta=zpoolLines[0].decode().split() zpoolMetaStr=','.join(zpoolMeta) zpoolEntry=zpoolLines[1].decode().split() zpoolEntryStr=','.join(zpoolEntry) compressName='' compressValue='' compressRatioName='' compressRatioValue='' for idx, fieldName in enumerate(zpoolMeta): if fieldName=='NAME': compressName=zpoolEntry[idx] elif fieldName=='VALUE': compressValue=zpoolEntry[idx] if compressName=='': stateNum = RaiseStateNum(3, stateNum) logging.warning("%s: Missing required field in zpool output: NAME", nagiosStatus[stateNum]) exit(stateNum) if compressValue=='on': getCompressRatioCommand = GetArgsForZfsCommand([zfsCommand, 'get', 'compressratio', args.pool]) try: childProcess = subprocess.Popen(getCompressRatioCommand, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError as osException: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Get compression ratio - Exception", stateNum, osException); zpoolString = childProcess.communicate()[0] zpoolRetval = childProcess.returncode if zpoolRetval == 1: stateNum = RaiseStateNum(3, stateNum) LogWarningRootProcessWarningAndExit("Get compression ratio - Retval", stateNum); zpoolLines=zpoolString.splitlines() zpoolMeta=zpoolLines[0].decode().split() zpoolMetaStr=','.join(zpoolMeta) zpoolEntry=zpoolLines[1].decode().split() zpoolEntryStr=','.join(zpoolEntry) for idx, fieldName in enumerate(zpoolMeta): if fieldName=='NAME': compressRatioName=zpoolEntry[idx] elif fieldName=='VALUE': compressRatioValue=zpoolEntry[idx] ################################################################################### ## # OK, finally in the actual status checking of the zpool # Let's build up our perfdata, regardless of what we're checking fragPercent='' if frag!='': fragPercent=frag.replace("%", "") fragPerfStr="frag="+str(fragPercent)+"%;" if checkFragmentation: fragPerfStr=fragPerfStr+str(fragWarnThreshold)+";"+str(fragCritThreshold)+";" else: fragPerfStr+=(";;"); perfdata+=(fragPerfStr) perfdata+=" " capPercent='' if cap!='': capPercent=cap.replace("%", "") capPerfStr="cap="+str(capPercent)+"%;" if checkCapacity: capPerfStr=capPerfStr+str(capWarnThreshold)+";"+str(capCritThreshold)+";" else: capPerfStr+=(";;"); perfdata+=(capPerfStr) perfdata+=" " # Perfdata for dedup & compression factor if dedup!='': dedup_no_x = dedup.rstrip('x') perfdata+="dedup="+str(dedup_no_x) perfdata+=" " if compressRatioValue!='': compressRatioNoX = compressRatioValue.rstrip('x') perfdata+="compress_ratio="+str(compressRatioNoX) perfdata+=" " # Sizes can be in K, M, G, or T (maybe P, but I'm not doing this yet) if size!='': sizeGB = ConvertToGB(size) perfdata+="size="+str(sizeGB)+"GB;;;" perfdata+=" " if alloc!='': allocGB = ConvertToGB(alloc) perfdata+="alloc="+str(allocGB)+"GB;;;" perfdata+=" " if free!='': freeGB = ConvertToGB(free) perfdata+="free="+str(freeGB)+"GB;;;" perfdata+=" " ## # Do mandatory checks healthNum=-1 if health=='ONLINE': healthNum=0 elif health=='OFFLINE': stateNum = RaiseStateNum(1, stateNum) healthNum=1 elif health=='REMOVED': stateNum = RaiseStateNum(1, stateNum) healthNum=2 elif health=='UNAVAIL': stateNum = RaiseStateNum(1, stateNum) healthNum=3 elif health=='DEGRADED': stateNum = RaiseStateNum(2, stateNum) healthNum=4 elif health=='FAULTED': stateNum = RaiseStateNum(2, stateNum) healthNum=5 perfdata+="health="+str(healthNum)+";1;3;" perfdata+=" " ## # Initial part of msg msg="POOL: "+str(name) healthMsgFilled=False if healthNum > 0: msg+=", STATUS: "+str(health) healthMsgFilled=True ## # Do optional checks fragMsgFilled=False capMsgFilled=False if checkFragmentation and fragPercent!='': if fragPercent.isdigit() == True: if int(fragPercent) > int(fragCritThreshold): fragMsgFilled=True stateNum = RaiseStateNum(2, stateNum) msg+=", FRAG CRIT: "+str(frag) elif int(fragPercent) > int(fragWarnThreshold): fragMsgFilled=True stateNum = RaiseStateNum(1, stateNum) msg+=", FRAG WARN: "+str(frag) if checkCapacity and capPercent!='': if int(capPercent) > int(capCritThreshold): capMsgFilled=True stateNum = RaiseStateNum(2, stateNum) msg+=", CAP CRIT: "+str(cap) elif int(capPercent) > int(capWarnThreshold): capMsgFilled=True stateNum = RaiseStateNum(1, stateNum) msg+=", CAP WARN: "+str(cap) ## # Build up rest of message if not healthMsgFilled: msg+=", STATUS: "+str(health) if size!='': msg+=", SIZE: "+str(size) if alloc!='': msg+=", ALLOC: "+str(alloc) if free!='': msg+=", FREE: "+str(free) if dedup!='': msg+=", DEDUP: "+str(dedup) if compressRatioValue!='': msg+=", COMPRESS: "+str(compressRatioValue) if frag!='' and not fragMsgFilled: msg+=", FRAG: "+str(frag) if cap!='' and not capMsgFilled: msg+=", CAP: "+str(cap) ## # Print our output and return logging.warning("%s: %s | %s", nagiosStatus[stateNum], msg, perfdata) exit(stateNum)