#!/usr/bin/env python
"""
Dump mongo records after a certain date
"""
from datetime import datetime, timedelta
import os, sys
# Third-party
import pymongo
# Local
from netlogger import nlapi

def usage():
    x = {'program' : os.path.basename(sys.argv[0])}
    print "usage: %(program)s {host} {database} {user:password} {collection} {field} {since} {until} {key:val ...}" % x
    print "  -- if no user:password is needed, use ':' "
    print "  -- since and until are both in days"
    print "  -- the key:val pairs are added to the mongodb expression"
    sys.exit(2)

def say(msg):
    sys.stdout.write(msg)
    sys.stdout.write("\n")

def error(msg):
    sys.stderr.write("ERROR: ")
    sys.stderr.write(msg)
    sys.stderr.write("\n")

def run(args=None):
    try:
        i = 0
        if args is None:
            args = sys.argv[1:]
        extra = None
        if len(args) > 7:
            extra = args[7:]
            args = args[:7]
        host, db_name, db_auth, coll_name, dt_field, since, until = args
        since = int(since)
        until = int(until)        
        try:
            db_user, db_pw = db_auth.split(':')
        except ValueError:
            error("Bad value for {user:password}")
            usage()
        expr_extra = { }
        if extra:
            for pair in extra:
                key, value = pair.split(':')
                expr_extra[key] = value
    except (IndexError, ValueError), err:
        error(str(err))
        usage()
    conn = pymongo.Connection(host=host)
    #print "connection = %s" % conn
    db = conn[db_name]
    if db_user and db_pw:
        db.authenticate(db_user, db_pw)
    coll = db[coll_name]
    dt0 = datetime.now() - timedelta(since)
    dt1 = datetime.now() - timedelta(until)
    #print "%s >= date <= %s" % (dt0, dt1)
    expr = {dt_field : { '$gte' : dt0, '$lte' : dt1 }  }
    expr.update(expr_extra)
    #print expr
    cursor = coll.find(expr)
    if cursor is None:
        return 1
    write_log(cursor)

def write_log(cursor):
    log = nlapi.Log(logfile=sys.stdout)
    TS, EV = nlapi.TS_FIELD, nlapi.EVENT_FIELD
    log.setLevel(nlapi.Level.ALL)
    for doc in cursor:
        ts = doc.get(TS, None)
        ev = doc.get(EV, None)
        if ts and ev:
            log.write(**doc)

if __name__ == '__main__':
    try:
        sys.exit(run())
    except Exception, err:
        error(str(err))
        sys.exit(-1) 
