【问题标题】:Parsing keepalived.conf, translate to json解析keepalived.conf,翻译成json
【发布时间】:2011-04-20 11:06:34
【问题描述】:

解析 keepalived.conf 格式并将其返回到 json 的(python 首选)最佳方法是什么?我想自动添加/删除虚拟和真实服务器。

我的第一个猜测是 pyparsing,遵循 stackoverflow 的一些答案,但我无法让它工作!

keepalived.conf的格式是这样的:

virtual_server 192.168.1.1 80
{
lb_algo wrr
lb_kind DR
protocol TCP
ha_suspend
delay_loop 10

    # server-01
real_server 192.168.1.100 80
{
    weight 100
    inhibit_on_failure
    TCP_CHECK
    {
        connect_port 80
        connect_timeout 5
    }
}
# server-02
real_server 192.168.1.101 80
{
    weight 100
    inhibit_on_failure
    TCP_CHECK
    {
        connect_port 80
        connect_timeout 5
    }
  }
}

提前致谢!

【问题讨论】:

    标签: python json parsing


    【解决方案1】:

    这是解析此数据的粗略第一步:

    from pyparsing import *
    
    # basic punctuation - useful in parsing, but suppress from results    
    LBRACE,RBRACE = map(Suppress, "{}")
    
    # some simple terminals
    ipv4_address = Regex(r"\d{1,3}(\.\d{1,3}){3}")
    ipv6_address = Regex(r"[0-9a-fA-F:]+")
    ip_address = ipv4_address | ipv6_address
    integer = Word(nums).setParseAction(lambda t:int(t[0]))
    
    # config parameters that take 0 or 1 arguments    
    config_param0 = oneOf("ha_suspend inhibit_on_failure")
    config_param1 = oneOf("""lb_algo b_kind protocol delay_loop weight 
                             connect_port connect_timeout""")
    param_arg = integer | Word(alphanums)
    config_param = Group(config_param1 + param_arg) | config_param0
    
    # definitions for a real_server    
    tcp_check = ("TCP_CHECK" + LBRACE + 
                    OneOrMore(config_param) +
                    RBRACE)
    
    real_defn = Group("real_server" + 
                    ip_address("rip_address") + 
                    integer("rport") + LBRACE +
                    ZeroOrMore(config_param)("params") + 
                    tcp_check("tcp_check") + RBRACE
                    )
    
    # definiton for a virtual_server                    
    virtual_defn = ("virtual_server" + 
                    ip_address("vip_address") + 
                    integer("vport") + LBRACE +
                    ZeroOrMore(config_param)("params") + 
                    OneOrMore(real_defn)("real_defns") + RBRACE
                    )
    
    # skip over comments
    comment = '#' + restOfLine
    virtual_defn.ignore(comment)
    
    # parse the input string and dump out the pieces
    confdata = virtual_defn.parseString(conf)
    print confdata.dump()
    for rip in confdata.real_defns:
        print
        print rip.dump()
    

    打印以下内容:

    ['virtual_server', '192.168.1.1', 80, ['lb_algo', 'wrrl'], ...
    - params: [['lb_algo', 'wrrl'], ['b_kind', 'DR'], ['protocol', 'TCP'], 
                'ha_suspend', ['delay_loop', 10]]
    - real_defns: [['real_server', '192.168.1.100', 80, ['weight', ...
    - vip_address: 192.168.1.1
    - vport: 80
    
    ['real_server', '192.168.1.100', 80, ['weight', 100], 'inhibit_on_fa...
    - params: [['weight', 100], 'inhibit_on_failure']
    - rip_address: 192.168.1.100
    - rport: 80
    - tcp_check: ['TCP_CHECK', ['connect_port', 80], ['connect_timeout', 5]]
    
    ['real_server', '192.168.1.101', 80, ['weight', 100], 'inhibit_on_fai...
    - params: [['weight', 100], 'inhibit_on_failure']
    - rip_address: 192.168.1.101
    - rport: 80
    - tcp_check: ['TCP_CHECK', ['connect_port', 80], ['connect_timeout', 5]]
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2012-04-28
      • 2018-12-30
      • 1970-01-01
      • 2012-05-07
      • 2018-02-08
      相关资源
      最近更新 更多