zoukankan      html  css  js  c++  java
  • 动态构建ConfigObj的configspec

    validate模块用来验证ini文件是否合法,内部设定的值是否合乎逻辑。

    但是我们的配置文件有些section是可选的,所以后来想到用下面这种办法来动态构建一个spec文件。

    示例代码如下:

    #coding:utf-8
    
    '''
    test configuration of float in same min max value range
    '''
    
    from pprint import pprint
    
    from StringIO import StringIO
    
    from configobj import ConfigObj, ConfigObjError, flatten_errors
    from validate import Validator
    
    
    cfg_file = StringIO('''
    option = opt1 # or opt2 
    version = 1.0
    [sec1]
    vv = 1
    [sec2]
    vv = 1
    [sec3]
    vv = 1
    ''')
    
    # base config, these always appear
    base_spec = '''
    version = float(min=2.0, max=2.0)
    link_type = option("telnet", "ssh")
    
    [db]
    ip = ip_addr
    sid = string(1,24)
    username = string(1,24)
    password = string(1,24)
    '''
    
    optional_sec1_spec = '''
    [optional_sec1]
    sec1_opt1 = string(1, 24)
    '''
    
    sec1_2_namelist = [
                       'sec1',
                       'sec2',
                       ]
    sec1_spec = '''
    [{}]
    enable=boolean
    '''
    
    sec3_spec = '''
    {}
    sleeptime=float(0, 100)'''.format(sec1_spec)
    sec3_4_5_namelist= ['sec3',
                        'sec4',
                        'sec5',
                        ]
    
    def main():
        vldt = Validator()
        # first configuration read from file
        # no spec has been bind to it
        cfg1 = ConfigObj(cfg_file)
        spec_file = StringIO()
        spec = spec_file
        spec.write(base_spec)
        if 'optional_sec1' in cfg1:
            spec.write(optional_sec1_spec)
        
        for section in sec1_2_namelist:
            if section in cfg1:
                spec.write(sec1_spec.format(section))
        
        for section in sec3_4_5_namelist:
            if section in cfg1:
                spec.write(sec1_spec.format(section))
        
        print spec.getvalue()
        return
    
        cfg = ConfigObj(cfg1, configspec=spec)
        
        result = cfg.validate(vldt, True)
        # TODO: flatten_errors
        if result is not True:
            pprint(result)
    
    
    if __name__ == '__main__':
        try:
            main()
        except ConfigObjError as err:
            print err.errors
    

      

  • 相关阅读:
    network / ethtool / eno
    java使用秘钥 对字符串进行加密、解密
    windows服务器环境下使用jenkins自动化部署vue前端项目
    ESXi下的常用命令
    使用kubeadm手动安装Kubernetes(附带Dashboard)
    cobbler高可用方案
    Linux服务器端口access改为trunk all
    Corosync fence盘替换
    Linux服务器CPU性能模式
    本地代码上传github失败常见错误
  • 原文地址:https://www.cnblogs.com/morya/p/2246899.html
Copyright © 2011-2022 走看看