Пример #1
0
 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)
Пример #2
0
 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})
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
    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
Пример #6
0
 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, '删除成功')
Пример #7
0
 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, '删除成功')
Пример #8
0
    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
Пример #9
0
 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)
Пример #10
0
 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)
Пример #11
0
    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': '数据文件过大,请先做主从复制,再导入数据库!'}
Пример #12
0
    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'