@ -0,0 +1,130 @@ | |||
#! /usr/bin/python3 | |||
# coding=utf-8 | |||
import telnetlib | |||
import json | |||
import paramiko | |||
import time | |||
class SSHSetup: | |||
def __init__(self, host, port, user, passwd, comlist=[]): | |||
self.host = host | |||
self.user = user | |||
self.passwd = passwd | |||
self.port = port | |||
try: | |||
self.client = paramiko.SSHClient() | |||
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |||
self.client.connect(hostname=self.host, port=self.port, username=self.user, password=self.passwd, | |||
look_for_keys=False, allow_agent=False) | |||
self.ssh = self.client.invoke_shell() | |||
time.sleep(1) | |||
self.ssh.recv(10000) | |||
except Exception as exc: | |||
raise Exception('ssh error: {}'.format(exc)) | |||
if len(comlist) > 0: | |||
if 'exit' not in comlist: | |||
comlist.append('exit') | |||
self.sendall(comlist) | |||
self.close() | |||
def send(self, command): | |||
self.ssh.send(command + '\n') | |||
time.sleep(1) | |||
self.ssh.recv(10000).decode() | |||
def sendall(self, commlist=[]): | |||
for command in commlist: | |||
self.send(command) | |||
def close(self): | |||
self.ssh.close() | |||
class TelnetSetup: | |||
def __init__(self, host, port, user, passwd, comlist=[]): | |||
self.host = host | |||
self.port = port | |||
self.user = user | |||
self.passwd = passwd | |||
try: | |||
self.tn = telnetlib.Telnet(host, port) | |||
except Exception as exc: | |||
raise Exception('telnet error: {}'.format(exc)) | |||
if len(comlist) > 0: | |||
if 'exit' not in comlist: | |||
comlist.append('exit') | |||
self.login() | |||
self.sendall(comlist) | |||
self.close() | |||
def login(self): | |||
self.tn.read_until(b'login:') | |||
self.tn.write(self.user.encode('utf8') + b'\n') | |||
self.tn.read_until(b'Password:') | |||
self.tn.write(self.passwd.encode('utf8') + b'\n') | |||
self.tn.read_until(self.user.encode('utf8')) | |||
def send(self, command): | |||
self.tn.write(command.encode('utf8') + b'\n') | |||
self.tn.read_until(self.user.encode('utf8')) | |||
def sendall(self, comlist=[]): | |||
for command in comlist: | |||
self.send(command) | |||
def close(self): | |||
self.tn.close() | |||
class SetupMiner: | |||
def __init__(self, host, conf={}, telnets=[], sshs=[]): | |||
self.host = host | |||
self.conf = conf | |||
if len(telnets) == 0: | |||
self.telnets = ["exit"] | |||
else: | |||
self.telnets = telnets | |||
if len(sshs) == 0: | |||
self.sshs = ["exit"] | |||
else: | |||
self.sshs = sshs | |||
try: | |||
TelnetSetup(self.host, self.conf['telnetport'], self.conf['telnetuser'], self.conf['telnetpass'], | |||
self.telnets) | |||
self.result = "telnet OK; " | |||
except Exception as exc: | |||
self.result = "{}; ".format(exc) | |||
try: | |||
SSHSetup(self.host, self.conf['sshport'], self.conf['sshuser'], conf['sshpass'], self.sshs) | |||
self.result += '\n ssh OK' | |||
except Exception as exc: | |||
self.result += '\n {}; '.format(exc) | |||
def ret_result(self): | |||
return self.result | |||
def read_conf(): | |||
with open('config.json') as f: | |||
conf = json.load(f) | |||
return conf | |||
def main(): | |||
conf = read_conf() | |||
minerconf = {"sshuser": conf["sshuser"], | |||
"sshpass": conf["sshpass"], | |||
"sshport": conf["sshport"], | |||
"telnetuser": conf["telnetuser"], | |||
"telnetpass": conf["telnetpass"], | |||
"telnetport": conf["telnetport"]} | |||
comlist = ["uname -a", "ps -A", "exit"] | |||
s = SetupMiner('10.100.4.10', minerconf) | |||
print(s.result) | |||
if __name__ == '__main__': | |||
main() |
@ -0,0 +1,103 @@ | |||
#! /usr/bin/python3 | |||
# coding=utf-8 | |||
import requests | |||
import json | |||
import sys | |||
from pyzabbix import ZabbixMetric, ZabbixSender | |||
hostname = 'hostname1' | |||
zabbix_server = '10.3.2.5' | |||
aw_url = 'http://10.5.0.1:17790/api/miners' | |||
class AwZabbix: | |||
def __init__(self, server, url, host): | |||
self.url = url | |||
self.server = server | |||
self.host = host | |||
self.data = '' | |||
self.mult_dict = {'G': 1000000000, 'M': 1000000, 'T': 1000000000000, 'K': 1000, 'N': 0, } | |||
self.packet = [] | |||
self.lld_data = [] | |||
def get_data(self): | |||
if len(self.data) == 0: | |||
self.data = requests.get(self.url).json() | |||
def make_packet(self): | |||
self.get_data() | |||
if len(self.packet) != 0: | |||
return self.packet | |||
total_hashrate_raw = self.data['totalHashrate5s'] | |||
if total_hashrate_raw: | |||
hashrate_mult = self.mult_dict[total_hashrate_raw[-4:-3]] | |||
total_hashrate = float(total_hashrate_raw[:-5].replace(',', '.')) * hashrate_mult | |||
total_hashrate = int(total_hashrate) | |||
self.packet.append(ZabbixMetric(self.host, 'total[hashrate]', total_hashrate)) | |||
for group in self.data['groupList']: | |||
for miner in group['minerList']: | |||
hashrate_raw = miner['speedInfo']['hashrate'] | |||
if hashrate_raw: | |||
hashrate_mult = self.mult_dict[hashrate_raw[-4:-3]] | |||
hashrate = float(hashrate_raw[:-5].replace(',', '.')) * hashrate_mult | |||
hashrate = int(hashrate) | |||
else: | |||
hashrate = 0 | |||
minername = str(miner['name']) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('hashrate', minername), hashrate)) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('ip', minername), miner['hostname'])) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('group', minername), miner['groupId'])) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('name', minername), miner['name'])) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('temp', minername), | |||
miner['temperature'][:-3])) | |||
self.packet.append(ZabbixMetric(self.host, "{}[{}]".format('status', minername), | |||
miner['statusInfo']['statusDisplay'])) | |||
return self.packet | |||
def send_packet(self): | |||
if len(self.packet) == 0: | |||
self.make_packet() | |||
return ZabbixSender(self.server).send(self.packet) | |||
def lld(self): | |||
self.get_data() | |||
if len(self.lld_data) != 0: | |||
return self.lld_data | |||
self.lld_data = {} | |||
jdat = [] | |||
for group in self.data['groupList']: | |||
for miner in group['minerList']: | |||
jdat.append({"{#MINERID}": str(miner['id']), | |||
"{#IP}": str(miner['hostname']), | |||
"{#MINERNAME}": str(miner['name'])}) | |||
self.lld_data = {'data': jdat} | |||
return self.lld_data | |||
def read_conf(): | |||
with open('config.json') as f: | |||
conf = json.load(f) | |||
return conf | |||
def main(): | |||
conf = read_conf() | |||
z = AwZabbix(zabbix_server, aw_url, hostname) | |||
if len(sys.argv) == 1: | |||
print(json.dumps(z.lld(), indent=4, sort_keys=True)) | |||
elif len(sys.argv) == 2 and sys.argv[1] == 'send': | |||
z.send_packet() | |||
print(1) | |||
elif len(sys.argv) == 2 and sys.argv[1] == 'send_debug': | |||
print(z.send_packet()) | |||
for i in z.packet: | |||
print(i) | |||
else: | |||
print('Wrong args.') | |||
if __name__ == '__main__': | |||
main() |
@ -0,0 +1,11 @@ | |||
{ | |||
"sshuser":"root", | |||
"sshpass":"admin", | |||
"sshport":"22", | |||
"telnetuser":"telnetd", | |||
"telnetpass":"admin", | |||
"telnetport":"23", | |||
"hostname": "hostname1", | |||
"zabbix_server": "", | |||
"aw_url": "http://10.5.0.1:17790/api/miners" | |||
} |
@ -0,0 +1,42 @@ | |||
#! /usr/bin/python3 | |||
# coding=utf-8 | |||
from aw_sender import AwZabbix | |||
from SetupMinersClass import SetupMiner, read_conf | |||
import sys | |||
import json | |||
def reboot_miner(miner, z, conf): | |||
for miner_dat in z.lld()['data']: | |||
if miner_dat["{#MINERNAME}"] == miner: | |||
miner_ip = miner_dat['{#IP}'] | |||
print(miner_ip) | |||
s = SetupMiner(miner_ip, conf=conf, telnets=['shutdown -r now'], sshs=['shutdown -r now']) | |||
print(s.result) | |||
break | |||
def main(): | |||
conf = read_conf() | |||
print(conf) | |||
zabbix_server = conf["zabbix_server"] | |||
aw_url = conf["aw_url"] | |||
hostname = conf["hostname"] | |||
minerconf = {"sshuser": conf["sshuser"], | |||
"sshpass": conf["sshpass"], | |||
"sshport": conf["sshport"], | |||
"telnetuser": conf["telnetuser"], | |||
"telnetpass": conf["telnetpass"], | |||
"telnetport": conf["telnetport"]} | |||
z = AwZabbix(zabbix_server, aw_url, hostname) | |||
if len(sys.argv) == 1: | |||
print('Need miner name to reboot as arg') | |||
elif len(sys.argv) == 2 and sys.argv[1] == 'test': | |||
print(z.lld()) | |||
elif len(sys.argv) == 2: | |||
print(reboot_miner(sys.argv[1], z, minerconf)) | |||
if __name__ == '__main__': | |||
main() |
Powered by TurnKey Linux.