#!/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+"\n db:%-15s role:%-20s" % (onerole['db'],onerole["role"])
allmsg=msg+roles+"\n"
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)

简单的mongo小工具 python的更多相关文章

  1. 用C语言实现解析简单配置文件的小工具

    本文介绍作者写的一个小工具,简单的代码中包含了C语言对字符串的处理技巧,对文本文件的简单解析,二进制文件的数据复制的方法,以及格式化输出文本文件的示例. 工具的输入是如下内容的配置文件: ;资源管理器 ...

  2. 简单bmp图片处理工具——python实现

    预备实现功能: 1.读取bmp文件 2.保存bmp文件 3.对bmp图片进行放大.缩小 4.对bmp图片进行灰度化 5.对bmp图片进行旋转 bmp文件格式非常简单,对于我这种初学者来说减少了不少不必 ...

  3. 发送邮件小工具(python)

    #!/usr/bin/python # -*- coding:UTF- -*- import sys import smtplib import email.mime.multipart import ...

  4. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  5. 18种CSS3loading效果完整版,兼容各大主流浏览器,提供在线小工具使用

    今天把之前分享的两篇博客<CSS3实现10种Loading效果>和 <CSS3实现8种Loading效果[二]>整理了一下.因为之前所分享的各种loading效果都只是做了we ...

  6. 基于百度通用翻译API的一个翻译小工具

    前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发 ...

  7. 实用在线小工具 -- Google URL Shortener

          实用在线小工具 -- Google URL Shortener 当你想分享一些你觉得有趣的东西,但是那个链接太长,以至于贴上去一大片.比如在微博上分享一张图片,然后贴上去图片的链接,url ...

  8. python开发目录合并小工具 PathMerge

    前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...

  9. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

随机推荐

  1. HTML DOM insertBefore() 方法 问题

    写即时通讯时,每次新增的回话插到原有子节点的前面. 但是出现了以下报错的情况 如图: MDC: var insertedElement = parentElement.insertBefore(new ...

  2. ntp时钟服务器

    NTP服务器时钟校准的基本流程: (1):NTP客户端向NTP服务器发出一个时间请求包(UDP包),其中包含了该包离开客户端时的时间戳. (2):当服务器接收到该包时.填入包到达时的时间戳.包离开时的 ...

  3. Android sqlite日期存储

    SQLite日期类型是以TEXT.REAL和INTEGER类型分别不同的格式表示的,对应如下:TEXT: "YYYY-MM-DD HH:MM:SS.SSS"REAL: 以Julia ...

  4. Python爬虫教程-31-创建 Scrapy 爬虫框架项目

    本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环 ...

  5. Visual Studio Code调试electron主进程

    Visual Studio Code调试electron主进程 作者: jekkay 分类: electron 发布时间: 2017-06-11 14:56  一·概述 此文原出自[水滴石]: htt ...

  6. 使用spring aop遇到的坑

    1.aop 切点配置无误但只对控制器无效. 检测你的aop开启配置是否放在了spring配置文件中,如果是请把它移到mvc配置文件中. 我们知道当spring项目使用了spring mvc时,项目是存 ...

  7. mac和windows自动清理内存工具

    因为我比较懒,所以需要一款能自动清理电脑内存的工具,目的是设置内存最小值,然后自动清理. mac: drcleaner windows: MaxMem win10设置开机启动地址:C:\Program ...

  8. TreeSet 题

    QUESTION 4Given:12. import java.util.*;13. public class Explorer2 {14. public static void main(Strin ...

  9. 前后端分离, 前端如何防止直接输入URL进入页面?

    转自:https://blog.csdn.net/weixin_41829196/article/details/80444870 前后端分离,如何防止用户直接在地址栏输入url进入页面,也就是判断用 ...

  10. [零基础学JAVA]Java SE基础部分-02.标识符、数据类型

    转自:http://redking.blog.51cto.com/27212/114976 1.课程名称:标识符.数据类型 本季介绍了Java中的标识符的命名规则,各种关键字及数据类型的划分,并对各种 ...