def read_packet(skt):
    while True:
        packet = read_server_packet(skt)
        sequenceId = getSequenceId(packet)
        print("read packet [%s]:" % (sequenceId, ))
        dump_my_packet(packet)
        packetType = getType(packet)

        if packetType == Flags.ERR:
            buf = ERR.loadFromPacket(packet)
            print("error:", buf.errorCode, buf.sqlState, buf.errorMessage)
            skt.close()
            exit(1)
            break

        if packetType == Flags.EOF or packetType == Flags.OK:
            break
def read_binlog(skt):
    while True:
        packet = read_server_packet(skt)
        sequenceId = getSequenceId(packet)
        packetType = getType(packet)

        # OK value
        # timestamp
        # event_type
        # server_id
        # log_pos
        # flags
        unpack = struct.unpack('<cIcIIIH', packet[6:26])

        # Header
        timestamp = unpack[1]
        event_type = byte2int(unpack[2])
        server_id = unpack[3]
        event_size = unpack[4]
        # position of the next event
        log_pos = unpack[5]
        flags = unpack[6]

        print('timestamp', 'event_type', 'server_id', 'event_size', 'log_pos')
        print(timestamp, event_type, server_id, event_size, log_pos)
        dump_my_packet(packet)

        if event_type == 16:
            ack = SemiAck("mysql-bin.000001", log_pos)
            ack.sequenceId = 0
            packet = ack.toPacket()
            send_socket(skt, packet)

        if packetType == Flags.ERR:
            buf = ERR.loadFromPacket(packet)
            print("error:", buf.errorCode, buf.sqlState, buf.errorMessage)
            skt.close()
            exit(1)
            break

        if packetType == Flags.EOF or packetType == Flags.OK:
            break
def get_socket(host='127.0.0.1', port=3306, user="", password="", schema=""):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))

    packet = read_server_packet(s)
    print("received 1:")
    dump_my_packet(packet)

    challenge = Challenge.loadFromPacket(packet)

    challenge1 = challenge.challenge1
    challenge2 = challenge.challenge2

    scramble_password = scramble_native_password(password,
                                                 challenge1 + challenge2)
    response = Response()
    response.sequenceId = 1
    response.capabilityFlags = 33531397
    response.characterSet = 33
    response.maxPacketSize = 16777216
    response.clientAttributes["_client_name"] = 'pymysql'
    response.clientAttributes["_pid"] = str(os.getpid())
    response.clientAttributes["_client_version"] = '5.7'
    response.clientAttributes["program_name"] = 'mysql'
    response.pluginName = 'mysql_native_password'
    response.username = user
    response.schema = schema
    response.authResponse = scramble_password
    response.removeCapabilityFlag(Flags.CLIENT_COMPRESS)
    response.removeCapabilityFlag(Flags.CLIENT_SSL)
    response.removeCapabilityFlag(Flags.CLIENT_LOCAL_FILES)

    packet = response.toPacket()
    print("login 1:")
    dump_my_packet(packet)

    s.sendall(packet)

    packet = read_server_packet(s)
    print("received 2:")
    dump_my_packet(packet)

    return s
Пример #4
0
        prelude += gtid_set.encoded()

        return prelude

    @staticmethod
    def loadFromPacket(packet):
        return None


if __name__ == "__main__":
    packet = bytes.fromhex(
        "6f0000001e000075723200000000000400000000000000580000000200000000000000ba66414cd10d11e9b4b00800275ae9e7010000000000000001000000000000001700000000000000f0ea18e03cff11e994880800275ae9e7010000000000000001000000000000002000000000000000"
    )

    print("length 1:", len(packet))
    dump_my_packet(packet)

    header_size = (
        2 +  # binlog_flags
        4 +  # server_id
        4 +  # binlog_name_info_size
        4 +  # empty binlog name
        8  # binlog_pos_info_size
    )

    off = 4 + 1
    # header = struct.unpack('<iHIIQI', packet[off:header_size+off])
    # print(header)

    # payload = packet[27:]
    payload = packet[off + header_size:]
def send_socket(skt, buff):
    print("send packet:")
    dump_my_packet(buff)
    skt.sendall(buff)
    dump_my_packet(buff)
    skt.sendall(buff)


if __name__ == "__main__":
    s = get_socket(host="192.168.1.100",
                   user="******",
                   password="******",
                   schema="mysql")

    sql = Query()
    sql.sequenceId = 0
    sql.query = "SET @slave_uuid= '8efa8f0a-d128-11e9-952d-0800275ae9e7'"
    packet = sql.toPacket()
    print("query 0:")
    dump_my_packet(packet)
    send_socket(s, packet)
    read_packet(s)

    sql = Query()
    sql.sequenceId = 0
    sql.query = "SET @master_heartbeat_period= 30000001024"
    packet = sql.toPacket()
    print("query 1:")
    dump_my_packet(packet)
    send_socket(s, packet)
    read_packet(s)

    slave = Slave("", '', '', 3306, 3306100, 3306201)
    slave.sequenceId = 0
    packet = slave.getPayload()
Пример #7
0
 def test_dumpgtid(self):
     dump = DumpGtid(3306201, "f0ea18e0-3cff-11e9-9488-0800275ae9e7:1-10")
     dump.sequenceId = 0
     buf = dump.toPacket()
     dump_my_packet(buf)
Пример #8
0
 def test_semiack(self):
     dump = SemiAck("mysql-bin.000007", 4)
     dump.sequenceId = 0
     buf = dump.toPacket()
     dump_my_packet(buf)
Пример #9
0
 def test_slave(self):
     slave = Slave("127.0.0.1", 'repl', 'repl1234', 3306, 3306100, 3306201)
     slave.sequenceId = 2
     # dump_my_packet(slave)
     buf = slave.getPayload()
     dump_my_packet(buf)
Пример #10
0
 def test_err(self):
     err2 = ERR(1045, '28000',
                'Access denied for user %s.' % ("alvinzane", ))
     err2.sequenceId = 2
     buff2 = err2.toPacket()
     dump_my_packet(buff2)
        super(FormatDescriptionEvent, self).__init__(timestamp, event_type,
                                                     server_id)
        self.sequenceId = 1
        self.binlog_version = 4
        self.mysql_server_version = '5.7.25-log'
        self.timestamp = timestamp or int(time.time())
        self.header_length = 19
        self.event_type_header_length = bytes.fromhex(
            "38 0D 00 08 00 12 00  04 04 04 04 12 00 00 5F 00 04 1A 08 00 00 00 08  08 08 02 00 00 00 0A 0A 0A 2A 2A 00 12 34 00 00 FF 77 B6 DC"
        )

    def getEventBody(self):
        payload = bytearray()

        payload.extend(Proto.build_fixed_int(2, self.binlog_version))
        payload.extend(Proto.build_fixed_str(50, self.mysql_server_version))
        payload.extend(Proto.build_fixed_int(4, self.timestamp))
        payload.extend(Proto.build_fixed_int(1, self.header_length))
        payload.extend(self.event_type_header_length)

        return payload

    @staticmethod
    def loadFromPacket(packet):
        return b''


if __name__ == "__main__":
    event = FormatDescriptionEvent(0, 0x0f, 3306101)
    dump_my_packet(event.toPacket())
Пример #12
0
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)