2011-04-20 147 views
2

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

我的第一个猜测是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 
    } 
    } 
} 

谢谢!

+0

哪里是你的pyparsing代码? – nosklo 2011-04-20 11:15:01

回答

0

这里是在解析这个数据粗略第一遍:

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]]