Définition de vues pour les tables opérationnelles Junos PyEZ qui analysent les sorties non structurées
Opérations (op) Junos PyEZ Les tables pour sortie non structurée extraient des données de la sortie texte d’une commande CLI exécutée sur un équipement Junos ou d’une commande vty exécutée sur un concentrateur PIC flexible (FPC) donné. Une table est associée à une vue, qui est utilisée pour accéder aux champs des éléments de table et les mapper à des variables Python définies par l’utilisateur. Vous associez une table à une vue particulière en incluant la view propriété dans la définition de la table, qui prend le nom de la vue comme argument.
Une vue mappe vos variables définies par l’utilisateur aux données des éléments de table sélectionnés. Une vue vous permet d’accéder à des champs spécifiques de la sortie sous forme de variables avec des propriétés que vous pouvez manipuler en Python. Junos PyEZ gère l’extraction des données en Python ainsi que toute conversion de type ou normalisation de données. Les clés définies dans la vue doivent être des noms de variables Python valides.
Cette rubrique traite des différents composants de la vue.
Récapitulatif des paramètres dans les vues pour l’analyse des sorties non structurées
Les vues Junos PyEZ, comme les tables, sont mises en forme à l’aide de YAML. Les vues qui analysent la sortie non structurée peuvent inclure un certain nombre de paramètres. Le Tableau 1 récapitule les paramètres.
|
Paramètre de vue |
Descriptif |
|---|---|
|
Nom de l’affichage |
Identificateur défini par l’utilisateur pour la vue. |
|
|
(Facultatif) Liste des titres de colonne dans la sortie de la commande. |
|
|
(Facultatif) Tableau associatif, ou dictionnaire, d’une ou plusieurs paires clé-valeur qui mappent une clé définie par l’utilisateur à une chaîne contenant une expression mathématique. L’expression est évaluée pour chaque itération des données. La clé et la valeur calculée sont ajoutées aux données correspondant à cette itération. |
|
|
(Facultatif) Tableau associatif, ou dictionnaire, de paires clé-valeur qui mappent une clé définie par l’utilisateur à une chaîne. Si la chaîne est présente dans la sortie, la variable est définie sur True, sinon, la variable est définie sur False. |
|
|
(Facultatif) Tableau associatif, ou dictionnaire, de paires clé-valeur qui mappent une clé définie par l’utilisateur au nom d’une table imbriquée qui analyse une section spécifique de la sortie de la commande. |
|
|
(Facultatif) Liste d’une ou plusieurs clés définies sous |
|
|
(Facultatif) Liste des expressions régulières correspondant au contenu souhaité. |
Nom de l’affichage
Le nom de la vue est un identifiant défini par l’utilisateur pour la vue. Vous associez une table à une vue particulière en incluant la view propriété dans la définition de la table et en fournissant le nom de la vue comme argument.
L’exemple view suivant définit une vue nommée ChassisFanView, qui est référencée par le paramètre de la table :
---
ChassisFanTable:
command: show chassis fan
key: fan-name
view: ChassisFanView
ChassisFanView:
columns:
fan-name: Item
fan-status: Status
fan-rpm: RPM
fan-measurement: Measurement
Colonnes
Vous pouvez utiliser le paramètre dans une vue pour extraire et analyser la columns sortie de commande mise en forme en lignes et en colonnes.
Considérez le résultat de commande suivant show ospf neighbor :
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
Pour extraire les données, incluez le columns paramètre dans la vue et mappez le nom de votre variable Python au nom de la colonne. L’application stocke la clé et la valeur extraites de la sortie de commande de cette colonne sous forme de paire clé-valeur dans le dictionnaire de l’élément donné.
La vue suivante extrait les données de chaque colonne de la sortie de la show ospf neighbor commande :
---
OspfNeighborTable:
command: show ospf neighbor
key: Address
view: OspfNeighborView
OspfNeighborView:
columns:
neighbor_address: Address
interface: Interface
neighbor_state: State
neighbor_id: ID
neighbor_priority: Pri
activity_timer: Dead
Lorsque vous récupérez et imprimez les données dans l’application Junos PyEZ, les données de chaque voisin incluent les clés de colonne et les données correspondantes.
from jnpr.junos import Device from jnpr.junos.command.ospf_neighbor import OspfNeighborTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborTable(dev) stats.get() pprint(json.loads(stats.to_json()))
user@host:~$ python3 junos-pyez-ospf-neighbors.py
{'198.51.100.2': {'activity_timer': 39,
'interface': 'ge-0/0/0.0',
'neighbor_address': '198.51.100.2',
'neighbor_id': '192.168.0.2',
'neighbor_priority': 128,
'neighbor_state': 'Full'},
'198.51.100.6': {'activity_timer': 36,
'interface': 'ge-0/0/1.0',
'neighbor_address': '198.51.100.6',
'neighbor_id': '192.168.0.3',
'neighbor_priority': 128,
'neighbor_state': 'Full'}}
Pour filtrer les données afin de n’inclure que les données des colonnes sélectionnées, incluez le filters paramètre dans la vue. Pour plus d’informations, voir filtres.
Certaines sorties de commande incluent des titres de colonnes qui s’étendent sur plusieurs lignes, par exemple :
FI interrupt statistics
-----------------------
--------------------------------------------------------------------------------
Stream Total RLIM Total Cell timeout Total Reorder Total cell Total number
request PT/MALLOC Ignored cell timeout drops in of times
counter Usemeter errors secure mode entered into
saturation Drops secure mode
--------------------------------------------------------------------------------
36 0 0 1 1 0 0
128 0 0 1 49 0 0
142 0 0 1 53 0 0
--------------------------------------------------------------------------------
...
Pour définir un titre de colonne multiligne dans une vue, définissez l’élément clé de colonne égal à une liste de mots dans chaque ligne pour ce titre. La vue suivante définit les colonnes de la sortie de la commande précédente :
CChipFiStatsTable:
command: show mqss {{ chip_instance }} fi interrupt-stats
target: fpc8
args:
chip_instance: 0
key: Stream
view: CChipFiStatsView
CChipFiStatsView:
columns:
stream: Stream
req_sat:
- Total RLIM
- request
- counter
- saturation
cchip_fi_malloc_drops:
- Total
- PT/MALLOC
- Usemeter
- Drops
cell_timeout_ignored:
- Cell timeout
- Ignored
cchip_fi_cell_timeout:
- Total Reorder
- cell timeout
- errors
drops_in_secure:
- Total cell
- drops in
- secure mode
times_in_secure:
- Total number
- of times
- entered into
- secure mode
Expression d’évaluation (eval)
Vous pouvez utiliser le paramètre facultatif eval pour ajouter ou modifier des paires clé-valeur dans les données finales renvoyées par la table et la vue. Le eval paramètre mappe un nom de clé à une chaîne contenant une expression mathématique. Vous pouvez inclure le paramètre dans les tables et les eval vues, et eval définir et calculer plusieurs valeurs.
Lorsque vous utilisez eval dans une table, il fait référence au dictionnaire de données complet pour le calcul. La clé et la valeur calculée sont ajoutées en tant qu’élément supplémentaire unique au dictionnaire. Lorsque vous utilisez eval dans une vue, l’expression est calculée à chaque itération des données. La valeur calculée est ajoutée aux données pour cette itération. Si le nom de la eval clé correspond à une clé définie dans la vue, eval remplace la valeur de cette clé par la valeur calculée. Si le nom de la eval clé ne correspond pas à une clé définie dans la vue, eval ajoute la nouvelle clé et la valeur calculée aux données.
L’expression eval peut faire référence au data dictionnaire renvoyé par la vue. L’expression doit faire référence data à l’aide d’une variable modèle Jinja, afin que Junos PyEZ puisse remplacer la variable par le dictionnaire lors de l’évaluation de l’expression.
À partir de la version 2.8.1 de Junos PyEZ, les expressions utilisées dans les instructions Table et View eval sont évaluées à l’aide d’une implémentation restreinte afin de réduire les risques de sécurité liés à l’exécution de code. Junos PyEZ analyse et valide chaque expression par rapport à un ensemble pris en charge de syntaxe, de fonctions, de méthodes et d’opérations Python avant l’évaluation. Les expressions contenant des éléments non pris en charge ou non sécurisés sont rejetées avec une UnsafeExpressionError erreur. Le Tableau 2 présente les expressions prises en charge.
| Catégorie | Syntaxe prise en charge | Exemple |
|---|---|---|
|
Arithmétique |
+ - * / // % ** |
|
|
Logique booléenne |
|
|
|
Littéraux |
Entiers, flottants |
|
|
Littéraux de chaîne |
|
|
|
Littéraux du dictionnaire |
|
|
|
Liste littérale |
|
|
|
Définir des littéraux |
|
|
|
Littéraux de uplet |
|
|
|
Comparaison |
|
|
|
Dictionnaire |
|
|
|
Liste |
|
|
|
Ensemble |
|
{k for k in {{ data }}.keys()} |
|
Expressions conditionnelles |
|
|
|
Fonctions |
|
|
|
Générateur |
|
|
|
Indexation |
|
|
|
Adhésion |
|
|
|
Méthodes |
|
|
|
Découpage |
|
|
|
Opérateurs unaires |
|
|
L’exemple suivant est utilisé eval dans la définition View. L’entrée cpu modifie la valeur existante du cpu champ pour chaque élément du dictionnaire de données. L’entrée max crée une nouvelle paire clé-valeur pour chaque élément du dictionnaire de données.
---
FPCThread:
command: show threads
target: Null
key: Name
view: FPCThreadView
FPCThreadView:
columns:
pid-pr: PID PR
state: State
name: Name
stack: Stack Use
time: Time (Last/Max/Total)
cpu: cpu
eval:
cpu: "'{{ cpu }}'[:-1]"
max: "{{ time }}[4:12]"
Considérez l’exemple de sortie suivant pour la show threads commande vty :
PID PR State Name Stack Use Time (Last/Max/Total) cpu --- -- ------- --------------------- --------- --------------------- 1 H asleep Maintenance 680/32768 0/5/5 ms 0% 2 L running Idle 1452/32768 0/22/565623960 ms 80% 3 H asleep Timer Services 1452/32768 0/7/1966 ms 0% ...
Le paramètre View eval modifie chaque cpu entrée pour omettre le signe de pourcentage ( %). Par conséquent, les données comprennent « 0 » au lieu de « 0 % ». En outre, il ajoute une nouvelle clé, maxet sa valeur calculée pour chaque élément.
'Maintenance': {'cpu': '0',
'max': '5 ms',
'name': 'Maintenance',
'pid-pr': '1 H',
'stack': '680/32768',
'state': 'asleep',
'time': '0/5/5 ms'},
'Timer Services': {'cpu': '0',
'max': '7 ms',
'name': 'Timer Services',
'pid-pr': '3 H',
'stack': '1452/32768',
'state': 'asleep',
'time': '0/7/1966 ms'},
...
Pour obtenir des exemples d’utilisation eval dans la définition Table, consultez Expression d’évaluation (eval).
existe
Vous pouvez utiliser le paramètre facultatif exists dans une vue pour indiquer si une chaîne est présente dans la sortie de la commande. exists est un dictionnaire de paires clé-valeur qui mappent un nom de variable Python défini par l’utilisateur à la chaîne à faire correspondre dans la sortie de commande. Si la chaîne est présente dans la sortie, la variable est définie sur True. Sinon, la variable est définie sur False.
Considérez la sortie de la show host_loopback status-summary commande vty.
SENT: Ukern command: show host_loopback status-summary Host Loopback Toolkit Status Summary: No detected wedges No toolkit errors
Le tableau suivant définit exists pour tester si la sortie de la commande inclut une No detected wedges chaîne ou une No toolkit errors chaîne :
---
HostlbStatusSummaryTable:
command: show host_loopback status-summary
target: fpc1
view: HostlbStatusSummaryView
HostlbStatusSummaryView:
exists:
no_detected_wedges: No detected wedges
no_toolkit_errors: No toolkit errors
Lorsque vous utilisez Table and View pour tester les chaînes et imprimer les valeurs résultantes dans votre application Junos PyEZ, les deux variables sont définies sur True dans ce cas.
{'no_detected_wedges': True, 'no_toolkit_errors': True}
Champs
La sortie des commandes peut être longue et complexe, et vous pouvez avoir besoin d’une logique différente pour analyser différentes sections de la sortie. Dans certains cas, vous ne pouvez pas analyser correctement la sortie de la commande à l’aide d’une seule table et d’une seule vue. Pour analyser ce type de sortie, vous pouvez inclure le paramètre facultatif fields dans la vue. fields est un dictionnaire de paires clé-valeur qui mappent une clé définie par l’utilisateur au nom d’une table imbriquée qui sélectionne une section spécifique de la sortie de la commande. Chaque table imbriquée peut référencer sa propre vue, qui analyse les données sélectionnées par cette table.
Considérons la sortie de la show xmchip 0 pt stats commande vty, qui comporte deux sections de données différentes :
SENT: Ukern command: show xmchip 0 pt stats WAN PT statistics (Index 0) --------------------------- PCT entries used by all WI-1 streams : 0 PCT entries used by all WI-0 streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all WI-1 streams : 0 CPT entries used by all WI-0 streams : 0 CPT entries used by all LI streams : 0 Fabric PT statistics (Index 1) ------------------------------ PCT entries used by all FI streams : 0 PCT entries used by all WI (Unused) streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all FI streams : 0 CPT entries used by all WI (Unused) streams : 0 CPT entries used by all LI streams : 0
La vue suivante XMChipStatsView utilise le fields paramètre pour définir deux tables supplémentaires, qui sont utilisées pour analyser les deux sections différentes de la sortie de commande. _FabricPTStatTable Les _WANPTStatTable et Les tableaux extraient les données des WAN PT statistics sections et des Fabric PT statistics sections, respectivement. Dans ce cas, les tables utilisent le delimiter paramètre pour extraire et diviser les données. Ainsi, les tables n’ont pas besoin de référencer une vue distincte.
XMChipStatsTable:
command: show xmchip 0 pt stats
target: fpc1
view: XMChipStatsView
XMChipStatsView:
fields:
wan_pt_stats: _WANPTStatTable
fabric_pt_stats: _FabricPTStatTable
_WANPTStatTable:
title: WAN PT statistics (Index 0)
delimiter: ":"
_FabricPTStatTable:
title: Fabric PT statistics (Index 1)
delimiter: ":"
Lorsque vous récupérez et imprimez les données dans l’application Junos PyEZ, chaque clé définie sous fields contient les données sélectionnées et analysées par la table correspondante.
{'fabric_pt_stats': {'CPT entries used by all FI streams': 0,
'CPT entries used by all LI streams': 0,
'CPT entries used by all WI (Unused) streams': 0,
'CPT entries used by all multicast packets': 0,
'PCT entries used by all FI streams': 0,
'PCT entries used by all LI streams': 0,
'PCT entries used by all WI (Unused) streams': 0},
'wan_pt_stats': {'CPT entries used by all LI streams': 0,
'CPT entries used by all WI-0 streams': 0,
'CPT entries used by all WI-1 streams': 0,
'CPT entries used by all multicast packets': 0,
'PCT entries used by all LI streams': 0,
'PCT entries used by all WI-0 streams': 0,
'PCT entries used by all WI-1 streams': 0}}
Autre exemple, considérons la sortie de la show ttp statistics commande vty :
TTP Statistics:
Receive Transmit
---------- ----------
L2 Packets 4292 1093544
L3 Packets 542638 0
Drops 0 0
Netwk Fail 0 0
Queue Drops 0 0
Unknown 0 0
Coalesce 0 0
Coalesce Fail 0 0
TTP Transmit Statistics:
Queue 0 Queue 1 Queue 2 Queue 3
---------- ---------- ---------- ----------
L2 Packets 1093544 0 0 0
L3 Packets 0 0 0 0
TTP Receive Statistics:
Control High Medium Low Discard
---------- ---------- ---------- ---------- ----------
L2 Packets 0 0 4292 0 0
L3 Packets 0 539172 3466 0 0
Drops 0 0 0 0 0
Queue Drops 0 0 0 0 0
Unknown 0 0 0 0 0
Coalesce 0 0 0 0 0
Coalesce Fail 0 0 0 0 0
TTP Receive Queue Sizes:
Control Plane : 0 (max is 4473)
High : 0 (max is 4473)
Medium : 0 (max is 4473)
Low : 0 (max is 2236)
TTP Transmit Queue Size: 0 (max is 6710)
La FPCTTPStatsView vue utilise le fields paramètre pour référencer plusieurs tables imbriquées, qui extraient les données dans les différentes sections de la sortie. Chaque table fait référence à sa propre vue ou utilise le delimiter paramètre pour analyser les données de cette section.
---
FPCTTPStatsTable:
command: show ttp statistics
target: fpc2
view: FPCTTPStatsView
FPCTTPStatsView:
fields:
TTPStatistics: _FPCTTPStatisticsTable
TTPTransmitStatistics: _FPCTTPTransmitStatisticsTable
TTPReceiveStatistics: _FPCTTPReceiveStatisticsTable
TTPQueueSizes: _FPCTTPQueueSizesTable
_FPCTTPStatisticsTable:
title: TTP Statistics
view: _FPCTTPStatisticsView
_FPCTTPStatisticsView:
columns:
rcvd: Receive
tras: Transmit
_FPCTTPTransmitStatisticsTable:
title: TTP Transmit Statistics
view: _FPCTTPTransmitStatisticsView
_FPCTTPTransmitStatisticsView:
columns:
queue0: Queue 0
queue1: Queue 1
queue2: Queue 2
queue3: Queue 3
filters:
- queue2
_FPCTTPReceiveStatisticsTable:
title: TTP Receive Statistics
key: name
key_items:
- Coalesce
view: _FPCTTPReceiveStatisticsView
_FPCTTPReceiveStatisticsView:
columns:
control: Control
high: High
medium: Medium
low: Low
discard: Discard
_FPCTTPQueueSizesTable:
title: TTP Receive Queue Sizes
delimiter: ":"
Lorsque vous récupérez et imprimez les données dans l’application Junos PyEZ, chaque fields clé contient les données qui ont été extraites et analysées par la table correspondante.
{'TTPQueueSizes': {'Control Plane': '0 (max is 4473)',
'High': '0 (max is 4473)',
'Low': '0 (max is 2236)',
'Medium': '0 (max is 4473)'},
'TTPReceiveStatistics': {'Coalesce': {'control': 0,
'discard': 0,
'high': 0,
'low': 0,
'medium': 0,
'name': 'Coalesce'}},
'TTPStatistics': {'Coalesce': {'name': 'Coalesce', 'rcvd': 0, 'tras': 0},
'Coalesce Fail': {'name': 'Coalesce Fail',
'rcvd': 0,
'tras': 0},
'Drops': {'name': 'Drops', 'rcvd': 0, 'tras': 0},
'L2 Packets': {'name': 'L2 Packets',
'rcvd': 4292,
'tras': 1093544},
'L3 Packets': {'name': 'L3 Packets',
'rcvd': 542638,
'tras': 0},
'Netwk Fail': {'name': 'Netwk Fail',
'rcvd': 0,
'tras': 173},
'Queue Drops': {'name': 'Queue Drops',
'rcvd': 0,
'tras': 0},
'Unknown': {'name': 'Unknown', 'rcvd': 0, 'tras': 0}},
'TTPTransmitStatistics': {'L2 Packets': {'queue2': 0},
'L3 Packets': {'queue2': 0}}}
filtres
Le columns paramètre extrait les données de la sortie de commande qui est mise en forme en lignes et en colonnes. Lorsque vous incluez le columns paramètre dans une vue, vous pouvez éventuellement inclure le paramètre pour filtrer les filters données de colonne incluses dans la sortie finale. La filters valeur est une liste d’une ou plusieurs clés définies sous columns. L’ensemble final de données ne comprend que les données des colonnes sélectionnées. Vous pouvez fournir des filtres par défaut dans la définition de la vue, et vous pouvez également définir ou remplacer les valeurs de filtre dans l’application Junos PyEZ.
Considérez le résultat de la show ospf neighbor commande :
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
Dans la vue suivante, le columns paramètre définit des clés pour toutes les colonnes de la sortie de commande correspondante. Avec le paramètre included filters , le dictionnaire de données résultant inclut uniquement les données des Address colonnes and State .
---
OspfNeighborFiltersTable:
command: show ospf neighbor
key: Address
view: OspfNeighborFiltersView
OspfNeighborFiltersView:
columns:
neighbor_address: Address
interface: Interface
neighbor_state: State
neighbor_id: ID
neighbor_priority: Pri
activity_timer: Dead
filters:
- neighbor_address
- neighbor_state
Le code Junos PyEZ suivant appelle get() d’abord sans aucun argument, ce qui récupère les données à l’aide de la liste par défaut de filtres définis dans la vue. Le deuxième appel à get() inclut l’argument filters , qui remplace la liste de filtres définie dans la vue.
from jnpr.junos import Device from Tables.show_ospf_neighbor_filter import OspfNeighborFiltersTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborFiltersTable(dev) stats.get() pprint(json.loads(stats.to_json())) print('\n') stats.get(filters=['neighbor_address', 'neighbor_id', 'neighbor_state']) pprint(json.loads(stats.to_json()))
Lorsque vous exécutez l’application, le premier appel à get() utilise les filtres définis dans la vue. Le deuxième appel utilise les filtres définis dans l’appel, qui remplacent ceux définis dans la vue.
user@host:~$ python3 junos-pyez-ospf-filters.py
{'198.51.100.2': {'neighbor_address': '198.51.100.2', 'neighbor_state': 'Full'},
'198.51.100.6': {'neighbor_address': '198.51.100.6', 'neighbor_state': 'Full'}}
{'198.51.100.2': {'neighbor_address': '198.51.100.2',
'neighbor_id': '192.168.0.2',
'neighbor_state': 'Full'},
'198.51.100.6': {'neighbor_address': '198.51.100.6',
'neighbor_id': '192.168.0.3',
'neighbor_state': 'Full'}}
regex
Vous pouvez utiliser le paramètre facultatif regex dans une vue pour faire correspondre et extraire des champs spécifiques dans la sortie de la commande. regex est un dictionnaire qui mappe les clés aux expressions régulières. Si la table correspondante ne définit item: '*'pas , Junos PyEZ combine les expressions régulières et compare le résultat à chaque ligne de sortie. Toutefois, si la table définit item: '*' l’extraction des données sous la forme d’une chaîne de texte unique, Junos PyEZ fait correspondre chaque expression régulière individuelle à la chaîne de texte entière.
Le groupe de capture défini dans l’expression régulière détermine les données extraites du champ et stockées dans le dictionnaire de données. Si vous définissez un groupe de capture, seule la valeur de ce groupe est stockée dans les données. Sinon, Junos PyEZ stocke la valeur qui correspond à l’expression complète. Par exemple, (d+.d+) récupère et stocke une valeur flottante à partir de l’expression de recherche de chaîne, alors que (d+).d+ ne stocke que la partie entière des données. Si vous définissez plusieurs groupes, seule la valeur du premier groupe est stockée.
Junos PyEZ exploite le pyparsing module pour définir un certain nombre de mots-clés intégrés que vous pouvez utiliser à la place d’une expression régulière. Le Tableau 3 répertorie le mot-clé, une brève description et l’expression correspondante, où pp est dérivé de import pyparsing as pp.
|
Mot-clé |
Descriptif |
L’expression |
|---|---|---|
|
|
Mot contenant uniquement des caractères hexadécimaux |
hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
& pp.OneOrMore(pp.Word('abcdefABCDEF', min=1)) |
|
|
Mot composé d’un entier ou d’une valeur flottante |
numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') +
pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i)) |
|
|
Mot composé de chiffres et d’un signe de pourcentage à la fin ( %) |
percentage = pp.Word(pp.nums) + pp.Literal('%') |
|
|
Un ou plusieurs mots composés de caractères imprimables (tous les caractères autres que les espaces) |
printables = pp.OneOrMore(pp.Word(pp.printables)) |
|
|
Mot composé de caractères alphabétiques ou alphanumériques |
word = pp.Word(pp.alphanums) | pp.Word(pp.alphas) |
|
|
Une ou plusieurs |
words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i)) |
Considérez le résultat de commande suivant show icmp statistics . Chaque section de sortie se trouve sous un titre de section spécifique et les données sont constituées d’un nombre et d’un ou plusieurs mots.
ICMP Statistics:
0 requests
0 throttled
0 network unreachables
0 ttl expired
0 redirects
0 mtu exceeded
0 source route denials
0 filter prohibited
0 other unreachables
0 parameter problems
0 ttl captured
0 icmp/option handoffs
0 igmp v1 handoffs
0 tag te requests
0 tag te to RE
ICMP Errors:
0 unknown unreachables
0 unsupported ICMP type
0 unprocessed redirects
0 invalid ICMP type
0 invalid protocol
0 bad input interface
0 bad route lookup
0 bad nh lookup
0 bad cf mtu
0 runts
ICMP Discards:
0 multicasts
0 bad source addresses
0 bad dest addresses
0 IP fragments
0 ICMP errors
0 unknown originators
ICMP Debug Messages:
0 throttled
ICMP Rate Limit Settings:
500 pps per iff
1000 pps total
Pour analyser la sortie précédente, la vue principale définit , qui fait fieldsréférence à des tables et des vues imbriquées qui analysent chaque section de la sortie. Les vues imbriquées définissent le regex paramètre à comparer aux données extraites par la table correspondante.
---
ICMPStatsTable:
command: show icmp statistics
target: fpc1
view: ICMPStatsView
ICMPStatsView:
fields:
discards: _ICMPDiscardsTable
errors: _ICMPErrorsTable
rate: _ICMPRateTable
_ICMPDiscardsTable:
title: ICMP Discards
key: name
view: _ICMPDiscardsView
_ICMPDiscardsView:
regex:
value: \d+
name: '(\w+(\s\w+)*)'
_ICMPErrorsTable:
title: ICMP Errors
key: name
view: _ICMPErrorsView
_ICMPErrorsView:
regex:
error: numbers
name: words
_ICMPRateTable:
title: ICMP Rate Limit Settings
key: name
view: _ICMPRateView
_ICMPRateView:
regex:
rate: numbers
name: words
Par exemple, le _ICMPDiscardsTable tableau sélectionne les données sous la ICMP Discards section dans la sortie de la commande. L’affichage _ICMPDiscardsView définit deux clés, value et name, qui correspondent à des expressions régulières. value correspond à un ou plusieurs chiffres, et name correspond à un ou plusieurs mots. Comme le tableau ne définit item: '*'pas , les expressions régulières sont combinées et mises en correspondance avec chaque ligne de données de cette section.
_ICMPDiscardsTable:
title: ICMP Discards
key: name
view: _ICMPDiscardsView
_ICMPDiscardsView:
regex:
value: \d+
name: '(\w+(\s\w+)*)'
Le _ICMPErrorsTable tableau sélectionne les données sous la ICMP Errors section dans la sortie de la commande. La _ICMPErrorsView vue définit les error touches et name . Les champs utilisent les mots-clés numbers intégrés et words au lieu de définir explicitement des expressions régulières.
_ICMPErrorsTable:
title: ICMP Errors
key: name
view: _ICMPErrorsView
_ICMPErrorsView:
regex:
error: numbers
name: words
Si le tableau définit item: '*', les données extraites sont considérées comme une chaîne de texte. Dans ce cas, chaque expression régulière de la vue correspondante correspond à la chaîne entière.
Considérez le résultat de la show ithrottle id 0 commande.
SENT: Ukern command: show ithrottle id 0
ID Usage % Cfg State Oper State Name
-- ------- --------- ---------- --------
0 50.0 1 1 TOE ithrottle
Throttle Times: In hptime ticks In ms
--------------- ------
Timer Interval 333333 5.000
Allowed time 166666 2.500
Allowed excess 8333 0.125
Start time 488655082 n/a
Run time this interval 0 0.000
Deficit 0 0.000
Run time max 17712 0.266
Run time total 144154525761 2162317
Min Usage Perc: 25.0
Max Usage Perc: 50.0
AdjustUsageEnable: 1
Throttle Stats:
Starts : 65708652
Stops : 65708652
Checks : 124149442
Enables : 0
Disables : 0
AdjUp : 6
AdjDown : 4
Le tableau suivant permet item: '*' d’extraire les données sous la forme d’une seule chaîne. Le paramètre de la vue regex définit trois expressions régulières. Chaque motif d’expression régulière est mis en correspondance avec la chaîne entière. Étant donné que les expressions régulières définissent des groupes de capture, Junos PyEZ ne stocke que les données qui correspondent au groupe.
IthrottleIDTable:
command: show ithrottle id {{ id }}
args:
id: 0
item: '*'
target: fpc1
view: IthrottleIDView
IthrottleIDView:
regex:
min_usage: 'Min Usage Perc: (\d+\.\d+)'
max_usage: 'Max Usage Perc: (\d+\.\d+)'
usg_enable: 'AdjustUsageEnable: (\d)'
fields:
throttle_stats: _ThrottleStatsTable
_ThrottleStatsTable:
title: Throttle Stats
delimiter: ":"
Lorsque vous récupérez et imprimez les données dans l’application Junos PyEZ, les données comprennent les trois regex éléments, qui contiennent la valeur correspondante du groupe de capture pour cette expression.
{'max_usage': 50.0,
'min_usage': 25.0,
'throttle_stats': {'AdjDown': 4,
'AdjUp': 6,
'Checks': 124149442,
'Disables': 0,
'Enables': 0,
'Starts': 65708652,
'Stops': 65708652},
'usg_enable': 1}
Tableau de l’historique des modifications
La prise en charge des fonctionnalités est déterminée par la plateforme et la version que vous utilisez. Utilisez l’explorateur de fonctionnalités pour déterminer si une fonctionnalité est prise en charge sur votre plateforme.
eval sont évaluées à l’aide d’une implémentation restreinte.