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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import os, json, time, re, sys, subprocess
from clusterman.config import CONF
from clusterman.utils import ssh_exec
def get_node_list():
nodes_path=CONF.NODE_FILE
if os.path.exists(nodes_path):
with open(nodes_path) as f:
nodes=json.load(f)
return nodes
return list()
def get_node_in_group(group):
nodes=get_node_list()
# Search
ingroup=list()
if len(nodes) > 0 and group in CONF["cluster"]["groups"]:
patterns=[re.compile(pattern) for pattern in CONF["cluster"]["groups"][group]]
for node in nodes:
for pattern in patterns:
if pattern.match(node):
ingroup.append(node)
break;
return ingroup
def ls(group=None):
nodes_path=CONF.NODE_FILE
nodes=get_node_list()
if len(nodes)<=0:
print("Please perform a scan before")
exit(0)
# Print nodes
if group is not None:
for node in get_node_in_group(group):
print(node)
else:
for node in nodes:
print(node)
def scan(timeout):
from_split=[int(n) for n in CONF["cluster"]["ip4_from"].split(".")]
to_split=[int(n) for n in CONF["cluster"]["ip4_to"].split(".")]
ignore_list=[ip.strip(" ") for ip in CONF["cluster"]["ip4_ignore"]]
nodes=list()
print("----- Starting node scan (timeout={}s) -----".format(timeout))
for W in range(from_split[0],to_split[0]+1):
for X in range(from_split[1],to_split[1]+1):
for Y in range(from_split[2],to_split[2]+1):
for Z in range(from_split[3],to_split[3]+1):
ip="{}.{}.{}.{}".format(W,X,Y,Z)
if ip in ignore_list:
print("Skipping {}".format(ip))
continue
print("Contacting {}...".format(ip),end='')
try:
subprocess.run(["ping", "-c", "1", "-W", str(timeout), ip],capture_output=True,check=True)
nodes.append(ip)
print("=> Found!!")
except:
print()
with open(CONF.NODE_FILE, "w") as f:
f.write(json.dumps(nodes,indent=4))
CONF["cache"]["last_scan"]=int(time.time())
CONF.save()
def check(timeout):
nodes=get_node_list()
if len(nodes) <= 0:
print("Please perform a scan before")
exit(0)
# Perform ping check
fail=False
for ip in nodes:
print("Contacting {}...".format(ip),end='')
try:
subprocess.run(["ping", "-c", "1", "-W", str(timeout), ip],capture_output=True,check=True)
print()
except:
fail=True
print("=> Not responding!!")
if not fail:
print("Success: All nodes are reachable")
else:
print("Error: Some of your nodes are not reachable")
def exec(command, group=None):
nodes=get_node_list() if group is None else get_node_in_group(group)
for ip in nodes:
print("----- Node {} -----".format(ip))
print(ssh_exec(ip," ".join(command)))
|