def handle(self): # 认证 challenge1 = '12345678' challenge2 = '123456789012' challenge = self.create_challenge(challenge1, challenge2) self.send_packet(challenge.toPacket()) packet = self.read_packet() response = Response() response = response.loadFromPacket(packet) username = response.username self.logger.info("login user:"******"proxy_password"] self.user_id = username # 验证密码 native_password = scramble_native_password(password, challenge1 + challenge2) if self.server.settings[ "proxy_user"] != username or response.authResponse.encode( "iso-8859-1") != native_password: err = ERR(9001, '28000', '[%s] Access denied.' % username) buff = err.toPacket() self.send_packet(buff) self.finish() return buff = file2packet("auth_result.cap") self.send_packet(buff) # 初始化后端服务器 self.init_upstream() # 查询 while True: packet = self.read_packet() if len(packet) < 4: continue packet_type = getType(packet) if packet_type == Flags.COM_QUIT: self.upstream.close() self.finish() elif packet_type == Flags.COM_QUERY: self.handle_query(packet) else: self.dispatch_packet(packet)
def handle(self): # 认证 challenge1 = '12345678' challenge2 = '123456789012' challenge = self.create_challenge(challenge1, challenge2) self.send_packet(challenge.toPacket()) packet = self.read_packet() response = Response() response = response.loadFromPacket(packet) username = response.username self.logger.info("login user:"******"password"] self.user_id = username # 验证密码 native_password = scramble_native_password(password, challenge1 + challenge2) if self.server.settings[ "user"] != username or response.authResponse.encode( "iso-8859-1") != native_password: err = ERR(9001, '28000', '[%s] Access denied.' % username) buff = err.toPacket() self.send_packet(buff) self.finish() return buff = file2packet("auth_result.cap") self.send_packet(buff) # self.send_packet(bytes.fromhex("07 00 00 02 00 00 00 02 00 00 00")) # 查询 while True: packet = self.read_packet() if len(packet) < 4: continue packet_type = getType(packet) # dump_my_packet(packet) # print('packet_type', packet_type, com_type_name(packet_type)) if packet_type == Flags.COM_QUIT: self.finish() elif packet_type == Flags.COM_REGISTER_SLAVE: logger.info("Received COM_REGISTER_SLAVE") self.send_packet(OK().toPacket()) elif packet_type == Flags.COM_BINLOG_DUMP_GTID: logger.info("Received COM_BINLOG_DUMP_GTID") dump(packet) # https://dev.mysql.com/doc/internals/en/com-binlog-dump-gtid.html filename_len = struct.unpack("<I", packet[11:15])[0] payload = packet[27 + filename_len:] gtid_set = GtidSet.decode(BytesIO(payload)) self.dump_binlog_gtid(gtid_set) elif packet_type == Flags.COM_QUERY: self.handle_query(packet)
def test_err(self): err2 = ERR(1045, '28000', 'Access denied for user %s.' % ("alvinzane", )) err2.sequenceId = 2 buff2 = err2.toPacket() dump_my_packet(buff2)
from py_mysql_binlogserver.packet.dump_gtid import DumpGtid from py_mysql_binlogserver.packet.dump_pos import DumpPos from py_mysql_binlogserver.packet.semiack import SemiAck from py_mysql_binlogserver.packet.slave import Slave from py_mysql_binlogserver.protocol.err import ERR from py_mysql_binlogserver.protocol.packet import file2packet, dump_my_packet err2 = ERR(1045, '28000', 'Access denied for user %s.' % ("alvinzane",)) err2.sequenceId = 2 buff2 = err2.toPacket() dump_my_packet(buff2) print(buff2) slave = Slave("127.0.0.1", 'repl', 'repl1234', 3306, 3306100, 3306201) slave.sequenceId = 2 # dump_my_packet(slave) buf = slave.getPayload() print(buf) dump_my_packet(buf) dump = DumpGtid(3306201, "f0ea18e0-3cff-11e9-9488-0800275ae9e7:1-10") slave.sequenceId = 0 # dump_my_packet(slave) buf = dump.getPayload() print(buf) dump_my_packet(buf) dump = DumpPos(3306201, "mysql-bin.000007", 4)