-
Notifications
You must be signed in to change notification settings - Fork 0
/
fabric_drive_check.py
executable file
·68 lines (53 loc) · 2.43 KB
/
fabric_drive_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Made to quickly and remotely check for failed drives after stress runs on new server builds. Uses Fabric to ssh into the
servers you specify via flags and output any failed drives to the screen and associated hostname."
"""
from fabric import Connection, Config
from getpass import getpass
import argparse
from re import findall
def drv_chk(host_start, host_end, site):
"""
Uses fabric to securely use a sudo password, ssh to each server specified with flags, run raiddisplay.py, use regex
to find any failed drives and print out the hostname along with any failed drives.
:param host_start: server number to start at
:param host_end: server number to end at
:param site: physical site of servers, e.g. tym
:return: None, print info to screen
"""
sudo_pass = getpass("Env Password: ")
config = Config(overrides={'sudo': {'password': sudo_pass}})
pattern = r"(\D\d+:\d+\D\s+\D\bFAIL\b\D)"
for i in range(int(host_start), (host_end + 1)):
conn = Connection(f"fs{i}.product.{site}.domain.com", config=config)
rd = str(conn.sudo("raiddisplay.py", hide="stdout"))
drv_list = findall(pattern, rd)
drv_list = "\n".join(drv_list)
print(f"fs{i}.product.{site}.domain.com\n{drv_list}")
return None
def create_parser():
"""
Create the parser and arguments.
:return: parser
"""
parser = argparse.ArgumentParser(description="Log into specified hosts, find any bad drives and return the host and"
" bad drive enclosure/number.\nAll flags are required.")
parser.add_argument("-s", "--host-start", dest='host_start', help="Starting host number (e.g. 100)", type=str,
required=True)
parser.add_argument("-e", "--host-end", dest='host_end', help="Ending host number (e.g. 103)", type=int,
required=True)
parser.add_argument("-S", "--site", dest='site', help="Site Abbreviation (e.g. tym)", type=str, required=True)
return parser
def handle_args(args=None):
"""
If args are not provided or all required not present, call create_parser and print help info.
"""
if args is None:
parser = create_parser()
args = parser.parse_args()
if args.host_start and args.host_end and args.site:
drv_chk(args.host_start, args.host_end, args.site)
if __name__ == '__main__':
handle_args()