由于经常要对一个json格式的文件进行操作,编辑文本比较麻烦,想了想写个脚本对其文件操作,将修改文件直接发送到邮箱里
文件目录如下:
drwxr-xr-x 2 root root 4096 12月 29 16:14 backup
-rw-r--r-- 1 root root 168 12月 29 16:10 config.ini
-rwx------ 1 root root 2106 12月 29 16:13 email_server.py
drwxr-xr-x 2 root root 4096 12月 29 10:16 log
-rw-r--r-- 1 root root 454 12月 29 16:14 shadowsocks.json
-rwx------ 1 root root 2857 12月 29 16:08 shadowsocks.py
大概解释下backup里存放每次操作之前的json文本,作为备份,log文件存放操作日志,email作为邮件发送,config作为配置文件,存放数据信息
操作的json格式如下:
{
"_comment": {
"40001": "xiaoming",
"40009": "xiaohong",
"40010": "1",
"40011": "test"
},
"method": "aes-256-cfb",
"port_password": {
"40001": "password10",
"40009": "SDSFS#X09",
"40010": "pQW26hBYMyNnLgm1",
"40011": "k9nYaRNF7GlW2ejE"
},
"server": "XXXXXXXX",
"timeout": 600
}
每次在comment和password中插入数据,逻辑:假设新增test这个用户,在comment中取出健,并进行排序,找出最大的40010,自动增1,生成“40011:test”这条数据,生成一个随机密码,在password中插入“40011:*****”这条数据,将新增信息发送至邮箱。
shadowsocks.py源码:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import subprocess
import os
import commands
import json
import random
import string
from email_server import main
import shutil
import time
import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read('config.ini')
file_path = conf.get("backup", "file_path")
backup_path= conf.get("backup", "backup_path")
def open_json(option,user):
with open(file_path,'r') as load_f:
try:
load_dict = json.load(load_f)
if(option == "-a"):
if user in load_dict['_comment'].values():
print "用户名已存在!"
return -1
else:
return add_user(load_dict,user)
elif(option == "-d"):
if user in load_dict['_comment'].values():
return delete_user(load_dict,user)
else:
print "用户名不存在!"
return -1
else:
print "可使用参数\n -a 添加用户\n -d 删除用户"
return -1
finally:
load_f.close( )
'''删除用户'''
def delete_user(load_dict,user):
keys = [x[0] for x in load_dict['_comment'].items() if user in x[1]]
print keys
for n in keys:
del load_dict['_comment'][n]
del load_dict['port_password'][n]
print "用户名已删除!"
return load_dict
'''加载用户'''
def add_user(load_dict,user):
items = load_dict['port_password'].items()
items.sort()
new_port = (int(items[len(items)-1][0])) + 1
salt = ''.join(random.sample(string.ascii_letters + string.digits, 16))
dict1={new_port : salt}
dict2={new_port : user}
load_dict['port_password'].update(dict1)
load_dict['_comment'].update(dict2)
print "用户名已加载!"
main(user,salt,new_port)
return load_dict
'''重新加载json文件'''
def write_json(load_dict):
with open(file_path,"w") as dump_f:
try:
json.dump(load_dict,dump_f,sort_keys=True,indent=4)
finally:
dump_f.close()
def email_send():
'''pass'''
if __name__ == "__main__":
log_time=time.strftime("%Y%m%d%H%M%S", time.localtime())
shutil.copyfile(file_path,backup_path + log_time)
if len(sys.argv) < 3:
print "用法:python shadowsocks.py [-options] username\n[-option]:\n -a 添加用户\n -d 删除用户"
sys.exit()
option = sys.argv[1]
name = sys.argv[2]
if(name != ""):
load_dict = open_json(option,name)
if load_dict != -1 and load_dict !="" :
write_json(load_dict)
else:
print "失败"
else:
print "用法:python shadowsocks.py [-options] username\n[-option]:\n -a 添加用户\n -d 删除用户"
config.ini配置文件:
[backup]
file_path=shadowsocks.json
backup_path =backup/shadowsocks.json
[email]
mail_host=smtp.***.com
mail_user=*****
mail_pass=*****
mail_postfix=****
邮件服务就不贴了,网上很多,最后效果如图: