def login_qrcode(self, get): tid = public.GetRandomString(12) qrcode_str = 'https://app.bt.cn/app.html?&panel_url=' + public.getPanelAddr( ) + '&v=' + public.GetRandomString(3) + '?login&tid=' + tid cache.set(tid, public.get_session_id(), 360) cache.set(public.get_session_id(), tid, 360) return public.returnMsg(True, qrcode_str)
def getInfo(self, get): is_update = False my_panel_addr = public.getPanelAddr() public.ExecShell('rm -f %sis_import' % self.masterslave_path) if self.init_error_msg: return public.returnMsg(False, str(self.init_error_msg)) data_list = [] for ip in self.data['master']: data_list.append({ 'master_ip': ip, 'slave_ip': '本机', 'db': self.data['master'][ip]['db'], 'master_panel_addr': self.data['master'][ip]['master_panel_addr'], 'slave_panel_addr': my_panel_addr, 'passwd': self.data['master'][ip]['passwd'], }) for ip in self.data['slave']: if self.data['slave'][ip]['status']: data_list.append({ 'master_ip': '本机', 'slave_ip': ip, 'db': self.data['slave'][ip]['db'], 'slave_panel_addr': self.data['slave'][ip]['slave_panel_addr'], 'master_panel_addr': my_panel_addr, 'passwd': self.data['slave'][ip]['passwd'], }) db = ['*'] + self.getDataBaseList() self.check_port_accept(get); return public.returnMsg(True, {'data_list': data_list, 'db': db})
def login_qrcode(self, get): tid = public.GetRandomString(12) qrcode_str = 'https://app.bt.cn/app.html?&panel_url=' + public.getPanelAddr( ) + '&v=' + public.GetRandomString(3) + '?login&tid=' + tid data = public.get_session_id() + ':' + str(time.time()) public.writeFile(self.app_path + "app_login_check.pl", data) cache.set(tid, public.get_session_id(), 360) cache.set(public.get_session_id(), tid, 360) return public.returnMsg(True, qrcode_str)
def blind_qrcode(self, get): ''' 生成绑定二维码 ''' panel_addr = public.getPanelAddr() token = public.GetRandomString(32) data = '%s:%s' % (token, int(time.time())) public.writeFile(self.app_path + 'token.pl', data) public.writeFile(self.app_path_p + 'token.pl', data) qrcode_str = 'https://app.bt.cn/app.html?panel_url=' + panel_addr + '&panel_token=' + token + '?blind' return public.returnMsg(True, qrcode_str)
def _startSlave(self, get): status = '200' print '从服务器: stop slave; 添加用户 start slave' self._mysql.execute("stop slave;") create_sql = "change master to master_host='%s',master_user='******',master_password='******', master_log_file='%s',master_log_pos=%s;" \ % (get['master_ip'], self.user_name, get['passwd'], get['log_file'], get['log_pos']) # print 'slave 4: ', create_sql self._mysql.execute(create_sql) self._mysql.execute("start slave;") time.sleep(0.5) slave_status = self._mysql.query("show slave status;", []).find() print slave_status[10], slave_status[11] if slave_status[10] == 'Yes' and slave_status[11] == 'Yes': self._set_salve_replicate_db(get['db']) # 将从服务器信息 写入 data.json文件 self.data['master'][get['master_ip']] = { "master_panel_addr": get['panel_addr'], "passwd": get['passwd'], 'db': get['db'], 'master_id': get['master_id'] } self._updateFile('data.json', self.data) else: time.sleep(0.5) slave_status = self._mysql.query("show slave status;", []).find() if slave_status[10] == 'Yes' and slave_status[11] == 'Yes': self._set_salve_replicate_db(get['db']) # 将从服务器信息 写入 data.json文件 self.data['master'][get['master_ip']] = { "master_panel_addr": get['panel_addr'], "passwd": get['passwd'], 'db': get['db'], 'master_id': get['master_id'] } self._updateFile('data.json', self.data) else: status = '401' my_panel_addr = public.getPanelAddr() # 请求主服务器 --> unlockTables post_data = { "passwd": get['passwd'], "panel_addr": my_panel_addr, "master_ip": get['master_ip'], "status": status, 'slave_ip': get['slave_ip'] } print '3---> unlockTables' self._curlServer(post_data, get['panel_addr'], 'unlockTables') public.ExecShell('rm -f %smaster_sql_file*' % self.masterslave_path) return status
def delSlaveByMaster(self, get): # 删除从服务器 if 'ip' in get.keys() and get['ip'] in self.data['slave']: slave_info = self.data['slave'][get['ip']] slave_panel_addr = slave_info['slave_panel_addr'] my_panel_addr = public.getPanelAddr() post_data = { "passwd": slave_info['passwd'], "panel_addr": my_panel_addr } del self.data['slave'][get['ip']] self._curlServer(post_data, slave_panel_addr, 'delSlaveBySlave') else: del self.data['slave'][get['client_ip']] self._updateFile('data.json', self.data) return public.returnMsg(True, '删除成功')
def delSlaveBySlave(self, get): self._mysql.execute("stop slave;") self._mysql.execute("change master to master_host=' ';") self._mysql.execute("reset slave;") if 'ip' in get.keys(): master_info = self.data['master'][get['ip']] master_panel_addr = master_info['master_panel_addr'] my_panel_addr = public.getPanelAddr() post_data = { "passwd": master_info['passwd'], "panel_addr": my_panel_addr } del self.data['master'][get['ip']] self._curlServer(post_data, master_panel_addr, 'delSlaveByMaster') else: del self.data['master'][get['client_ip']] self._updateFile('data.json', self.data) return public.returnMsg(True, '删除成功')
def get_token(self, get): data = self.get_api_config() if not 'key' in data: data['key'] = public.GetRandomString(16) public.writeFile(self.save_path, json.dumps(data)) if 'token_crypt' in data: data['token'] = public.de_crypt(data['token'], data['token_crypt']) else: data['token'] = "***********************************" data['limit_addr'] = '\n'.join(data['limit_addr']) data['bind'] = self.get_bind_token() qrcode = (public.getPanelAddr() + "|" + data['token'] + "|" + data['key'] + '|' + data['bind']['token']).encode('utf-8') data['qrcode'] = public.base64.b64encode(qrcode).decode('utf-8') data['apps'] = sorted(data['apps'], key=lambda x: x['time'], reverse=True) del (data['key']) return data
def addSlaveByMaster(self, get): ''' 开启权限 允许从服务器连接 get = { 'db':'*', 'master_ip':'192.168.1.242', } ''' self._mysql.execute('unlock tables;') passwd = public.GetRandomString(32) data = "%s:%s:%s" % (get['master_ip'], get['db'], passwd) public.ExecShell("echo '%s' > %stoken.pl" % (data, self.masterslave_path)) ''' 秘钥包含:server_id, uesr, passwd, all_user_id, master_ip, panel_addr, db ''' all_user_id = self.__getAllUserId() my_panel_addr = public.getPanelAddr() secret_key = self.__encodeKey(self.my_id, self.user_name, passwd, all_user_id, get['master_ip'], my_panel_addr, get['db'], self.my_id, self.my_version) print secret_key return public.returnMsg(True, secret_key)
def login_qrcode(self, get): qrcode_str = 'https://app.bt.cn/app.html?&panel_url=' + \ public.getPanelAddr()+'&v=' + public.GetRandomString(3)+'?login' return public.returnMsg(True, qrcode_str)
def setSlave(self, get): ''' # 将该服务器设置为 从服务器 to: createAccountByMaster(self, get) ''' try: data = json.loads(base64.b64decode(get['secret_key'])) server_id = data['A'] user = data['B'] passwd = data['C'] all_user_id = data['D'] master_ip = data['E'] master_panel_addr = data['F'] db = data['G'] master_id = data['H'] master_version = data['I'] except: return public.returnMsg(403, '秘钥不正确') if master_version != self.my_version: return public.returnMsg(403, '数据库版本不一致') if master_ip in self.data['master'].keys(): return public.returnMsg(403, '该主数据库已存在,请不要重复添加') if master_ip in self.data['master']: return public.returnMsg(403, '已存在主服务器, 不支持做多主复制') # if self.data['master'] and self.my_id in all_user_id: # # 该服务器同时也为 主服务器 # return public.returnMsg(403, '目标服务存在主服务器,server-id冲突,请手动处理') if self.data['slave'] and self.my_id in all_user_id: # 该服务器同时也为 主服务器 return public.returnMsg(403, '目标服务存在从服务器,server-id冲突,请手动处理') if not master_ip in self.data['slave'].keys(): print '正在计算 severid', self.my_id in all_user_id, self.my_id # 该服务器的server_id 存在 主服务器已分配的id中 则修改该服务器id if self.my_id in all_user_id: # 计算新的 slave_id user_count = len(all_user_id) for i in xrange(1, user_count+2): if str(i) not in all_user_id: slave_id = i break print '修改 服务器id', slave_id self.__setServerId(slave_id) # 并且该服务器 同时也是主服务器 ——————> 这里暂时不设置 else: # 不需修改 服务器id, 添加slave-skip-errors slave_id = self.my_id if not public.ExecShell("cat /etc/my.cnf|grep 'slave-skip-errors'|awk '{print $3}'")[0]: self.__setServerId(self.my_id) print '计算成功', self.my_id else: # 不需要重新导入数据库,主主复制 public.ExecShell('echo 1 > %sis_import' % self.masterslave_path) print '主主复制' # 不需修改 服务器id, 添加slave-skip-errors slave_id = self.my_id if not public.ExecShell("cat /etc/my.cnf|grep 'slave-skip-errors'|awk '{print $3}'")[0]: self.__setServerId(self.my_id) data = "%s:%s:%s" % (master_ip, db, passwd) public.ExecShell("echo '%s' > %stoken.pl" % (data, self.masterslave_path)) my_panel_addr = public.getPanelAddr() # 请求主服务器 --> createAccountByMaster post_data = { "slave_ip": get['slave_ip'], "passwd": passwd, "slave_id": slave_id, "db": db, "panel_addr": my_panel_addr, "master_ip": master_ip, "master_id": master_id } print '1---> createAccountByMaster' msg = self._curlServer( post_data, master_panel_addr, 'createAccountByMaster') print 'msg-----------', msg try: msg = ast.literal_eval(msg) except: return {'status': 401, 'msg': '服务器无法连接目标面板地址:' + master_panel_addr} print 'msg-----------', msg[0] if msg[0] == '200': return public.returnMsg(200, '成功添加') # return public.returnMsg(False, msg) elif msg[0] == '401': return public.returnMsg(401, '添加失败') else: return {'status': 404, 'msg': '数据文件过大,请先做主从复制,再导入数据库!'}
def createAccountByMaster(self, get): ''' from: setSlave(self, get) to: createAccountBySlave(self, get) 添加用户 锁表 导出数据库 ''' # change master print '主服务器: 添加账户并锁表' create_sql = "grant replication slave on *.* to '%s'@'%s' identified by '%s';" \ % (self.user_name, get['slave_ip'], get['passwd']) # self._set_master_binlog_db(get['db']) self._mysql.execute(create_sql) flush_sql = "flush privileges;" self._mysql.execute(flush_sql) lock_sql = "flush tables with read lock;" self._mysql.execute(lock_sql) master_info = self._mysql.query("show master status;", []).find() log_file = master_info[0] log_pos = master_info[1] print "导出主数据库", get['db'] sql_name = 'master_sql_file.sql.gz' get['file_name'] = sql_name falg = self._dumpMysql(get) # 请求从服务器 --> createAccountBySlave my_panel_addr = public.getPanelAddr() post_data = { "slave_ip": get['slave_ip'], "passwd": get['passwd'], "panel_addr": my_panel_addr, "log_file": log_file, "log_pos": log_pos, "master_ip": get['master_ip'], "master_id": get['master_id'], 'db': get['db'] } self.data['slave'][get['slave_ip']] = { "status": True, "slave_panel_addr": get['panel_addr'], "passwd": get['passwd'], 'db': get['db'], 'slave_id': get['slave_id'] } # if False and os.path.getsize(self.masterslave_path+sql_name) < 1024*1024*100: if falg: # 将从服务器信息 写入 data.json文件 self._updateFile('data.json', self.data) data = self._curlServer( post_data, get['panel_addr'], 'createAccountBySlave') print '2---> createAccountBySlave', data[1:-1] return data[1:-1], '' else: ''' # 文件过大 返回下载链接 # 将从服务器信息 写入 data.json文件 self.data['slave'][get['slave_ip']]['status'] = False self._updateFile('data.json', self.data) return '%s/yield?action=a&name=masterslave&fun=downSqlFile&passwd=%s&master_ip=%s'\ % (my_panel_addr, get['passwd'], get['master_ip']), post_data ''' # 解锁 post_data['status'] = '404' self.unlockTables(post_data) return '404'