├── README.md └── memcachedumper.py /README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /memcachedumper.py: -------------------------------------------------------------------------------- 1 | '''Dump all non-null data from a listening memcached server instance''' 2 | import socket 3 | import argparse 4 | import time 5 | import re 6 | import sys 7 | 8 | def recv_basic(the_socket,terminator): 9 | total_data=[] 10 | while True: 11 | data = the_socket.recv(8192) 12 | if not data: 13 | break 14 | total_data.append(data) 15 | if terminator in data: 16 | break 17 | return ''.join(total_data) 18 | 19 | if __name__ == '__main__': 20 | parser = argparse.ArgumentParser() 21 | parser.add_argument("-t","--target",help='Memcached server host:port') 22 | args = parser.parse_args() 23 | 24 | if(len(sys.argv) < 2): 25 | parser.print_help() 26 | sys.exit(0) 27 | 28 | [host,port] = args.target.split(':') 29 | port = int(port) 30 | 31 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 32 | s.connect((host,port)) 33 | s.send('stats items\n') 34 | statItems = recv_basic(s,'END') 35 | 36 | itemNumbers = re.findall('STAT items:(\d+):number (\d+)',statItems) 37 | 38 | for itemNumber in itemNumbers: 39 | cmd = 'stats cachedump '+itemNumber[0]+' '+itemNumber[1]+'\n' 40 | s.send(cmd) 41 | keys = recv_basic(s,'END') 42 | keyNames = re.findall('ITEM ([^\s]+) \[(\d+) b',keys) 43 | 44 | for keyName in keyNames: 45 | if(int(keyName[1]) != 0): 46 | print keyName[0] 47 | s.send('get ' + keyName[0]+'\n') 48 | content = recv_basic(s,'END') 49 | print content --------------------------------------------------------------------------------