python 解析Nginx配置文件

该博客介绍了如何利用Python的Crossplane模块解析Nginx的vhosts配置文件,并将其内容存储到数据库中。同时,提供了从数据库中读取数据并转换回原始vhosts配置文件格式的方法。主要涉及Django模型配置、数据解析和存储以及数据到配置文件的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要使用的开源的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
        
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

day>day>up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值