2017-10-09 8 views
0

Je suis très nouveau à python et mako et je peux avoir des problèmes avec les concepts de base. J'ai des modèles de travail mais mon entrée CSV pourrait être nettoyée considérablement si je pouvais utiliser le module netaddr pour travailler avec les adresses IP dans le modèle. Ce que je voudrais faire est de passer une variable IP d'interface comme: LAN_IP = '192.168.1.1/24' (je fais ceci d'un CSV) au modèle et puis en quelque sorte utiliser le module netaddr pour remplir l'IP, sous-réseau masque (en pointillés décimal et masque inverse) et l'adresse réseau afin que je puisse utiliser cette variable CSV pour les instructions réseau bgp, les masques eigrp et ACL, etc dans la même configuration. Je peux faire ce qui suit d'une coquille de Python:Utilisation de mako pour la génération de config de Cisco. Est-il possible d'utiliser le module netaddr (ou n'importe quel module) dans les templates?

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

EDIT. On m'a dit d'essayer le ipaddress construit en fuction. Essayer partir d'une invite de Python montre que cela peut fonctionner:

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")) 

Cela me donne le résultat suivant: ! Entrée variable: 192.168.1.1/25 192.168.1.1 255.255.255.128 192.168.1.0/25 0.0.0.127

Maintenant, un nouveau problème est que la définition de .network ipaddress.IPv4Interface (ip_string) retourne le réseau PLUS le sous-réseau "192.168.1.0/25", ce que netaddr n'a pas fait. Je n'ai trouvé aucun moyen d'obtenir ipaddress pour retourner seulement la partie de sous-réseau.

Donc, pour la construction du modèle, je suis un peu plus loin .... Si je mets seulement cela dans le modèle, il valide:

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

Mais quand j'essaie tout type de référence, je reçois une erreur .

! 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)} 

Il me semble que je manque quelque chose ici très simple mais peut-être que je suis aborder le problème de la mauvaise façon. Toute aide serait grandement appréciée car les docs de Mako et Google ont peu avancé pour illustrer comment faire quelque chose comme ça.

+0

Encore en train de travailler dessus mais rien n'a encore aidé. –

+0

Je me suis peut-être un peu éloigné. J'ai essayé ceci pour un modèle: <%! ## code de niveau module python import ipaddress %> <% def name = "get_Address (ip_string)"> <% retour ipaddress.IPv4Interface (ip_string) .IP %> !Variable d'entrée: $ {LAN_IP} $ {get_Address (LAN_IP)} et maintenant je reçois modèle non valide, s'il vous plaît corriger l'erreur suivante: Modèle erreur d'attribut: attendu 4 octets dans 'test' Depuis 'test' est pas où dans mon modèle, je pense que c'est un bug dans le code frontal. –

Répondre

0

Le problème était avec le code de validation. Dans la section python du modèle, la classe IPv4Interface lève une exception en raison de la valeur non valide au cours du processus de validation. Par conséquent, le serveur rejette les données de formulaire et le modèle n'est pas créé.

Solution: Cela fonctionnerait si vous ajoutiez une gestion des erreurs à la section python du modèle.

<%! 
    ## 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)} 

Explication: Lors de la validation côté serveur du formulaire HTML, le modèle de configuration est rendu avec un paramètre fictif fixé pour vérifier la syntaxe (voir fichier app/forms.py, classe ConfigTemplateForm). Votre modèle de configuration est validé avec le jeu de paramètres suivant lors de la validation du formulaire:

{ 
    "hostname": "test", 
    "LAN_IP": "test" 
}