116 lines
4.2 KiB
Python
116 lines
4.2 KiB
Python
from nodes import Node
|
|
import os
|
|
|
|
DEFAULT_KEY = "-----BEGIN RSA PRIVATE KEY-----\n\
|
|
MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI\n\
|
|
w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP\n\
|
|
kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2\n\
|
|
hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO\n\
|
|
Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW\n\
|
|
yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd\n\
|
|
ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1\n\
|
|
Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf\n\
|
|
TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK\n\
|
|
iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A\n\
|
|
sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf\n\
|
|
4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP\n\
|
|
cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk\n\
|
|
EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN\n\
|
|
CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX\n\
|
|
3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG\n\
|
|
YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj\n\
|
|
3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+\n\
|
|
dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz\n\
|
|
6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC\n\
|
|
P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF\n\
|
|
llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ\n\
|
|
kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH\n\
|
|
+vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ\n\
|
|
NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=\n\
|
|
-----END RSA PRIVATE KEY-----"
|
|
|
|
TMP_PATH = "/tmp/joker_%s_%d"
|
|
|
|
|
|
class Joker():
|
|
|
|
def __init__(self, key=DEFAULT_KEY, *args, **kwargs):
|
|
|
|
self.default_key = key
|
|
|
|
self.discoverQueue = []
|
|
self.discoveryResult = []
|
|
self.cleanUp = []
|
|
self.name = "EntryPoint"
|
|
self.seenNodes = {}
|
|
|
|
# keys temporary files
|
|
|
|
def __del__(self):
|
|
for filePath in self.cleanUp:
|
|
if os.path.exists(filePath):
|
|
os.remove(filePath)
|
|
|
|
def addNode(self, name, host, port=22, user='root'):
|
|
|
|
node = Node(name, host, port)
|
|
node.assignCredential(user, self.default_key, None)
|
|
|
|
self.discoverQueue.append(node)
|
|
|
|
self.cleanUp.append(node.keyPath)
|
|
|
|
return node
|
|
|
|
def addResult(self, hostname, ip, user, key, proxyCommand=None, port=22):
|
|
return self.discoveryResult.append(
|
|
self.dkOutput(hostname, ip, user, key, proxyCommand, port))
|
|
|
|
def dkOutput(self, hostname, ip, user, key, proxyCommand=None, port=22):
|
|
return {
|
|
"name": hostname,
|
|
"ip": ip,
|
|
"user": user,
|
|
"key": key,
|
|
"port": port,
|
|
"proxy_command": proxyCommand
|
|
}
|
|
|
|
def discover(self):
|
|
result = {}
|
|
|
|
while self.discoverQueue:
|
|
point = self.discoverQueue.pop()
|
|
|
|
nodes = point.discover()
|
|
|
|
# this host can't be discovered by ssh method
|
|
if nodes is None:
|
|
continue
|
|
|
|
self.addResult(
|
|
hostname=point.hostName, ip=point.hostName, user=point.user,
|
|
key=point.origKey, proxyCommand=point.proxyCommandTxt,
|
|
port=point.accessPort)
|
|
|
|
# merge already seen nodes with new discovered nodes
|
|
self.seenNodes = dict(self.seenNodes.items() + point.link.items())
|
|
|
|
for node in nodes:
|
|
if node['hwAddr'] not in self.seenNodes:
|
|
# add to discovering queue
|
|
newNode = self.addNode(
|
|
name=node['ip'],
|
|
host=node['ip'],
|
|
user=point.user)
|
|
|
|
# new node connection channel working through master node
|
|
newNode.setProxyCommand(
|
|
point.hostName,
|
|
point.accessPort,
|
|
point.user,
|
|
point.keyPath
|
|
)
|
|
|
|
return self.discoveryResult
|