2017-10-09 28 views
0

我对python和mako很新,我可能在基本概念上遇到麻烦。我有工作模板,但是如果我可以使用netaddr模块来处理模板中的IP地址,我的CSV输入可以大大地清理干净。我想要做的是通过一个接口IP变量,如: LAN_IP ='192.168.1.1/24'(我从CSV做这个)到模板,然后以某种方式使用netaddr模块来填写IP,子网掩码(点分十进制和反掩码)和网络地址,以便我可以在同一配置中使用该CSV变量作为bgp网络语句,eigrp掩码和ACL等。我可以从Python shell执行以下操作:使用mako进行思科配置生成。是否可以在模板中使用netaddr模块(或任何模块)?

>>> from netaddr import * 
>>> LAN_IP = '192.168.1.1/24' 
>>> IP = IPNetwork(LAN_IP) 
>>> print(IP.ip) 
192.168.1.1 
>>> print(IP.network) 
192.168.1.0 
>>> print(IP.netmask) 
255.255.255.0 
>>> print(IP.hostmask) 
0.0.0.255 

编辑。我被告知尝试使用构建功能的ipaddress。从Python提示符尝试这表明它可以工作:

MAKO_TEMPLATE_STRING = """\ 
<%def name="get_netmask(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).netmask 
%></%def> 
<%def name="get_address(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).ip 
%></%def> 
<%def name="get_subnet(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).network 
%></%def> 
<%def name="get_hostmask(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).hostmask 
%></%def> 
! Variable Input: ${data} 
${get_address(data)} ${get_netmask(data)} ${get_subnet(data)} ${get_hostmask(data)} 
""" 
print(Template(MAKO_TEMPLATE_STRING).render(data="192.168.1.1/25")) 

这给了我下面的输出: !可变输入:192.168.1.1/25 192.168.1.1 255.255.255.128 192.168.1.0/25 0.0.0.127

现在,一个新的问题是,ipaddress.IPv4Interface(ip_string)。网络定义返回网络PLUS子网netaddr没有做的“192.168.1.0/25”。我还没有找到任何方法让ipaddress只返回子网部分。

所以对于模板构建我有点远....如果我把只有这到模板,它证明:

<%def name="get_netmask(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).netmask 
%></%def> 
<%def name="get_address(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).ip 
%></%def> 
<%def name="get_network(ip_string)"><% 
    import ipaddress 
    return ipaddress.IPv4Interface(ip_string).network 
%></%def> 

但是当我尝试任何类型的引用,我得到一个错误。

! Variable Input: ${LAN_IP} <--I tried with and without this line 
${get_address(LAN_IP)} <--The template does not seem to like these references. 
${get_netmask(LAN_IP)} 
${get_subnet(LAN_IP)} 

在我看来,我错过了一些非常简单的东西,但也许我错误地接近了这个问题。任何帮助将不胜感激,因为Mako文档和谷歌已经很少说明如何做这样的事情。

+0

仍在工作,但目前为止还没有任何帮助。 –

+0

虽然我可能已经变得更远了。我试过这个模板: <%! ##蟒模块级代码 进口IPADDRESS %> <%DEF名称= “get_address(ip_string)”> <% 返回ipaddress.IPv4Interface(ip_string).IP %> !变量输入:$ {LAN_IP} $ {get_address(LAN_IP)} 现在我得到无效的模板,请更正以下错误:模板属性错误:在“测试”应为4个字节 由于“测试”是没有在我的模板中,我认为这是前端代码中的一个错误。 –

回答

0

问题出在验证码上。在模板的python部分中,由于验证过程中的值无效,类IPv4Interface将引发异常。因此,服务器拒绝表单数据并且不创建模板。

解决方案:如果您将错误处理添加到模板的python部分,它会起作用。

<%! 
    ## python module-level code 
    import ipaddress 
%> 
<%def name="get_address(ip_string)"> 
    <% 
    try: 
     return ipaddress.IPv4Interface(ip_string).ip 
    except Exception: 
     return "FAIL_OR_EMPTY" 
    %> 
</%def> 
! Variable Input: ${LAN_IP} 
${get_address(LAN_IP)} 

说明:在HTML表格的服务器端验证,配置模板呈现与设置为验证的句法的伪参数(见文件app/forms.py,类ConfigTemplateForm)。在表单验证过程中,您的配置模板已通过以下参数设置进行验证:

{ 
    "hostname": "test", 
    "LAN_IP": "test" 
} 
相关问题