#!/usr/bin/env python
import sys
import os
import glob
import shutil
import getopt
import mc_bin_client

DEFAULT_PORT="11210"

def usage(err=None):
    print >> sys.stderr, """
Usage: %s [--vacuum] [--backupto=<dest_dir>] [--port=%s]
""" % (os.path.basename(sys.argv[0]), DEFAULT_PORT)

    if err:
        print >> sys.stderr, err
    sys.exit(1)

def isADBFile(f):
    return f.endswith('.sqlite') or f.endswith('.mb')

def findCmd(cmdName):
    cmd_dir = os.path.dirname(sys.argv[0])
    possible = []
    for bin_dir in [cmd_dir, os.path.join(cmd_dir, "..", "..", "bin")]:
        possible = possible + [os.path.join(bin_dir, p) for p in [cmdName, cmdName + '.exe']]
    cmdbin = [p for p in possible if os.path.exists(p)][0]
    return cmdbin

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], '', ['vacuum', 'backupto=', 'port='])
    except getopt.GetoptError, e:
        usage(e.msg)

    if not opts:
        usage()

    flushctl = findCmd('mbflushctl')
    sqlitebin = findCmd('sqlite3')

    optdict = dict(opts)
    shouldVacuum = '--vacuum' in optdict

    dest_dir = optdict.get("--backupto")
    port = int(optdict.get("--port", DEFAULT_PORT))

    mc = mc_bin_client.MemcachedClient('127.0.0.1', port=port)
    db_path = mc.stats()['ep_dbname']
    db_files = glob.glob('%s*' % db_path)

    print 'Pausing persistence... ',
    os.system('"%s" 127.0.0.1:%d stop' % (flushctl, port))
    print 'paused.'
    try:
        for fn in db_files:

            if shouldVacuum and (fn == db_path or isADBFile(fn)):
                print "Vacuuming", fn
                os.system('"%s" "%s" vacuum' % (sqlitebin, fn))

            if dest_dir:
                dest_fn = os.path.join(dest_dir, os.path.basename(fn))
                print 'Copying %s to %s' % (fn, dest_fn)
                shutil.copyfile(fn, dest_fn)
    finally:
        print 'Unpausing persistence.'
        os.system('"%s" 127.0.0.1:%d start' % (flushctl, port))


if __name__ == '__main__':
    main()
