| @ -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.