主要使用的开源的python模块:crossplane
表结构如下:
CREATE TABLE `tbl_nginx_vhosts_params` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`directive` varchar(100) NOT NULL,
`args` varchar(255) NOT NULL,
`line` int(11) NOT NULL,
`parentId` int(11) NOT NULL,
`create_user` varchar(100) NOT NULL,
`create_time` datetime(6) NOT NULL,
`vhosts_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `tbl_nginx_vhosts_par_vhosts_id_1cfbaea0_fk_tbl_nginx` (`vhosts_id`),
CONSTRAINT `tbl_nginx_vhosts_par_vhosts_id_1cfbaea0_fk_tbl_nginx` FOREIGN KEY (`vhosts_id`) REFERENCES `tbl_nginx_vhosts` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9234 DEFAULT CHARSET=utf8;
Django Model配置:
directive = models.CharField(u'参数名', max_length=100, default='')
args = models.CharField(u'参数值', max_length=255, default='')
line = models.IntegerField(u'行数')
parentId = models.IntegerField(u'父级ID,做高级为0', default=0)
create_user = models.CharField(u'创建用户', max_length=100, default='')
create_time = models.DateTimeField(u'创建时间', auto_now_add=True)
vhosts = models.ForeignKey(NginxVhostsModel, on_delete=models.CASCADE, related_name='vhosts')
import crossplane
def conf2Json(vhost_path):
"""
python解析vhosts文件,屏蔽nginx.conf文件的校验
vhost_path: vhosts文件全路径
return:json数据格式,通过递归方式解析存入db
"""
parseContent = crossplane.parse(vhost_path, catch_errors=False, check_ctx=False, single=True)
return parseContent
def confJsonToDB(parse_dict: dict, parentId: int):
"""
nginx vhosts 内容json 解析存入db中
parse_dict:解析vhosts文件后的json数据:上述conf2json的返回值
parentId:父级ID,首次传入为0,代表一级
"""
directive = parse_dict['directive']
line = parse_dict['line']
args = ' '.join(parse_dict['args'])
vhosts_obj = {
"directive": directive,
"args": args,
"line": line,
"parentId": parentId,
"vhosts_id": self.vhosts_id
}
obj = db_model.create(**vhosts_obj) # 存入数据库操作,获取存入的新的parentId
next_id = obj.id
logger.info(f"Id: {next_id}, parentId: {parentId}; 写入key:{directive},val: {args}成功!")
block_list = parse_dict.get('block', [])
for stmt in block_list:
confJsonToDB(stmt, next_id)
def confDBToJson(_params_list: list):
"""
DB数据转化为nginx vhosts内容json
_params_list:查询数据后的queryset集合
"""
parsed = []
for _param_dict in _params_list:
auto_id = _param_dict['id']
directive = _param_dict['directive']
# line = _param_dict['line']
args = _param_dict['args']
stmt = {
'directive': directive,
# 'line': line,
'args': args.split(' ') if args else []
}
son_list = db_model.objects.filter(parentId=auto_id).values('id', 'directive', 'args')
if son_list:
stmt['block'] = confDBToJson(son_list)
parsed.append(stmt)
return parsed
def json2vhostConf(queryset: list) -> str:
"""
将json数据格式转化为vhosts文件内容字符串,结果可直接写入文件中
queryset:查询数据后的queryset集合:需要查询传入parentId=0的集合列表
"""
build_list = confDBToJson(queryset)
conf_str = crossplane.build(build_list)
return conf_str