class Monitor: """ 1.监控top101受托人的丢块信息,超过50分钟未出块视为丢块 2.监控top101受托人的XAS余额,不足50000或者150000的要报警,已剔除官方账号asch_gxx done 3.监控top101受托人节点记录的账户余额top100的信息是否一致(随机抽取2个节点在整点的时候进行对比,时间对10取模为0) """ def __init__(self): self.delegate = Delegates() self.account = Accounts() self.blocks = Blocks() def get_top_101(self): payload = {'limit': 100, 'orderBy': 'approval:desc'} return self.delegate.get_delegates(payload) def check_block(self, publickey): payload = { 'generatorPublicKey': publickey, 'limit': 1, 'orderBy': 'height:desc' } return self.blocks.get_blocks(payload) @staticmethod def check_time(last_block_time): now = int(time.time()) - 1467057600 # UTC+8时区-asch创世块生成时间,即asch纪元元年0点(2016/6/28 4:0:0,js时间为UTC(2016, 5, 27, 20, 0, 0, 0) ) difftime = now - last_block_time return difftime def check_time_batch(self, top_delegates): data = top_delegates issuse_delegates = [] # for delegate in data['delegates'][1:3]: for delegate in data['delegates']: pubkey = delegate['publicKey'] data = self.check_block(pubkey) if data['success']: if len(data['blocks']) > 0: last_block_time = data['blocks'][0][ 'timestamp'] # 这个是自asch主链创世块生成时间以来经历的秒数 difftime = self.check_time(last_block_time) if difftime > 50 * 60: res = { 'username': delegate['username'], 'rate': delegate['rate'], 'height': data['blocks'][0]['height'], 'behind_seconds': difftime } issuse_delegates.append(res) else: print "api返回成功但貌似没有数据", data return issuse_delegates @staticmethod def check_balance(top_delegates): data = top_delegates nsf = [] # 余额不足5万XAS(not sufficient funds)受托人账户列表 if data['success']: for delegate in data['delegates']: if delegate['username'].find('asch_g') < 0: if delegate['balance'] < 50000 * 100000000: res = { 'username': delegate['username'], 'balance': delegate['balance'] / 10**8 } nsf.append(res) return nsf @staticmethod def send_main(content): sub = 'asch_monitor' return send_mail(mailto_list, sub, content)
class Monitor: """ 1.监控top101受托人的丢块信息,超过50分钟未出块视为丢块 done 2.监控top101受托人的XAS余额,不足50000或者150000的要报警,已剔除官方账号asch_g done 3.监控top101受托人节点记录的账户余额top100的信息是否一致(随机抽取2个节点在整点的时候进行对比,时间对10取模为0)done """ def __init__(self): self.delegate = Delegates() self.account = Accounts() self.blocks = Blocks() self.peers = Peers() def get_peers(self): rs = self.peers.peers('') if rs['success']: res = rs['peers'] else: res = None return res def get_top100_balance(self): res = self.account.top('') return res def check_peers(self): peers = self.get_peers() if peers is not None: cnt = len(peers) num = random.randint(0, cnt-1) ip = peers[num]['ip'] port = str(peers[num]['port']) url = 'http://' + ip + ':' + port + '/api/accounts/top' rs = json.loads(requests.get(url).text) # print 'rs is:', rs rs_official = self.get_top100_balance() # print 'rs_official is:', rs_official res = [] if rs['success'] and rs_official['success']: for i in range(0, 99): balance = rs['accounts'][i]['balance'] balance_official = rs_official['accounts'][i]['balance'] # print 'balance:', balance, 'balance_official', balance_official if balance != balance_official: res.append([ip, rs['accounts'][i]['address'], str(balance)+'XAS']) res.append(['mainnet.asch.so', rs_official['accounts'][i]['address'], str(balance_official) + 'XAS']) break if len(res) == 0: res.append("The top 100 accounts's balance of "+ip+":"+str(port)+" is same with mainnet.asch.so.") return res def get_top_101(self): payload = {'limit': 100, 'orderBy': 'approval:desc' } return self.delegate.get_delegates(payload) def check_block(self, publickey): payload = {'generatorPublicKey': publickey, 'limit': 1, 'orderBy': 'height:desc' } return self.blocks.get_blocks(payload) @staticmethod def check_time(last_block_time): now = int(time.time()) - 1467057600 # UTC+8时区-asch创世块生成时间,即asch纪元元年0点(2016/6/28 4:0:0,js时间为UTC(2016, 5, 27, 20, 0, 0, 0) ) difftime = now - last_block_time return difftime def check_time_batch(self, top_delegates): data = top_delegates issue_delegates = [] # for delegate in data['delegates'][1:3]: for delegate in data['delegates']: pubkey = delegate['publicKey'] data = self.check_block(pubkey) if data['success']: if len(data['blocks']) > 0: last_block_time = data['blocks'][0]['timestamp'] # 这个是自asch主链创世块生成时间以来经历的秒数 difftime = self.check_time(last_block_time) if difftime > 50*60: res = [delegate['username'], str(delegate['rate']), str(data['blocks'][0]['height']), str(round(difftime/60/60, 2))] issue_delegates.append(res) else: print "warings:api返回成功但貌似没有数据", data return issue_delegates @staticmethod def check_balance(top_delegates): data = top_delegates del_150k_xas = open('config/delegate_150k_xas.txt', 'r').readlines() nsf = [] # 余额不足5万XAS(not sufficient funds)受托人账户列表 if data['success']: for delegate in data['delegates']: name = delegate['username'].strip() balance = delegate['balance']/10**8 if name.find('asch_g') < 0: if name+'\n' in del_150k_xas: # 需要150k的受托人 # print name, balance if balance < 15*10000: res = [name, str(balance)] nsf.append(res) else: # 需要50k的受托人 if balance < 5*10000: res = [name, str(balance)] nsf.append(res) return nsf @staticmethod def send_mail(content): sub = 'asch_monitor' return send_mail(mailto_list, sub, content)