#!/usr/bin/python3 # Raw Python3 memcache dumper # Handy for internals ;) import sys from socket import socket, AF_INET, SOCK_STREAM ip = sys.argv[1] if len(sys.argv)>1 else None port = int(sys.argv[2]) if len(sys.argv)>2 else 11211 if ip == None: print('ERROR: No IP specified') print('USAGE: python3 ' + sys.argv[0] + ' ') sys.exit(1) def recvall(sock): BUFF_SIZE = 4096 # 4 KiB data = b'' while True: part = sock.recv(BUFF_SIZE) data += part if data[::-1][:5:][::-1] == b'END\r\n': break return data def get_item_numbers(data): items = [] data = data.decode().split('\r\n') items = list(set([x.split(':')[1] for x in data if ':' in x])) return items def get_item_keys(numbers, sock): keys = [] for i in numbers: sock.sendall(bytes(f"stats cachedump {i} 1000\n", 'utf-8')) d = recvall(s) keys.append(d.decode().split(' ')[1]) return list(set(keys)) def dump(keys, sock): for key in keys: sock.sendall(bytes(f"get {key}\n",'utf-8')) d = recvall(sock) d = d.split(b'\r\n')[1] print(key) try: print(d.decode()) except: print(d) with socket(AF_INET, SOCK_STREAM) as s: s.connect((ip, port)) # Get the items from memcahced s.sendall(b"stats items\n") d = recvall(s) # Parse the numbers out of the data dump numbers = get_item_numbers(d) keys = get_item_keys(numbers, s) dump(keys, s)