#!/bin/python #coding=utf-8 ### eg : mgotool.py -i 127.0.0.1 -p 10001 -a xxxxx -u root -rc #import sys #sys.path.append('../') #reload(sys) #import MySQLdb #import redis import datetime import pymongo import argparse import commands import os,sys,glob,re,time import ConfigParser from tempfile import TemporaryFile class mymongo: host=None port=None passwd=None user=None def __init__(self,host,port,user,passwd,dbname): self.host=host self.port=port self.passwd=passwd self.user=user self.dbname=dbname try: self.conn=self.mongo_conn() self.succ=True except Exception as error: print error print "Connect mongo error: %s,server ip:%s:%s" % (error,self.host,self.port) self.succ=False def mongo_conn(self): try: #self.connection=pymongo.MongoClient(host=self.host, port=int(self.port),serverSelectionTimeoutMS=3) #uri='mongodb://' + user + ':' + pwd + '@' + server + ':' + port +'/'+ db_name uri="mongodb://%s:%s@%s:%s/%s" % (self.user,self.passwd,self.host,self.port,self.dbname) #print uri self.connection=pymongo.MongoClient(uri) #self.connection=pymongo.MongoClient(host=self.host, port=int(self.port),serverSelectionTimeoutMS=3) return self.connection except Exception as error: print 'mongo connect fail %s' % (error) def admin_comm(self,stmt): return self.conn.admin.command(stmt) def current_op(myconn): db=myconn.conn['local'] #res=collection.find() current_op=db.current_op(True) #print current_op print "%-8s %-10s %-10s %-20s %-10s %-10s %-20s %s" % ('opid','desc','op','ns','secs','wLock','client','query') for one in current_op['inprog']: #print one.get('client','me') #print one if one.get('op','none')=='none': continue print "%-8s %-10s %-10s %-20s %-10s %-10s %-20s %s" % (one.get('opid','none'),one['desc'],one.get('op','none'),one.get('ns','none'),one.get('secs_running','none'),one.get('waitingForLock','none'),one.get('client','none'),one.get('query','none')) def slow_log(myconn): '获取慢日志' db=myconn.conn['local'] collection=db.system.profile #log=collection.find({"op":{ "$ne":'command'}).sort({ "ts" : -1 }) log=collection.find({"$and": [{"op":{ "$ne":'command'}},{"ns":{"$ne":"local.oplog.rs"}}]}).sort([('ts',-1)]) for one in log: #print one['ts'] #data['updata_time']+datetime.timedelta(hours=8) ts=str(one['ts']+datetime.timedelta(hours=8))[0:19] print "%-10s %-10s %-8s %-20s %-10s %-20s %-8s %-8s %-8s " %(one['op'],one['ns'],one['millis'],ts,one.get('client','none'),one.get('user','none'),one.get('nscanned','none'),one.get('nscannedObjects','none'),one.get('nreturned','none')) #print " %s" % (one.get('query','none')) if one.get("execStats"): print " %s" % (one.get("execStats",'none')) def count_coll(myconn): '返回每个集合的条目' try: alldb=myconn.conn.database_names() for one in alldb: if one not in ('admin','local'): print "[ {} ]:".format(one) db=myconn.conn[one] all_coll=db.collection_names() for one in all_coll: onecol=db[one] col_count=onecol.find().count() print "%-30s %-30s" % (one,col_count) #print all_coll except Exception, error: print error def user_list(myconn): '列出数据库用户列表' try: db=myconn.conn['admin'] col=db['system.users'] userlist=col.find() #print userlist for one in userlist: msg="" msg="""[ user_db: {} {} ]""".format(one['user'],one['db']) roles="" for onerole in one["roles"]: roles=roles+" db:%-15s role:%-20s" % (onerole['db'],onerole["role"]) allmsg=msg+roles+" " print allmsg except Exception, error: print error def repl_status(myconn): '查找复制集信息' try: db=myconn.conn['admin'] replstatus=db.command("replSetGetStatus") print "[ {} ]".format(replstatus["set"]) for one in replstatus["members"]: onemsg="""name:{} stateStr:{} health:{} uptime:{} """.format(one['name'],one["stateStr"],one["health"],one["uptime"]) print onemsg except Exception, error: print error def repl_conf(myconn): '查找复制集的配置信息' try: db=myconn.conn['admin'] replconf=db.command("replSetGetConfig") print "[ {} ]".format(replconf["config"]["_id"]) for one in replconf["config"]["members"]: onemsg="""host:{} hidden:{} priority:{} slaveDelay:{} votes:{} """.format(one['host'],one['hidden'],one['priority'],one['slaveDelay'],one['votes']) print onemsg except Exception, error: print error def mongo_conn(host,port,user,password,dbname): '连接mongo' try: myconn=mymongo(host,port,user,password,dbname) if myconn.succ: return True,myconn return False,'连接失败' except Exception, error: print error return False,error if __name__ == '__main__': parser = argparse.ArgumentParser(description='mgongo tools') parser.add_argument('-p','--port', type=int,required=True,help="指定实例端口") parser.add_argument('-i','--ip', type=str,required=True,help="ip") parser.add_argument('-u','--user', type=str,required=True,help="用户名") parser.add_argument('-a','--password', type=str,required=True,help="验证密码") parser.add_argument('-sl','--slowlog', action='store_true',default=False,help='查看慢日志') parser.add_argument('-c','--count', action='store_true',default=False,help='统计collction的文档数') parser.add_argument('-ul','--userlist', action='store_true',default=False,help='列出系统用户及权限') parser.add_argument('-co','--currentop', action='store_true',default=False,help='查看当前连接线程') parser.add_argument('-rs','--replstatus', action='store_true',default=False,help='查看rs.status') parser.add_argument('-rc','--replconf', action='store_true',default=False,help='查看rs.config') args = parser.parse_args() port = args.port slowlog = args.slowlog count=args.count userlist=args.userlist currentop=args.currentop replstatus=args.replstatus replconf=args.replconf host=args.ip user=args.user password=args.password mongo_status,myconn=mongo_conn(host,port,user,password,'admin') if mongo_status: if slowlog: slow_log(myconn) if count: count_coll(myconn) if userlist: user_list(myconn) if currentop: current_op(myconn) if replstatus: repl_status(myconn) if replconf: repl_conf(myconn)