| Server IP : 212.114.33.6 / Your IP : 216.73.217.30 Web Server : Apache System : Linux ger18 6.12.94+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.94-1 (2026-06-20) x86_64 User : immotrainerde ( 2287) PHP Version : 8.2.32 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /sbin/ |
Upload File : |
#!/usr/bin/env python3
import os
import re
import sys
import subprocess
BINARY_PATH = "/usr/sbin/tw-cli"
def usage():
print("Usage: 3ware-status [--nagios]")
sys.exit(1)
def get_output(cmd):
result = subprocess.run(
cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=False,
)
return [
line.strip()
for line in result.stdout.splitlines()
if line.strip()
]
def return_controller_list(output):
lines = []
for line in output:
if re.match(r"^c[0-9]+\s.*$", line.strip()):
lines.append(line.split()[0])
return lines
def return_disk_list(output):
lines = []
for line in output:
if re.match(r"^p[0-9]+\s.*$", line.strip()):
parts = line.split()
# Should contain something like 'u0'
# '-' means the drive doesn't belong to any array
# If NOT-PRESENT, it just means this is an empty port
if parts[2].strip() != "-" and parts[1].strip() != "NOT-PRESENT":
lines.append(parts)
if fake_failure and lines:
lines[0][1] = "NOT PRESENT"
return lines
def return_array_list(output):
lines = []
for line in output:
if re.match(r"^u[0-9]+\s.*$", line.strip()):
lines.append(line.split())
if fake_failure and lines:
lines[0][2] = "DEGRADED"
return lines
if len(sys.argv) > 2:
usage()
nagios_mode = False
nagios_good_array = 0
nagios_bad_array = 0
nagios_good_disk = 0
nagios_bad_disk = 0
if len(sys.argv) > 1:
if sys.argv[1] == "--nagios":
nagios_mode = True
else:
usage()
if not (os.path.exists(BINARY_PATH) and os.access(BINARY_PATH, os.X_OK)):
if nagios_mode:
print(f"UNKNOWN - Cannot find {BINARY_PATH}")
else:
print(f"Cannot find {BINARY_PATH}. Please install it.")
sys.exit(3)
fake_failure = os.path.exists("/root/fake_3ware_failure")
output = get_output(f"{BINARY_PATH} info")
controller_list = return_controller_list(output)
bad = False
if not nagios_mode:
print("-- Controller informations --")
print("-- ID | Model")
for controller in controller_list:
output = get_output(f"{BINARY_PATH} info {controller} model")
model = output[0].split(" = ")[1].strip()
print(f"{controller} | {model}")
print("")
if not nagios_mode:
print("-- Arrays informations --")
print("-- ID\tType\tSize\tStatus")
for controller in controller_list:
output = get_output(f"{BINARY_PATH} info {controller}")
array_list = return_array_list(output)
for array in array_list:
array_type = array[1].replace("-", "")
array_id = controller + array[0]
size = array[6].split(".")[0] + "G"
status = array[2]
if status not in ["OK", "VERIFYING", "VERIFY-PAUSED"]:
bad = True
nagios_bad_array += 1
else:
nagios_good_array += 1
if not nagios_mode:
print(f"{array_id}\t{array_type}\t{size}\t{status}")
if not nagios_mode:
print("")
if not nagios_mode:
print("-- Disks informations")
print("-- ID\tModel\t\t\tStatus")
for controller in controller_list:
output = get_output(f"{BINARY_PATH} info {controller}")
disk_list = return_disk_list(output)
for disk in disk_list:
disk_id = controller + disk[2] + disk[0]
output = get_output(f"{BINARY_PATH} info {controller} {disk[0]} model")
model = output[0].split(" = ")[1].strip()
output = get_output(f"{BINARY_PATH} info {controller} {disk[0]} status")
status = output[0].split(" = ")[1].strip()
if status != "OK":
bad = True
nagios_bad_disk += 1
else:
nagios_good_disk += 1
if not nagios_mode:
print(f"{disk_id}\t{model}\t{status}")
if nagios_mode:
if bad:
print(
f"RAID ERROR - Arrays: OK:{nagios_good_array} Bad:{nagios_bad_array} "
f"- Disks: OK:{nagios_good_disk} Bad:{nagios_bad_disk}"
)
sys.exit(2)
print(
f"RAID OK - Arrays: OK:{nagios_good_array} Bad:{nagios_bad_array} "
f"- Disks: OK:{nagios_good_disk} Bad:{nagios_bad_disk}"
)
else:
if bad:
print("\nThere is at least one disk/array in a NOT OPTIMAL state.")
sys.exit(1)