python打开摄像头 调节hue_python 监控binlog实现hue一个小插件

本文展示了如何使用Python的`pymysqlreplication`库监听MySQL的binlog事件,当检测到新用户插入时,通过SSH在多台主机上创建用户和组,并同步更新Hue数据库中的用户权限。程序还使用了`logging`进行日志记录,确保操作的可追踪性。
摘要由CSDN通过智能技术生成

from pymysqlreplication import BinLogStreamReader

from pymysqlreplication.row_event import (

DeleteRowsEvent,

UpdateRowsEvent,

WriteRowsEvent,

)

import threading

import paramiko

import logging.handlers

LOG_FILE = r'hue_auto_create_user.log'

handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5, encoding='utf-8') # 实例化handlerfmt = '%(asctime)s -%(levelname)s -%(message)s'

formatter = logging.Formatter(fmt) # 实例化formatterhandler.setFormatter(formatter) # 为handler添加formatter

logger = logging.getLogger('hue_auto_create_user') # 获取名为hue_auto_create_user的loggerlogger.addHandler(handler) # 为logger添加handlerlogger.setLevel(logging.DEBUG)

MYSQL_SETTINGS = {

"host": "cdh-m1.temp.online",

"port": 3306,

"user": "root",

"passwd": "12345"

}

HOST_ARRAY = [

'10.50.40.1',

'10.50.40.2',

'10.50.40.3',

'10.50.40.4',

'10.50.40.5',

'10.50.40.6',

'10.50.40.7',

'10.50.40.8',

'10.50.40.9',

'10.50.40.10',

]

def ssh_host_createUserAndGroup(ip, username, passwd, cmd):

try:

# 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数 # pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa') ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(ip, 22, username, passwd, timeout=5)

for m in cmd:

stdin, stdout, stderr = ssh.exec_command(m)

out = stdout.readlines()

# 屏幕输出 for o in out:

print(o)

logger.info(u"ssh 远程执行 {} Success".format(ip))

ssh.close()

except:

logger.error(u"ssh 远程执行 {} Error".format(ip))

def startTask(user):

cmd = ['useradd {}'.format(user), 'groupadd {}'.format(user),

'usermod -a -G {} {}'.format(user, user)] # 你要执行的命令列表 username = "root" # 用户名 passwd = "123456" # 密码

for ip in HOST_ARRAY:

a = threading.Thread(target=ssh_host_createUserAndGroup, args=(ip, username, passwd, cmd))

logger.info(u"Host {} 执行命令 {}".format(ip,cmd))

a.start()

def updateMysql(uid,userName):

import pymysql

cnx = pymysql.connect(user='root',

password='123456',

host='cdh-m1.temop.online',

database='hue',

port=3306,

charset='utf8'

)

cursor = cnx.cursor()

try:

cursor.execute("update auth_user set is_superuser=0 where id={}".format(uid))

#INSERT IGNORE INTO cursor.execute("insert INTO hue.auth_group ( id, name) SELECT (auth_group.id+1), '{}' FROM hue.auth_group order by id DESC limit 1".format(userName))

except Exception:

logger.error("已经存在 Group {}".format(userName))

print("已经存在 Group {}".format(userName))

cursor.execute("insert INTO hue.auth_user_groups(user_id,group_id) SELECT {},auth_group.id FROM hue.auth_group where hue.auth_group.name='{}'".format(uid, userName))

cnx.commit()

cnx.close()

def main():

stream = BinLogStreamReader(

connection_settings=MYSQL_SETTINGS,

server_id=100,

blocking=True,

resume_stream=True,

only_events=[DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent])

for binlogevent in stream:

e_start_pos, last_pos = stream.log_pos, stream.log_pos

for row in binlogevent.rows:

event = {"schema": binlogevent.schema,

"table": binlogevent.table,

"type": type(binlogevent).__name__,

"row": row

};

if binlogevent.table == "auth_user" and type(binlogevent).__name__ == "DeleteRowsEvent":

logger.info(u"DELETE User " + row['values']['username'])

print(u"DELETE User " + row['values']['username'])

if binlogevent.table == "auth_user" and type(binlogevent).__name__ == "WriteRowsEvent":

userName = row['values']['username'];

uid = row['values']['id'];

print(u"INSERT User {} Uid {}".format(row['values']['username'],uid))

startTask(userName)

logger.info(u"[INFO] 添加用户到集群所有节点 -> {}".format(userName) + "\n")

updateMysql(uid,userName)

logger.info(u"[INFO] 去掉Hue SuperUser {} Uid={}".format(userName, uid) + "\n")

if __name__ == "__main__":

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值