add project
This commit is contained in:
112
README.md
Normal file
112
README.md
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
# Firewall Config Parser & Excel Flow Matrix Generator
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Cet outil permet de **parser les configurations de différents types de firewalls** (Palo Alto, Stormshield, Forcepoint) et de **convertir ces informations en un format JSON normalisé basé sur des modèles OpenConfig en YANG**.
|
||||||
|
|
||||||
|
Il fournit également la possibilité de générer une **matrice de flux au format Excel** pour visualiser les communications et règles de trafic dans l’infrastructure.
|
||||||
|
|
||||||
|
## Fonctionnalités principales
|
||||||
|
|
||||||
|
1. **Analyse multi-firewalls**
|
||||||
|
- Développement de scripts Python dédiés à chaque type de firewall :
|
||||||
|
- Palo Alto
|
||||||
|
- Stormshield
|
||||||
|
- Forcepoint
|
||||||
|
- Extraction automatique des informations pertinentes à partir des fichiers de configuration respectifs.
|
||||||
|
- address
|
||||||
|
- address-group
|
||||||
|
- service
|
||||||
|
- service-group
|
||||||
|
- interface
|
||||||
|
- rules
|
||||||
|
- routes
|
||||||
|
|
||||||
|
2. **Modèle YANG personnalisé**
|
||||||
|
- Conception d’un modèle YANG personnalisé pour stocker les informations spécifiques non couvertes par OpenConfig :
|
||||||
|
- `address`
|
||||||
|
- `address-group`
|
||||||
|
- `service`
|
||||||
|
- `service-group`
|
||||||
|
|
||||||
|
3. **Conversion en JSON normalisé**
|
||||||
|
- Export des configurations dans un format JSON structuré selon les modèles OpenConfig :
|
||||||
|
- `openconfig-acl`
|
||||||
|
- `openconfig-interfaces`
|
||||||
|
- `openconfig-network-instance`
|
||||||
|
- Intégration des objets personnalisés via le modèle YANG développé.
|
||||||
|
|
||||||
|
5. **Génération de matrices de flux**
|
||||||
|
- Script Python qui utilise le JSON normalisé pour générer automatiquement une matrice Excel détaillant :
|
||||||
|
- les règles de sécurité
|
||||||
|
- les communications entre objets et groupes d’adresses/services.
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
### Pré-requis
|
||||||
|
```bash
|
||||||
|
python -m venv .venv
|
||||||
|
.\.venv\Scripts\activate
|
||||||
|
|
||||||
|
pip install -r .\src\requierements.txt
|
||||||
|
```
|
||||||
|
- Mettre le/les fichier(s) de configurations dans le dossier `/src/input/`
|
||||||
|
- Modifier le fichier `site.json` de données dans `/src/data/`
|
||||||
|
|
||||||
|
#### Commandes principales
|
||||||
|
```bash
|
||||||
|
python3 .\src\main.py stormshield .\src\input\backup\ -m
|
||||||
|
python3 .\src\main.py paloalto .\src\input\nomfichier -m
|
||||||
|
python3 .\src\main.py forcepoint .\src\input\nomfichier -m
|
||||||
|
```
|
||||||
|
#### Options
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| -o [nom_fichier] | Spécifie le nom du fichier JSON de sortie (optionnel)
|
||||||
|
| -m | Génère un rapport Excel de type matrice de flux (optionnel)
|
||||||
|
---
|
||||||
|
|
||||||
|
## Arborescence du projet
|
||||||
|
|
||||||
|
```bash
|
||||||
|
C:.
|
||||||
|
├───src
|
||||||
|
│ ├───data # Données static
|
||||||
|
│ ├───input # Fichiers/Dossiers de configuration
|
||||||
|
│ ├───modèles # Modèles YANG
|
||||||
|
│ ├───output # Fichiers JSON normalisés/Excel matrice de flux
|
||||||
|
│ └───scripts # Fichiers python
|
||||||
|
│ ├───objets
|
||||||
|
│ └───style_excel
|
||||||
|
```
|
||||||
|
|
||||||
|
## Structure du JSON généré
|
||||||
|
|
||||||
|
```bash
|
||||||
|
.json
|
||||||
|
├── firewall-device # type de firewall (palo-alto|stormshield|forcepoint)
|
||||||
|
├── openconfig-interfaces
|
||||||
|
├── openconfig-network-instances
|
||||||
|
├── openconfig-acl
|
||||||
|
└── custom-firewall-objects
|
||||||
|
├── address
|
||||||
|
├── address-group
|
||||||
|
├── service
|
||||||
|
└── service-group
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fichiers YANG utilisés
|
||||||
|
|
||||||
|
| Fichier YANG | Description |
|
||||||
|
|--------------|-------------|
|
||||||
|
| `.\src\modèles\openconfig-acl.yang` | Décrit les ACL et règles de firewall standard OpenConfig |
|
||||||
|
| `.\src\modèles\openconfig-interfaces.yang` | Modèle pour les interfaces réseau standard OpenConfig |
|
||||||
|
| `.\src\modèles\openconfig-network-instance.yang` | Modèle pour les VRF / instances réseau OpenConfig |
|
||||||
|
| `.\src\modèles\custom-firewall-objects.yang` | Modèle personnalisé pour les objets spécifiques (address, address-group, service, service-group) |
|
||||||
|
---
|
||||||
|
|
||||||
|
## Auteurs
|
||||||
|
|
||||||
|
Projet développé par :
|
||||||
|
- Julie Chevallier | Computacenter
|
||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pandas>=2.3.1
|
||||||
|
openpyxl>=3.1.5
|
||||||
6
src/data/site.json
Normal file
6
src/data/site.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"10.0.2.0/24": "ZONE1",
|
||||||
|
"10.0.3.0/24": "ZONE2",
|
||||||
|
"30.20.0.0/16": "ZONE3",
|
||||||
|
"30.30.0.0/16": "ZONE4"
|
||||||
|
}
|
||||||
61
src/main.py
Normal file
61
src/main.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
from scripts.json_PaloAlto import generate_json_paloalto
|
||||||
|
from scripts.json_Stormshield import generate_json_stormshield
|
||||||
|
from scripts.json_Forcepoint import generate_json_forcepoint
|
||||||
|
from scripts.export_excel import export_to_excel
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("Usage: python3 src/main.py <firewall_type>[paloalto|stormshield|forcepoint] <input_directory/file> [-o <output_file>] [-m]")
|
||||||
|
print("Options:")
|
||||||
|
print(" <firewall_type> Type of firewall to process (paloalto|stormshield|forcepoint)")
|
||||||
|
print(" -o <output_file> Specify output JSON file name (optional)")
|
||||||
|
print(" -m Generate Excel report (optional)")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
firewall_type = sys.argv[1].lower()
|
||||||
|
input_data = sys.argv[2]
|
||||||
|
input_path = "src/input/"
|
||||||
|
output_path = "src/output/"
|
||||||
|
if "-o" in sys.argv:
|
||||||
|
o_index = sys.argv.index("-o")
|
||||||
|
if o_index + 1 < len(sys.argv):
|
||||||
|
output_file_json = f"{output_path}{firewall_type}_{sys.argv[o_index + 1]}.json"
|
||||||
|
else:
|
||||||
|
print("Erreur: nom de fichier de sortie manquant après '-o'.")
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
timestamp = time.strftime("%Y%m%d")
|
||||||
|
output_file_json = f"{output_path}{firewall_type}_{timestamp}.json"
|
||||||
|
os.makedirs(output_path, exist_ok=True)
|
||||||
|
|
||||||
|
if firewall_type == "paloalto":
|
||||||
|
generate_json_paloalto(input_data, output_file_json)
|
||||||
|
elif firewall_type == "stormshield":
|
||||||
|
generate_json_stormshield(input_data, output_file_json)
|
||||||
|
elif firewall_type == "forcepoint":
|
||||||
|
generate_json_forcepoint(input_data, output_file_json)
|
||||||
|
else:
|
||||||
|
print("Erreur: type de firewall inconnu. Utilisez 'paloalto', 'stormshield' ou 'forcepoint'.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if "-m" in sys.argv:
|
||||||
|
print(f"\nGénération de l'export Excel...")
|
||||||
|
if "-o" in sys.argv:
|
||||||
|
o_index = sys.argv.index("-o")
|
||||||
|
if o_index + 1 < len(sys.argv):
|
||||||
|
output_file_excel = os.path.join(f"{output_path}matrice_{firewall_type}_{sys.argv[o_index + 1]}.xlsx")
|
||||||
|
else:
|
||||||
|
print("Erreur: nom de fichier de sortie manquant après '-o'.")
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
timestamp = time.strftime("%Y%m%d")
|
||||||
|
output_file_excel = f"{output_path}matrice_{firewall_type}_{timestamp}.xlsx"
|
||||||
|
|
||||||
|
excel_file = export_to_excel(output_file_json, output_file_excel)
|
||||||
|
print(f"✓ Processus terminé. Fichiers générés:\n - JSON: {output_file_json}\n - Excel: {excel_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
108
src/modèles/custom-firewall-objects.yang
Normal file
108
src/modèles/custom-firewall-objects.yang
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
module custom-firewall-objects {
|
||||||
|
yang-version 1.1;
|
||||||
|
namespace "urn:custom:firewall-objects";
|
||||||
|
prefix cfwobj;
|
||||||
|
|
||||||
|
import ietf-inet-types { prefix inet; }
|
||||||
|
import firewall-device { prefix fwd; }
|
||||||
|
|
||||||
|
organization "Custom Network Automation";
|
||||||
|
contact "Julien Chevalier <julien@example.com>";
|
||||||
|
description
|
||||||
|
"Custom firewall objects model depending on the firewall type.";
|
||||||
|
|
||||||
|
revision "2025-12-22" {
|
||||||
|
description "Initial version with conditional structure.";
|
||||||
|
reference "Internal reference FW-OBJ-001.";
|
||||||
|
}
|
||||||
|
|
||||||
|
container firewall-objects {
|
||||||
|
description
|
||||||
|
"Firewall object definitions depending on firewall type.";
|
||||||
|
|
||||||
|
choice vendor-type {
|
||||||
|
description "Different structures depending on the firewall device type.";
|
||||||
|
|
||||||
|
case palo-alto {
|
||||||
|
when "/fwd:firewall-device/fwd:type = 'palo-alto'";
|
||||||
|
description "Objects for Palo Alto firewalls.";
|
||||||
|
|
||||||
|
container palo-alto-objects {
|
||||||
|
description "Container for Palo Alto specific objects.";
|
||||||
|
|
||||||
|
list address {
|
||||||
|
key "name";
|
||||||
|
description "Palo Alto address objects.";
|
||||||
|
leaf name { type string; description "Object name."; }
|
||||||
|
leaf-list members { type string; description "Members list."; }
|
||||||
|
leaf description { type string; description "Description."; }
|
||||||
|
leaf tag { type string; description "Tag."; }
|
||||||
|
}
|
||||||
|
|
||||||
|
list address-group {
|
||||||
|
key "name";
|
||||||
|
description "Palo Alto address groups.";
|
||||||
|
leaf name { type string; description "Group name."; }
|
||||||
|
leaf-list ip_netmask { type string; description "IP/netmask list."; }
|
||||||
|
leaf description { type string; description "Description."; }
|
||||||
|
leaf tag { type string; description "Tag."; }
|
||||||
|
}
|
||||||
|
|
||||||
|
list service {
|
||||||
|
key "name";
|
||||||
|
description "Palo Alto service objects.";
|
||||||
|
leaf name { type string; description "Service name."; }
|
||||||
|
leaf protocol { type string; description "Protocol."; }
|
||||||
|
leaf port { type string; description "Port number or range."; }
|
||||||
|
leaf source_port { type string; description "Source port."; }
|
||||||
|
leaf description { type string; description "Description."; }
|
||||||
|
leaf tag { type string; description "Tag."; }
|
||||||
|
}
|
||||||
|
|
||||||
|
list service-group {
|
||||||
|
key "name";
|
||||||
|
description "Palo Alto service groups.";
|
||||||
|
leaf name { type string; description "Group name."; }
|
||||||
|
leaf-list members { type string; description "Members list."; }
|
||||||
|
leaf description { type string; description "Description."; }
|
||||||
|
leaf tag { type string; description "Tag."; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case forcepoint {
|
||||||
|
when "/fwd:firewall-device/fwd:type = 'forcepoint'";
|
||||||
|
description "Objects for forcepoint firewalls.";
|
||||||
|
|
||||||
|
container forcepoint-objects {
|
||||||
|
description "Container for forcepoint specific objects.";
|
||||||
|
|
||||||
|
list address {
|
||||||
|
key "name";
|
||||||
|
description "forcepoint address objects.";
|
||||||
|
leaf name { type string; description "Object name."; }
|
||||||
|
leaf subnet { type inet:ipv4-prefix; description "IPv4 subnet."; }
|
||||||
|
leaf interface { type string; description "Associated interface."; }
|
||||||
|
leaf comment { type string; description "Description or comment."; }
|
||||||
|
}
|
||||||
|
|
||||||
|
list service {
|
||||||
|
key "name";
|
||||||
|
description "forcepoint service objects.";
|
||||||
|
leaf name { type string; description "Service name."; }
|
||||||
|
leaf protocol {
|
||||||
|
type enumeration {
|
||||||
|
enum TCP { description "TCP protocol."; }
|
||||||
|
enum UDP { description "UDP protocol."; }
|
||||||
|
}
|
||||||
|
description "Protocol type.";
|
||||||
|
}
|
||||||
|
leaf tcp_portrange { type string; description "TCP port range."; }
|
||||||
|
leaf udp_portrange { type string; description "UDP port range."; }
|
||||||
|
leaf comment { type string; description "Description or comment."; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/modèles/firewall-device.yang
Normal file
34
src/modèles/firewall-device.yang
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
module firewall-device {
|
||||||
|
yang-version 1.1;
|
||||||
|
namespace "urn:custom:firewall-device";
|
||||||
|
prefix fwd;
|
||||||
|
|
||||||
|
organization "Custom Network Automation";
|
||||||
|
contact "Julie Chevallier <julie@example.com>";
|
||||||
|
description
|
||||||
|
"Simple device info model exposing firewall vendor type.";
|
||||||
|
|
||||||
|
revision "2025-10-21" {
|
||||||
|
description
|
||||||
|
"Initial version of the firewall device type module.";
|
||||||
|
reference
|
||||||
|
"Internal reference FW-DEV-001.";
|
||||||
|
}
|
||||||
|
|
||||||
|
container firewall-device {
|
||||||
|
description
|
||||||
|
"Container representing the firewall vendor and type.";
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type enumeration {
|
||||||
|
enum palo-alto {
|
||||||
|
description "Palo Alto Networks firewall.";
|
||||||
|
}
|
||||||
|
enum fortinet {
|
||||||
|
description "Fortinet firewall.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description "Firewall vendor type.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
669
src/modèles/ietf-inet-types.yang
Normal file
669
src/modèles/ietf-inet-types.yang
Normal file
@@ -0,0 +1,669 @@
|
|||||||
|
module ietf-inet-types {
|
||||||
|
|
||||||
|
namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
|
||||||
|
prefix "inet";
|
||||||
|
|
||||||
|
organization
|
||||||
|
"IETF Network Modeling (NETMOD) Working Group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"WG Web: <https://datatracker.ietf.org/wg/netmod/>
|
||||||
|
WG List: <mailto:netmod@ietf.org>
|
||||||
|
|
||||||
|
Editor: Juergen Schoenwaelder
|
||||||
|
<mailto:jschoenwaelder@constructor.university>";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a collection of generally useful derived
|
||||||
|
YANG data types for Internet addresses and related things.
|
||||||
|
|
||||||
|
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
|
||||||
|
NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
|
||||||
|
'MAY', and 'OPTIONAL' in this document are to be interpreted as
|
||||||
|
described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
|
||||||
|
they appear in all capitals, as shown here.
|
||||||
|
|
||||||
|
Copyright (c) 2025 IETF Trust and the persons identified as
|
||||||
|
authors of the code. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or
|
||||||
|
without modification, is permitted pursuant to, and subject
|
||||||
|
to the license terms contained in, the Revised BSD License
|
||||||
|
set forth in Section 4.c of the IETF Trust's Legal Provisions
|
||||||
|
Relating to IETF Documents
|
||||||
|
(https://trustee.ietf.org/license-info).
|
||||||
|
|
||||||
|
This version of this YANG module is part of RFC XXXX;
|
||||||
|
see the RFC itself for full legal notices.";
|
||||||
|
|
||||||
|
revision 2025-06-23 {
|
||||||
|
description
|
||||||
|
"This revision adds the following new data types:
|
||||||
|
- inet:ip-address-and-prefix
|
||||||
|
- inet:ipv4-address-and-prefix
|
||||||
|
- inet:ipv6-address-and-prefix
|
||||||
|
- inet:protocol-number
|
||||||
|
- inet:upper-layer-protocol-number
|
||||||
|
- inet:host-name
|
||||||
|
- inet:email-address
|
||||||
|
- inet:ip-address-link-local
|
||||||
|
- inet:ipv4-address-link-local
|
||||||
|
- inet:ipv6-address-link-local
|
||||||
|
The inet:host union was changed to use inet:host-name instead
|
||||||
|
of inet:domain-name. Several pattern statements have been
|
||||||
|
improved.";
|
||||||
|
reference
|
||||||
|
"RFC XXXX: Common YANG Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2013-07-15 {
|
||||||
|
description
|
||||||
|
"This revision adds the following new data types:
|
||||||
|
- inet:ip-address-no-zone
|
||||||
|
- inet:ipv4-address-no-zone
|
||||||
|
- inet:ipv6-address-no-zone";
|
||||||
|
reference
|
||||||
|
"RFC 6991: Common YANG Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2010-09-24 {
|
||||||
|
description
|
||||||
|
"Initial revision.";
|
||||||
|
reference
|
||||||
|
"RFC 6021: Common YANG Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of types related to protocol fields ***/
|
||||||
|
|
||||||
|
typedef ip-version {
|
||||||
|
type enumeration {
|
||||||
|
enum unknown {
|
||||||
|
value "0";
|
||||||
|
description
|
||||||
|
"An unknown or unspecified version of the Internet
|
||||||
|
protocol.";
|
||||||
|
}
|
||||||
|
enum ipv4 {
|
||||||
|
value "1";
|
||||||
|
description
|
||||||
|
"The IPv4 protocol as defined in RFC 791.";
|
||||||
|
}
|
||||||
|
enum ipv6 {
|
||||||
|
value "2";
|
||||||
|
description
|
||||||
|
"The IPv6 protocol as defined in RFC 8200.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This value represents the version of the IP protocol.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the InetVersion textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 791: Internet Protocol
|
||||||
|
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification
|
||||||
|
RFC 4001: Textual Conventions for Internet Network Addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef dscp {
|
||||||
|
type uint8 {
|
||||||
|
range "0..63";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The dscp type represents a Differentiated Services Code Point
|
||||||
|
that may be used for marking packets in a traffic stream.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the Dscp textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 3289: Management Information Base for the Differentiated
|
||||||
|
Services Architecture
|
||||||
|
RFC 2474: Definition of the Differentiated Services Field
|
||||||
|
(DS Field) in the IPv4 and IPv6 Headers
|
||||||
|
RFC 2780: IANA Allocation Guidelines For Values In
|
||||||
|
the Internet Protocol and Related Headers";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-flow-label {
|
||||||
|
type uint32 {
|
||||||
|
range "0..1048575";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv6-flow-label type represents the flow identifier or
|
||||||
|
Flow Label in an IPv6 packet header that may be used to
|
||||||
|
discriminate traffic flows.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the IPv6FlowLabel textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 3595: Textual Conventions for IPv6 Flow Label
|
||||||
|
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef port-number {
|
||||||
|
type uint16 {
|
||||||
|
range "0..65535";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The port-number type represents a 16-bit port number of an
|
||||||
|
Internet transport-layer protocol such as UDP, TCP, DCCP, or
|
||||||
|
SCTP.
|
||||||
|
|
||||||
|
Port numbers are assigned by IANA. The current list of
|
||||||
|
all assignments is available from <https://www.iana.org/>.
|
||||||
|
|
||||||
|
Note that the port number value zero is reserved by IANA. In
|
||||||
|
situations where the value zero does not make sense, it can
|
||||||
|
be excluded by subtyping the port-number type.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the InetPortNumber textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 768: User Datagram Protocol
|
||||||
|
RFC 9293: Transmission Control Protocol (TCP)
|
||||||
|
RFC 9260: Stream Control Transmission Protocol
|
||||||
|
RFC 4340: Datagram Congestion Control Protocol (DCCP)
|
||||||
|
RFC 4001: Textual Conventions for Internet Network Addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef protocol-number {
|
||||||
|
type uint8;
|
||||||
|
description
|
||||||
|
"The protocol-number type represents an 8-bit Internet
|
||||||
|
protocol number, carried in the 'protocol' field of the
|
||||||
|
IPv4 header or in the 'next header' field of the IPv6
|
||||||
|
header.
|
||||||
|
|
||||||
|
Protocol numbers are assigned by IANA. The current list of
|
||||||
|
all assignments is available from <https://www.iana.org/>.";
|
||||||
|
reference
|
||||||
|
"RFC 791: Internet Protocol
|
||||||
|
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef upper-layer-protocol-number {
|
||||||
|
type protocol-number;
|
||||||
|
description
|
||||||
|
"The upper-layer-protocol-number represents the upper-layer
|
||||||
|
protocol number carried in an IP packet. For IPv6 packets
|
||||||
|
with extension headers, this is the protocol number carried
|
||||||
|
in the last 'next header' field of the chain of IPv6 extension
|
||||||
|
headers.";
|
||||||
|
reference
|
||||||
|
"RFC 791: Internet Protocol
|
||||||
|
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of types related to autonomous systems ***/
|
||||||
|
|
||||||
|
typedef as-number {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"The as-number type represents autonomous system numbers
|
||||||
|
which identify an Autonomous System (AS). An AS is a set
|
||||||
|
of routers under a single technical administration, using
|
||||||
|
an interior gateway protocol and common metrics to route
|
||||||
|
packets within the AS, and using an exterior gateway
|
||||||
|
protocol to route packets to other ASes. IANA maintains
|
||||||
|
the AS number space and has delegated large parts to the
|
||||||
|
regional registries.
|
||||||
|
|
||||||
|
Autonomous system numbers were originally limited to 16
|
||||||
|
bits. BGP extensions have enlarged the autonomous system
|
||||||
|
number space to 32 bits. This type therefore uses an uint32
|
||||||
|
base type without a range restriction in order to support
|
||||||
|
a larger autonomous system number space.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the InetAutonomousSystemNumber textual convention of
|
||||||
|
the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 1930: Guidelines for creation, selection, and registration
|
||||||
|
of an Autonomous System (AS)
|
||||||
|
RFC 4271: A Border Gateway Protocol 4 (BGP-4)
|
||||||
|
RFC 4001: Textual Conventions for Internet Network Addresses
|
||||||
|
RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
|
||||||
|
Number Space";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of types related to IP addresses and hostnames ***/
|
||||||
|
|
||||||
|
typedef ip-address {
|
||||||
|
type union {
|
||||||
|
type ipv4-address;
|
||||||
|
type ipv6-address;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ip-address type represents an IP address and is IP
|
||||||
|
version neutral. The format of the textual representation
|
||||||
|
implies the IP version. This type supports scoped addresses
|
||||||
|
by allowing zone identifiers in the address format.";
|
||||||
|
reference
|
||||||
|
"RFC 4007: IPv6 Scoped Address Architecture";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-address {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
|
||||||
|
+ '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
|
||||||
|
+ '(%.+)?';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv4-address type represents an IPv4 address in
|
||||||
|
dotted-quad notation. The IPv4 address may include a zone
|
||||||
|
index, separated by a % sign. If a system uses zone names
|
||||||
|
that are not represented in UTF-8, then an implementation
|
||||||
|
needs to use some mechanism to transform the local name
|
||||||
|
into UTF-8. The definition of such a mechanism is outside
|
||||||
|
the scope of this document.
|
||||||
|
|
||||||
|
The zone index is used to disambiguate identical address
|
||||||
|
values. For link-local addresses, the zone index will
|
||||||
|
typically be the interface index number or the name of an
|
||||||
|
interface. If the zone index is not present, the default
|
||||||
|
zone of the device will be used.
|
||||||
|
|
||||||
|
The canonical format for the zone index is the numerical
|
||||||
|
format";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address {
|
||||||
|
type string {
|
||||||
|
pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
|
||||||
|
+ '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
|
||||||
|
+ '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
|
||||||
|
+ '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
|
||||||
|
+ '(%[A-Za-z0-9][A-Za-z0-9\-\._~/]*)?';
|
||||||
|
pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
|
||||||
|
+ '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
|
||||||
|
+ '(%.+)?';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv6-address type represents an IPv6 address in full,
|
||||||
|
mixed, shortened, and shortened-mixed notation. The IPv6
|
||||||
|
address may include a zone index, separated by a % sign.
|
||||||
|
If a system uses zone names that are not represented in
|
||||||
|
UTF-8, then an implementation needs to use some mechanism
|
||||||
|
to transform the local name into UTF-8. The definition of
|
||||||
|
such a mechanism is outside the scope of this document.
|
||||||
|
|
||||||
|
The zone index is used to disambiguate identical address
|
||||||
|
values. For link-local addresses, the zone index will
|
||||||
|
typically be the interface index number or the name of an
|
||||||
|
interface. If the zone index is not present, the default
|
||||||
|
zone of the device will be used.
|
||||||
|
|
||||||
|
The canonical format of IPv6 addresses uses the textual
|
||||||
|
representation defined in Section 4 of RFC 5952. The
|
||||||
|
canonical format for the zone index is the numerical
|
||||||
|
format as described in Section 11.2 of RFC 4007.";
|
||||||
|
reference
|
||||||
|
"RFC 4291: IP Version 6 Addressing Architecture
|
||||||
|
RFC 4007: IPv6 Scoped Address Architecture
|
||||||
|
RFC 5952: A Recommendation for IPv6 Address Text
|
||||||
|
Representation";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-address-no-zone {
|
||||||
|
type union {
|
||||||
|
type ipv4-address-no-zone;
|
||||||
|
type ipv6-address-no-zone;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ip-address-no-zone type represents an IP address and is
|
||||||
|
IP version neutral. The format of the textual representation
|
||||||
|
implies the IP version. This type does not support scoped
|
||||||
|
addresses since it does not allow zone identifiers in the
|
||||||
|
address format.";
|
||||||
|
reference
|
||||||
|
"RFC 4007: IPv6 Scoped Address Architecture";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-address-no-zone {
|
||||||
|
type ipv4-address {
|
||||||
|
pattern '[0-9\.]*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 address without a zone index. This type, derived
|
||||||
|
from the type ipv4-address, may be used in situations where
|
||||||
|
the zone is known from the context and no zone index is
|
||||||
|
needed.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address-no-zone {
|
||||||
|
type ipv6-address {
|
||||||
|
pattern '[0-9a-fA-F:\.]*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv6 address without a zone index. This type, derived
|
||||||
|
from the type ipv6-address, may be used in situations where
|
||||||
|
the zone is known from the context and no zone index is
|
||||||
|
needed.";
|
||||||
|
reference
|
||||||
|
"RFC 4291: IP Version 6 Addressing Architecture
|
||||||
|
RFC 4007: IPv6 Scoped Address Architecture
|
||||||
|
RFC 5952: A Recommendation for IPv6 Address Text
|
||||||
|
Representation";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-address-link-local {
|
||||||
|
type union {
|
||||||
|
type ipv4-address-link-local;
|
||||||
|
type ipv6-address-link-local;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ip-address-link-local type represents a link-local IP
|
||||||
|
address and is IP version neutral. The format of the textual
|
||||||
|
representation implies the IP version.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-address-link-local {
|
||||||
|
type ipv4-address {
|
||||||
|
pattern '169\.254\..*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A link-local IPv4 address in the prefix 169.254.0.0/16 as
|
||||||
|
defined in section 2.1. of RFC 3927.";
|
||||||
|
reference
|
||||||
|
"RFC 3927: Dynamic Configuration of IPv4 Link-Local Addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address-link-local {
|
||||||
|
type ipv6-address {
|
||||||
|
pattern '[fF][eE]80:.*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A link-local IPv6 address in the prefix fe80::/10 as defined
|
||||||
|
in section 2.5.6. of RFC 4291.";
|
||||||
|
reference
|
||||||
|
"RFC 4291: IP Version 6 Addressing Architecture";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-prefix {
|
||||||
|
type union {
|
||||||
|
type ipv4-prefix;
|
||||||
|
type ipv6-prefix;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ip-prefix type represents an IP prefix and is IP
|
||||||
|
version neutral. The format of the textual representations
|
||||||
|
implies the IP version.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-prefix {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
|
||||||
|
+ '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
|
||||||
|
+ '/(([0-9])|([1-2][0-9])|(3[0-2]))';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv4-prefix type represents an IPv4 prefix.
|
||||||
|
The prefix length is given by the number following the
|
||||||
|
slash character and must be less than or equal to 32.
|
||||||
|
|
||||||
|
A prefix length value of n corresponds to an IP address
|
||||||
|
mask that has n contiguous 1-bits from the most
|
||||||
|
significant bit (MSB) and all other bits set to 0.
|
||||||
|
|
||||||
|
The canonical format of an IPv4 prefix has all bits of
|
||||||
|
the IPv4 address set to zero that are not part of the
|
||||||
|
IPv4 prefix.
|
||||||
|
|
||||||
|
The definition of ipv4-prefix does not require that bits,
|
||||||
|
which are not part of the prefix, are set to zero. However,
|
||||||
|
implementations have to return values in canonical format,
|
||||||
|
which requires non-prefix bits to be set to zero. This means
|
||||||
|
that 192.0.2.1/24 must be accepted as a valid value but it
|
||||||
|
will be converted into the canonical format 192.0.2.0/24.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-prefix {
|
||||||
|
type string {
|
||||||
|
pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
|
||||||
|
+ '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
|
||||||
|
+ '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
|
||||||
|
+ '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
|
||||||
|
+ '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
|
||||||
|
pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
|
||||||
|
+ '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
|
||||||
|
+ '(/.+)';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv6-prefix type represents an IPv6 prefix.
|
||||||
|
The prefix length is given by the number following the
|
||||||
|
slash character and must be less than or equal to 128.
|
||||||
|
|
||||||
|
A prefix length value of n corresponds to an IP address
|
||||||
|
mask that has n contiguous 1-bits from the most
|
||||||
|
significant bit (MSB) and all other bits set to 0.
|
||||||
|
|
||||||
|
The canonical format of an IPv6 prefix has all bits of
|
||||||
|
the IPv6 address set to zero that are not part of the
|
||||||
|
IPv6 prefix. Furthermore, the IPv6 address is represented
|
||||||
|
as defined in Section 4 of RFC 5952.
|
||||||
|
|
||||||
|
The definition of ipv6-prefix does not require that bits,
|
||||||
|
which are not part of the prefix, are set to zero. However,
|
||||||
|
implementations have to return values in canonical format,
|
||||||
|
which requires non-prefix bits to be set to zero. This means
|
||||||
|
that 2001:db8::1/64 must be accepted as a valid value but it
|
||||||
|
will be converted into the canonical format 2001:db8::/64.";
|
||||||
|
reference
|
||||||
|
"RFC 5952: A Recommendation for IPv6 Address Text
|
||||||
|
Representation";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-address-and-prefix {
|
||||||
|
type union {
|
||||||
|
type ipv4-address-and-prefix;
|
||||||
|
type ipv6-address-and-prefix;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ip-address-and-prefix type represents an IP address and
|
||||||
|
prefix and is IP version neutral. The format of the textual
|
||||||
|
representations implies the IP version.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-address-and-prefix {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
|
||||||
|
+ '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
|
||||||
|
+ '/(([0-9])|([1-2][0-9])|(3[0-2]))';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv4-address-and-prefix type represents an IPv4
|
||||||
|
address and an associated IPv4 prefix.
|
||||||
|
The prefix length is given by the number following the
|
||||||
|
slash character and must be less than or equal to 32.
|
||||||
|
|
||||||
|
A prefix length value of n corresponds to an IP address
|
||||||
|
mask that has n contiguous 1-bits from the most
|
||||||
|
significant bit (MSB) and all other bits set to 0.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address-and-prefix {
|
||||||
|
type string {
|
||||||
|
pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
|
||||||
|
+ '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
|
||||||
|
+ '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
|
||||||
|
+ '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
|
||||||
|
+ '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
|
||||||
|
pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
|
||||||
|
+ '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
|
||||||
|
+ '(/.+)';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The ipv6-address-and-prefix type represents an IPv6
|
||||||
|
address and an associated IPv6 prefix.
|
||||||
|
The prefix length is given by the number following the
|
||||||
|
slash character and must be less than or equal to 128.
|
||||||
|
|
||||||
|
A prefix length value of n corresponds to an IP address
|
||||||
|
mask that has n contiguous 1-bits from the most
|
||||||
|
significant bit (MSB) and all other bits set to 0.
|
||||||
|
|
||||||
|
The canonical format requires that the IPv6 address is
|
||||||
|
represented as defined in Section 4 of RFC 5952.";
|
||||||
|
reference
|
||||||
|
"RFC 5952: A Recommendation for IPv6 Address Text
|
||||||
|
Representation";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of domain name and URI types ***/
|
||||||
|
|
||||||
|
typedef domain-name {
|
||||||
|
type string {
|
||||||
|
length "1..253";
|
||||||
|
pattern
|
||||||
|
'((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
|
||||||
|
+ '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
|
||||||
|
+ '|\.';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The domain-name type represents a DNS domain name. The
|
||||||
|
name SHOULD be fully qualified whenever possible. This
|
||||||
|
type does not support wildcards (see RFC 4592) or
|
||||||
|
classless in-addr.arpa delegations (see RFC 2317).
|
||||||
|
|
||||||
|
Internet domain names are only loosely specified. Section
|
||||||
|
3.5 of RFC 1034 recommends a syntax (modified in Section
|
||||||
|
2.1 of RFC 1123). The pattern above is intended to allow
|
||||||
|
for current practice in domain name use, and some possible
|
||||||
|
future expansion. Note that Internet host names have a
|
||||||
|
stricter syntax (described in RFC 952) than the DNS
|
||||||
|
recommendations in RFCs 1034 and 1123. Schema nodes
|
||||||
|
representing host names should use the host-name type
|
||||||
|
instead of the domain-type.
|
||||||
|
|
||||||
|
The encoding of DNS names in the DNS protocol is limited
|
||||||
|
to 255 characters. Since the encoding consists of labels
|
||||||
|
prefixed by a length bytes and there is a trailing NULL
|
||||||
|
byte, only 253 characters can appear in the textual dotted
|
||||||
|
notation.
|
||||||
|
|
||||||
|
The description clause of schema nodes using the domain-name
|
||||||
|
type MUST describe when and how these names are resolved to
|
||||||
|
IP addresses. Note that the resolution of a domain-name value
|
||||||
|
may require to query multiple DNS records (e.g., A for IPv4
|
||||||
|
and AAAA for IPv6). The order of the resolution process and
|
||||||
|
which DNS record takes precedence can either be defined
|
||||||
|
explicitly or may depend on the configuration of the
|
||||||
|
resolver.
|
||||||
|
|
||||||
|
Domain-name values use the US-ASCII encoding. Their canonical
|
||||||
|
format uses lowercase US-ASCII characters. Internationalized
|
||||||
|
domain names MUST be A-labels as per RFC 5890.";
|
||||||
|
reference
|
||||||
|
"RFC 952: DoD Internet Host Table Specification
|
||||||
|
RFC 1034: Domain Names - Concepts and Facilities
|
||||||
|
RFC 1123: Requirements for Internet Hosts -- Application
|
||||||
|
and Support
|
||||||
|
RFC 2317: Classless IN-ADDR.ARPA delegation
|
||||||
|
RFC 2782: A DNS RR for specifying the location of services
|
||||||
|
(DNS SRV)
|
||||||
|
RFC 4592: The Role of Wildcards in the Domain Name System
|
||||||
|
RFC 5890: Internationalized Domain Names in Applications
|
||||||
|
(IDNA): Definitions and Document Framework
|
||||||
|
RFC 9499: DNS Terminology";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef host-name {
|
||||||
|
type domain-name {
|
||||||
|
length "2..max";
|
||||||
|
pattern '[a-zA-Z0-9\-\.]+';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The host-name type represents (fully qualified) host names.
|
||||||
|
Host names must be at least two characters long (see RFC 952)
|
||||||
|
and they are restricted to labels consisting of letters, digits
|
||||||
|
and hyphens separated by dots (see RFC1123 and RFC 952).";
|
||||||
|
reference
|
||||||
|
"RFC 952: DoD Internet Host Table Specification
|
||||||
|
RFC 1123: Requirements for Internet Hosts -- Application
|
||||||
|
and Support";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef host {
|
||||||
|
type union {
|
||||||
|
type ip-address;
|
||||||
|
type host-name;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The host type represents either an IP address or a (fully
|
||||||
|
qualified) host name.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef uri {
|
||||||
|
type string {
|
||||||
|
pattern '[a-z][a-z0-9+.-]*:.*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The uri type represents a Uniform Resource Identifier
|
||||||
|
(URI) as defined by the rule 'URI' in RFC 3986.
|
||||||
|
|
||||||
|
Objects using the uri type MUST be in US-ASCII encoding,
|
||||||
|
and MUST be normalized as described by RFC 3986 Sections
|
||||||
|
6.2.1, 6.2.2.1, and 6.2.2.2. Characters that can be
|
||||||
|
represented without using percent-encoding are represented
|
||||||
|
as characters (without percent-encoding), and all
|
||||||
|
case-insensitive characters are set to lowercase except
|
||||||
|
for hexadecimal digits within a percent-encoded triplet,
|
||||||
|
which are normalized to uppercase as described in
|
||||||
|
Section 6.2.2.1 of RFC 3986.
|
||||||
|
|
||||||
|
The purpose of this normalization is to help provide
|
||||||
|
unique URIs. Note that this normalization is not
|
||||||
|
sufficient to provide uniqueness. Two URIs that are
|
||||||
|
textually distinct after this normalization may still be
|
||||||
|
equivalent.
|
||||||
|
|
||||||
|
Objects using the uri type may restrict the schemes that
|
||||||
|
they permit. For example, 'data:' and 'urn:' schemes
|
||||||
|
might not be appropriate.
|
||||||
|
|
||||||
|
A zero-length URI is not a valid URI. This can be used to
|
||||||
|
express 'URI absent' where required.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the Uri SMIv2 textual convention defined in RFC 5017.";
|
||||||
|
reference
|
||||||
|
"RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
|
||||||
|
RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
|
||||||
|
Group: Uniform Resource Identifiers (URIs), URLs,
|
||||||
|
and Uniform Resource Names (URNs): Clarifications
|
||||||
|
and Recommendations
|
||||||
|
RFC 5017: MIB Textual Conventions for Uniform Resource
|
||||||
|
Identifiers (URIs)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef email-address {
|
||||||
|
type string {
|
||||||
|
pattern '.+@.+';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The email-address type represents an internationalized
|
||||||
|
email address.
|
||||||
|
|
||||||
|
The email address format is defined by the addr-spec
|
||||||
|
ABNF rule in RFC 5322 section 3.4.1. This format has
|
||||||
|
been extended by RFC 6532 to support internationalized
|
||||||
|
email addresses. Implementations MUST support the
|
||||||
|
internationalization extensions of RFC 6532. Support
|
||||||
|
of the obsolete obs-local-part, obs-domain, and
|
||||||
|
obs-qtext parts of RFC 5322 is not required.
|
||||||
|
|
||||||
|
The domain part may use both A-labels and U-labels
|
||||||
|
(see RFC 5890). The canonical format of the domain part
|
||||||
|
uses lowercase characters and U-labels (RFC 5890) where
|
||||||
|
applicable.";
|
||||||
|
reference
|
||||||
|
"RFC 5322: Internet Message Format
|
||||||
|
RFC 5890: Internationalized Domain Names in Applications
|
||||||
|
(IDNA): Definitions and Document Framework
|
||||||
|
RFC 6531: SMTP Extension for Internationalized Email";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
725
src/modèles/ietf-interfaces.yang
Normal file
725
src/modèles/ietf-interfaces.yang
Normal file
@@ -0,0 +1,725 @@
|
|||||||
|
module ietf-interfaces {
|
||||||
|
|
||||||
|
namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
|
||||||
|
prefix if;
|
||||||
|
|
||||||
|
import ietf-yang-types {
|
||||||
|
prefix yang;
|
||||||
|
}
|
||||||
|
|
||||||
|
organization
|
||||||
|
"IETF NETMOD (NETCONF Data Modeling Language) Working Group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"WG Web: <http://tools.ietf.org/wg/netmod/>
|
||||||
|
WG List: <mailto:netmod@ietf.org>
|
||||||
|
|
||||||
|
WG Chair: Thomas Nadeau
|
||||||
|
<mailto:tnadeau@lucidvision.com>
|
||||||
|
|
||||||
|
WG Chair: Juergen Schoenwaelder
|
||||||
|
<mailto:j.schoenwaelder@jacobs-university.de>
|
||||||
|
|
||||||
|
Editor: Martin Bjorklund
|
||||||
|
<mailto:mbj@tail-f.com>";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a collection of YANG definitions for
|
||||||
|
managing network interfaces.
|
||||||
|
|
||||||
|
Copyright (c) 2014 IETF Trust and the persons identified as
|
||||||
|
authors of the code. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or
|
||||||
|
without modification, is permitted pursuant to, and subject
|
||||||
|
to the license terms contained in, the Simplified BSD License
|
||||||
|
set forth in Section 4.c of the IETF Trust's Legal Provisions
|
||||||
|
Relating to IETF Documents
|
||||||
|
(http://trustee.ietf.org/license-info).
|
||||||
|
|
||||||
|
This version of this YANG module is part of RFC 7223; see
|
||||||
|
the RFC itself for full legal notices.";
|
||||||
|
|
||||||
|
revision 2014-05-08 {
|
||||||
|
description
|
||||||
|
"Initial revision.";
|
||||||
|
reference
|
||||||
|
"RFC 7223: A YANG Data Model for Interface Management";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Typedefs
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef interface-ref {
|
||||||
|
type leafref {
|
||||||
|
path "/if:interfaces/if:interface/if:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This type is used by data models that need to reference
|
||||||
|
configured interfaces.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef interface-state-ref {
|
||||||
|
type leafref {
|
||||||
|
path "/if:interfaces-state/if:interface/if:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This type is used by data models that need to reference
|
||||||
|
the operationally present interfaces.";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Identities
|
||||||
|
*/
|
||||||
|
|
||||||
|
identity interface-type {
|
||||||
|
description
|
||||||
|
"Base identity from which specific interface types are
|
||||||
|
derived.";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Features
|
||||||
|
*/
|
||||||
|
|
||||||
|
feature arbitrary-names {
|
||||||
|
description
|
||||||
|
"This feature indicates that the device allows user-controlled
|
||||||
|
interfaces to be named arbitrarily.";
|
||||||
|
}
|
||||||
|
feature pre-provisioning {
|
||||||
|
description
|
||||||
|
"This feature indicates that the device supports
|
||||||
|
pre-provisioning of interface configuration, i.e., it is
|
||||||
|
possible to configure an interface whose physical interface
|
||||||
|
hardware is not present on the device.";
|
||||||
|
}
|
||||||
|
|
||||||
|
feature if-mib {
|
||||||
|
description
|
||||||
|
"This feature indicates that the device implements
|
||||||
|
the IF-MIB.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration data nodes
|
||||||
|
*/
|
||||||
|
|
||||||
|
container interfaces {
|
||||||
|
description
|
||||||
|
"Interface configuration parameters.";
|
||||||
|
|
||||||
|
list interface {
|
||||||
|
key "name";
|
||||||
|
|
||||||
|
description
|
||||||
|
"The list of configured interfaces on the device.
|
||||||
|
|
||||||
|
The operational state of an interface is available in the
|
||||||
|
/interfaces-state/interface list. If the configuration of a
|
||||||
|
system-controlled interface cannot be used by the system
|
||||||
|
(e.g., the interface hardware present does not match the
|
||||||
|
interface type), then the configuration is not applied to
|
||||||
|
the system-controlled interface shown in the
|
||||||
|
/interfaces-state/interface list. If the configuration
|
||||||
|
of a user-controlled interface cannot be used by the system,
|
||||||
|
the configured interface is not instantiated in the
|
||||||
|
/interfaces-state/interface list.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"The name of the interface.
|
||||||
|
|
||||||
|
A device MAY restrict the allowed values for this leaf,
|
||||||
|
possibly depending on the type of the interface.
|
||||||
|
For system-controlled interfaces, this leaf is the
|
||||||
|
device-specific name of the interface. The 'config false'
|
||||||
|
list /interfaces-state/interface contains the currently
|
||||||
|
existing interfaces on the device.
|
||||||
|
|
||||||
|
If a client tries to create configuration for a
|
||||||
|
system-controlled interface that is not present in the
|
||||||
|
/interfaces-state/interface list, the server MAY reject
|
||||||
|
the request if the implementation does not support
|
||||||
|
pre-provisioning of interfaces or if the name refers to
|
||||||
|
an interface that can never exist in the system. A
|
||||||
|
NETCONF server MUST reply with an rpc-error with the
|
||||||
|
error-tag 'invalid-value' in this case.
|
||||||
|
|
||||||
|
If the device supports pre-provisioning of interface
|
||||||
|
configuration, the 'pre-provisioning' feature is
|
||||||
|
advertised.
|
||||||
|
|
||||||
|
If the device allows arbitrarily named user-controlled
|
||||||
|
interfaces, the 'arbitrary-names' feature is advertised.
|
||||||
|
|
||||||
|
When a configured user-controlled interface is created by
|
||||||
|
the system, it is instantiated with the same name in the
|
||||||
|
/interface-state/interface list.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A textual description of the interface.
|
||||||
|
|
||||||
|
A server implementation MAY map this leaf to the ifAlias
|
||||||
|
MIB object. Such an implementation needs to use some
|
||||||
|
mechanism to handle the differences in size and characters
|
||||||
|
allowed between this leaf and ifAlias. The definition of
|
||||||
|
such a mechanism is outside the scope of this document.
|
||||||
|
|
||||||
|
Since ifAlias is defined to be stored in non-volatile
|
||||||
|
storage, the MIB implementation MUST map ifAlias to the
|
||||||
|
value of 'description' in the persistently stored
|
||||||
|
datastore.
|
||||||
|
|
||||||
|
Specifically, if the device supports ':startup', when
|
||||||
|
ifAlias is read the device MUST return the value of
|
||||||
|
'description' in the 'startup' datastore, and when it is
|
||||||
|
written, it MUST be written to the 'running' and 'startup'
|
||||||
|
datastores. Note that it is up to the implementation to
|
||||||
|
|
||||||
|
decide whether to modify this single leaf in 'startup' or
|
||||||
|
perform an implicit copy-config from 'running' to
|
||||||
|
'startup'.
|
||||||
|
|
||||||
|
If the device does not support ':startup', ifAlias MUST
|
||||||
|
be mapped to the 'description' leaf in the 'running'
|
||||||
|
datastore.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifAlias";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type identityref {
|
||||||
|
base interface-type;
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The type of the interface.
|
||||||
|
|
||||||
|
When an interface entry is created, a server MAY
|
||||||
|
initialize the type leaf with a valid value, e.g., if it
|
||||||
|
is possible to derive the type from the name of the
|
||||||
|
interface.
|
||||||
|
|
||||||
|
If a client tries to set the type of an interface to a
|
||||||
|
value that can never be used by the system, e.g., if the
|
||||||
|
type is not supported or if the type does not match the
|
||||||
|
name of the interface, the server MUST reject the request.
|
||||||
|
A NETCONF server MUST reply with an rpc-error with the
|
||||||
|
error-tag 'invalid-value' in this case.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifType";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf enabled {
|
||||||
|
type boolean;
|
||||||
|
default "true";
|
||||||
|
description
|
||||||
|
"This leaf contains the configured, desired state of the
|
||||||
|
interface.
|
||||||
|
|
||||||
|
Systems that implement the IF-MIB use the value of this
|
||||||
|
leaf in the 'running' datastore to set
|
||||||
|
IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
|
||||||
|
has been initialized, as described in RFC 2863.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Changes in this leaf in the 'running' datastore are
|
||||||
|
reflected in ifAdminStatus, but if ifAdminStatus is
|
||||||
|
changed over SNMP, this leaf is not affected.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifAdminStatus";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf link-up-down-trap-enable {
|
||||||
|
if-feature if-mib;
|
||||||
|
type enumeration {
|
||||||
|
enum enabled {
|
||||||
|
value 1;
|
||||||
|
}
|
||||||
|
enum disabled {
|
||||||
|
value 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Controls whether linkUp/linkDown SNMP notifications
|
||||||
|
should be generated for this interface.
|
||||||
|
|
||||||
|
If this node is not configured, the value 'enabled' is
|
||||||
|
operationally used by the server for interfaces that do
|
||||||
|
not operate on top of any other interface (i.e., there are
|
||||||
|
no 'lower-layer-if' entries), and 'disabled' otherwise.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifLinkUpDownTrapEnable";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Operational state data nodes
|
||||||
|
*/
|
||||||
|
|
||||||
|
container interfaces-state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Data nodes for the operational state of interfaces.";
|
||||||
|
|
||||||
|
list interface {
|
||||||
|
key "name";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
description
|
||||||
|
"The list of interfaces on the device.
|
||||||
|
|
||||||
|
System-controlled interfaces created by the system are
|
||||||
|
always present in this list, whether they are configured or
|
||||||
|
not.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"The name of the interface.
|
||||||
|
|
||||||
|
A server implementation MAY map this leaf to the ifName
|
||||||
|
MIB object. Such an implementation needs to use some
|
||||||
|
mechanism to handle the differences in size and characters
|
||||||
|
allowed between this leaf and ifName. The definition of
|
||||||
|
such a mechanism is outside the scope of this document.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifName";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type identityref {
|
||||||
|
base interface-type;
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The type of the interface.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifType";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf admin-status {
|
||||||
|
if-feature if-mib;
|
||||||
|
type enumeration {
|
||||||
|
enum up {
|
||||||
|
value 1;
|
||||||
|
description
|
||||||
|
"Ready to pass packets.";
|
||||||
|
}
|
||||||
|
enum down {
|
||||||
|
value 2;
|
||||||
|
description
|
||||||
|
"Not ready to pass packets and not in some test mode.";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
enum testing {
|
||||||
|
value 3;
|
||||||
|
description
|
||||||
|
"In some test mode.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The desired state of the interface.
|
||||||
|
|
||||||
|
This leaf has the same read semantics as ifAdminStatus.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifAdminStatus";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf oper-status {
|
||||||
|
type enumeration {
|
||||||
|
enum up {
|
||||||
|
value 1;
|
||||||
|
description
|
||||||
|
"Ready to pass packets.";
|
||||||
|
}
|
||||||
|
enum down {
|
||||||
|
value 2;
|
||||||
|
description
|
||||||
|
"The interface does not pass any packets.";
|
||||||
|
}
|
||||||
|
enum testing {
|
||||||
|
value 3;
|
||||||
|
description
|
||||||
|
"In some test mode. No operational packets can
|
||||||
|
be passed.";
|
||||||
|
}
|
||||||
|
enum unknown {
|
||||||
|
value 4;
|
||||||
|
description
|
||||||
|
"Status cannot be determined for some reason.";
|
||||||
|
}
|
||||||
|
enum dormant {
|
||||||
|
value 5;
|
||||||
|
description
|
||||||
|
"Waiting for some external event.";
|
||||||
|
}
|
||||||
|
enum not-present {
|
||||||
|
value 6;
|
||||||
|
description
|
||||||
|
"Some component (typically hardware) is missing.";
|
||||||
|
}
|
||||||
|
enum lower-layer-down {
|
||||||
|
value 7;
|
||||||
|
description
|
||||||
|
"Down due to state of lower-layer interface(s).";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The current operational state of the interface.
|
||||||
|
|
||||||
|
This leaf has the same semantics as ifOperStatus.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifOperStatus";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf last-change {
|
||||||
|
type yang:date-and-time;
|
||||||
|
description
|
||||||
|
"The time the interface entered its current operational
|
||||||
|
state. If the current state was entered prior to the
|
||||||
|
last re-initialization of the local network management
|
||||||
|
subsystem, then this node is not present.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifLastChange";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf if-index {
|
||||||
|
if-feature if-mib;
|
||||||
|
type int32 {
|
||||||
|
range "1..2147483647";
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The ifIndex value for the ifEntry represented by this
|
||||||
|
interface.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifIndex";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf phys-address {
|
||||||
|
type yang:phys-address;
|
||||||
|
description
|
||||||
|
"The interface's address at its protocol sub-layer. For
|
||||||
|
example, for an 802.x interface, this object normally
|
||||||
|
contains a Media Access Control (MAC) address. The
|
||||||
|
interface's media-specific modules must define the bit
|
||||||
|
|
||||||
|
|
||||||
|
and byte ordering and the format of the value of this
|
||||||
|
object. For interfaces that do not have such an address
|
||||||
|
(e.g., a serial line), this node is not present.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifPhysAddress";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list higher-layer-if {
|
||||||
|
type interface-state-ref;
|
||||||
|
description
|
||||||
|
"A list of references to interfaces layered on top of this
|
||||||
|
interface.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifStackTable";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list lower-layer-if {
|
||||||
|
type interface-state-ref;
|
||||||
|
description
|
||||||
|
"A list of references to interfaces layered underneath this
|
||||||
|
interface.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifStackTable";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf speed {
|
||||||
|
type yang:gauge64;
|
||||||
|
units "bits/second";
|
||||||
|
description
|
||||||
|
"An estimate of the interface's current bandwidth in bits
|
||||||
|
per second. For interfaces that do not vary in
|
||||||
|
bandwidth or for those where no accurate estimation can
|
||||||
|
be made, this node should contain the nominal bandwidth.
|
||||||
|
For interfaces that have no concept of bandwidth, this
|
||||||
|
node is not present.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifSpeed, ifHighSpeed";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
container statistics {
|
||||||
|
description
|
||||||
|
"A collection of interface-related statistics objects.";
|
||||||
|
|
||||||
|
leaf discontinuity-time {
|
||||||
|
type yang:date-and-time;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"The time on the most recent occasion at which any one or
|
||||||
|
more of this interface's counters suffered a
|
||||||
|
discontinuity. If no such discontinuities have occurred
|
||||||
|
since the last re-initialization of the local management
|
||||||
|
subsystem, then this node contains the time the local
|
||||||
|
management subsystem re-initialized itself.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-octets {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The total number of octets received on the interface,
|
||||||
|
including framing characters.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifHCInOctets";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-unicast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The number of packets, delivered by this sub-layer to a
|
||||||
|
higher (sub-)layer, that were not addressed to a
|
||||||
|
multicast or broadcast address at this sub-layer.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
leaf in-broadcast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The number of packets, delivered by this sub-layer to a
|
||||||
|
higher (sub-)layer, that were addressed to a broadcast
|
||||||
|
address at this sub-layer.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifHCInBroadcastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-multicast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The number of packets, delivered by this sub-layer to a
|
||||||
|
higher (sub-)layer, that were addressed to a multicast
|
||||||
|
address at this sub-layer. For a MAC-layer protocol,
|
||||||
|
this includes both Group and Functional addresses.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifHCInMulticastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-discards {
|
||||||
|
type yang:counter32;
|
||||||
|
description
|
||||||
|
"The number of inbound packets that were chosen to be
|
||||||
|
discarded even though no errors had been detected to
|
||||||
|
prevent their being deliverable to a higher-layer
|
||||||
|
protocol. One possible reason for discarding such a
|
||||||
|
packet could be to free up buffer space.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
|
||||||
|
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifInDiscards";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-errors {
|
||||||
|
type yang:counter32;
|
||||||
|
description
|
||||||
|
"For packet-oriented interfaces, the number of inbound
|
||||||
|
packets that contained errors preventing them from being
|
||||||
|
deliverable to a higher-layer protocol. For character-
|
||||||
|
oriented or fixed-length interfaces, the number of
|
||||||
|
inbound transmission units that contained errors
|
||||||
|
preventing them from being deliverable to a higher-layer
|
||||||
|
protocol.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifInErrors";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf in-unknown-protos {
|
||||||
|
type yang:counter32;
|
||||||
|
description
|
||||||
|
"For packet-oriented interfaces, the number of packets
|
||||||
|
received via the interface that were discarded because
|
||||||
|
of an unknown or unsupported protocol. For
|
||||||
|
character-oriented or fixed-length interfaces that
|
||||||
|
support protocol multiplexing, the number of
|
||||||
|
transmission units received via the interface that were
|
||||||
|
discarded because of an unknown or unsupported protocol.
|
||||||
|
For any interface that does not support protocol
|
||||||
|
multiplexing, this counter is not present.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
leaf out-octets {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The total number of octets transmitted out of the
|
||||||
|
interface, including framing characters.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf out-unicast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The total number of packets that higher-level protocols
|
||||||
|
requested be transmitted, and that were not addressed
|
||||||
|
to a multicast or broadcast address at this sub-layer,
|
||||||
|
including those that were discarded or not sent.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf out-broadcast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The total number of packets that higher-level protocols
|
||||||
|
requested be transmitted, and that were addressed to a
|
||||||
|
broadcast address at this sub-layer, including those
|
||||||
|
that were discarded or not sent.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifHCOutBroadcastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leaf out-multicast-pkts {
|
||||||
|
type yang:counter64;
|
||||||
|
description
|
||||||
|
"The total number of packets that higher-level protocols
|
||||||
|
requested be transmitted, and that were addressed to a
|
||||||
|
multicast address at this sub-layer, including those
|
||||||
|
that were discarded or not sent. For a MAC-layer
|
||||||
|
protocol, this includes both Group and Functional
|
||||||
|
addresses.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB -
|
||||||
|
ifHCOutMulticastPkts";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf out-discards {
|
||||||
|
type yang:counter32;
|
||||||
|
description
|
||||||
|
"The number of outbound packets that were chosen to be
|
||||||
|
discarded even though no errors had been detected to
|
||||||
|
prevent their being transmitted. One possible reason
|
||||||
|
for discarding such a packet could be to free up buffer
|
||||||
|
space.
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifOutDiscards";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf out-errors {
|
||||||
|
type yang:counter32;
|
||||||
|
description
|
||||||
|
"For packet-oriented interfaces, the number of outbound
|
||||||
|
packets that could not be transmitted because of errors.
|
||||||
|
For character-oriented or fixed-length interfaces, the
|
||||||
|
number of outbound transmission units that could not be
|
||||||
|
transmitted because of errors.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Discontinuities in the value of this counter can occur
|
||||||
|
at re-initialization of the management system, and at
|
||||||
|
other times as indicated by the value of
|
||||||
|
'discontinuity-time'.";
|
||||||
|
reference
|
||||||
|
"RFC 2863: The Interfaces Group MIB - ifOutErrors";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
480
src/modèles/ietf-yang-types.yang
Normal file
480
src/modèles/ietf-yang-types.yang
Normal file
@@ -0,0 +1,480 @@
|
|||||||
|
module ietf-yang-types {
|
||||||
|
|
||||||
|
namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
|
||||||
|
prefix "yang";
|
||||||
|
|
||||||
|
organization
|
||||||
|
"IETF NETMOD (NETCONF Data Modeling Language) Working Group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"WG Web: <http://tools.ietf.org/wg/netmod/>
|
||||||
|
WG List: <mailto:netmod@ietf.org>
|
||||||
|
|
||||||
|
WG Chair: David Kessens
|
||||||
|
<mailto:david.kessens@nsn.com>
|
||||||
|
|
||||||
|
WG Chair: Juergen Schoenwaelder
|
||||||
|
<mailto:j.schoenwaelder@jacobs-university.de>
|
||||||
|
|
||||||
|
Editor: Juergen Schoenwaelder
|
||||||
|
<mailto:j.schoenwaelder@jacobs-university.de>";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a collection of generally useful derived
|
||||||
|
YANG data types.
|
||||||
|
|
||||||
|
Copyright (c) 2013 IETF Trust and the persons identified as
|
||||||
|
authors of the code. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or
|
||||||
|
without modification, is permitted pursuant to, and subject
|
||||||
|
to the license terms contained in, the Simplified BSD License
|
||||||
|
set forth in Section 4.c of the IETF Trust's Legal Provisions
|
||||||
|
Relating to IETF Documents
|
||||||
|
(http://trustee.ietf.org/license-info).
|
||||||
|
|
||||||
|
This version of this YANG module is part of RFC 6991; see
|
||||||
|
the RFC itself for full legal notices.";
|
||||||
|
|
||||||
|
revision 2013-07-15 {
|
||||||
|
description
|
||||||
|
"This revision adds the following new data types:
|
||||||
|
- yang-identifier
|
||||||
|
- hex-string
|
||||||
|
- uuid
|
||||||
|
- dotted-quad";
|
||||||
|
reference
|
||||||
|
"RFC 6991: Common YANG Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2010-09-24 {
|
||||||
|
description
|
||||||
|
"Initial revision.";
|
||||||
|
reference
|
||||||
|
"RFC 6021: Common YANG Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of counter and gauge types ***/
|
||||||
|
|
||||||
|
typedef counter32 {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"The counter32 type represents a non-negative integer
|
||||||
|
that monotonically increases until it reaches a
|
||||||
|
maximum value of 2^32-1 (4294967295 decimal), when it
|
||||||
|
wraps around and starts increasing again from zero.
|
||||||
|
|
||||||
|
Counters have no defined 'initial' value, and thus, a
|
||||||
|
single value of a counter has (in general) no information
|
||||||
|
content. Discontinuities in the monotonically increasing
|
||||||
|
value normally occur at re-initialization of the
|
||||||
|
management system, and at other times as specified in the
|
||||||
|
description of a schema node using this type. If such
|
||||||
|
other times can occur, for example, the creation of
|
||||||
|
a schema node of type counter32 at times other than
|
||||||
|
re-initialization, then a corresponding schema node
|
||||||
|
should be defined, with an appropriate type, to indicate
|
||||||
|
the last discontinuity.
|
||||||
|
|
||||||
|
The counter32 type should not be used for configuration
|
||||||
|
schema nodes. A default statement SHOULD NOT be used in
|
||||||
|
combination with the type counter32.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the Counter32 type of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2578: Structure of Management Information Version 2
|
||||||
|
(SMIv2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef zero-based-counter32 {
|
||||||
|
type yang:counter32;
|
||||||
|
default "0";
|
||||||
|
description
|
||||||
|
"The zero-based-counter32 type represents a counter32
|
||||||
|
that has the defined 'initial' value zero.
|
||||||
|
|
||||||
|
A schema node of this type will be set to zero (0) on creation
|
||||||
|
and will thereafter increase monotonically until it reaches
|
||||||
|
a maximum value of 2^32-1 (4294967295 decimal), when it
|
||||||
|
wraps around and starts increasing again from zero.
|
||||||
|
|
||||||
|
Provided that an application discovers a new schema node
|
||||||
|
of this type within the minimum time to wrap, it can use the
|
||||||
|
'initial' value as a delta. It is important for a management
|
||||||
|
station to be aware of this minimum time and the actual time
|
||||||
|
between polls, and to discard data if the actual time is too
|
||||||
|
long or there is no defined minimum time.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the ZeroBasedCounter32 textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 4502: Remote Network Monitoring Management Information
|
||||||
|
Base Version 2";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef counter64 {
|
||||||
|
type uint64;
|
||||||
|
description
|
||||||
|
"The counter64 type represents a non-negative integer
|
||||||
|
that monotonically increases until it reaches a
|
||||||
|
maximum value of 2^64-1 (18446744073709551615 decimal),
|
||||||
|
when it wraps around and starts increasing again from zero.
|
||||||
|
|
||||||
|
Counters have no defined 'initial' value, and thus, a
|
||||||
|
single value of a counter has (in general) no information
|
||||||
|
content. Discontinuities in the monotonically increasing
|
||||||
|
value normally occur at re-initialization of the
|
||||||
|
management system, and at other times as specified in the
|
||||||
|
description of a schema node using this type. If such
|
||||||
|
other times can occur, for example, the creation of
|
||||||
|
a schema node of type counter64 at times other than
|
||||||
|
re-initialization, then a corresponding schema node
|
||||||
|
should be defined, with an appropriate type, to indicate
|
||||||
|
the last discontinuity.
|
||||||
|
|
||||||
|
The counter64 type should not be used for configuration
|
||||||
|
schema nodes. A default statement SHOULD NOT be used in
|
||||||
|
combination with the type counter64.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the Counter64 type of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2578: Structure of Management Information Version 2
|
||||||
|
(SMIv2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef zero-based-counter64 {
|
||||||
|
type yang:counter64;
|
||||||
|
default "0";
|
||||||
|
description
|
||||||
|
"The zero-based-counter64 type represents a counter64 that
|
||||||
|
has the defined 'initial' value zero.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
A schema node of this type will be set to zero (0) on creation
|
||||||
|
and will thereafter increase monotonically until it reaches
|
||||||
|
a maximum value of 2^64-1 (18446744073709551615 decimal),
|
||||||
|
when it wraps around and starts increasing again from zero.
|
||||||
|
|
||||||
|
Provided that an application discovers a new schema node
|
||||||
|
of this type within the minimum time to wrap, it can use the
|
||||||
|
'initial' value as a delta. It is important for a management
|
||||||
|
station to be aware of this minimum time and the actual time
|
||||||
|
between polls, and to discard data if the actual time is too
|
||||||
|
long or there is no defined minimum time.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the ZeroBasedCounter64 textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2856: Textual Conventions for Additional High Capacity
|
||||||
|
Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef gauge32 {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"The gauge32 type represents a non-negative integer, which
|
||||||
|
may increase or decrease, but shall never exceed a maximum
|
||||||
|
value, nor fall below a minimum value. The maximum value
|
||||||
|
cannot be greater than 2^32-1 (4294967295 decimal), and
|
||||||
|
the minimum value cannot be smaller than 0. The value of
|
||||||
|
a gauge32 has its maximum value whenever the information
|
||||||
|
being modeled is greater than or equal to its maximum
|
||||||
|
value, and has its minimum value whenever the information
|
||||||
|
being modeled is smaller than or equal to its minimum value.
|
||||||
|
If the information being modeled subsequently decreases
|
||||||
|
below (increases above) the maximum (minimum) value, the
|
||||||
|
gauge32 also decreases (increases).
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the Gauge32 type of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2578: Structure of Management Information Version 2
|
||||||
|
(SMIv2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef gauge64 {
|
||||||
|
type uint64;
|
||||||
|
description
|
||||||
|
"The gauge64 type represents a non-negative integer, which
|
||||||
|
may increase or decrease, but shall never exceed a maximum
|
||||||
|
value, nor fall below a minimum value. The maximum value
|
||||||
|
cannot be greater than 2^64-1 (18446744073709551615), and
|
||||||
|
the minimum value cannot be smaller than 0. The value of
|
||||||
|
a gauge64 has its maximum value whenever the information
|
||||||
|
being modeled is greater than or equal to its maximum
|
||||||
|
value, and has its minimum value whenever the information
|
||||||
|
being modeled is smaller than or equal to its minimum value.
|
||||||
|
If the information being modeled subsequently decreases
|
||||||
|
below (increases above) the maximum (minimum) value, the
|
||||||
|
gauge64 also decreases (increases).
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the CounterBasedGauge64 SMIv2 textual convention defined
|
||||||
|
in RFC 2856";
|
||||||
|
reference
|
||||||
|
"RFC 2856: Textual Conventions for Additional High Capacity
|
||||||
|
Data Types";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of identifier-related types ***/
|
||||||
|
|
||||||
|
typedef object-identifier {
|
||||||
|
type string {
|
||||||
|
pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
|
||||||
|
+ '(\.(0|([1-9]\d*)))*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The object-identifier type represents administratively
|
||||||
|
assigned names in a registration-hierarchical-name tree.
|
||||||
|
|
||||||
|
Values of this type are denoted as a sequence of numerical
|
||||||
|
non-negative sub-identifier values. Each sub-identifier
|
||||||
|
value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
|
||||||
|
are separated by single dots and without any intermediate
|
||||||
|
whitespace.
|
||||||
|
|
||||||
|
The ASN.1 standard restricts the value space of the first
|
||||||
|
sub-identifier to 0, 1, or 2. Furthermore, the value space
|
||||||
|
of the second sub-identifier is restricted to the range
|
||||||
|
0 to 39 if the first sub-identifier is 0 or 1. Finally,
|
||||||
|
the ASN.1 standard requires that an object identifier
|
||||||
|
has always at least two sub-identifiers. The pattern
|
||||||
|
captures these restrictions.
|
||||||
|
|
||||||
|
Although the number of sub-identifiers is not limited,
|
||||||
|
module designers should realize that there may be
|
||||||
|
implementations that stick with the SMIv2 limit of 128
|
||||||
|
sub-identifiers.
|
||||||
|
|
||||||
|
This type is a superset of the SMIv2 OBJECT IDENTIFIER type
|
||||||
|
since it is not restricted to 128 sub-identifiers. Hence,
|
||||||
|
this type SHOULD NOT be used to represent the SMIv2 OBJECT
|
||||||
|
IDENTIFIER type; the object-identifier-128 type SHOULD be
|
||||||
|
used instead.";
|
||||||
|
reference
|
||||||
|
"ISO9834-1: Information technology -- Open Systems
|
||||||
|
Interconnection -- Procedures for the operation of OSI
|
||||||
|
Registration Authorities: General procedures and top
|
||||||
|
arcs of the ASN.1 Object Identifier tree";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef object-identifier-128 {
|
||||||
|
type object-identifier {
|
||||||
|
pattern '\d*(\.\d*){1,127}';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This type represents object-identifiers restricted to 128
|
||||||
|
sub-identifiers.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the OBJECT IDENTIFIER type of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2578: Structure of Management Information Version 2
|
||||||
|
(SMIv2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef yang-identifier {
|
||||||
|
type string {
|
||||||
|
length "1..max";
|
||||||
|
pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
|
||||||
|
pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A YANG identifier string as defined by the 'identifier'
|
||||||
|
rule in Section 12 of RFC 6020. An identifier must
|
||||||
|
start with an alphabetic character or an underscore
|
||||||
|
followed by an arbitrary sequence of alphabetic or
|
||||||
|
numeric characters, underscores, hyphens, or dots.
|
||||||
|
|
||||||
|
A YANG identifier MUST NOT start with any possible
|
||||||
|
combination of the lowercase or uppercase character
|
||||||
|
sequence 'xml'.";
|
||||||
|
reference
|
||||||
|
"RFC 6020: YANG - A Data Modeling Language for the Network
|
||||||
|
Configuration Protocol (NETCONF)";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of types related to date and time***/
|
||||||
|
|
||||||
|
typedef date-and-time {
|
||||||
|
type string {
|
||||||
|
pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
|
||||||
|
+ '(Z|[\+\-]\d{2}:\d{2})';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The date-and-time type is a profile of the ISO 8601
|
||||||
|
standard for representation of dates and times using the
|
||||||
|
Gregorian calendar. The profile is defined by the
|
||||||
|
date-time production in Section 5.6 of RFC 3339.
|
||||||
|
|
||||||
|
The date-and-time type is compatible with the dateTime XML
|
||||||
|
schema type with the following notable exceptions:
|
||||||
|
|
||||||
|
(a) The date-and-time type does not allow negative years.
|
||||||
|
|
||||||
|
(b) The date-and-time time-offset -00:00 indicates an unknown
|
||||||
|
time zone (see RFC 3339) while -00:00 and +00:00 and Z
|
||||||
|
all represent the same time zone in dateTime.
|
||||||
|
|
||||||
|
(c) The canonical format (see below) of data-and-time values
|
||||||
|
differs from the canonical format used by the dateTime XML
|
||||||
|
schema type, which requires all times to be in UTC using
|
||||||
|
the time-offset 'Z'.
|
||||||
|
|
||||||
|
This type is not equivalent to the DateAndTime textual
|
||||||
|
convention of the SMIv2 since RFC 3339 uses a different
|
||||||
|
separator between full-date and full-time and provides
|
||||||
|
higher resolution of time-secfrac.
|
||||||
|
|
||||||
|
The canonical format for date-and-time values with a known time
|
||||||
|
zone uses a numeric time zone offset that is calculated using
|
||||||
|
the device's configured known offset to UTC time. A change of
|
||||||
|
the device's offset to UTC time will cause date-and-time values
|
||||||
|
to change accordingly. Such changes might happen periodically
|
||||||
|
in case a server follows automatically daylight saving time
|
||||||
|
(DST) time zone offset changes. The canonical format for
|
||||||
|
date-and-time values with an unknown time zone (usually
|
||||||
|
referring to the notion of local time) uses the time-offset
|
||||||
|
-00:00.";
|
||||||
|
reference
|
||||||
|
"RFC 3339: Date and Time on the Internet: Timestamps
|
||||||
|
RFC 2579: Textual Conventions for SMIv2
|
||||||
|
XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef timeticks {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"The timeticks type represents a non-negative integer that
|
||||||
|
represents the time, modulo 2^32 (4294967296 decimal), in
|
||||||
|
hundredths of a second between two epochs. When a schema
|
||||||
|
node is defined that uses this type, the description of
|
||||||
|
the schema node identifies both of the reference epochs.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the TimeTicks type of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2578: Structure of Management Information Version 2
|
||||||
|
(SMIv2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef timestamp {
|
||||||
|
type yang:timeticks;
|
||||||
|
description
|
||||||
|
"The timestamp type represents the value of an associated
|
||||||
|
timeticks schema node at which a specific occurrence
|
||||||
|
happened. The specific occurrence must be defined in the
|
||||||
|
description of any schema node defined using this type. When
|
||||||
|
the specific occurrence occurred prior to the last time the
|
||||||
|
associated timeticks attribute was zero, then the timestamp
|
||||||
|
value is zero. Note that this requires all timestamp values
|
||||||
|
to be reset to zero when the value of the associated timeticks
|
||||||
|
attribute reaches 497+ days and wraps around to zero.
|
||||||
|
|
||||||
|
The associated timeticks schema node must be specified
|
||||||
|
in the description of any schema node using this type.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the TimeStamp textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2579: Textual Conventions for SMIv2";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of generic address types ***/
|
||||||
|
|
||||||
|
typedef phys-address {
|
||||||
|
type string {
|
||||||
|
pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
description
|
||||||
|
"Represents media- or physical-level addresses represented
|
||||||
|
as a sequence octets, each octet represented by two hexadecimal
|
||||||
|
numbers. Octets are separated by colons. The canonical
|
||||||
|
representation uses lowercase characters.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the PhysAddress textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 2579: Textual Conventions for SMIv2";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef mac-address {
|
||||||
|
type string {
|
||||||
|
pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The mac-address type represents an IEEE 802 MAC address.
|
||||||
|
The canonical representation uses lowercase characters.
|
||||||
|
|
||||||
|
In the value set and its semantics, this type is equivalent
|
||||||
|
to the MacAddress textual convention of the SMIv2.";
|
||||||
|
reference
|
||||||
|
"IEEE 802: IEEE Standard for Local and Metropolitan Area
|
||||||
|
Networks: Overview and Architecture
|
||||||
|
RFC 2579: Textual Conventions for SMIv2";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of XML-specific types ***/
|
||||||
|
|
||||||
|
typedef xpath1.0 {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"This type represents an XPATH 1.0 expression.
|
||||||
|
|
||||||
|
When a schema node is defined that uses this type, the
|
||||||
|
description of the schema node MUST specify the XPath
|
||||||
|
context in which the XPath expression is evaluated.";
|
||||||
|
reference
|
||||||
|
"XPATH: XML Path Language (XPath) Version 1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** collection of string types ***/
|
||||||
|
|
||||||
|
typedef hex-string {
|
||||||
|
type string {
|
||||||
|
pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A hexadecimal string with octets represented as hex digits
|
||||||
|
separated by colons. The canonical representation uses
|
||||||
|
lowercase characters.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef uuid {
|
||||||
|
type string {
|
||||||
|
pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
|
||||||
|
+ '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A Universally Unique IDentifier in the string representation
|
||||||
|
defined in RFC 4122. The canonical representation uses
|
||||||
|
lowercase characters.
|
||||||
|
|
||||||
|
The following is an example of a UUID in string representation:
|
||||||
|
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
|
||||||
|
";
|
||||||
|
reference
|
||||||
|
"RFC 4122: A Universally Unique IDentifier (UUID) URN
|
||||||
|
Namespace";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef dotted-quad {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
|
||||||
|
+ '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An unsigned 32-bit number expressed in the dotted-quad
|
||||||
|
notation, i.e., four octets written as decimal numbers
|
||||||
|
and separated with the '.' (full stop) character.";
|
||||||
|
}
|
||||||
|
}
|
||||||
935
src/modèles/openconfig-acl.yang
Normal file
935
src/modèles/openconfig-acl.yang
Normal file
@@ -0,0 +1,935 @@
|
|||||||
|
module openconfig-acl {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/acl";
|
||||||
|
|
||||||
|
prefix "oc-acl";
|
||||||
|
|
||||||
|
import openconfig-packet-match { prefix oc-match; }
|
||||||
|
import openconfig-interfaces { prefix oc-if; }
|
||||||
|
import openconfig-yang-types { prefix oc-yang; }
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module defines configuration and operational state
|
||||||
|
data for network access control lists (i.e., filters, rules,
|
||||||
|
etc.). ACLs are organized into ACL sets, with each set
|
||||||
|
containing one or more ACL entries. ACL sets are identified
|
||||||
|
by a unique name, while each entry within a set is assigned
|
||||||
|
a sequence-id that determines the order in which the ACL
|
||||||
|
rules are applied to a packet. Note that ACLs are evaluated
|
||||||
|
in ascending order based on the sequence-id (low to high).
|
||||||
|
|
||||||
|
Individual ACL rules specify match criteria based on fields in
|
||||||
|
the packet, along with an action that defines how matching
|
||||||
|
packets should be handled. Entries have a type that indicates
|
||||||
|
the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.3.3";
|
||||||
|
|
||||||
|
revision "2023-02-06" {
|
||||||
|
description
|
||||||
|
"Add clarifying comments on use of interface-ref.";
|
||||||
|
reference "1.3.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2023-01-29" {
|
||||||
|
description
|
||||||
|
"Update sequence-id reference to allow model to be re-used
|
||||||
|
outside of ACL context.";
|
||||||
|
reference "1.3.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-12-20" {
|
||||||
|
description
|
||||||
|
"Remove unused openconfig-inet-types import";
|
||||||
|
reference "1.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-06-01" {
|
||||||
|
description
|
||||||
|
"Add the management of prefix lists
|
||||||
|
that can be used in matches";
|
||||||
|
reference "1.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-01-14" {
|
||||||
|
description
|
||||||
|
"Fix when statements for MIXED mode ACLs";
|
||||||
|
reference "1.2.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-06-16" {
|
||||||
|
description
|
||||||
|
"Remove trailing whitespace";
|
||||||
|
reference "1.2.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-03-17" {
|
||||||
|
description
|
||||||
|
"Add MPLS filter Support.";
|
||||||
|
reference "1.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-11-27" {
|
||||||
|
description
|
||||||
|
"Fix xpaths in when statements.";
|
||||||
|
reference "1.1.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-10-25" {
|
||||||
|
description
|
||||||
|
"Update when statements.";
|
||||||
|
reference "1.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "1.0.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-04-24" {
|
||||||
|
description
|
||||||
|
"Clarified order of ACL evaluation";
|
||||||
|
reference "1.0.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-05-26" {
|
||||||
|
description
|
||||||
|
"Separated ACL entries by type";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-08-08" {
|
||||||
|
description
|
||||||
|
"OpenConfig public release";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-01-22" {
|
||||||
|
description
|
||||||
|
"Initial revision";
|
||||||
|
reference "TBD";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:regexp-posix;
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
identity ACL_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for types of ACL sets";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_IPV4 {
|
||||||
|
base ACL_TYPE;
|
||||||
|
description
|
||||||
|
"IP-layer ACLs with IPv4 addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_IPV6 {
|
||||||
|
base ACL_TYPE;
|
||||||
|
description
|
||||||
|
"IP-layer ACLs with IPv6 addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_L2 {
|
||||||
|
base ACL_TYPE;
|
||||||
|
description
|
||||||
|
"MAC-layer ACLs";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_MIXED {
|
||||||
|
base ACL_TYPE;
|
||||||
|
description
|
||||||
|
"Mixed-mode ACL that specifies L2 and L3 protocol
|
||||||
|
fields. This ACL type is not implemented by many
|
||||||
|
routing/switching devices.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_MPLS {
|
||||||
|
base ACL_TYPE;
|
||||||
|
description
|
||||||
|
"An ACL that matches on fields from the MPLS header.";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ACL action type
|
||||||
|
|
||||||
|
identity FORWARDING_ACTION {
|
||||||
|
description
|
||||||
|
"Base identity for actions in the forwarding category";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACCEPT {
|
||||||
|
base FORWARDING_ACTION;
|
||||||
|
description
|
||||||
|
"Accept the packet";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DROP {
|
||||||
|
base FORWARDING_ACTION;
|
||||||
|
description
|
||||||
|
"Drop packet without sending any ICMP error message";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REJECT {
|
||||||
|
base FORWARDING_ACTION;
|
||||||
|
description
|
||||||
|
"Drop the packet and send an ICMP error message to the source";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LOG_ACTION {
|
||||||
|
description
|
||||||
|
"Base identity for defining the destination for logging
|
||||||
|
actions";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LOG_SYSLOG {
|
||||||
|
base LOG_ACTION;
|
||||||
|
description
|
||||||
|
"Log the packet in Syslog";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LOG_NONE {
|
||||||
|
base LOG_ACTION;
|
||||||
|
description
|
||||||
|
"No logging";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACL_COUNTER_CAPABILITY {
|
||||||
|
description
|
||||||
|
"Base identity for system to indicate how it is able to report
|
||||||
|
counters";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity INTERFACE_ONLY {
|
||||||
|
base ACL_COUNTER_CAPABILITY;
|
||||||
|
description
|
||||||
|
"ACL counters are available and reported only per interface";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity AGGREGATE_ONLY {
|
||||||
|
base ACL_COUNTER_CAPABILITY;
|
||||||
|
description
|
||||||
|
"ACL counters are aggregated over all interfaces, and reported
|
||||||
|
only per ACL entry";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity INTERFACE_AGGREGATE {
|
||||||
|
base ACL_COUNTER_CAPABILITY;
|
||||||
|
description
|
||||||
|
"ACL counters are reported per interface, and also aggregated
|
||||||
|
and reported per ACL entry.";
|
||||||
|
}
|
||||||
|
|
||||||
|
// grouping statements
|
||||||
|
|
||||||
|
// input interface
|
||||||
|
grouping input-interface-config {
|
||||||
|
description
|
||||||
|
"Config of interface";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping input-interface-state {
|
||||||
|
description
|
||||||
|
"State information of interface";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping input-interface-top {
|
||||||
|
description
|
||||||
|
"Input interface top level container";
|
||||||
|
|
||||||
|
container input-interface {
|
||||||
|
description
|
||||||
|
"Input interface container. The interface is resolved based
|
||||||
|
on the interface and subinterface leaves of the interface-ref
|
||||||
|
container, which are references to entries in the /interfaces
|
||||||
|
list.";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Config data";
|
||||||
|
uses input-interface-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State information";
|
||||||
|
uses input-interface-config;
|
||||||
|
uses input-interface-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-if:interface-ref;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Action Type
|
||||||
|
grouping action-config {
|
||||||
|
description
|
||||||
|
"Config of action type";
|
||||||
|
|
||||||
|
|
||||||
|
leaf forwarding-action {
|
||||||
|
type identityref {
|
||||||
|
base FORWARDING_ACTION;
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Specifies the forwarding action. One forwarding action
|
||||||
|
must be specified for each ACL entry";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf log-action {
|
||||||
|
type identityref {
|
||||||
|
base LOG_ACTION;
|
||||||
|
}
|
||||||
|
default LOG_NONE;
|
||||||
|
description
|
||||||
|
"Specifies the log action and destination for
|
||||||
|
matched packets. The default is not to log the
|
||||||
|
packet.";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping action-state {
|
||||||
|
description
|
||||||
|
"State information of action type";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping action-top {
|
||||||
|
description
|
||||||
|
"ACL action type top level container";
|
||||||
|
|
||||||
|
container actions {
|
||||||
|
description
|
||||||
|
"Enclosing container for list of ACL actions associated
|
||||||
|
with an entry";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Config data for ACL actions";
|
||||||
|
uses action-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State information for ACL actions";
|
||||||
|
uses action-config;
|
||||||
|
uses action-state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-counters-state {
|
||||||
|
description
|
||||||
|
"Common grouping for ACL counters";
|
||||||
|
|
||||||
|
leaf matched-packets {
|
||||||
|
type oc-yang:counter64;
|
||||||
|
description
|
||||||
|
"Count of the number of packets matching the current ACL
|
||||||
|
entry.
|
||||||
|
|
||||||
|
An implementation should provide this counter on a
|
||||||
|
per-interface per-ACL-entry if possible.
|
||||||
|
|
||||||
|
If an implementation only supports ACL counters per entry
|
||||||
|
(i.e., not broken out per interface), then the value
|
||||||
|
should be equal to the aggregate count across all interfaces.
|
||||||
|
|
||||||
|
An implementation that provides counters per entry per
|
||||||
|
interface is not required to also provide an aggregate count,
|
||||||
|
e.g., per entry -- the user is expected to be able implement
|
||||||
|
the required aggregation if such a count is needed.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf matched-octets {
|
||||||
|
type oc-yang:counter64;
|
||||||
|
description
|
||||||
|
"Count of the number of octets (bytes) matching the current
|
||||||
|
ACL entry.
|
||||||
|
|
||||||
|
An implementation should provide this counter on a
|
||||||
|
per-interface per-ACL-entry if possible.
|
||||||
|
|
||||||
|
If an implementation only supports ACL counters per entry
|
||||||
|
(i.e., not broken out per interface), then the value
|
||||||
|
should be equal to the aggregate count across all interfaces.
|
||||||
|
|
||||||
|
An implementation that provides counters per entry per
|
||||||
|
interface is not required to also provide an aggregate count,
|
||||||
|
e.g., per entry -- the user is expected to be able implement
|
||||||
|
the required aggregation if such a count is needed.";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Access List Entries
|
||||||
|
|
||||||
|
grouping access-list-entries-config {
|
||||||
|
description
|
||||||
|
"Access List Entries (ACE) config.";
|
||||||
|
|
||||||
|
leaf sequence-id {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"The sequence id determines the order in which ACL entries
|
||||||
|
are applied. The sequence id must be unique for each entry
|
||||||
|
in an ACL set. Target devices should apply the ACL entry
|
||||||
|
rules in ascending order determined by sequence id (low to
|
||||||
|
high), rather than the relying only on order in the list.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A user-defined description, or comment, for this Access List
|
||||||
|
Entry.";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping access-list-entries-state {
|
||||||
|
description
|
||||||
|
"Access List Entries state.";
|
||||||
|
|
||||||
|
uses acl-counters-state;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping access-list-entries-top {
|
||||||
|
description
|
||||||
|
"Access list entries to level container";
|
||||||
|
|
||||||
|
container acl-entries {
|
||||||
|
description
|
||||||
|
"Access list entries container";
|
||||||
|
|
||||||
|
list acl-entry {
|
||||||
|
key "sequence-id";
|
||||||
|
description
|
||||||
|
"List of ACL entries comprising an ACL set";
|
||||||
|
|
||||||
|
leaf sequence-id {
|
||||||
|
type leafref {
|
||||||
|
path "../config/sequence-id";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"references the list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Access list entries config";
|
||||||
|
uses access-list-entries-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State information for ACL entries";
|
||||||
|
uses access-list-entries-config;
|
||||||
|
uses access-list-entries-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-match:ethernet-header-top {
|
||||||
|
when "../../config/type='ACL_L2' or " +
|
||||||
|
"../../config/type='ACL_MIXED'" {
|
||||||
|
description
|
||||||
|
"MAC-layer fields are valid when the ACL type is L2 or
|
||||||
|
MIXED";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-match:ipv4-protocol-fields-top {
|
||||||
|
when "../../config/type='ACL_IPV4' or " +
|
||||||
|
"../../config/type='ACL_MIXED'" {
|
||||||
|
description
|
||||||
|
"IPv4-layer fields are valid when the ACL type is
|
||||||
|
IPv4 or MIXED";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-match:mpls-header-top {
|
||||||
|
when "../../config/type='ACL_MPLS' or " +
|
||||||
|
"../../config/type='ACL_MIXED'" {
|
||||||
|
description
|
||||||
|
"MPLS-layer fields are valid when the ACL type is
|
||||||
|
MPLS or MIXED";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-match:ipv6-protocol-fields-top {
|
||||||
|
when "../../config/type='ACL_IPV6' or " +
|
||||||
|
"../../config/type='ACL_MIXED'" {
|
||||||
|
description
|
||||||
|
"IPv6-layer fields are valid when the ACL type is
|
||||||
|
IPv6 or MIXED";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-match:transport-fields-top {
|
||||||
|
when "../../config/type='ACL_IPV6' or " +
|
||||||
|
"../../config/type='ACL_IPV4' or " +
|
||||||
|
"../../config/type='ACL_MIXED'" {
|
||||||
|
description
|
||||||
|
"Transport-layer fields are valid when specifying
|
||||||
|
L3 or MIXED ACL types";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses input-interface-top;
|
||||||
|
uses action-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-set-config {
|
||||||
|
description
|
||||||
|
"Access Control List config";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"The name of the access-list set";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type identityref {
|
||||||
|
base ACL_TYPE;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The type determines the fields allowed in the ACL entries
|
||||||
|
belonging to the ACL set (e.g., IPv4, IPv6, etc.)";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"Description, or comment, for the ACL set";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-set-state {
|
||||||
|
description
|
||||||
|
"Access Control List state";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-set-top {
|
||||||
|
description
|
||||||
|
"Access list entries variables top level container";
|
||||||
|
|
||||||
|
container acl-sets {
|
||||||
|
description
|
||||||
|
"Access list entries variables enclosing container";
|
||||||
|
|
||||||
|
list acl-set {
|
||||||
|
key "name type";
|
||||||
|
description
|
||||||
|
"List of ACL sets, each comprising of a list of ACL
|
||||||
|
entries";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the name list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type leafref {
|
||||||
|
path "../config/type";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the type list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Access list config";
|
||||||
|
uses acl-set-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Access list state information";
|
||||||
|
uses acl-set-config;
|
||||||
|
uses acl-set-state;
|
||||||
|
}
|
||||||
|
uses access-list-entries-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-acl-entries-config {
|
||||||
|
description
|
||||||
|
"Configuration data for per-interface ACLs";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-acl-entries-state {
|
||||||
|
description
|
||||||
|
"Operational state data for per-interface ACL entries";
|
||||||
|
|
||||||
|
leaf sequence-id {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-acl:acl/oc-acl:acl-sets/" +
|
||||||
|
"oc-acl:acl-set[oc-acl:name=current()/../../../../set-name]" +
|
||||||
|
"[oc-acl:type=current()/../../../../type]/" +
|
||||||
|
"oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:sequence-id";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to an entry in the ACL set applied to an
|
||||||
|
interface";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses acl-counters-state;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-acl-entries-top {
|
||||||
|
description
|
||||||
|
"Top-level grouping for per-interface ACL entries";
|
||||||
|
|
||||||
|
container acl-entries {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Enclosing container for list of references to ACLs";
|
||||||
|
|
||||||
|
list acl-entry {
|
||||||
|
key "sequence-id";
|
||||||
|
description
|
||||||
|
"List of ACL entries assigned to an interface";
|
||||||
|
|
||||||
|
leaf sequence-id {
|
||||||
|
type leafref {
|
||||||
|
path "../state/sequence-id";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to per-interface acl entry key";
|
||||||
|
}
|
||||||
|
|
||||||
|
// no config container since the enclosing container is
|
||||||
|
// read-only
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Operational state data for per-interface ACL entries";
|
||||||
|
|
||||||
|
uses interface-acl-entries-config;
|
||||||
|
uses interface-acl-entries-state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-ingress-acl-config {
|
||||||
|
description
|
||||||
|
"Configuration data for per-interface ingress ACLs";
|
||||||
|
|
||||||
|
leaf set-name {
|
||||||
|
type leafref {
|
||||||
|
path "../../../../../../acl-sets/acl-set/config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the ACL set name applied on ingress";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type leafref {
|
||||||
|
path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
|
||||||
|
"/config/type";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the ACL set type applied on ingress";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-ingress-acl-state {
|
||||||
|
description
|
||||||
|
"Operational state data for the per-interface ingress ACL";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-ingress-acl-top {
|
||||||
|
description
|
||||||
|
"Top-level grouping for per-interface ingress ACL data";
|
||||||
|
|
||||||
|
container ingress-acl-sets {
|
||||||
|
description
|
||||||
|
"Enclosing container the list of ingress ACLs on the
|
||||||
|
interface";
|
||||||
|
|
||||||
|
list ingress-acl-set {
|
||||||
|
key "set-name type";
|
||||||
|
description
|
||||||
|
"List of ingress ACLs on the interface";
|
||||||
|
|
||||||
|
leaf set-name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/set-name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to set name list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type leafref {
|
||||||
|
path "../config/type";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to type list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data ";
|
||||||
|
|
||||||
|
uses interface-ingress-acl-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Operational state data for interface ingress ACLs";
|
||||||
|
|
||||||
|
uses interface-ingress-acl-config;
|
||||||
|
uses interface-ingress-acl-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses interface-acl-entries-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-egress-acl-config {
|
||||||
|
description
|
||||||
|
"Configuration data for per-interface egress ACLs";
|
||||||
|
|
||||||
|
leaf set-name {
|
||||||
|
type leafref {
|
||||||
|
path "../../../../../../acl-sets/acl-set/config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the ACL set name applied on egress";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type leafref {
|
||||||
|
path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
|
||||||
|
"/config/type";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the ACL set type applied on egress.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-egress-acl-state {
|
||||||
|
description
|
||||||
|
"Operational state data for the per-interface egress ACL";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-egress-acl-top {
|
||||||
|
description
|
||||||
|
"Top-level grouping for per-interface egress ACL data";
|
||||||
|
|
||||||
|
container egress-acl-sets {
|
||||||
|
description
|
||||||
|
"Enclosing container the list of egress ACLs on the
|
||||||
|
interface";
|
||||||
|
|
||||||
|
list egress-acl-set {
|
||||||
|
key "set-name type";
|
||||||
|
description
|
||||||
|
"List of egress ACLs on the interface";
|
||||||
|
|
||||||
|
leaf set-name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/set-name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to set name list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type leafref {
|
||||||
|
path "../config/type";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to type list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data ";
|
||||||
|
|
||||||
|
uses interface-egress-acl-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Operational state data for interface egress ACLs";
|
||||||
|
|
||||||
|
uses interface-egress-acl-config;
|
||||||
|
uses interface-egress-acl-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses interface-acl-entries-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-interfaces-config {
|
||||||
|
description
|
||||||
|
"Configuration data for interface references";
|
||||||
|
|
||||||
|
leaf id {
|
||||||
|
type oc-if:interface-id;
|
||||||
|
description
|
||||||
|
"User-defined identifier for the interface -- a common
|
||||||
|
convention could be '<if name>.<subif index>'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-interfaces-state {
|
||||||
|
description
|
||||||
|
"Operational state data for interface references";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-interfaces-top {
|
||||||
|
description
|
||||||
|
"Top-level grouping for interface-specific ACL data";
|
||||||
|
|
||||||
|
container interfaces {
|
||||||
|
description
|
||||||
|
"Enclosing container for the list of interfaces on which
|
||||||
|
ACLs are set";
|
||||||
|
|
||||||
|
list interface {
|
||||||
|
key "id";
|
||||||
|
description
|
||||||
|
"List of interfaces on which ACLs are set. The interface is resolved
|
||||||
|
based on the interface and subinterface leaves of the interface-ref
|
||||||
|
container, which are references to entries in the /interfaces
|
||||||
|
list. The key of the list is an arbitrary value that the
|
||||||
|
implementation should not use to resolve an interface name.";
|
||||||
|
|
||||||
|
leaf id {
|
||||||
|
type leafref {
|
||||||
|
path "../config/id";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the interface id list key";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration for ACL per-interface data";
|
||||||
|
|
||||||
|
uses acl-interfaces-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Operational state for ACL per-interface data";
|
||||||
|
|
||||||
|
uses acl-interfaces-config;
|
||||||
|
uses acl-interfaces-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-if:interface-ref;
|
||||||
|
uses interface-ingress-acl-top;
|
||||||
|
uses interface-egress-acl-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
grouping acl-config {
|
||||||
|
description
|
||||||
|
"Global configuration data for ACLs";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping acl-state {
|
||||||
|
description
|
||||||
|
"Global operational state data for ACLs";
|
||||||
|
|
||||||
|
leaf counter-capability {
|
||||||
|
type identityref {
|
||||||
|
base ACL_COUNTER_CAPABILITY;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"System reported indication of how ACL counters are reported
|
||||||
|
by the target";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
grouping acl-top {
|
||||||
|
description
|
||||||
|
"Top level grouping for ACL data and structure";
|
||||||
|
|
||||||
|
container acl {
|
||||||
|
description
|
||||||
|
"Top level enclosing container for ACL model config
|
||||||
|
and operational state data";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Global config data for ACLs";
|
||||||
|
|
||||||
|
uses acl-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Global operational state data for ACLs";
|
||||||
|
|
||||||
|
uses acl-config;
|
||||||
|
uses acl-state;
|
||||||
|
}
|
||||||
|
|
||||||
|
uses acl-set-top;
|
||||||
|
uses acl-interfaces-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// data definition statements
|
||||||
|
uses acl-top;
|
||||||
|
|
||||||
|
// augment statements
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
227
src/modèles/openconfig-defined-sets.yang
Normal file
227
src/modèles/openconfig-defined-sets.yang
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
module openconfig-defined-sets {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/defined-sets";
|
||||||
|
|
||||||
|
prefix "oc-sets";
|
||||||
|
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
import openconfig-inet-types { prefix oc-inet; }
|
||||||
|
import openconfig-packet-match-types { prefix oc-pkt-match-types; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module defines configuration and operational state
|
||||||
|
data for defined sets (sets of IPv4 prefixes, sets of
|
||||||
|
IPv6 prefixes, sets of ports, etc). These sets are used,
|
||||||
|
for example, in network access control lists (i.e., filters,
|
||||||
|
rules, etc.) in the matching fields.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.0.0";
|
||||||
|
|
||||||
|
revision "2022-12-14" {
|
||||||
|
description
|
||||||
|
"Initial version of the defined set model";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
grouping ipv4-prefix-sets-config {
|
||||||
|
description "Configuration parameters of IPv4 prefix sets.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A user defined name of the IPv4 prefix set.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description "A user defined IPv4 prefix set description.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list prefix {
|
||||||
|
type oc-inet:ipv4-prefix;
|
||||||
|
description
|
||||||
|
"A user defined list of IPv4 prefixes to be used in match
|
||||||
|
conditions. Each entry is a IPv4 + mask combination.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv6-prefix-sets-config {
|
||||||
|
description "Configuration parameters of IPv6 prefix sets.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"Name of the IPv6 prefix set.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A user defined IPv6 prefix set description.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list prefix {
|
||||||
|
type oc-inet:ipv6-prefix;
|
||||||
|
description
|
||||||
|
"A user defined list of IPv6 prefixes to be used in match
|
||||||
|
conditions. Each entry is a IPv6 + mask combination.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping port-sets-config {
|
||||||
|
description
|
||||||
|
"Configuration parameters of port sets.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A user defined name of the port set.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf description {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"A user defined description for the port set";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list port {
|
||||||
|
type oc-pkt-match-types:port-num-range;
|
||||||
|
description
|
||||||
|
"A user defined set of ports to be
|
||||||
|
used in the match conditions.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping defined-sets {
|
||||||
|
description "Configuration of Defined Sets.";
|
||||||
|
|
||||||
|
container ipv4-prefix-sets {
|
||||||
|
description
|
||||||
|
"Container to hold the list of IPv4 prefix sets.";
|
||||||
|
|
||||||
|
list ipv4-prefix-set {
|
||||||
|
key "name";
|
||||||
|
description
|
||||||
|
"List of IPv4 prefix sets.";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the name of the IPv4 prefix set.";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data for IPv4 prefix sets.";
|
||||||
|
uses ipv4-prefix-sets-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State data for IPv4 prefix sets.";
|
||||||
|
uses ipv4-prefix-sets-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
container ipv6-prefix-sets {
|
||||||
|
description
|
||||||
|
"Container to hold the list of IPv4 prefix sets.";
|
||||||
|
|
||||||
|
list ipv6-prefix-set {
|
||||||
|
key "name";
|
||||||
|
description "List of IPv6 prefix sets. Each defined set
|
||||||
|
is uniquely identified by a name";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to the name of the IPv6 prefix set.";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data for IPv6 prefix sets.";
|
||||||
|
uses ipv6-prefix-sets-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State data for prefix lists.";
|
||||||
|
uses ipv6-prefix-sets-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
container port-sets {
|
||||||
|
description
|
||||||
|
"Container to hold the list of port sets.";
|
||||||
|
|
||||||
|
list port-set {
|
||||||
|
key "name";
|
||||||
|
description
|
||||||
|
"List of port sets. Each por set is uniquely
|
||||||
|
identified by its name";
|
||||||
|
|
||||||
|
leaf name {
|
||||||
|
type leafref {
|
||||||
|
path "../config/name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Name of the port set. The name is used to
|
||||||
|
reference the set in match conditions.";
|
||||||
|
}
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data for port lists.";
|
||||||
|
uses port-sets-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State data for port lists.";
|
||||||
|
uses port-sets-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
grouping defined-sets-top {
|
||||||
|
description
|
||||||
|
"Top level grouping for defined-sets";
|
||||||
|
|
||||||
|
container defined-sets {
|
||||||
|
description
|
||||||
|
"Top level enclosing container for defined-set model
|
||||||
|
config and operational state data.";
|
||||||
|
uses defined-sets;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uses defined-sets-top;
|
||||||
|
|
||||||
|
}
|
||||||
229
src/modèles/openconfig-extensions.yang
Normal file
229
src/modèles/openconfig-extensions.yang
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
module openconfig-extensions {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/openconfig-ext";
|
||||||
|
|
||||||
|
prefix "oc-ext";
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module provides extensions to the YANG language to allow
|
||||||
|
OpenConfig specific functionality and meta-data to be defined.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "0.6.0";
|
||||||
|
|
||||||
|
revision "2024-09-19" {
|
||||||
|
description
|
||||||
|
"Add telemetry-atomic-exempt annotation.";
|
||||||
|
reference "0.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-10-05" {
|
||||||
|
description
|
||||||
|
"Add missing version statement.";
|
||||||
|
reference "0.5.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-06-16" {
|
||||||
|
description
|
||||||
|
"Add extension for POSIX pattern statements.";
|
||||||
|
reference "0.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-10-17" {
|
||||||
|
description
|
||||||
|
"Add extension for regular expression type.";
|
||||||
|
reference "0.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-04-11" {
|
||||||
|
description
|
||||||
|
"rename password type to 'hashed' and clarify description";
|
||||||
|
reference "0.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-01-29" {
|
||||||
|
description
|
||||||
|
"Added extension for annotating encrypted values.";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2015-10-09" {
|
||||||
|
description
|
||||||
|
"Initial OpenConfig public release";
|
||||||
|
reference "0.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// extension statements
|
||||||
|
extension openconfig-version {
|
||||||
|
argument "semver" {
|
||||||
|
yin-element false;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The OpenConfig version number for the module. This is
|
||||||
|
expressed as a semantic version number of the form:
|
||||||
|
x.y.z
|
||||||
|
where:
|
||||||
|
* x corresponds to the major version,
|
||||||
|
* y corresponds to a minor version,
|
||||||
|
* z corresponds to a patch version.
|
||||||
|
This version corresponds to the model file within which it is
|
||||||
|
defined, and does not cover the whole set of OpenConfig models.
|
||||||
|
|
||||||
|
Individual YANG modules are versioned independently -- the
|
||||||
|
semantic version is generally incremented only when there is a
|
||||||
|
change in the corresponding file. Submodules should always
|
||||||
|
have the same semantic version as their parent modules.
|
||||||
|
|
||||||
|
A major version number of 0 indicates that this model is still
|
||||||
|
in development (whether within OpenConfig or with industry
|
||||||
|
partners), and is potentially subject to change.
|
||||||
|
|
||||||
|
Following a release of major version 1, all modules will
|
||||||
|
increment major revision number where backwards incompatible
|
||||||
|
changes to the model are made.
|
||||||
|
|
||||||
|
The minor version is changed when features are added to the
|
||||||
|
model that do not impact current clients use of the model.
|
||||||
|
|
||||||
|
The patch-level version is incremented when non-feature changes
|
||||||
|
(such as bugfixes or clarifications to human-readable
|
||||||
|
descriptions that do not impact model functionality) are made
|
||||||
|
that maintain backwards compatibility.
|
||||||
|
|
||||||
|
The version number is stored in the module meta-data.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension openconfig-hashed-value {
|
||||||
|
description
|
||||||
|
"This extension provides an annotation on schema nodes to
|
||||||
|
indicate that the corresponding value should be stored and
|
||||||
|
reported in hashed form.
|
||||||
|
|
||||||
|
Hash algorithms are by definition not reversible. Clients
|
||||||
|
reading the configuration or applied configuration for the node
|
||||||
|
should expect to receive only the hashed value. Values written
|
||||||
|
in cleartext will be hashed. This annotation may be used on
|
||||||
|
nodes such as secure passwords in which the device never reports
|
||||||
|
a cleartext value, even if the input is provided as cleartext.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension regexp-posix {
|
||||||
|
description
|
||||||
|
"This extension indicates that the regular expressions included
|
||||||
|
within the YANG module specified are conformant with the POSIX
|
||||||
|
regular expression format rather than the W3C standard that is
|
||||||
|
specified by RFC6020 and RFC7950.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension posix-pattern {
|
||||||
|
argument "pattern" {
|
||||||
|
yin-element false;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Provides a POSIX ERE regular expression pattern statement as an
|
||||||
|
alternative to YANG regular expresssions based on XML Schema Datatypes.
|
||||||
|
It is used the same way as the standard YANG pattern statement defined in
|
||||||
|
RFC6020 and RFC7950, but takes an argument that is a POSIX ERE regular
|
||||||
|
expression string.";
|
||||||
|
reference
|
||||||
|
"POSIX Extended Regular Expressions (ERE) Specification:
|
||||||
|
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension telemetry-on-change {
|
||||||
|
description
|
||||||
|
"The telemetry-on-change annotation is specified in the context
|
||||||
|
of a particular subtree (container, or list) or leaf within the
|
||||||
|
YANG schema. Where specified, it indicates that the value stored
|
||||||
|
by the nodes within the context change their value only in response
|
||||||
|
to an event occurring. The event may be local to the target, for
|
||||||
|
example - a configuration change, or external - such as the failure
|
||||||
|
of a link.
|
||||||
|
|
||||||
|
When a telemetry subscription allows the target to determine whether
|
||||||
|
to export the value of a leaf in a periodic or event-based fashion
|
||||||
|
(e.g., TARGET_DEFINED mode in gNMI), leaves marked as
|
||||||
|
telemetry-on-change should only be exported when they change,
|
||||||
|
i.e., event-based.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension telemetry-atomic {
|
||||||
|
description
|
||||||
|
"The telemetry-atomic annotation is specified in the context of
|
||||||
|
a subtree (container, or list), and indicates that all nodes
|
||||||
|
within the subtree are always updated together within the data
|
||||||
|
model. For example, all elements under the subtree may be updated
|
||||||
|
as a result of a new alarm being raised, or the arrival of a new
|
||||||
|
protocol message.
|
||||||
|
|
||||||
|
Transport protocols may use the atomic specification to determine
|
||||||
|
optimisations for sending or storing the corresponding data.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension telemetry-atomic-exempt {
|
||||||
|
description
|
||||||
|
"The telemetry-atomic-exempt annotation is specified in the context
|
||||||
|
of a node or subtree (container, or list), and indicates that the node
|
||||||
|
or all nodes within the subtree are not always updated together within
|
||||||
|
the data model of the parent tree. All elements under the subtree may
|
||||||
|
not be updated as a result of a new alarm being raised, or the arrival
|
||||||
|
of a new protocol message that updates the parent tree.
|
||||||
|
|
||||||
|
This annotation allows parent tree containers with telemetry-atomic
|
||||||
|
annotation to not be updated when a more frequently updated node or
|
||||||
|
subtree. For example, a counters container is present.
|
||||||
|
|
||||||
|
This extension should only be used when there is a parent that
|
||||||
|
contains telemetry-atomic extension.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension operational {
|
||||||
|
description
|
||||||
|
"The operational annotation is specified in the context of a
|
||||||
|
grouping, leaf, or leaf-list within a YANG module. It indicates
|
||||||
|
that the nodes within the context are derived state on the device.
|
||||||
|
|
||||||
|
OpenConfig data models divide nodes into the following three categories:
|
||||||
|
|
||||||
|
- intended configuration - these are leaves within a container named
|
||||||
|
'config', and are the writable configuration of a target.
|
||||||
|
- applied configuration - these are leaves within a container named
|
||||||
|
'state' and are the currently running value of the intended configuration.
|
||||||
|
- derived state - these are the values within the 'state' container which
|
||||||
|
are not part of the applied configuration of the device. Typically, they
|
||||||
|
represent state values reflecting underlying operational counters, or
|
||||||
|
protocol statuses.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension catalog-organization {
|
||||||
|
argument "org" {
|
||||||
|
yin-element false;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This extension specifies the organization name that should be used within
|
||||||
|
the module catalogue on the device for the specified YANG module. It stores
|
||||||
|
a pithy string where the YANG organization statement may contain more
|
||||||
|
details.";
|
||||||
|
}
|
||||||
|
|
||||||
|
extension origin {
|
||||||
|
argument "origin" {
|
||||||
|
yin-element false;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This extension specifies the name of the origin that the YANG module
|
||||||
|
falls within. This allows multiple overlapping schema trees to be used
|
||||||
|
on a single network element without requiring module based prefixing
|
||||||
|
of paths.";
|
||||||
|
}
|
||||||
|
}
|
||||||
540
src/modèles/openconfig-icmpv4-types.yang
Normal file
540
src/modèles/openconfig-icmpv4-types.yang
Normal file
@@ -0,0 +1,540 @@
|
|||||||
|
module openconfig-icmpv4-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
namespace "http://openconfig.net/yang/openconfig-icmpv4-types";
|
||||||
|
|
||||||
|
prefix "oc-icmpv4-types";
|
||||||
|
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"OpenConfig module defining the types and coresponding codes for
|
||||||
|
ICMPv4.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "0.1.0";
|
||||||
|
|
||||||
|
revision "2023-01-26" {
|
||||||
|
description
|
||||||
|
"Initial revision of ICMPv4 types module.";
|
||||||
|
reference "0.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for ICMPv4 codes";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity CODE {
|
||||||
|
description
|
||||||
|
"Base identity for ICMPv4 codes.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO_REPLY {
|
||||||
|
description
|
||||||
|
"ICMP echo reply, value 0.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE {
|
||||||
|
description
|
||||||
|
"ICMP destination unreachable, value 3.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT {
|
||||||
|
description
|
||||||
|
"ICMP redirect, value 5.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO {
|
||||||
|
description
|
||||||
|
"ICMP echo, value 8.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_ADVERTISEMENT {
|
||||||
|
description
|
||||||
|
"ICMP router advertisement, value 9.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC1256: ICMP Router Discovery Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_SOLICITATION {
|
||||||
|
description
|
||||||
|
"ICMP Router Solicitation, value 10.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC1256: ICMP Router Discovery Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIME_EXCEEDED {
|
||||||
|
description
|
||||||
|
"ICMP TTL exceede, value 11.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PARAM_PROBLEM {
|
||||||
|
description
|
||||||
|
"ICMP parameter problem, value 12.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIMESTAMP {
|
||||||
|
description
|
||||||
|
"ICMP timestamp, value 13.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIMESTAMP_REPLY {
|
||||||
|
description
|
||||||
|
"ICMP timestamp reply, value 14.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
identity TRACEROUTE{
|
||||||
|
description
|
||||||
|
"Traceroute (deprecated), value 30.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC1393: Traceroute Using an IP Option";
|
||||||
|
}
|
||||||
|
identity PHOTURIS {
|
||||||
|
description
|
||||||
|
"ICMP Photuris, value 40.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC2521: CMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REQUEST {
|
||||||
|
description
|
||||||
|
"ICMP extended echo request, value 42.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY {
|
||||||
|
description
|
||||||
|
"ICMP extended echo reply, value 43.";
|
||||||
|
base TYPE;
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO_REPLY_CODE {
|
||||||
|
description
|
||||||
|
"CODE for ICMPv4 Echo Reply.";
|
||||||
|
base CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO_REPLY_NONE {
|
||||||
|
description
|
||||||
|
"No code, type 0 for Echo Reply.";
|
||||||
|
base ECHO_REPLY_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_CODE {
|
||||||
|
description
|
||||||
|
"Codes for ICMPv4 Destination Unreachable.";
|
||||||
|
base CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_NET {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination network unreachable, code 0.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_HOST {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination host unreachable, code 1";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_PROTOCOL {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination protocol unreachable, code 2.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_PORT {
|
||||||
|
description
|
||||||
|
"ICMPv4 Port unreachable, code 3.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_CANNOT_FRAGMENT {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination unreachable due to inability to fragment. The df-bit
|
||||||
|
is set but the packet requires fragmentation, code 4.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_SRC_ROUTE_FAILED {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as source routing failed, code 5.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_DST_NET_UNKNOWN {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as the destination network is
|
||||||
|
unknown, code 6.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_DST_HOST_UNKNOWN {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as the destination host is unknown, code 7.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_SRC_HOST_ISOLATED {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination unreachable as the source host is isolated, code 8.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_DST_NET_ADMIN_PROHIBITED {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as communication with the destination
|
||||||
|
network is administratively prohibited, code 9.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_DST_HOST_ADMIN_PROHIBITED {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as communication with the destination
|
||||||
|
host is adminstratively prohibited, code 10.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_NET_UNREACHABLE_FOR_TOS {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination network is unreachable for the specified type of
|
||||||
|
service, code 11.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_HOST_UNREACHABLE_FOR_TOS {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination host is unreachable for the specified type of
|
||||||
|
service, code 12.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1122: Requirements for Internet Hosts --
|
||||||
|
Communication Layers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_ADMIN_PROHIBITED {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreacable as packets were adminstratively
|
||||||
|
filtered.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1812: Requirements for IP Version 4 Routers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_HOST_PRECEDENCE_VIOLATION {
|
||||||
|
description
|
||||||
|
"ICMPv4 destination is unreachable as the first-hop router has determined
|
||||||
|
that the destination cannot be reached for the specified source/
|
||||||
|
destination host, network, upper-layer protocol and source/destination
|
||||||
|
port. Code 14";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DST_UNREACHABLE_PRECEDENCE_CUTOFF {
|
||||||
|
description
|
||||||
|
"ICMPv4 Precedence cutoff in effect. The network operators have imposed
|
||||||
|
a minimum level of precedence required for operation, the
|
||||||
|
datagram was sent with a precedence below this level.
|
||||||
|
Code 15.";
|
||||||
|
base DST_UNREACHABLE_CODE;
|
||||||
|
reference "RFC1812: Requirements for IP Version 4 Routers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes for the ICMPv4 Redirect type.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT_NETWORK {
|
||||||
|
base REDIRECT_CODE;
|
||||||
|
description
|
||||||
|
"ICMP redirect is being issued for the network or subnet,
|
||||||
|
code 0";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT_HOST {
|
||||||
|
base REDIRECT_CODE;
|
||||||
|
description
|
||||||
|
"ICMP redirect is being issued for the host, code 1.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT_TOS_NETWORK {
|
||||||
|
base REDIRECT_CODE;
|
||||||
|
description
|
||||||
|
"ICMP redirect is being issued for the network and type of service. code 2.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REDIRECT_TOS_HOST {
|
||||||
|
base REDIRECT_CODE;
|
||||||
|
description
|
||||||
|
"ICMP redirect is being issued for the host and type of service,
|
||||||
|
code 3";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes for ICMPv4 echo messages.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ECHO_NO_CODE {
|
||||||
|
base ECHO_CODE;
|
||||||
|
description
|
||||||
|
"No code.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_ADVERTISEMENT_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Code for the ICMPv4 router advertisement message.";
|
||||||
|
}
|
||||||
|
identity ROUTER_ADVERTISEMENT_NORMAL {
|
||||||
|
base ROUTER_ADVERTISEMENT_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: Normal router advertisement.";
|
||||||
|
reference "RFC3344: IP Mobility Support for IPv4";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_ADVERTISEMENT_DOES_NOT_ROUTE_COMMON {
|
||||||
|
base ROUTER_ADVERTISEMENT_CODE;
|
||||||
|
description
|
||||||
|
"Code 16: Does not route common traffic.";
|
||||||
|
reference "RFC3344: IP Mobility Support for IPv4";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_SELECTION_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes for the ICMPv4 router selection message.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ROUTER_SELECTION_NO_CODE {
|
||||||
|
base ROUTER_SELECTION_CODE;
|
||||||
|
description
|
||||||
|
"No code.";
|
||||||
|
reference "RFC1256: ICMP Router Discovery Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIME_EXCEEDED_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes for the ICMPv4 time exceeded code.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIME_EXCEEDED_IN_TRANSIT {
|
||||||
|
base TIME_EXCEEDED_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: Time to Live exceeded in Transit.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIME_EXCEEDED_FRAGMENT_REASSEMBLY_IN_TRANSIT {
|
||||||
|
base TIME_EXCEEDED_CODE;
|
||||||
|
description
|
||||||
|
"Code 1: Fragment reassembly time exceeded.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PARAM_PROBLEM_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes for the ICMPv4 parameter problem message (Type 12).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PARAM_PROBLEM_POINTER_INDICATES_ERR {
|
||||||
|
base PARAM_PROBLEM_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: Pointer indicates the error.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PARAM_PROBLEM_MISSING_REQ_OPTION {
|
||||||
|
base PARAM_PROBLEM_CODE;
|
||||||
|
description
|
||||||
|
"Code 1: Missing a required option.";
|
||||||
|
reference "RFC1108: U.S. Department of Defense
|
||||||
|
Security Options for the Internet Protocol";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PARAM_PROBLEM_BAD_LENGTH {
|
||||||
|
base PARAM_PROBLEM_CODE;
|
||||||
|
description
|
||||||
|
"Code 2: Bad Length.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIMESTAMP_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes of the ICMPv4 timestamp message (Type 13).";
|
||||||
|
}
|
||||||
|
identity TIMESTAMP_NO_CODE {
|
||||||
|
base TIMESTAMP_CODE;
|
||||||
|
description
|
||||||
|
"No code.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIMESTAMP_REPLY_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes of the ICMPv4 timestamp reply message (Type 14).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TIMESTAMP_REPLY_NO_CODE {
|
||||||
|
base TIMESTAMP_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"No code.";
|
||||||
|
reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_CODE {
|
||||||
|
base CODE;
|
||||||
|
description
|
||||||
|
"Codes of the ICMPv4 Photuris message (type 40).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_BAD_SPI {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: Bad SPI.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_AUTH_FAILED {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 1: Authentication failed.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_DECOMPRESS_FAILED {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 2: Decompression failed.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_DECRYPTION_FAILED {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 3: Decryption failed.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_NEED_AUTHENTICATION {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 4: Need authentication.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PHOTURIS_NEED_AUTHORIZATION {
|
||||||
|
base PHOTURIS_CODE;
|
||||||
|
description
|
||||||
|
"Code 5: Need authorization.";
|
||||||
|
reference "RFC2521: ICMP Security Failures Messages";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REQUEST_CODE {
|
||||||
|
description
|
||||||
|
"Codes of the extended echo request ICMP message.";
|
||||||
|
base CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REQUEST_NO_ERROR {
|
||||||
|
base EXT_ECHO_REQUEST_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: No error.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_CODE {
|
||||||
|
description
|
||||||
|
"Codes of the extended echo reply ICMP message (Type 43).";
|
||||||
|
base CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_NO_ERROR {
|
||||||
|
base EXT_ECHO_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"Code 0: No error.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_MALFORMED_QUERY {
|
||||||
|
base EXT_ECHO_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"Code 1: Malformed query.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_NO_SUCH_INTF {
|
||||||
|
base EXT_ECHO_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"Code 2: No such interface.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_NO_SUB_TABLE_ENTRY {
|
||||||
|
base EXT_ECHO_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"Code 3: No such table entry.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXT_ECHO_REPLY_MULTIPLE_INTF_SATISFY_QUERY {
|
||||||
|
base EXT_ECHO_REPLY_CODE;
|
||||||
|
description
|
||||||
|
"Code 4: Multiple interfaces satisfy query.";
|
||||||
|
reference "RFC8335: PROBE: A Utility for Probing Interfaces";
|
||||||
|
}
|
||||||
|
}
|
||||||
1010
src/modèles/openconfig-icmpv6-types.yang
Normal file
1010
src/modèles/openconfig-icmpv6-types.yang
Normal file
File diff suppressed because it is too large
Load Diff
485
src/modèles/openconfig-inet-types.yang
Normal file
485
src/modèles/openconfig-inet-types.yang
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
module openconfig-inet-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
namespace "http://openconfig.net/yang/types/inet";
|
||||||
|
prefix "oc-inet";
|
||||||
|
|
||||||
|
import openconfig-extensions { prefix "oc-ext"; }
|
||||||
|
|
||||||
|
organization
|
||||||
|
"OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a set of Internet address related
|
||||||
|
types for use in OpenConfig modules.
|
||||||
|
|
||||||
|
Portions of this code were derived from IETF RFC 6021.
|
||||||
|
Please reproduce this note if possible.
|
||||||
|
|
||||||
|
IETF code is subject to the following copyright and license:
|
||||||
|
Copyright (c) IETF Trust and the persons identified as authors of
|
||||||
|
the code.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, is permitted pursuant to, and subject to the license
|
||||||
|
terms contained in, the Simplified BSD License set forth in
|
||||||
|
Section 4.c of the IETF Trust's Legal Provisions Relating
|
||||||
|
to IETF Documents (http://trustee.ietf.org/license-info).";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "0.7.0";
|
||||||
|
|
||||||
|
revision "2024-01-05" {
|
||||||
|
description
|
||||||
|
"Change ipv6-address-zoned typedef to conform to W3C standard
|
||||||
|
regex pattern.";
|
||||||
|
reference "0.7.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2023-02-06" {
|
||||||
|
description
|
||||||
|
"Add ipv6-link-local and ipv6-address-type";
|
||||||
|
reference "0.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-08-17" {
|
||||||
|
description
|
||||||
|
"Add ip-address-zoned typedef as a union between ipv4-address-zoned
|
||||||
|
and ipv6-address-zoned types.";
|
||||||
|
reference "0.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-07-14" {
|
||||||
|
description
|
||||||
|
"Use auto-generated regex for ipv4 pattern statements:
|
||||||
|
- ipv4-address
|
||||||
|
- ipv4-address-zoned
|
||||||
|
- ipv4-prefix";
|
||||||
|
reference "0.4.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-01-07" {
|
||||||
|
description
|
||||||
|
"Remove module extension oc-ext:regexp-posix by making pattern regexes
|
||||||
|
conform to RFC7950.
|
||||||
|
|
||||||
|
Types impacted:
|
||||||
|
- ipv4-address
|
||||||
|
- ipv4-address-zoned
|
||||||
|
- ipv6-address
|
||||||
|
- domain-name";
|
||||||
|
reference "0.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-10-12" {
|
||||||
|
description
|
||||||
|
"Fix anchors for domain-name pattern.";
|
||||||
|
reference "0.3.5";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-06-30" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig POSIX pattern extensions and add anchors for domain-name
|
||||||
|
pattern.";
|
||||||
|
reference "0.3.4";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-04-25" {
|
||||||
|
description
|
||||||
|
"Fix regex bug for ipv6-prefix type";
|
||||||
|
reference "0.3.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "0.3.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-08-24 {
|
||||||
|
description
|
||||||
|
"Minor formatting fixes.";
|
||||||
|
reference "0.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-07-06 {
|
||||||
|
description
|
||||||
|
"Add domain-name and host typedefs";
|
||||||
|
reference "0.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-04-03 {
|
||||||
|
description
|
||||||
|
"Add ip-version typedef.";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-04-03 {
|
||||||
|
description
|
||||||
|
"Update copyright notice.";
|
||||||
|
reference "0.1.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-01-26 {
|
||||||
|
description
|
||||||
|
"Initial module for inet types";
|
||||||
|
reference "0.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
// IPv4 and IPv6 types.
|
||||||
|
|
||||||
|
typedef ipv4-address {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 address in dotted quad notation using the default
|
||||||
|
zone.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-address-zoned {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+)';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+))$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 address in dotted quad notation. This type allows
|
||||||
|
specification of a zone index to disambiguate identical
|
||||||
|
address values. For link-local addresses, the index is
|
||||||
|
typically the interface index or interface name.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
// Must support compression through different lengths
|
||||||
|
// therefore this regexp is complex.
|
||||||
|
'(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
// Must support compression through different lengths
|
||||||
|
// therefore this regexp is complex.
|
||||||
|
'^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv6 address represented as either a full address; shortened
|
||||||
|
or mixed-shortened formats, using the default zone.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address-zoned {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
// Must support compression through different lengths
|
||||||
|
// therefore this regexp is complex.
|
||||||
|
'(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')(%[a-zA-Z0-9_]+)';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
// Must support compression through different lengths
|
||||||
|
// therefore this regexp is complex.
|
||||||
|
'^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')(%[a-zA-Z0-9_]+)$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv6 address represented as either a full address; shortened
|
||||||
|
or mixed-shortened formats. This type allows specification of
|
||||||
|
a zone index to disambiguate identical address values. For
|
||||||
|
link-local addresses, the index is typically the interface
|
||||||
|
index or interface name.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv4-prefix {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|'
|
||||||
|
+ '3[0-2])';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|'
|
||||||
|
+ '3[0-2]))$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 prefix represented in dotted quad notation followed by
|
||||||
|
a slash and a CIDR mask (0 <= mask <= 32).";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-prefix {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,7}:|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
|
||||||
|
'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
|
||||||
|
'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
|
||||||
|
':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
|
||||||
|
')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv6 prefix represented in full, shortened, or mixed
|
||||||
|
shortened format followed by a slash and CIDR mask
|
||||||
|
(0 <= mask <= 128).";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-address {
|
||||||
|
type union {
|
||||||
|
type ipv4-address;
|
||||||
|
type ipv6-address;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 or IPv6 address with no prefix specified.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-address-zoned {
|
||||||
|
type union {
|
||||||
|
type ipv4-address-zoned;
|
||||||
|
type ipv6-address-zoned;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 or IPv6 address with no prefix specified and an optional
|
||||||
|
zone index.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-prefix {
|
||||||
|
type union {
|
||||||
|
type ipv4-prefix;
|
||||||
|
type ipv6-prefix;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPv4 or IPv6 prefix.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-version {
|
||||||
|
type enumeration {
|
||||||
|
enum UNKNOWN {
|
||||||
|
value 0;
|
||||||
|
description
|
||||||
|
"An unknown or unspecified version of the Internet
|
||||||
|
protocol.";
|
||||||
|
}
|
||||||
|
enum IPV4 {
|
||||||
|
value 4;
|
||||||
|
description
|
||||||
|
"The IPv4 protocol as defined in RFC 791.";
|
||||||
|
}
|
||||||
|
enum IPV6 {
|
||||||
|
value 6;
|
||||||
|
description
|
||||||
|
"The IPv6 protocol as defined in RFC 2460.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This value represents the version of the IP protocol.
|
||||||
|
Note that integer representation of the enumerated values
|
||||||
|
are not specified, and are not required to follow the
|
||||||
|
InetVersion textual convention in SMIv2.";
|
||||||
|
reference
|
||||||
|
"RFC 791: Internet Protocol
|
||||||
|
RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
|
||||||
|
RFC 4001: Textual Conventions for Internet Network Addresses";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-address-type {
|
||||||
|
type enumeration {
|
||||||
|
enum GLOBAL_UNICAST {
|
||||||
|
description
|
||||||
|
"The IPv6 address is a global unicast address type and must be in
|
||||||
|
the format defined in RFC 4291 section 2.4.";
|
||||||
|
}
|
||||||
|
enum LINK_LOCAL_UNICAST {
|
||||||
|
description
|
||||||
|
"The IPv6 address is a Link-Local unicast address type and must be
|
||||||
|
in the format defined in RFC 4291 section 2.4.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The value represents the type of IPv6 address";
|
||||||
|
reference
|
||||||
|
"RFC 4291: IP Version 6 Addressing Architecture
|
||||||
|
section 2.5";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef domain-name {
|
||||||
|
type string {
|
||||||
|
length "1..253";
|
||||||
|
pattern
|
||||||
|
'(((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' +
|
||||||
|
'([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' +
|
||||||
|
'|\.)';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' +
|
||||||
|
'([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' +
|
||||||
|
'|\.)$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The domain-name type represents a DNS domain name.
|
||||||
|
Fully quallified left to the models which utilize this type.
|
||||||
|
|
||||||
|
Internet domain names are only loosely specified. Section
|
||||||
|
3.5 of RFC 1034 recommends a syntax (modified in Section
|
||||||
|
2.1 of RFC 1123). The pattern above is intended to allow
|
||||||
|
for current practice in domain name use, and some possible
|
||||||
|
future expansion. It is designed to hold various types of
|
||||||
|
domain names, including names used for A or AAAA records
|
||||||
|
(host names) and other records, such as SRV records. Note
|
||||||
|
that Internet host names have a stricter syntax (described
|
||||||
|
in RFC 952) than the DNS recommendations in RFCs 1034 and
|
||||||
|
1123, and that systems that want to store host names in
|
||||||
|
schema nodes using the domain-name type are recommended to
|
||||||
|
adhere to this stricter standard to ensure interoperability.
|
||||||
|
|
||||||
|
The encoding of DNS names in the DNS protocol is limited
|
||||||
|
to 255 characters. Since the encoding consists of labels
|
||||||
|
prefixed by a length bytes and there is a trailing NULL
|
||||||
|
byte, only 253 characters can appear in the textual dotted
|
||||||
|
notation.
|
||||||
|
|
||||||
|
Domain-name values use the US-ASCII encoding. Their canonical
|
||||||
|
format uses lowercase US-ASCII characters. Internationalized
|
||||||
|
domain names MUST be encoded in punycode as described in RFC
|
||||||
|
3492";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef host {
|
||||||
|
type union {
|
||||||
|
type ip-address;
|
||||||
|
type domain-name;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The host type represents either an unzoned IP address or a DNS
|
||||||
|
domain name.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef as-number {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"A numeric identifier for an autonomous system (AS). An AS is a
|
||||||
|
single domain, under common administrative control, which forms
|
||||||
|
a unit of routing policy. Autonomous systems can be assigned a
|
||||||
|
2-byte identifier, or a 4-byte identifier which may have public
|
||||||
|
or private scope. Private ASNs are assigned from dedicated
|
||||||
|
ranges. Public ASNs are assigned from ranges allocated by IANA
|
||||||
|
to the regional internet registries (RIRs).";
|
||||||
|
reference
|
||||||
|
"RFC 1930 Guidelines for creation, selection, and registration
|
||||||
|
of an Autonomous System (AS)
|
||||||
|
RFC 4271 A Border Gateway Protocol 4 (BGP-4)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef dscp {
|
||||||
|
type uint8 {
|
||||||
|
range "0..63";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A differentiated services code point (DSCP) marking within the
|
||||||
|
IP header.";
|
||||||
|
reference
|
||||||
|
"RFC 2474 Definition of the Differentiated Services Field
|
||||||
|
(DS Field) in the IPv4 and IPv6 Headers";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ipv6-flow-label {
|
||||||
|
type uint32 {
|
||||||
|
range "0..1048575";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The IPv6 flow-label is a 20-bit value within the IPv6 header
|
||||||
|
which is optionally used by the source of the IPv6 packet to
|
||||||
|
label sets of packets for which special handling may be
|
||||||
|
required.";
|
||||||
|
reference
|
||||||
|
"RFC 2460 Internet Protocol, Version 6 (IPv6) Specification";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef port-number {
|
||||||
|
type uint16;
|
||||||
|
description
|
||||||
|
"A 16-bit port number used by a transport protocol such as TCP
|
||||||
|
or UDP.";
|
||||||
|
reference
|
||||||
|
"RFC 768 User Datagram Protocol
|
||||||
|
RFC 793 Transmission Control Protocol";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef uri {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"An ASCII-encoded Uniform Resource Identifier (URI) as defined
|
||||||
|
in RFC 3986.";
|
||||||
|
reference
|
||||||
|
"RFC 3986 Uniform Resource Identifier (URI): Generic Syntax";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef url {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"An ASCII-encoded Uniform Resource Locator (URL) as defined
|
||||||
|
in RFC 3986, section 1.1.3";
|
||||||
|
reference
|
||||||
|
"RFC 3986, paragraph 1.1.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
1382
src/modèles/openconfig-interfaces.yang
Normal file
1382
src/modèles/openconfig-interfaces.yang
Normal file
File diff suppressed because it is too large
Load Diff
548
src/modèles/openconfig-mpls-types.yang
Normal file
548
src/modèles/openconfig-mpls-types.yang
Normal file
@@ -0,0 +1,548 @@
|
|||||||
|
module openconfig-mpls-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/mpls-types";
|
||||||
|
|
||||||
|
prefix "oc-mplst";
|
||||||
|
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
netopenconfig@googlegroups.com";
|
||||||
|
|
||||||
|
description
|
||||||
|
"General types for MPLS / TE data model";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "3.5.0";
|
||||||
|
|
||||||
|
revision "2023-12-14" {
|
||||||
|
description
|
||||||
|
"Added additional attributes oc-if:interface-ref
|
||||||
|
and metric attributes to static lsp";
|
||||||
|
reference "3.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-12-01" {
|
||||||
|
description
|
||||||
|
"Add new identity for RSVP authentication types";
|
||||||
|
reference "3.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-06-16" {
|
||||||
|
description
|
||||||
|
"Remove trailing whitespace";
|
||||||
|
reference "3.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-03-23" {
|
||||||
|
description
|
||||||
|
"Add new identity for path metric types.";
|
||||||
|
reference "3.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-02-04" {
|
||||||
|
description
|
||||||
|
"Consistent prefix for openconfig-mpls-types.";
|
||||||
|
reference "3.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-03-26" {
|
||||||
|
description
|
||||||
|
"Add Pseudowire encapsulation.";
|
||||||
|
reference "3.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "3.0.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-07-02" {
|
||||||
|
description
|
||||||
|
"Add new RSVP-TE statistics, remove associated-rsvp-session
|
||||||
|
leaf. Remove use of date-and-time.";
|
||||||
|
reference "3.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-06-16" {
|
||||||
|
description
|
||||||
|
"Included attributes for base LDP configuration.";
|
||||||
|
reference "2.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-06-13" {
|
||||||
|
description
|
||||||
|
"Add ttl-propagation to global MPLS config";
|
||||||
|
reference "2.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-06-05" {
|
||||||
|
description
|
||||||
|
"Fixed bugs in when statements on RSVP-TE attributes";
|
||||||
|
reference "2.4.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-08-24" {
|
||||||
|
description
|
||||||
|
"Minor formatting fixes.";
|
||||||
|
reference "2.4.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-06-21" {
|
||||||
|
description
|
||||||
|
"Add TC bits typedef.";
|
||||||
|
reference "2.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-03-22" {
|
||||||
|
description
|
||||||
|
"Add RSVP calculated-absolute-subscription-bw";
|
||||||
|
reference "2.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-01-26" {
|
||||||
|
description
|
||||||
|
"Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
|
||||||
|
reference "2.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-12-15" {
|
||||||
|
description
|
||||||
|
"Add additional MPLS parameters";
|
||||||
|
reference "2.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-09-01" {
|
||||||
|
description
|
||||||
|
"Revisions based on implementation feedback";
|
||||||
|
reference "2.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-08-08" {
|
||||||
|
description
|
||||||
|
"Public release of MPLS models";
|
||||||
|
reference "1.0.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
// identity statements
|
||||||
|
|
||||||
|
identity PATH_COMPUTATION_METHOD {
|
||||||
|
description
|
||||||
|
"base identity for supported path computation
|
||||||
|
mechanisms";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LOCALLY_COMPUTED {
|
||||||
|
base PATH_COMPUTATION_METHOD;
|
||||||
|
description
|
||||||
|
"indicates a constrained-path LSP in which the
|
||||||
|
path is computed by the local LER";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXTERNALLY_QUERIED {
|
||||||
|
base PATH_COMPUTATION_METHOD;
|
||||||
|
description
|
||||||
|
"Constrained-path LSP in which the path is
|
||||||
|
obtained by querying an external source, such as a PCE server.
|
||||||
|
In the case that an LSP is defined to be externally queried, it may
|
||||||
|
also have associated explicit definitions (which are provided to the
|
||||||
|
external source to aid computation); and the path that is returned by
|
||||||
|
the external source is not required to provide a wholly resolved
|
||||||
|
path back to the originating system - that is to say, some local
|
||||||
|
computation may also be required";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXPLICITLY_DEFINED {
|
||||||
|
base PATH_COMPUTATION_METHOD;
|
||||||
|
description
|
||||||
|
"constrained-path LSP in which the path is
|
||||||
|
explicitly specified as a collection of strict or/and loose
|
||||||
|
hops";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// using identities rather than enum types to simplify adding new
|
||||||
|
// signaling protocols as they are introduced and supported
|
||||||
|
identity PATH_SETUP_PROTOCOL {
|
||||||
|
description
|
||||||
|
"base identity for supported MPLS signaling
|
||||||
|
protocols";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PATH_SETUP_RSVP {
|
||||||
|
base PATH_SETUP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"RSVP-TE signaling protocol";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PATH_SETUP_SR {
|
||||||
|
base PATH_SETUP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Segment routing";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PATH_SETUP_LDP {
|
||||||
|
base PATH_SETUP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"LDP - RFC 5036";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
identity PROTECTION_TYPE {
|
||||||
|
description
|
||||||
|
"base identity for protection type";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity UNPROTECTED {
|
||||||
|
base PROTECTION_TYPE;
|
||||||
|
description
|
||||||
|
"no protection is desired";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LINK_PROTECTION_REQUIRED {
|
||||||
|
base PROTECTION_TYPE;
|
||||||
|
description
|
||||||
|
"link protection is desired";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LINK_NODE_PROTECTION_REQUESTED {
|
||||||
|
base PROTECTION_TYPE;
|
||||||
|
description
|
||||||
|
"node and link protection are both desired";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LSP_ROLE {
|
||||||
|
description
|
||||||
|
"Base identity for describing the role of
|
||||||
|
label switched path at the current node";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity INGRESS {
|
||||||
|
base LSP_ROLE;
|
||||||
|
description
|
||||||
|
"Label switched path is an ingress (headend)
|
||||||
|
LSP";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EGRESS {
|
||||||
|
base LSP_ROLE;
|
||||||
|
description
|
||||||
|
"Label switched path is an egress (tailend)
|
||||||
|
LSP";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TRANSIT {
|
||||||
|
base LSP_ROLE;
|
||||||
|
description
|
||||||
|
"Label switched path is a transit LSP";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
identity TUNNEL_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity from which specific tunnel types are
|
||||||
|
derived.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity P2P {
|
||||||
|
base TUNNEL_TYPE;
|
||||||
|
description
|
||||||
|
"TE point-to-point tunnel type.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity P2MP {
|
||||||
|
base TUNNEL_TYPE;
|
||||||
|
description
|
||||||
|
"TE point-to-multipoint tunnel type.";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
identity LSP_OPER_STATUS {
|
||||||
|
description
|
||||||
|
"Base identity for LSP operational status";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DOWN {
|
||||||
|
base LSP_OPER_STATUS;
|
||||||
|
description
|
||||||
|
"LSP is operationally down or out of service";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity UP {
|
||||||
|
base LSP_OPER_STATUS;
|
||||||
|
description
|
||||||
|
"LSP is operationally active and available
|
||||||
|
for traffic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TUNNEL_ADMIN_STATUS {
|
||||||
|
description
|
||||||
|
"Base identity for tunnel administrative status";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ADMIN_DOWN {
|
||||||
|
base TUNNEL_ADMIN_STATUS;
|
||||||
|
description
|
||||||
|
"LSP is administratively down";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ADMIN_UP {
|
||||||
|
base TUNNEL_ADMIN_STATUS;
|
||||||
|
description
|
||||||
|
"LSP is administratively up";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity NULL_LABEL_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity from which specific null-label types are
|
||||||
|
derived.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity EXPLICIT {
|
||||||
|
base NULL_LABEL_TYPE;
|
||||||
|
description
|
||||||
|
"Explicit null label is used.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IMPLICIT {
|
||||||
|
base NULL_LABEL_TYPE;
|
||||||
|
description
|
||||||
|
"Implicit null label is used.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LSP_METRIC_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for types of LSP metric specification";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LSP_METRIC_RELATIVE {
|
||||||
|
base LSP_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"The metric specified for the LSPs to which this identity refers
|
||||||
|
is specified as a relative value to the IGP metric cost to the
|
||||||
|
LSP's tail-end.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LSP_METRIC_ABSOLUTE {
|
||||||
|
base LSP_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"The metric specified for the LSPs to which this identity refers
|
||||||
|
is specified as an absolute value";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LSP_METRIC_INHERITED {
|
||||||
|
base LSP_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"The metric for for the LSPs to which this identity refers is
|
||||||
|
not specified explicitly - but rather inherited from the IGP
|
||||||
|
cost directly";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: The IANA PWE3 Types Registry has several more values than these
|
||||||
|
identity PSEUDOWIRE_ENCAPSULATION {
|
||||||
|
description
|
||||||
|
"Sets the PDU type of the PSEUDOWIRE Example in RFC4448. This value
|
||||||
|
should be enumerated from the IANA Pseudowire types registry";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PWE_ETHERNET_TAGGED_MODE {
|
||||||
|
base PSEUDOWIRE_ENCAPSULATION;
|
||||||
|
description
|
||||||
|
"Ethernet Tagged Mode RFC4448";
|
||||||
|
reference "IANA PWE3 0x0004";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PWE_ETHERNET_RAW_MODE {
|
||||||
|
base PSEUDOWIRE_ENCAPSULATION;
|
||||||
|
description
|
||||||
|
"Ethernet Raw Mode RFC4448";
|
||||||
|
reference "IANA PWE3 0x0005";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PATH_METRIC_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for path metric type.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TE_METRIC {
|
||||||
|
base PATH_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"TE path metric.";
|
||||||
|
reference
|
||||||
|
"RFC3785: Use of Interior Gateway Protocol (IGP) Metric as a
|
||||||
|
second MPLS Traffic Engineering (TE) Metric.
|
||||||
|
RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IGP_METRIC {
|
||||||
|
base PATH_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"IGP path metric.";
|
||||||
|
reference
|
||||||
|
"RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity HOP_COUNT {
|
||||||
|
base PATH_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"Hop count path metric.";
|
||||||
|
reference
|
||||||
|
"RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PATH_DELAY {
|
||||||
|
base PATH_METRIC_TYPE;
|
||||||
|
description
|
||||||
|
"Unidirectional average link delay.
|
||||||
|
It represents the sum of the Link Delay metric
|
||||||
|
of all links along a P2P path.";
|
||||||
|
reference
|
||||||
|
"RFC8570 IS-IS Traffic Engineering (TE) Metric Extensions.
|
||||||
|
RFC7471 OSPF Traffic Engineering (TE) Metric Extensions.
|
||||||
|
RFC 8233: Extensions to the Path Computation Element Communication Protocol (PCEP)
|
||||||
|
to Compute Service-Aware Label Switched Paths (LSPs) Path Computation Element (PCE)
|
||||||
|
Communication Protocol (PCEP).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity RSVP_AUTH_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for RSVP message authentication types";
|
||||||
|
reference
|
||||||
|
"RFC2747: RSVP Cryptographic Authentication";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity RSVP_AUTH_MD5 {
|
||||||
|
base RSVP_AUTH_TYPE;
|
||||||
|
description
|
||||||
|
"HMAC-MD5 message authentication";
|
||||||
|
}
|
||||||
|
|
||||||
|
// typedef statements
|
||||||
|
typedef mpls-label {
|
||||||
|
type union {
|
||||||
|
type uint32 {
|
||||||
|
range 16..1048575;
|
||||||
|
}
|
||||||
|
type enumeration {
|
||||||
|
enum IPV4_EXPLICIT_NULL {
|
||||||
|
value 0;
|
||||||
|
description
|
||||||
|
"valid at the bottom of the label stack,
|
||||||
|
indicates that stack must be popped and packet forwarded
|
||||||
|
based on IPv4 header";
|
||||||
|
}
|
||||||
|
enum ROUTER_ALERT {
|
||||||
|
value 1;
|
||||||
|
description
|
||||||
|
"allowed anywhere in the label stack except
|
||||||
|
the bottom, local router delivers packet to the local CPU
|
||||||
|
when this label is at the top of the stack";
|
||||||
|
}
|
||||||
|
enum IPV6_EXPLICIT_NULL {
|
||||||
|
value 2;
|
||||||
|
description
|
||||||
|
"valid at the bottom of the label stack,
|
||||||
|
indicates that stack must be popped and packet forwarded
|
||||||
|
based on IPv6 header";
|
||||||
|
}
|
||||||
|
enum IMPLICIT_NULL {
|
||||||
|
value 3;
|
||||||
|
description
|
||||||
|
"assigned by local LSR but not carried in
|
||||||
|
packets";
|
||||||
|
}
|
||||||
|
enum ENTROPY_LABEL_INDICATOR {
|
||||||
|
value 7;
|
||||||
|
description
|
||||||
|
"Entropy label indicator, to allow an LSR
|
||||||
|
to distinguish between entropy label and applicaiton
|
||||||
|
labels RFC 6790";
|
||||||
|
}
|
||||||
|
enum NO_LABEL {
|
||||||
|
description
|
||||||
|
"This value is utilised to indicate that the packet that
|
||||||
|
is forwarded by the local system does not have an MPLS
|
||||||
|
header applied to it. Typically, this is used at the
|
||||||
|
egress of an LSP";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"type for MPLS label value encoding";
|
||||||
|
reference "RFC 3032 - MPLS Label Stack Encoding";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef tunnel-type {
|
||||||
|
type enumeration {
|
||||||
|
enum P2P {
|
||||||
|
description
|
||||||
|
"point-to-point label-switched-path";
|
||||||
|
}
|
||||||
|
enum P2MP {
|
||||||
|
description
|
||||||
|
"point-to-multipoint label-switched-path";
|
||||||
|
}
|
||||||
|
enum MP2MP {
|
||||||
|
description
|
||||||
|
"multipoint-to-multipoint label-switched-path";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"defines the tunnel type for the LSP";
|
||||||
|
reference
|
||||||
|
"RFC 6388 - Label Distribution Protocol Extensions for
|
||||||
|
Point-to-Multipoint and Multipoint-to-Multipoint Label Switched
|
||||||
|
Paths
|
||||||
|
RFC 4875 - Extensions to Resource Reservation Protocol
|
||||||
|
- Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE
|
||||||
|
Label Switched Paths (LSPs)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef bandwidth-kbps {
|
||||||
|
type uint64;
|
||||||
|
units "Kbps";
|
||||||
|
description
|
||||||
|
"Bandwidth values expressed in kilobits per second";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef bandwidth-mbps {
|
||||||
|
type uint64;
|
||||||
|
units "Mbps";
|
||||||
|
description
|
||||||
|
"Bandwidth values expressed in megabits per second";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef bandwidth-gbps {
|
||||||
|
type uint64;
|
||||||
|
units "Gbps";
|
||||||
|
description
|
||||||
|
"Bandwidth values expressed in gigabits per second";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef mpls-tc {
|
||||||
|
type uint8 {
|
||||||
|
range "0..7";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Values of the MPLS Traffic Class (formerly known as
|
||||||
|
Experimental, EXP) bits";
|
||||||
|
}
|
||||||
|
|
||||||
|
// grouping statements
|
||||||
|
|
||||||
|
// data definition statements
|
||||||
|
|
||||||
|
// augment statements
|
||||||
|
|
||||||
|
// rpc statements
|
||||||
|
|
||||||
|
// notification statements
|
||||||
|
|
||||||
|
}
|
||||||
1457
src/modèles/openconfig-network-instance.yang
Normal file
1457
src/modèles/openconfig-network-instance.yang
Normal file
File diff suppressed because it is too large
Load Diff
374
src/modèles/openconfig-packet-match-types.yang
Normal file
374
src/modèles/openconfig-packet-match-types.yang
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
module openconfig-packet-match-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/packet-match-types";
|
||||||
|
|
||||||
|
prefix "oc-pkt-match-types";
|
||||||
|
|
||||||
|
// import some basic types
|
||||||
|
import openconfig-inet-types { prefix oc-inet; }
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module defines common types for use in models requiring
|
||||||
|
data definitions related to packet matches.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.3.3";
|
||||||
|
|
||||||
|
revision "2023-01-29" {
|
||||||
|
description
|
||||||
|
"Whitespace cleanup.";
|
||||||
|
reference "1.3.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-07-14" {
|
||||||
|
description
|
||||||
|
"Use auto-generated regex for port-num-range pattern statements";
|
||||||
|
reference "1.3.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-06-16" {
|
||||||
|
description
|
||||||
|
"Remove trailing whitespace.";
|
||||||
|
reference "1.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-05-19" {
|
||||||
|
description
|
||||||
|
"Add IP-in-IP protocol.";
|
||||||
|
reference "1.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-03-17" {
|
||||||
|
description
|
||||||
|
"Add MPLS filter Support.";
|
||||||
|
reference "1.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-01-07" {
|
||||||
|
description
|
||||||
|
"Remove module extension oc-ext:regexp-posix by making pattern regexes
|
||||||
|
conform to RFC7950.
|
||||||
|
|
||||||
|
Types impacted:
|
||||||
|
- port-num-range";
|
||||||
|
reference "1.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-10-20" {
|
||||||
|
description
|
||||||
|
"Fix pattern regex for port-num-range.";
|
||||||
|
reference "1.0.4";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-06-30" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig POSIX pattern extensions.";
|
||||||
|
reference "1.0.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "1.0.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-04-15" {
|
||||||
|
description
|
||||||
|
"Corrected description and range for ethertype typedef";
|
||||||
|
reference "1.0.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-05-26" {
|
||||||
|
description
|
||||||
|
"Separated IP matches into AFs";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-08-08" {
|
||||||
|
description
|
||||||
|
"OpenConfig public release";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-04-27" {
|
||||||
|
description
|
||||||
|
"Initial revision";
|
||||||
|
reference "TBD";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
|
||||||
|
// extension statements
|
||||||
|
|
||||||
|
// feature statements
|
||||||
|
|
||||||
|
// identity statements
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: should replace this with an official IEEE module
|
||||||
|
// when available. Only a select number of types are
|
||||||
|
// defined in this identity.
|
||||||
|
identity ETHERTYPE {
|
||||||
|
description
|
||||||
|
"Base identity for commonly used Ethertype values used
|
||||||
|
in packet header matches on Ethernet frames. The Ethertype
|
||||||
|
indicates which protocol is encapsulated in the Ethernet
|
||||||
|
payload.";
|
||||||
|
reference
|
||||||
|
"IEEE 802.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_IPV4 {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"IPv4 protocol (0x0800)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_ARP {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"Address resolution protocol (0x0806)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_VLAN {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note
|
||||||
|
that this value is also used to represent Shortest Path
|
||||||
|
Bridging (IEEE 801.1aq) frames.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_IPV6 {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"IPv6 protocol (0x86DD)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_MPLS {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"MPLS unicast (0x8847)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_LLDP {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"Link Layer Discovery Protocol (0x88CC)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ETHERTYPE_ROCE {
|
||||||
|
base ETHERTYPE;
|
||||||
|
description
|
||||||
|
"RDMA over Converged Ethernet (0x8915)";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: should replace this with an official IANA module when
|
||||||
|
//available. Only a select set of protocols are defined with
|
||||||
|
//this identity.
|
||||||
|
identity IP_PROTOCOL {
|
||||||
|
description
|
||||||
|
"Base identity for commonly used IP protocols used in
|
||||||
|
packet header matches";
|
||||||
|
reference
|
||||||
|
"IANA Assigned Internet Protocol Numbers";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_TCP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Transmission Control Protocol (6)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_UDP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"User Datagram Protocol (17)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_ICMP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Internet Control Message Protocol (1)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_IGMP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Internet Group Membership Protocol (2)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_PIM {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Protocol Independent Multicast (103)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_RSVP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Resource Reservation Protocol (46)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_GRE {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Generic Routing Encapsulation (47)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_AUTH {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Authentication header, e.g., for IPSEC (51)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_L2TP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"Layer Two Tunneling Protocol v.3 (115)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IP_IN_IP {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
description
|
||||||
|
"IP-in-IP tunneling (4)";
|
||||||
|
reference
|
||||||
|
"RFC2003: IP Encapsulation within IP";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_FLAGS {
|
||||||
|
description
|
||||||
|
"Common TCP flags used in packet header matches";
|
||||||
|
reference
|
||||||
|
"IETF RFC 793 - Transmission Control Protocol
|
||||||
|
IETF RFC 3168 - The Addition of Explicit Congestion
|
||||||
|
Notification (ECN) to IP";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_SYN {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP SYN flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_FIN {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP FIN flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_RST {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP RST flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_PSH {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP push flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_ACK {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP ACK flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_URG {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP urgent flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_ECE {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP ECN-Echo flag. If the SYN flag is set, indicates that
|
||||||
|
the TCP peer is ECN-capable, otherwise indicates that a
|
||||||
|
packet with Congestion Experienced flag in the IP header
|
||||||
|
is set";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TCP_CWR {
|
||||||
|
base TCP_FLAGS;
|
||||||
|
description
|
||||||
|
"TCP Congestion Window Reduced flag";
|
||||||
|
}
|
||||||
|
|
||||||
|
// typedef statements
|
||||||
|
|
||||||
|
typedef port-num-range {
|
||||||
|
type union {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|'
|
||||||
|
+ '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|'
|
||||||
|
+ '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|'
|
||||||
|
+ '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|'
|
||||||
|
+ '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^((0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|'
|
||||||
|
+ '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|'
|
||||||
|
+ '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|'
|
||||||
|
+ '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|'
|
||||||
|
+ '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))$';
|
||||||
|
}
|
||||||
|
type oc-inet:port-number;
|
||||||
|
type enumeration {
|
||||||
|
enum ANY {
|
||||||
|
description
|
||||||
|
"Indicates any valid port number (e.g., wildcard)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Port numbers may be represented as a single value,
|
||||||
|
an inclusive range as <lower>..<higher>, or as ANY to
|
||||||
|
indicate a wildcard.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ip-protocol-type {
|
||||||
|
type union {
|
||||||
|
type uint8 {
|
||||||
|
range 0..254;
|
||||||
|
}
|
||||||
|
type identityref {
|
||||||
|
base IP_PROTOCOL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The IP protocol number may be expressed as a valid protocol
|
||||||
|
number (integer) or using a protocol type defined by the
|
||||||
|
IP_PROTOCOL identity";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ethertype-type {
|
||||||
|
type union {
|
||||||
|
type uint16 {
|
||||||
|
range 1536..65535;
|
||||||
|
}
|
||||||
|
type identityref {
|
||||||
|
base ETHERTYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The Ethertype value may be expressed as a 16-bit number in
|
||||||
|
decimal notation, or using a type defined by the
|
||||||
|
ETHERTYPE identity";
|
||||||
|
}
|
||||||
|
}
|
||||||
727
src/modèles/openconfig-packet-match.yang
Normal file
727
src/modèles/openconfig-packet-match.yang
Normal file
@@ -0,0 +1,727 @@
|
|||||||
|
module openconfig-packet-match {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/header-fields";
|
||||||
|
|
||||||
|
prefix "oc-pkt-match";
|
||||||
|
|
||||||
|
// import some basic types
|
||||||
|
import openconfig-inet-types { prefix oc-inet; }
|
||||||
|
import openconfig-yang-types { prefix oc-yang; }
|
||||||
|
import openconfig-packet-match-types { prefix oc-pkt-match-types; }
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
import openconfig-mpls-types { prefix oc-mpls; }
|
||||||
|
import openconfig-defined-sets { prefix oc-sets; }
|
||||||
|
import openconfig-icmpv4-types { prefix oc-icmpv4-types; }
|
||||||
|
import openconfig-icmpv6-types { prefix oc-icmpv6-types; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization "OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module defines data related to packet header fields
|
||||||
|
used in matching operations, for example in ACLs. When a
|
||||||
|
field is omitted from a match expression, the effect is a
|
||||||
|
wildcard ('any') for that field.";
|
||||||
|
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "2.1.0";
|
||||||
|
|
||||||
|
revision "2023-03-01" {
|
||||||
|
description
|
||||||
|
"Add ICMP Fields for filtering.";
|
||||||
|
reference "2.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2023-01-27" {
|
||||||
|
description
|
||||||
|
"Update the mechanism to match detailed transport flags,
|
||||||
|
adding means for AND/OR in the explicitly specified flags
|
||||||
|
and commonly supported match aliases.";
|
||||||
|
reference "2.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-06-01" {
|
||||||
|
description
|
||||||
|
"Add the ability to match source/destination ipv4 and
|
||||||
|
ipv6 prefix list and source/destination port list ";
|
||||||
|
reference "1.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-06-16" {
|
||||||
|
description
|
||||||
|
"Remove trailing whitespace.";
|
||||||
|
reference "1.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-05-19" {
|
||||||
|
description
|
||||||
|
"Add the ability to match multiple DSCPs in a rule.";
|
||||||
|
reference "1.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-03-17" {
|
||||||
|
description
|
||||||
|
"Add MPLS filter Support.";
|
||||||
|
reference "1.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "1.1.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-12-15" {
|
||||||
|
description
|
||||||
|
"Add MPLS packet field matches";
|
||||||
|
reference "1.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-05-26" {
|
||||||
|
description
|
||||||
|
"Separated IP matches into AFs";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-08-08" {
|
||||||
|
description
|
||||||
|
"OpenConfig public release";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-04-27" {
|
||||||
|
description
|
||||||
|
"Initial revision";
|
||||||
|
reference "TBD";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:regexp-posix;
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
|
||||||
|
// Physical Layer fields
|
||||||
|
// ethernet-header
|
||||||
|
grouping ethernet-header-config {
|
||||||
|
description
|
||||||
|
"Configuration data of fields in Ethernet header.";
|
||||||
|
|
||||||
|
leaf source-mac {
|
||||||
|
type oc-yang:mac-address;
|
||||||
|
description
|
||||||
|
"Source IEEE 802 MAC address.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf source-mac-mask {
|
||||||
|
type oc-yang:mac-address;
|
||||||
|
description
|
||||||
|
"Source IEEE 802 MAC address mask.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-mac {
|
||||||
|
type oc-yang:mac-address;
|
||||||
|
description
|
||||||
|
"Destination IEEE 802 MAC address.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-mac-mask {
|
||||||
|
type oc-yang:mac-address;
|
||||||
|
description
|
||||||
|
"Destination IEEE 802 MAC address mask.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf ethertype {
|
||||||
|
type oc-pkt-match-types:ethertype-type;
|
||||||
|
description
|
||||||
|
"Ethertype field to match in Ethernet packets";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ethernet-header-state {
|
||||||
|
description
|
||||||
|
"State information of fields in Ethernet header.";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ethernet-header-top {
|
||||||
|
description
|
||||||
|
"Top level container for fields in Ethernet header.";
|
||||||
|
|
||||||
|
container l2 {
|
||||||
|
description
|
||||||
|
"Ethernet header fields";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data";
|
||||||
|
uses ethernet-header-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State Information.";
|
||||||
|
uses ethernet-header-config;
|
||||||
|
uses ethernet-header-state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping mpls-header-top {
|
||||||
|
description
|
||||||
|
"Top-level container for fields in an MPLS header.";
|
||||||
|
|
||||||
|
container mpls {
|
||||||
|
description
|
||||||
|
"MPLS header fields";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration parameters relating to fields within
|
||||||
|
the MPLS header.";
|
||||||
|
uses mpls-header-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Operational state parameters relating to fields
|
||||||
|
within the MPLS header";
|
||||||
|
uses mpls-header-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping mpls-header-config {
|
||||||
|
description
|
||||||
|
"Configuration parameters relating to matches within
|
||||||
|
MPLS header fields.";
|
||||||
|
|
||||||
|
leaf traffic-class {
|
||||||
|
type oc-mpls:mpls-tc;
|
||||||
|
description
|
||||||
|
"The value of the MPLS traffic class (TC) bits,
|
||||||
|
formerly known as the EXP bits.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf start-label-value {
|
||||||
|
type oc-mpls:mpls-label;
|
||||||
|
description
|
||||||
|
"Match MPLS label value on the MPLS header.
|
||||||
|
The usage of this field indicated the upper
|
||||||
|
range value in the top of the stack.
|
||||||
|
The range that is used is inclusive. The match that
|
||||||
|
is done for a particular received pkt_label is:
|
||||||
|
start-label-value <= pkt_label <= end-label-value.
|
||||||
|
The 20-bit label value in an MPLS label
|
||||||
|
stack as specified in RFC 3032.
|
||||||
|
This label value does not include the
|
||||||
|
encodings of Traffic Class and TTL.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf end-label-value {
|
||||||
|
type oc-mpls:mpls-label;
|
||||||
|
description
|
||||||
|
"Match MPLS label value on the MPLS header.
|
||||||
|
The usage of this field indicated the upper
|
||||||
|
range value in the top of the stack.
|
||||||
|
The range that is used is inclusive. The match that
|
||||||
|
is done for a particular received pkt_label is:
|
||||||
|
start-label-value <= pkt_label <= end-label-value.
|
||||||
|
The 20-bit label value in an MPLS label
|
||||||
|
stack as specified in RFC 3032.
|
||||||
|
This label value does not include the
|
||||||
|
encodings of Traffic Class and TTL.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf ttl-value {
|
||||||
|
type uint8;
|
||||||
|
description
|
||||||
|
"Time-to-live MPLS packet value match.";
|
||||||
|
reference
|
||||||
|
"RFC 3032: MPLS Label Stack Encoding.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ip-protocol-fields-common-config {
|
||||||
|
description
|
||||||
|
"IP protocol fields common to IPv4 and IPv6";
|
||||||
|
|
||||||
|
leaf dscp {
|
||||||
|
type oc-inet:dscp;
|
||||||
|
description
|
||||||
|
"Value of diffserv codepoint.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list dscp-set {
|
||||||
|
type oc-inet:dscp;
|
||||||
|
description
|
||||||
|
"A list of DSCP values to be matched for incoming packets. AN OR match should
|
||||||
|
be performed, such that a packet must match one of the values defined in this
|
||||||
|
list. If the field is left empty then any DSCP value matches unless the 'dscp'
|
||||||
|
leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf length {
|
||||||
|
type uint16;
|
||||||
|
description
|
||||||
|
"In the IPv4 header field, this field is known as the Total
|
||||||
|
Length. Total Length is the length of the datagram, measured
|
||||||
|
in octets, including internet header and data.
|
||||||
|
In the IPv6 header field, this field is known as the Payload
|
||||||
|
Length, which is the length of the IPv6 payload, i.e., the rest
|
||||||
|
of the packet following the IPv6 header, in octets.";
|
||||||
|
reference
|
||||||
|
"RFC 791: Internet Protocol
|
||||||
|
RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf protocol {
|
||||||
|
type oc-pkt-match-types:ip-protocol-type;
|
||||||
|
description
|
||||||
|
"The protocol carried in the IP packet, expressed either
|
||||||
|
as its IP protocol number, or by a defined identity.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf hop-limit {
|
||||||
|
type uint8 {
|
||||||
|
range 0..255;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The IP packet's hop limit -- known as TTL (in hops) in
|
||||||
|
IPv4 packets, and hop limit in IPv6";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP Layer
|
||||||
|
// ip-protocol-fields
|
||||||
|
grouping ipv4-protocol-fields-config {
|
||||||
|
description
|
||||||
|
"Configuration data of IP protocol fields
|
||||||
|
for IPv4";
|
||||||
|
|
||||||
|
leaf source-address {
|
||||||
|
type oc-inet:ipv4-prefix;
|
||||||
|
description
|
||||||
|
"Source IPv4 address prefix.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf source-address-prefix-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets"
|
||||||
|
+ "/oc-sets:ipv4-prefix-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a IPv4 address prefix Set
|
||||||
|
to match the source address";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-address {
|
||||||
|
type oc-inet:ipv4-prefix;
|
||||||
|
description
|
||||||
|
"Destination IPv4 address prefix.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-address-prefix-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets"
|
||||||
|
+ "/oc-sets:ipv4-prefix-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a IPv4 address prefix set
|
||||||
|
to match the destination address";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses ip-protocol-fields-common-config;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv4-protocol-fields-state {
|
||||||
|
description
|
||||||
|
"State information of IP header fields for IPv4";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv4-protocol-fields-top {
|
||||||
|
description
|
||||||
|
"IP header fields for IPv4";
|
||||||
|
|
||||||
|
container ipv4 {
|
||||||
|
description
|
||||||
|
"Top level container for IPv4 match field data";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data for IPv4 match fields";
|
||||||
|
uses ipv4-protocol-fields-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State information for IPv4 match fields";
|
||||||
|
uses ipv4-protocol-fields-config;
|
||||||
|
uses ipv4-protocol-fields-state;
|
||||||
|
}
|
||||||
|
uses ip-icmpv4-header-fields-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv6-protocol-fields-config {
|
||||||
|
description
|
||||||
|
"Configuration data for IPv6 match fields";
|
||||||
|
|
||||||
|
leaf source-address {
|
||||||
|
type oc-inet:ipv6-prefix;
|
||||||
|
description
|
||||||
|
"Source IPv6 address prefix.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf source-address-prefix-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets"
|
||||||
|
+ "/oc-sets:ipv6-prefix-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a IPv6 address prefix set
|
||||||
|
to match the source address";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf source-flow-label {
|
||||||
|
type oc-inet:ipv6-flow-label;
|
||||||
|
description
|
||||||
|
"Source IPv6 Flow label.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-address {
|
||||||
|
type oc-inet:ipv6-prefix;
|
||||||
|
description
|
||||||
|
"Destination IPv6 address prefix.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-address-prefix-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets"
|
||||||
|
+ "/oc-sets:ipv6-prefix-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a IPv6 address prefix set
|
||||||
|
to match the destination address";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-flow-label {
|
||||||
|
type oc-inet:ipv6-flow-label;
|
||||||
|
description
|
||||||
|
"Destination IPv6 Flow label.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses ip-protocol-fields-common-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv6-protocol-fields-state {
|
||||||
|
description
|
||||||
|
"Operational state data for IPv6 match fields";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ipv6-protocol-fields-top {
|
||||||
|
description
|
||||||
|
"Top-level grouping for IPv6 match fields";
|
||||||
|
|
||||||
|
container ipv6 {
|
||||||
|
description
|
||||||
|
"Top-level container for IPv6 match field data";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data for IPv6 match fields";
|
||||||
|
|
||||||
|
uses ipv6-protocol-fields-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
|
||||||
|
config false;
|
||||||
|
|
||||||
|
description
|
||||||
|
"Operational state data for IPv6 match fields";
|
||||||
|
|
||||||
|
uses ipv6-protocol-fields-config;
|
||||||
|
uses ipv6-protocol-fields-state;
|
||||||
|
}
|
||||||
|
uses ip-icmpv6-header-fields-top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transport fields
|
||||||
|
grouping transport-fields-config {
|
||||||
|
description
|
||||||
|
"Configuration data of transport-layer packet fields";
|
||||||
|
|
||||||
|
leaf source-port {
|
||||||
|
type oc-pkt-match-types:port-num-range;
|
||||||
|
description
|
||||||
|
"Source port or range";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf source-port-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:port-sets"
|
||||||
|
+ "/oc-sets:port-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a port set
|
||||||
|
to match the source port";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-port {
|
||||||
|
type oc-pkt-match-types:port-num-range;
|
||||||
|
description
|
||||||
|
"Destination port or range";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf destination-port-set {
|
||||||
|
type leafref {
|
||||||
|
path "/oc-sets:defined-sets/oc-sets:port-sets"
|
||||||
|
+ "/oc-sets:port-set/oc-sets:name";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Reference to a port set
|
||||||
|
to match the destination port";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf detail-mode {
|
||||||
|
type enumeration {
|
||||||
|
enum EXPLICIT {
|
||||||
|
description
|
||||||
|
"Specifies that the mode for matching details at the transport
|
||||||
|
layer is to explicitly match transport flags.";
|
||||||
|
}
|
||||||
|
enum BUILTIN {
|
||||||
|
description
|
||||||
|
"Specifies that the mode for matching details at the transport
|
||||||
|
layer is to using implementation built-ins which may map to
|
||||||
|
multiple flags.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Mode that is used for matching detailed fields at the transport
|
||||||
|
layer. When EXPLICIT is specified, the implementation should
|
||||||
|
match based on the explicit flags that are specified in the
|
||||||
|
corresponding leaf. When BUILTIN is specified, the implementation
|
||||||
|
must expand the contents of the corresponding leaf to the flags
|
||||||
|
and/or fields that match the pre-defined built-in values.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf explicit-detail-match-mode {
|
||||||
|
type enumeration {
|
||||||
|
enum ANY {
|
||||||
|
description
|
||||||
|
"Matches of the explicit-detail-flags field are treated as
|
||||||
|
an OR between the values in the list.";
|
||||||
|
}
|
||||||
|
enum ALL {
|
||||||
|
description
|
||||||
|
"Matches of the explicit-details-flags field are treated
|
||||||
|
as an AND of the values in the list.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Specifies how the contents of the explicit-details-flags list
|
||||||
|
are to be treated. ANY implies that any of the flags may match,
|
||||||
|
where ALL indicates that all the flags must be matched.";
|
||||||
|
when "../detail-mode = 'EXPLICIT'" {
|
||||||
|
description
|
||||||
|
"This leaf is only valid when the mode for matches is specified to
|
||||||
|
be explicit.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf-list explicit-tcp-flags {
|
||||||
|
type identityref {
|
||||||
|
base oc-pkt-match-types:TCP_FLAGS;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An explicit list of the TCP flags that are to be matched. The
|
||||||
|
mechanism for the match is specified by the explicit-detail-match-mode
|
||||||
|
leaf.";
|
||||||
|
when "../detail-mode = 'EXPLICIT'" {
|
||||||
|
description
|
||||||
|
"This leaf is only valid when the mode for matches is specified to
|
||||||
|
be explicit.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf builtin-detail {
|
||||||
|
type enumeration {
|
||||||
|
enum TCP_INITIAL {
|
||||||
|
description
|
||||||
|
"Matches the first packet of a TCP session based on a packet
|
||||||
|
not having the ACK flag set, and having the SYN flag set.";
|
||||||
|
}
|
||||||
|
enum TCP_ESTABLISHED {
|
||||||
|
description
|
||||||
|
"Matches an established TCP session based on a packet having
|
||||||
|
the ACK or RST flags set. This does not match the first
|
||||||
|
packet.";
|
||||||
|
}
|
||||||
|
enum FRAGMENT {
|
||||||
|
description
|
||||||
|
"Matches non-zero values of the fragment-offset field, indicating
|
||||||
|
this packet is a follow up to a fragmented datagram.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Specifies a built-in (alias) for a match condition that matches
|
||||||
|
multiple flags, or specifies particular logic as to the flag matches
|
||||||
|
to be implemented. This leaf is only valid when the detail-match-mode
|
||||||
|
leaf is BUILTIN.";
|
||||||
|
when "../detail-mode = 'BUILTIN'" {
|
||||||
|
description
|
||||||
|
"This leaf is only valid when the mode for matches is specified to
|
||||||
|
be builtin.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping transport-fields-state {
|
||||||
|
description
|
||||||
|
"State data of transport-fields";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping transport-fields-top {
|
||||||
|
description
|
||||||
|
"Destination transport-fields top level grouping";
|
||||||
|
|
||||||
|
container transport {
|
||||||
|
description
|
||||||
|
"Transport fields container";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration data";
|
||||||
|
uses transport-fields-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"State data";
|
||||||
|
uses transport-fields-config;
|
||||||
|
uses transport-fields-state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ip-icmpv4-header-fields-top {
|
||||||
|
description
|
||||||
|
"Top grouping for ICMPv4 filtering";
|
||||||
|
|
||||||
|
container icmpv4 {
|
||||||
|
description
|
||||||
|
"Top container for ICMPv4 filtering";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration attributes for ICMPv4 filtering";
|
||||||
|
|
||||||
|
uses ip-icmpv4-header-fields-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
description
|
||||||
|
"State attributes for ICMPv4 filtering";
|
||||||
|
config false;
|
||||||
|
|
||||||
|
uses ip-icmpv4-header-fields-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ip-icmpv6-header-fields-top {
|
||||||
|
description
|
||||||
|
"Top grouping for ICMPv6 filtering";
|
||||||
|
|
||||||
|
container icmpv6 {
|
||||||
|
description
|
||||||
|
"Top container for ICMPv6 filtering";
|
||||||
|
|
||||||
|
container config {
|
||||||
|
description
|
||||||
|
"Configuration attributes for ICMPv6 filtering";
|
||||||
|
|
||||||
|
uses ip-icmpv6-header-fields-config;
|
||||||
|
}
|
||||||
|
|
||||||
|
container state {
|
||||||
|
description
|
||||||
|
"State attributes for ICMPv6 filtering";
|
||||||
|
config false;
|
||||||
|
|
||||||
|
uses ip-icmpv6-header-fields-config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ip-icmpv4-header-fields-config {
|
||||||
|
description
|
||||||
|
"Collection of ICMPv4 header fields that can be
|
||||||
|
used to set up a match filter.";
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type identityref {
|
||||||
|
base oc-icmpv4-types:TYPE;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"ICMPv4 type to be matched.";
|
||||||
|
reference
|
||||||
|
"RFC 792: Internet Control Message Protocol";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf code {
|
||||||
|
type identityref {
|
||||||
|
base oc-icmpv4-types:CODE;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"ICMPv4 code to be matched.";
|
||||||
|
reference
|
||||||
|
"RFC 792: Internet Control Message Protocol";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping ip-icmpv6-header-fields-config {
|
||||||
|
description
|
||||||
|
"Collection of ICMPv6 header fields that can be
|
||||||
|
used to set up a match filter.";
|
||||||
|
|
||||||
|
leaf type {
|
||||||
|
type identityref {
|
||||||
|
base oc-icmpv6-types:TYPE;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"ICMPv6 type to be matched.";
|
||||||
|
reference
|
||||||
|
"RFC 4443: Internet Control Message Protocol (ICMPv6)
|
||||||
|
for Internet Protocol Version 6 (IPv6)
|
||||||
|
Specification.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf code {
|
||||||
|
type identityref {
|
||||||
|
base oc-icmpv6-types:CODE;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"ICMP code to be matched.";
|
||||||
|
reference
|
||||||
|
"RFC 4443: Internet Control Message Protocol (ICMPv6)
|
||||||
|
for Internet Protocol Version 6 (IPv6)
|
||||||
|
Specification.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
633
src/modèles/openconfig-platform-types.yang
Normal file
633
src/modèles/openconfig-platform-types.yang
Normal file
@@ -0,0 +1,633 @@
|
|||||||
|
module openconfig-platform-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
namespace "http://openconfig.net/yang/platform-types";
|
||||||
|
|
||||||
|
prefix "oc-platform-types";
|
||||||
|
|
||||||
|
import openconfig-types { prefix oc-types; }
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization
|
||||||
|
"OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module defines data types (e.g., YANG identities)
|
||||||
|
to support the OpenConfig component inventory model.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.10.0";
|
||||||
|
|
||||||
|
revision "2025-07-09" {
|
||||||
|
description
|
||||||
|
"Add FPGA, BOOT_LOADER_GRUB, BOOT_LOADER_ONIE";
|
||||||
|
reference "1.10.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2024-11-04" {
|
||||||
|
description
|
||||||
|
"Add FAN_TRAY_CONTROLLER";
|
||||||
|
reference "1.9.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2024-04-30" {
|
||||||
|
description
|
||||||
|
"Add FAN_TRAY";
|
||||||
|
reference "1.8.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2024-01-30" {
|
||||||
|
description
|
||||||
|
"Add component-last-poweroff-reason grouping";
|
||||||
|
reference "1.7.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2023-06-27" {
|
||||||
|
description
|
||||||
|
"Add WIFI_ACCESS_POINT";
|
||||||
|
reference "1.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-07-28" {
|
||||||
|
description
|
||||||
|
"Add grouping for component power management";
|
||||||
|
reference "1.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-03-27" {
|
||||||
|
description
|
||||||
|
"Add identity for BIOS";
|
||||||
|
reference "1.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2022-02-02" {
|
||||||
|
description
|
||||||
|
"Add support for component reboot and switchover.";
|
||||||
|
reference "1.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-07-29" {
|
||||||
|
description
|
||||||
|
"Add several avg-min-max-instant-stats groupings";
|
||||||
|
reference "1.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-01-18" {
|
||||||
|
description
|
||||||
|
"Add identity for software modules";
|
||||||
|
reference "1.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-06-03" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig component operating system patch type.";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "0.10.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-16" {
|
||||||
|
description
|
||||||
|
"Added FEC_MODE_TYPE and FEC_STATUS_TYPE";
|
||||||
|
reference "0.10.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-05-05" {
|
||||||
|
description
|
||||||
|
"Added min-max-time to
|
||||||
|
avg-min-max-instant-stats-precision1-celsius,
|
||||||
|
added new CONTROLLER_CARD identity";
|
||||||
|
reference "0.9.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-01-16" {
|
||||||
|
description
|
||||||
|
"Added new per-component common data; add temp alarm";
|
||||||
|
reference "0.8.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-12-14" {
|
||||||
|
description
|
||||||
|
"Added anchor containers for component data, added new
|
||||||
|
component types";
|
||||||
|
reference "0.7.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-08-16" {
|
||||||
|
description
|
||||||
|
"Added power state enumerated type";
|
||||||
|
reference "0.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-12-22" {
|
||||||
|
description
|
||||||
|
"Added temperature state variable to component";
|
||||||
|
reference "0.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:regexp-posix;
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
// grouping statements
|
||||||
|
grouping avg-min-max-instant-stats-precision1-celsius {
|
||||||
|
description
|
||||||
|
"Common grouping for recording temperature values in
|
||||||
|
Celsius with 1 decimal precision. Values include the
|
||||||
|
instantaneous, average, minimum, and maximum statistics";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
units celsius;
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
units celsius;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
sampling period.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
units celsius;
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the sampling
|
||||||
|
period";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
units celsius;
|
||||||
|
description
|
||||||
|
"The maximum value of the statistic over the sampling
|
||||||
|
period";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-types:stat-interval-state;
|
||||||
|
uses oc-types:min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-precision2-volts {
|
||||||
|
description
|
||||||
|
"Common grouping for recording voltage values in
|
||||||
|
volts with 2 decimal precision. Values include the
|
||||||
|
instantaneous, average, minimum, and maximum statistics.
|
||||||
|
If supported by the device, the time interval over which
|
||||||
|
the statistics are computed, and the times at which the
|
||||||
|
minimum and maximum values occurred, are also reported.";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units volts;
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units volts;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
sampling period.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units volts;
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the sampling
|
||||||
|
period";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units volts;
|
||||||
|
description
|
||||||
|
"The maximum value of the statistic over the sampling
|
||||||
|
period";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses oc-types:stat-interval-state;
|
||||||
|
uses oc-types:min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping component-last-poweroff-reason {
|
||||||
|
description
|
||||||
|
"Common grouping for recording the reason of a component's
|
||||||
|
power-off state";
|
||||||
|
|
||||||
|
leaf trigger {
|
||||||
|
type component-last-poweroff-reason-trigger;
|
||||||
|
description
|
||||||
|
"Records the generic triggers for the last poweroff
|
||||||
|
event. Component power-off can be triggered
|
||||||
|
in various ways,
|
||||||
|
- USER_INITIATED
|
||||||
|
- SYSTEM_INITIATED
|
||||||
|
- POWER_FAILURE
|
||||||
|
This field is not updated during reboots; those are
|
||||||
|
tracked in the 'last-reboot-reason' leaf.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf details {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"Provides a detailed reason for component power-off.
|
||||||
|
For system-initiated power-offs, this field can include
|
||||||
|
specific causes (e.g., critical errors resulting in a
|
||||||
|
controller-card bootloop).";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping component-redundant-role-switchover-reason {
|
||||||
|
description
|
||||||
|
"Common grouping for recording the reason of a component's
|
||||||
|
redundant role switchover. For example two supervisors in
|
||||||
|
a device, one as primary the other as secondary, switchover
|
||||||
|
can happen in different scenarios, e.g. user requested,
|
||||||
|
system error, priority contention, etc.";
|
||||||
|
|
||||||
|
leaf trigger {
|
||||||
|
type component-redundant-role-switchover-reason-trigger;
|
||||||
|
description
|
||||||
|
"Records the generic triggers, e.g. user or system
|
||||||
|
initiated the switchover.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf details {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"Records detailed description of why the switchover happens.
|
||||||
|
For example, when system initiated the switchover, this leaf
|
||||||
|
can be used to record the specific reason, e.g. due to critical
|
||||||
|
errors of the routing daemon in the primary role.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// identity statements
|
||||||
|
identity OPENCONFIG_HARDWARE_COMPONENT {
|
||||||
|
description
|
||||||
|
"Base identity for hardware related components in a managed
|
||||||
|
device. Derived identities are partially based on contents
|
||||||
|
of the IANA Entity MIB.";
|
||||||
|
reference
|
||||||
|
"IANA Entity MIB and RFC 6933";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity OPENCONFIG_SOFTWARE_COMPONENT {
|
||||||
|
description
|
||||||
|
"Base identity for software-related components in a managed
|
||||||
|
device";
|
||||||
|
}
|
||||||
|
|
||||||
|
// hardware types
|
||||||
|
identity CHASSIS {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Chassis component, typically with multiple slots / shelves";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity BACKPLANE {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Backplane component for aggregating traffic, typically
|
||||||
|
contained in a chassis component";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FABRIC {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Interconnect between ingress and egress ports on the
|
||||||
|
device (e.g., a crossbar switch).";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity POWER_SUPPLY {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Component that is supplying power to the device";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FAN {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Cooling fan, or could be some other heat-reduction component";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FAN_TRAY {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Contains multiple fans that work in unison to cool the router components.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FAN_TRAY_CONTROLLER {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Controls the fan trays.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity SENSOR {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Physical sensor, e.g., a temperature sensor in a chassis";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FRU {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Replaceable hardware component that does not have a more
|
||||||
|
specific defined schema.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity LINECARD {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Linecard component, typically inserted into a chassis slot";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity CONTROLLER_CARD {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"A type of linecard whose primary role is management or control
|
||||||
|
rather than data forwarding.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity PORT {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Physical port, e.g., for attaching pluggables and networking
|
||||||
|
cables";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity TRANSCEIVER {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Pluggable module present in a port";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity CPU {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Processing unit, e.g., a management processor";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity STORAGE {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"A storage subsystem on the device (disk, SSD, etc.)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity INTEGRATED_CIRCUIT {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"A special purpose processing unit, typically for traffic
|
||||||
|
switching/forwarding (e.g., switching ASIC, NPU, forwarding
|
||||||
|
chip, etc.)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity WIFI_ACCESS_POINT {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"A device that attaches to a an Ethernet network and creates a wireless
|
||||||
|
local area network";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FPGA {
|
||||||
|
base OPENCONFIG_HARDWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Field-Programmable Gate Array (FPGA) is a type of integrated circuit
|
||||||
|
that can be configured after manufacturing. This type should not be
|
||||||
|
used to represent a switching ASIC";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity OPERATING_SYSTEM {
|
||||||
|
base OPENCONFIG_SOFTWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Operating system running on a component";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity OPERATING_SYSTEM_UPDATE {
|
||||||
|
base OPENCONFIG_SOFTWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"An operating system update - which should be a subcomponent
|
||||||
|
of the `OPERATING_SYSTEM` running on a component. An update is
|
||||||
|
defined to be a set of software changes that are atomically
|
||||||
|
installed (and uninstalled) together. Multiple updates may be
|
||||||
|
present for the Operating System. A system should not list all
|
||||||
|
installed software packages using this type -- but rather
|
||||||
|
updates that are bundled together as a single installable
|
||||||
|
item";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity BIOS {
|
||||||
|
base OPENCONFIG_SOFTWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Legacy BIOS or UEFI firmware interface responsible for
|
||||||
|
initializing hardware components and first stage boot loader.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity BOOT_LOADER {
|
||||||
|
base OPENCONFIG_SOFTWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"Software layer responsible for loading and booting the
|
||||||
|
device OS or network OS.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity SOFTWARE_MODULE {
|
||||||
|
base OPENCONFIG_SOFTWARE_COMPONENT;
|
||||||
|
description
|
||||||
|
"A base identity for software modules installed and/or
|
||||||
|
running on the device. Modules include user-space programs
|
||||||
|
and kernel modules that provide specific functionality.
|
||||||
|
A component with type SOFTWARE_MODULE should also have a
|
||||||
|
module type that indicates the specific type of software module";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity COMPONENT_OPER_STATUS {
|
||||||
|
description
|
||||||
|
"Current operational status of a platform component";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ACTIVE {
|
||||||
|
base COMPONENT_OPER_STATUS;
|
||||||
|
description
|
||||||
|
"Component is enabled and active (i.e., up)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity INACTIVE {
|
||||||
|
base COMPONENT_OPER_STATUS;
|
||||||
|
description
|
||||||
|
"Component is enabled but inactive (i.e., down)";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity DISABLED {
|
||||||
|
base COMPONENT_OPER_STATUS;
|
||||||
|
description
|
||||||
|
"Component is administratively disabled.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_MODE_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for FEC operational modes.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_ENABLED {
|
||||||
|
base FEC_MODE_TYPE;
|
||||||
|
description
|
||||||
|
"FEC is administratively enabled.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_DISABLED {
|
||||||
|
base FEC_MODE_TYPE;
|
||||||
|
description
|
||||||
|
"FEC is administratively disabled.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_AUTO {
|
||||||
|
base FEC_MODE_TYPE;
|
||||||
|
description
|
||||||
|
"System will determine whether to enable or disable
|
||||||
|
FEC on a transceiver.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_STATUS_TYPE {
|
||||||
|
description
|
||||||
|
"Base identity for FEC operational statuses.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_STATUS_LOCKED {
|
||||||
|
base FEC_STATUS_TYPE;
|
||||||
|
description
|
||||||
|
"FEC is operationally locked.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity FEC_STATUS_UNLOCKED {
|
||||||
|
base FEC_STATUS_TYPE;
|
||||||
|
description
|
||||||
|
"FEC is operationally unlocked.";
|
||||||
|
}
|
||||||
|
|
||||||
|
// typedef statements
|
||||||
|
typedef component-power-type {
|
||||||
|
type enumeration {
|
||||||
|
enum POWER_ENABLED {
|
||||||
|
description
|
||||||
|
"Enable power on the component";
|
||||||
|
}
|
||||||
|
enum POWER_DISABLED {
|
||||||
|
description
|
||||||
|
"Disable power on the component";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A generic type reflecting whether a hardware component
|
||||||
|
is powered on or off";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity COMPONENT_REBOOT_REASON {
|
||||||
|
description
|
||||||
|
"Base entity for component reboot reasons.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REBOOT_USER_INITIATED {
|
||||||
|
base COMPONENT_REBOOT_REASON;
|
||||||
|
description
|
||||||
|
"User initiated the reboot of the componenent.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REBOOT_POWER_FAILURE {
|
||||||
|
base COMPONENT_REBOOT_REASON;
|
||||||
|
description
|
||||||
|
"The component reboots due to power failure.";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity REBOOT_CRITICAL_ERROR {
|
||||||
|
base COMPONENT_REBOOT_REASON;
|
||||||
|
description
|
||||||
|
"The component reboots due to critical errors.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef component-redundant-role {
|
||||||
|
type enumeration {
|
||||||
|
enum PRIMARY {
|
||||||
|
description
|
||||||
|
"Component is acting the primary role.";
|
||||||
|
}
|
||||||
|
enum SECONDARY {
|
||||||
|
description
|
||||||
|
"Component is acting the secondary role.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A generic type reflecting the component's redundanty role.
|
||||||
|
For example, a device might have dual supervisors components
|
||||||
|
for redundant purpose, with one being the primary and the
|
||||||
|
other secondary.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef component-redundant-role-switchover-reason-trigger {
|
||||||
|
type enumeration {
|
||||||
|
enum USER_INITIATED {
|
||||||
|
description
|
||||||
|
"User initiated the switchover, e.g. via command line.";
|
||||||
|
}
|
||||||
|
enum SYSTEM_INITIATED {
|
||||||
|
description
|
||||||
|
"The system initiated the switchover, e.g. due to
|
||||||
|
critical errors in the component of the primar role.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Records how the role switchover is triggered.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef component-last-poweroff-reason-trigger {
|
||||||
|
type enumeration {
|
||||||
|
enum USER_INITIATED {
|
||||||
|
description
|
||||||
|
"User initiated the power-off, e.g. via command line.";
|
||||||
|
}
|
||||||
|
enum SYSTEM_INITIATED {
|
||||||
|
description
|
||||||
|
"The system initiated the power-off, e.g. due to
|
||||||
|
critical errors in the component of the primary role.";
|
||||||
|
}
|
||||||
|
enum POWER_FAILURE {
|
||||||
|
description
|
||||||
|
"The last power-off was due to power failure.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Records how the last power-off was triggered.";
|
||||||
|
}
|
||||||
|
}
|
||||||
1952
src/modèles/openconfig-transport-types.yang
Normal file
1952
src/modèles/openconfig-transport-types.yang
Normal file
File diff suppressed because it is too large
Load Diff
485
src/modèles/openconfig-types.yang
Normal file
485
src/modèles/openconfig-types.yang
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
module openconfig-types {
|
||||||
|
yang-version "1";
|
||||||
|
|
||||||
|
namespace "http://openconfig.net/yang/openconfig-types";
|
||||||
|
|
||||||
|
prefix "oc-types";
|
||||||
|
|
||||||
|
// import statements
|
||||||
|
import openconfig-extensions { prefix oc-ext; }
|
||||||
|
|
||||||
|
// meta
|
||||||
|
organization
|
||||||
|
"OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
netopenconfig@googlegroups.com";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a set of general type definitions that
|
||||||
|
are used across OpenConfig models. It can be imported by modules
|
||||||
|
that make use of these types.";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.0.0";
|
||||||
|
|
||||||
|
revision "2024-01-31" {
|
||||||
|
description
|
||||||
|
"Add posix-eregexp type and promote model to version 1.0.0.";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2019-04-16" {
|
||||||
|
description
|
||||||
|
"Clarify definition of timeticks64.";
|
||||||
|
reference "0.6.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "0.5.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-05-05" {
|
||||||
|
description
|
||||||
|
"Add grouping of min-max-time and
|
||||||
|
included them to all stats with min/max/avg";
|
||||||
|
reference "0.5.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-01-16" {
|
||||||
|
description
|
||||||
|
"Add interval to min/max/avg stats; add percentage stat";
|
||||||
|
reference "0.4.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-08-16" {
|
||||||
|
description
|
||||||
|
"Apply fix for ieetfloat32 length parameter";
|
||||||
|
reference "0.3.3";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2017-01-13" {
|
||||||
|
description
|
||||||
|
"Add ADDRESS_FAMILY identity";
|
||||||
|
reference "0.3.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-11-14" {
|
||||||
|
description
|
||||||
|
"Correct length of ieeefloat32";
|
||||||
|
reference "0.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-11-11" {
|
||||||
|
description
|
||||||
|
"Additional types - ieeefloat32 and routing-password";
|
||||||
|
reference "0.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2016-05-31" {
|
||||||
|
description
|
||||||
|
"OpenConfig public release";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:regexp-posix;
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
typedef percentage {
|
||||||
|
type uint8 {
|
||||||
|
range "0..100";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Integer indicating a percentage value";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef std-regexp {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"This type definition is a placeholder for a standard
|
||||||
|
definition of a regular expression that can be utilised in
|
||||||
|
OpenConfig models. Further discussion is required to
|
||||||
|
consider the type of regular expressions that are to be
|
||||||
|
supported. An initial proposal is POSIX compatible.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef posix-eregexp {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"This is a string which represents an extended POSIX
|
||||||
|
regular expression.";
|
||||||
|
reference "IEEE Std 1003.1-2017";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef timeticks64 {
|
||||||
|
type uint64;
|
||||||
|
units "nanoseconds";
|
||||||
|
description
|
||||||
|
"The timeticks64 represents the time, modulo 2^64 in
|
||||||
|
nanoseconds between two epochs. The leaf using this
|
||||||
|
type must define the epochs that tests are relative to.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ieeefloat32 {
|
||||||
|
type binary {
|
||||||
|
length "4";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IEEE 32-bit floating point number. The format of this number
|
||||||
|
is of the form:
|
||||||
|
1-bit sign
|
||||||
|
8-bit exponent
|
||||||
|
23-bit fraction
|
||||||
|
The floating point value is calculated using:
|
||||||
|
(-1)**S * 2**(Exponent-127) * (1+Fraction)";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef routing-password {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"This type is indicative of a password that is used within
|
||||||
|
a routing protocol which can be returned in plain text to the
|
||||||
|
NMS by the local system. Such passwords are typically stored
|
||||||
|
as encrypted strings. Since the encryption used is generally
|
||||||
|
well known, it is possible to extract the original value from
|
||||||
|
the string - and hence this format is not considered secure.
|
||||||
|
Leaves specified with this type should not be modified by
|
||||||
|
the system, and should be returned to the end-user in plain
|
||||||
|
text. This type exists to differentiate passwords, which
|
||||||
|
may be sensitive, from other string leaves. It could, for
|
||||||
|
example, be used by the NMS to censor this data when
|
||||||
|
viewed by particular users.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef stat-interval {
|
||||||
|
type uint64;
|
||||||
|
units nanoseconds;
|
||||||
|
description
|
||||||
|
"A time interval over which a set of statistics is computed.
|
||||||
|
A common usage is to report the interval over which
|
||||||
|
avg/min/max stats are computed and reported.";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping stat-interval-state {
|
||||||
|
description
|
||||||
|
"Reusable leaf definition for stats computation interval";
|
||||||
|
|
||||||
|
leaf interval {
|
||||||
|
type oc-types:stat-interval;
|
||||||
|
description
|
||||||
|
"If supported by the system, this reports the time interval
|
||||||
|
over which the min/max/average statistics are computed by
|
||||||
|
the system.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping min-max-time {
|
||||||
|
description
|
||||||
|
"Common grouping for recording the absolute time at which
|
||||||
|
the minimum and maximum values occurred in the statistics";
|
||||||
|
|
||||||
|
leaf min-time {
|
||||||
|
type oc-types:timeticks64;
|
||||||
|
description
|
||||||
|
"The absolute time at which the minimum value occurred.
|
||||||
|
The value is the timestamp in nanoseconds relative to
|
||||||
|
the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max-time {
|
||||||
|
type oc-types:timeticks64;
|
||||||
|
description
|
||||||
|
"The absolute time at which the maximum value occurred.
|
||||||
|
The value is the timestamp in nanoseconds relative to
|
||||||
|
the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-stats-precision1 {
|
||||||
|
description
|
||||||
|
"Common nodes for recording average, minimum, and
|
||||||
|
maximum values for a statistic. These values all have
|
||||||
|
fraction-digits set to 1. Statistics are computed
|
||||||
|
and reported based on a moving time interval (e.g., the last
|
||||||
|
30s). If supported by the device, the time interval over which
|
||||||
|
the statistics are computed is also reported.";
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The maximum value of the statitic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses stat-interval-state;
|
||||||
|
uses min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-precision1 {
|
||||||
|
description
|
||||||
|
"Common grouping for recording an instantaneous statistic value
|
||||||
|
in addition to avg-min-max stats";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 1;
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses avg-min-max-stats-precision1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-precision2-dB {
|
||||||
|
description
|
||||||
|
"Common grouping for recording dB values with 2 decimal
|
||||||
|
precision. Values include the instantaneous, average,
|
||||||
|
minimum, and maximum statistics. Statistics are computed
|
||||||
|
and reported based on a moving time interval (e.g., the last
|
||||||
|
30s). If supported by the device, the time interval over which
|
||||||
|
the statistics are computed, and the times at which the minimum
|
||||||
|
and maximum values occurred, are also reported.";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dB;
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dB;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dB;
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dB;
|
||||||
|
description
|
||||||
|
"The maximum value of the statistic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses stat-interval-state;
|
||||||
|
uses min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-precision2-dBm {
|
||||||
|
description
|
||||||
|
"Common grouping for recording dBm values with 2 decimal
|
||||||
|
precision. Values include the instantaneous, average,
|
||||||
|
minimum, and maximum statistics. Statistics are computed
|
||||||
|
and reported based on a moving time interval (e.g., the last
|
||||||
|
30s). If supported by the device, the time interval over which
|
||||||
|
the statistics are computed, and the times at which the minimum
|
||||||
|
and maximum values occurred, are also reported.";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dBm;
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dBm;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dBm;
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units dBm;
|
||||||
|
description
|
||||||
|
"The maximum value of the statistic over the time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses stat-interval-state;
|
||||||
|
uses min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-precision2-mA {
|
||||||
|
description
|
||||||
|
"Common grouping for recording mA values with 2 decimal
|
||||||
|
precision. Values include the instantaneous, average,
|
||||||
|
minimum, and maximum statistics. Statistics are computed
|
||||||
|
and reported based on a moving time interval (e.g., the last
|
||||||
|
30s). If supported by the device, the time interval over which
|
||||||
|
the statistics are computed, and the times at which the minimum
|
||||||
|
and maximum values occurred, are also reported.";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units mA;
|
||||||
|
description
|
||||||
|
"The instantaneous value of the statistic.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units mA;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the statistic over the
|
||||||
|
time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units mA;
|
||||||
|
description
|
||||||
|
"The minimum value of the statistic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type decimal64 {
|
||||||
|
fraction-digits 2;
|
||||||
|
}
|
||||||
|
units mA;
|
||||||
|
description
|
||||||
|
"The maximum value of the statistic over the time
|
||||||
|
interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses stat-interval-state;
|
||||||
|
uses min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping avg-min-max-instant-stats-pct {
|
||||||
|
description
|
||||||
|
"Common grouping for percentage statistics.
|
||||||
|
Values include the instantaneous, average,
|
||||||
|
minimum, and maximum statistics. Statistics are computed
|
||||||
|
and reported based on a moving time interval (e.g., the last
|
||||||
|
30s). If supported by the device, the time interval over which
|
||||||
|
the statistics are computed, and the times at which the minimum
|
||||||
|
and maximum values occurred, are also reported.";
|
||||||
|
|
||||||
|
leaf instant {
|
||||||
|
type oc-types:percentage;
|
||||||
|
description
|
||||||
|
"The instantaneous percentage value.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf avg {
|
||||||
|
type oc-types:percentage;
|
||||||
|
description
|
||||||
|
"The arithmetic mean value of the percentage measure of the
|
||||||
|
statistic over the time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf min {
|
||||||
|
type oc-types:percentage;
|
||||||
|
description
|
||||||
|
"The minimum value of the percentage measure of the
|
||||||
|
statistic over the time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
leaf max {
|
||||||
|
type oc-types:percentage;
|
||||||
|
description
|
||||||
|
"The maximum value of the percentage measure of the
|
||||||
|
statistic over the time interval.";
|
||||||
|
}
|
||||||
|
|
||||||
|
uses stat-interval-state;
|
||||||
|
uses min-max-time;
|
||||||
|
}
|
||||||
|
|
||||||
|
identity ADDRESS_FAMILY {
|
||||||
|
description
|
||||||
|
"A base identity for all address families";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IPV4 {
|
||||||
|
base ADDRESS_FAMILY;
|
||||||
|
description
|
||||||
|
"The IPv4 address family";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity IPV6 {
|
||||||
|
base ADDRESS_FAMILY;
|
||||||
|
description
|
||||||
|
"The IPv6 address family";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity MPLS {
|
||||||
|
base ADDRESS_FAMILY;
|
||||||
|
description
|
||||||
|
"The MPLS address family";
|
||||||
|
}
|
||||||
|
|
||||||
|
identity L2_ETHERNET {
|
||||||
|
base ADDRESS_FAMILY;
|
||||||
|
description
|
||||||
|
"The 802.3 Ethernet address family";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
250
src/modèles/openconfig-yang-types.yang
Normal file
250
src/modèles/openconfig-yang-types.yang
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
module openconfig-yang-types {
|
||||||
|
|
||||||
|
yang-version "1";
|
||||||
|
namespace "http://openconfig.net/yang/types/yang";
|
||||||
|
prefix "oc-yang";
|
||||||
|
|
||||||
|
import openconfig-extensions { prefix "oc-ext"; }
|
||||||
|
|
||||||
|
organization
|
||||||
|
"OpenConfig working group";
|
||||||
|
|
||||||
|
contact
|
||||||
|
"OpenConfig working group
|
||||||
|
www.openconfig.net";
|
||||||
|
|
||||||
|
description
|
||||||
|
"This module contains a set of extension types to the
|
||||||
|
YANG builtin types that are used across multiple
|
||||||
|
OpenConfig models.
|
||||||
|
|
||||||
|
Portions of this code were derived from IETF RFC 6021.
|
||||||
|
Please reproduce this note if possible.
|
||||||
|
|
||||||
|
IETF code is subject to the following copyright and license:
|
||||||
|
Copyright (c) IETF Trust and the persons identified as authors of
|
||||||
|
the code.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, is permitted pursuant to, and subject to the license
|
||||||
|
terms contained in, the Simplified BSD License set forth in
|
||||||
|
Section 4.c of the IETF Trust's Legal Provisions Relating
|
||||||
|
to IETF Documents (http://trustee.ietf.org/license-info).";
|
||||||
|
|
||||||
|
oc-ext:openconfig-version "1.0.0";
|
||||||
|
|
||||||
|
revision "2024-05-30" {
|
||||||
|
description
|
||||||
|
"Add hex-string-prefixed typedef";
|
||||||
|
reference "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-07-14" {
|
||||||
|
description
|
||||||
|
"Use auto-generated regex for certain pattern statements:
|
||||||
|
- dotted-quad
|
||||||
|
- date-and-time
|
||||||
|
- date
|
||||||
|
|
||||||
|
For date-and-time, allow lowercase z and t in the pattern.";
|
||||||
|
reference "0.3.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2021-03-02" {
|
||||||
|
description
|
||||||
|
"Fix date-and-time and date's pattern statement, and remove the
|
||||||
|
regexp-posix extension, which makes pattern statements conform to the
|
||||||
|
YANG standard.";
|
||||||
|
reference "0.3.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2020-06-30" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig POSIX pattern extensions.";
|
||||||
|
reference "0.2.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision "2018-11-21" {
|
||||||
|
description
|
||||||
|
"Add OpenConfig module metadata extensions.";
|
||||||
|
reference "0.2.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2018-04-24 {
|
||||||
|
description
|
||||||
|
"Add date typedef";
|
||||||
|
reference "0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-07-30 {
|
||||||
|
description
|
||||||
|
"Fixed unprintable character";
|
||||||
|
reference "0.1.2";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-04-03 {
|
||||||
|
description
|
||||||
|
"Update copyright notice.";
|
||||||
|
reference "0.1.1";
|
||||||
|
}
|
||||||
|
|
||||||
|
revision 2017-01-26 {
|
||||||
|
description
|
||||||
|
"Initial module for inet types";
|
||||||
|
reference "0.1.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenConfig specific extensions for module metadata.
|
||||||
|
oc-ext:catalog-organization "openconfig";
|
||||||
|
oc-ext:origin "openconfig";
|
||||||
|
|
||||||
|
typedef dotted-quad {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
|
||||||
|
+ '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An unsigned 32-bit integer expressed as a dotted quad. The
|
||||||
|
format is four octets written as decimal numbers separated
|
||||||
|
with a period character.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef hex-string {
|
||||||
|
status deprecated;
|
||||||
|
type string {
|
||||||
|
pattern '[0-9a-fA-F]*';
|
||||||
|
oc-ext:posix-pattern '^[0-9a-fA-F]*$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A string consisting of a hexadecimal characters. This leaf is
|
||||||
|
deprecated and will removed in a future version of this model.
|
||||||
|
The type hex-string-prefixed should be used instead.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef hex-string-prefixed {
|
||||||
|
type string {
|
||||||
|
pattern '(0x)([0-9a-fA-F]{2})*';
|
||||||
|
oc-ext:posix-pattern '^(0x)([0-9a-fA-F]{2})*$';
|
||||||
|
length "3..max";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A string encoding a hexadecimal number with a prefix of '0x' followed
|
||||||
|
by a list of bytes.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef counter32 {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
|
||||||
|
"A 32-bit counter. A counter value is a monotonically increasing
|
||||||
|
value which is used to express a count of a number of
|
||||||
|
occurrences of a particular event or entity. When the counter
|
||||||
|
reaches its maximum value, in this case 2^32-1, it wraps to 0.
|
||||||
|
|
||||||
|
Discontinuities in the counter are generally triggered only when
|
||||||
|
the counter is reset to zero.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef counter64 {
|
||||||
|
type uint64;
|
||||||
|
description
|
||||||
|
"A 64-bit counter. A counter value is a monotonically increasing
|
||||||
|
value which is used to express a count of a number of
|
||||||
|
occurrences of a particular event or entity. When a counter64
|
||||||
|
reaches its maximum value, 2^64-1, it loops to zero.
|
||||||
|
Discontinuities in a counter are generally triggered only when
|
||||||
|
the counter is reset to zero, through operator or system
|
||||||
|
intervention.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef date-and-time {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|'
|
||||||
|
+ '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|'
|
||||||
|
+ '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|'
|
||||||
|
+ '[1-5][0-9])))';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|'
|
||||||
|
+ '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|'
|
||||||
|
+ '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|'
|
||||||
|
+ '[1-5][0-9]))))$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A date and time, expressed in the format described in RFC3339.
|
||||||
|
That is to say:
|
||||||
|
|
||||||
|
YYYY-MM-DDTHH:MM:SSZ+-hh:mm
|
||||||
|
|
||||||
|
where YYYY is the year, MM is the month expressed as a two-digit
|
||||||
|
month (zero padding if required), DD is the day of the month,
|
||||||
|
expressed as a two digit value. T is the literal character 'T',
|
||||||
|
HH is the hour of the day expressed as a two digit number, using
|
||||||
|
the 24-hour clock, MM is the minute of the hour expressed as a
|
||||||
|
two digit number. Z is the literal character 'Z', followed by a
|
||||||
|
timezone offset expressed in hours (hh) and minutes (mm), both
|
||||||
|
expressed as two digit numbers. The time offset is specified as
|
||||||
|
a positive or negative offset to UTC using the '+' or '-'
|
||||||
|
character preceding the offset.
|
||||||
|
|
||||||
|
Optionally, fractional seconds can be expressed after the minute
|
||||||
|
of the hour as a decimal number of unspecified precision
|
||||||
|
reflecting fractions of a second.";
|
||||||
|
reference
|
||||||
|
"RFC3339 - Date and Time on the Internet: Timestamps";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef date {
|
||||||
|
type string {
|
||||||
|
pattern
|
||||||
|
'[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])';
|
||||||
|
oc-ext:posix-pattern
|
||||||
|
'^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01]))$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A full UTC date, expressed in the format described in RFC3339.
|
||||||
|
That is to say:
|
||||||
|
|
||||||
|
YYYY-MM-DD
|
||||||
|
|
||||||
|
where YYYY is the year, MM is the month expressed as a two-digit
|
||||||
|
month (zero padding if required), DD is the day of the month,
|
||||||
|
expressed as a two digit value.";
|
||||||
|
|
||||||
|
reference
|
||||||
|
"RFC3339 - Date and Time on the Internet: full-date";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef gauge64 {
|
||||||
|
type uint64;
|
||||||
|
description
|
||||||
|
"A gauge value may increase or decrease - and reflects a value
|
||||||
|
at a particular point in time. If the value of the variable
|
||||||
|
being modeled using the gauge exceeds its maximum - 2^64-1 in
|
||||||
|
this case - the gauge is set to its maximum value.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef phys-address {
|
||||||
|
type string {
|
||||||
|
pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
|
||||||
|
oc-ext:posix-pattern '^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A physical layer address, expressed as a series of pairs of
|
||||||
|
hexadecimal digits.";
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef mac-address {
|
||||||
|
type string {
|
||||||
|
pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
|
||||||
|
oc-ext:posix-pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IEEE 802 MAC address";
|
||||||
|
}
|
||||||
|
}
|
||||||
214
src/scripts/export_excel.py
Normal file
214
src/scripts/export_excel.py
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
import json
|
||||||
|
import re
|
||||||
|
import pandas as pd
|
||||||
|
import ipaddress
|
||||||
|
import time
|
||||||
|
from collections import deque
|
||||||
|
from openpyxl import load_workbook
|
||||||
|
from scripts.style_excel.style_address_groups import style_address_groups
|
||||||
|
from scripts.style_excel.style_service_groups import style_service_groups
|
||||||
|
from scripts.style_excel.style_matrice_flux import style_matrice_flux
|
||||||
|
|
||||||
|
def export_to_excel(json_file_path, output_file_excel):
|
||||||
|
"""
|
||||||
|
Export firewall data from JSON to Excel
|
||||||
|
Args:
|
||||||
|
json_file_path: Path to the JSON file to process
|
||||||
|
output_file_excel: Path to the output Excel file
|
||||||
|
"""
|
||||||
|
|
||||||
|
# === Load JSON ===
|
||||||
|
with open(json_file_path, "r", encoding="utf-8") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
acls = data.get("openconfig-acl:acl", {}).get("acl-sets", {}).get("acl-set", [])
|
||||||
|
objects = data.get("custom-firewall-objects:firewall-objects", {})
|
||||||
|
|
||||||
|
addresses = {a["name"]: a["config"] for a in objects.get("address", [])}
|
||||||
|
address_groups = {g["name"]: g["config"] for g in objects.get("address-group", [])}
|
||||||
|
services = {s["name"]: s["config"] for s in objects.get("service", [])}
|
||||||
|
service_groups = {g["name"]: g["config"] for g in objects.get("service-group", [])}
|
||||||
|
|
||||||
|
# === Load site mapping ===
|
||||||
|
with open("src/data/site.json", "r", encoding="utf-8") as f:
|
||||||
|
site_mapping = json.load(f)
|
||||||
|
|
||||||
|
# === Build flow matrix helpers ===
|
||||||
|
def get_tier_from_tags(tags):
|
||||||
|
s = ""
|
||||||
|
for t in ["T0","T1A","T1B","T2A","T2B"]:
|
||||||
|
if any(t in str(tag) for tag in tags): s += t + ","
|
||||||
|
return s[:-1] if s else ""
|
||||||
|
|
||||||
|
# === Extract tags without tier info ===
|
||||||
|
def get_tags_without_tier(text):
|
||||||
|
if not text: return ""
|
||||||
|
tags = re.findall(r"Misc\s*:\s*(.*)", text)
|
||||||
|
if not tags: return ""
|
||||||
|
tag_list = [tag.strip() for tag in tags[0].split(",")]
|
||||||
|
filtered_tags = [tag for tag in tag_list if tag not in ["T0","T1A","T1B","T2A","T2B"]]
|
||||||
|
return ", ".join(filtered_tags)
|
||||||
|
|
||||||
|
# === Resolve equipment to members ===
|
||||||
|
def resolve_equipment(name):
|
||||||
|
if str(name).lower() == "any": return ["any"]
|
||||||
|
if name in address_groups: return address_groups[name].get("members", [])
|
||||||
|
return [name]
|
||||||
|
|
||||||
|
# === Resolve equipment to IP/mask ===
|
||||||
|
def resolve_ip_masks(equipment_list):
|
||||||
|
if not equipment_list:
|
||||||
|
return ""
|
||||||
|
clean = str(equipment_list).replace("[","").replace("]","").replace("'","").replace('"',"")
|
||||||
|
eq_list = [eq.strip() for eq in clean.split(",") if eq.strip()]
|
||||||
|
cidrs = []
|
||||||
|
for eq in eq_list:
|
||||||
|
if eq in addresses:
|
||||||
|
ip = addresses[eq].get("ip_netmask","")
|
||||||
|
if ip:
|
||||||
|
cidrs.append(ip if "/" in ip else ip+"/32")
|
||||||
|
return ", ".join(cidrs)
|
||||||
|
|
||||||
|
# === Recursive address resolver ===
|
||||||
|
def resolve_all_addresses(equipment_list):
|
||||||
|
resolved = set()
|
||||||
|
eq_list = []
|
||||||
|
for item in equipment_list:
|
||||||
|
if isinstance(item, str):
|
||||||
|
if ',' in item:
|
||||||
|
eq_list.extend([eq.strip() for eq in item.split(',') if eq.strip()])
|
||||||
|
else:
|
||||||
|
eq_list.append(item.strip())
|
||||||
|
else:
|
||||||
|
eq_list.append(item)
|
||||||
|
|
||||||
|
to_process = deque(eq_list)
|
||||||
|
processed = set()
|
||||||
|
|
||||||
|
while to_process:
|
||||||
|
eq = to_process.popleft()
|
||||||
|
if eq in processed: continue
|
||||||
|
processed.add(eq)
|
||||||
|
|
||||||
|
if eq in addresses:
|
||||||
|
resolved.add(eq)
|
||||||
|
elif eq in address_groups:
|
||||||
|
members = address_groups[eq].get("members", [])
|
||||||
|
new_members = [m for m in members if m not in processed]
|
||||||
|
to_process.extend(new_members)
|
||||||
|
|
||||||
|
return list(resolved)
|
||||||
|
|
||||||
|
# === Map addresses to sites ===
|
||||||
|
def get_sites_for_addresses(address_list):
|
||||||
|
sites = set()
|
||||||
|
for addr in address_list:
|
||||||
|
ipmask = addresses.get(addr, {}).get("ip_netmask", "")
|
||||||
|
if not ipmask:
|
||||||
|
continue
|
||||||
|
ipmask = ipmask if "/" in ipmask else ipmask + "/32"
|
||||||
|
|
||||||
|
# cas particulier d'une plage d'IP format "CIDR1-CIDR2"
|
||||||
|
if "-" in ipmask:
|
||||||
|
start_ip, end_ip = ipmask.split("-")
|
||||||
|
end_ip = end_ip.split("/")[0]
|
||||||
|
for ip in range(int(ipaddress.ip_address(start_ip)), int(ipaddress.ip_address(end_ip)) + 1):
|
||||||
|
ip_obj = ipaddress.ip_network(f"{ipaddress.ip_address(ip)}/32", strict=False)
|
||||||
|
for cidr, site in site_mapping.items():
|
||||||
|
site_cidr = ipaddress.ip_network(cidr, strict=False)
|
||||||
|
if ip_obj.network_address in site_cidr or ip_obj.subnet_of(site_cidr):
|
||||||
|
sites.add(site)
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
ip_obj = ipaddress.ip_network(ipmask, strict=False)
|
||||||
|
|
||||||
|
for cidr, site in site_mapping.items():
|
||||||
|
site_cidr = ipaddress.ip_network(cidr, strict=False)
|
||||||
|
if ip_obj.network_address in site_cidr or ip_obj.subnet_of(site_cidr):
|
||||||
|
sites.add(site)
|
||||||
|
break
|
||||||
|
return ", ".join(sorted(sites))
|
||||||
|
|
||||||
|
rows=[]
|
||||||
|
for acl in acls:
|
||||||
|
acl_name = acl.get("name","")
|
||||||
|
acl_desc = acl.get("config",{}).get("description","")
|
||||||
|
enabled = acl.get("state",{}).get("description","")
|
||||||
|
for entry in acl.get("acl-entries",{}).get("acl-entry",[]):
|
||||||
|
cfg = entry.get("config",{})
|
||||||
|
ipv4 = entry.get("ipv4",{}).get("config",{})
|
||||||
|
transport = entry.get("transport",{}).get("config",{})
|
||||||
|
actions = entry.get("actions",{}).get("config",{})
|
||||||
|
state = entry.get("state",{})
|
||||||
|
|
||||||
|
src_name = ipv4.get("source-address","any")
|
||||||
|
src_e = resolve_equipment(src_name)
|
||||||
|
src_c = resolve_ip_masks(src_e)
|
||||||
|
dst_name = ipv4.get("destination-address","any")
|
||||||
|
dst_e = resolve_equipment(dst_name)
|
||||||
|
dst_c = resolve_ip_masks(dst_e)
|
||||||
|
|
||||||
|
src_sites = get_sites_for_addresses(resolve_all_addresses(src_e))
|
||||||
|
dst_sites = get_sites_for_addresses(resolve_all_addresses(dst_e))
|
||||||
|
|
||||||
|
rows.append({
|
||||||
|
"Nom du flux": acl_name,
|
||||||
|
"Description": acl_desc,
|
||||||
|
"Src Equipement": ", ".join(src_e),
|
||||||
|
"Src CIDR": src_c,
|
||||||
|
"Src VLAN":"",
|
||||||
|
"Src Site": src_sites,
|
||||||
|
"Dst Equipement": ", ".join(dst_e),
|
||||||
|
"Dst CIDR": dst_c,
|
||||||
|
"Dst VLAN":"",
|
||||||
|
"Dst Site": dst_sites,
|
||||||
|
"Application": cfg.get("description",""),
|
||||||
|
"Port": transport.get("destination-port",""),
|
||||||
|
"Miscellaneous": get_tags_without_tier(state.get("description","")),
|
||||||
|
"Action": actions.get("forwarding-action","").replace("openconfig-acl:",""),
|
||||||
|
"Tier": get_tier_from_tags([state.get("description","")]),
|
||||||
|
"Active": "Oui" if enabled is True else "Non"
|
||||||
|
})
|
||||||
|
|
||||||
|
df = pd.DataFrame(rows)
|
||||||
|
df_addr = pd.DataFrame([
|
||||||
|
{
|
||||||
|
"Group Name": g,
|
||||||
|
"Member": m,
|
||||||
|
"IP": addresses[m]["ip_netmask"] if m in addresses and "/" in addresses[m].get("ip_netmask","") else
|
||||||
|
(addresses[m]["ip_netmask"]+"/32" if m in addresses else "")
|
||||||
|
}
|
||||||
|
for g, cfg in address_groups.items()
|
||||||
|
for m in cfg.get("members", [])
|
||||||
|
])
|
||||||
|
df_srv = pd.DataFrame([
|
||||||
|
{
|
||||||
|
"Group Name": g,
|
||||||
|
"Member": m,
|
||||||
|
"Protocol": services[m]["protocol"] if m in services and "protocol" in services[m] else "",
|
||||||
|
"Port": services[m]["port"] if m in services and "port" in services[m] else ""
|
||||||
|
}
|
||||||
|
for g, cfg in service_groups.items()
|
||||||
|
for m in cfg.get("members", [])
|
||||||
|
])
|
||||||
|
|
||||||
|
# === Export Excel ===
|
||||||
|
firewall_type = data.get("firewall-device", {}).get("type", "firewall").replace(" ","_").lower()
|
||||||
|
date = time.strftime("%Y%m%d")
|
||||||
|
|
||||||
|
with pd.ExcelWriter(output_file_excel, engine="openpyxl") as writer:
|
||||||
|
df_addr.to_excel(writer,sheet_name="Address-Groups",index=False)
|
||||||
|
df_srv.to_excel(writer,sheet_name="Service-Groups",index=False)
|
||||||
|
df.to_excel(writer,sheet_name="Matrice Flux",index=False,startrow=1)
|
||||||
|
|
||||||
|
wb = load_workbook(output_file_excel)
|
||||||
|
if "Sheet1" in wb.sheetnames:
|
||||||
|
del wb["Sheet1"]
|
||||||
|
|
||||||
|
style_address_groups(wb["Address-Groups"], address_groups)
|
||||||
|
style_service_groups(wb["Service-Groups"], service_groups)
|
||||||
|
style_matrice_flux(wb["Matrice Flux"])
|
||||||
|
|
||||||
|
wb.save(output_file_excel)
|
||||||
|
print(f"✓ Export Excel OK: {output_file_excel}")
|
||||||
|
return output_file_excel
|
||||||
296
src/scripts/export_modele.py
Normal file
296
src/scripts/export_modele.py
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Modèle de base pour les parsers de configurations de firewalls vers un format json normalisé OpenConfig YANG
|
||||||
|
Fournit des méthodes communes pour la conversion et l'exportation des données
|
||||||
|
"""
|
||||||
|
from typing import Dict, Any
|
||||||
|
|
||||||
|
class ParserMixin:
|
||||||
|
def to_openconfig_yang(self, type) -> Dict[str, Any]:
|
||||||
|
"""Convertit la configuration au format OpenConfig YANG avec les nouveaux modèles"""
|
||||||
|
openconfig = {
|
||||||
|
"firewall-device": {
|
||||||
|
"type": type
|
||||||
|
},
|
||||||
|
"openconfig-interfaces:interfaces": {
|
||||||
|
"interface": []
|
||||||
|
},
|
||||||
|
"openconfig-network-instance:network-instances": {
|
||||||
|
"network-instance": []
|
||||||
|
},
|
||||||
|
"openconfig-acl:acl": {
|
||||||
|
"acl-sets": {
|
||||||
|
"acl-set": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"custom-firewall-objects:firewall-objects": {
|
||||||
|
"address": [],
|
||||||
|
"address-group": [],
|
||||||
|
"service": [],
|
||||||
|
"service-group": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Conversion des interfaces
|
||||||
|
for interface in self.config['interfaces']:
|
||||||
|
intf_config = {
|
||||||
|
"name": interface.name,
|
||||||
|
"config": {
|
||||||
|
"name": interface.name,
|
||||||
|
"type": "iana-if-type:ethernetCsmacd" if interface.interface_type == "ethernet" else "iana-if-type:ieee8023adLag",
|
||||||
|
"enabled": interface.enabled,
|
||||||
|
"description": interface.comment or ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if interface.ip:
|
||||||
|
intf_config["subinterfaces"] = {
|
||||||
|
"subinterface": [
|
||||||
|
{
|
||||||
|
"index": interface.misc or 0,
|
||||||
|
"config": {
|
||||||
|
"index": interface.misc or 0,
|
||||||
|
"enabled": interface.enabled
|
||||||
|
},
|
||||||
|
"oc-ip:ipv4": {
|
||||||
|
"oc-ip:addresses": {
|
||||||
|
"oc-ip:address": [
|
||||||
|
{
|
||||||
|
"oc-ip:ip": interface.ip,
|
||||||
|
"oc-ip:config": {
|
||||||
|
"oc-ip:ip": interface.ip,
|
||||||
|
"oc-ip:prefix-length": interface.netmask if interface.netmask else 24
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
openconfig["openconfig-interfaces:interfaces"]["interface"].append(intf_config)
|
||||||
|
|
||||||
|
# Conversion des virtual-routers et routes statiques
|
||||||
|
for vr in self.config.get('virtual_routers', []):
|
||||||
|
vr_entry = {
|
||||||
|
"name": vr.name,
|
||||||
|
"config": {
|
||||||
|
"name": vr.name,
|
||||||
|
"type": "L3VRF"
|
||||||
|
},
|
||||||
|
"interfaces": {
|
||||||
|
"interface": [{"id": iface} for iface in vr.interfaces]
|
||||||
|
},
|
||||||
|
"protocols": {
|
||||||
|
"protocol": [
|
||||||
|
{
|
||||||
|
"identifier": "STATIC",
|
||||||
|
"name": "STATIC",
|
||||||
|
"static-routes": {
|
||||||
|
"static": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static_list = vr_entry["protocols"]["protocol"][0]["static-routes"]["static"]
|
||||||
|
|
||||||
|
for route in vr.static_routes:
|
||||||
|
prefix = route.destination
|
||||||
|
next_hops = []
|
||||||
|
|
||||||
|
nh_config = {
|
||||||
|
"index": route.name,
|
||||||
|
"config": {
|
||||||
|
"index": route.name,
|
||||||
|
"next-hop": route.next_vr if route.next_vr else route.next_hop_ip,
|
||||||
|
"metric": route.metric if getattr(route, "metric", None) is not None else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if route.next_vr:
|
||||||
|
nh_config["config"]["oc-loc-rt-netinst:next-network-instance"] = route.next_vr
|
||||||
|
nh_config["config"]["oc-loc-rt-netinst:nh-network-instance"] = None
|
||||||
|
elif route.next_hop_ip:
|
||||||
|
nh_config["config"]["oc-loc-rt-netinst:next-network-instance"] = None
|
||||||
|
nh_config["config"]["oc-loc-rt-netinst:nh-network-instance"] = vr.name
|
||||||
|
|
||||||
|
if route.interface:
|
||||||
|
nh_config["interface-ref"] = {
|
||||||
|
"config": {
|
||||||
|
"interface": route.interface,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next_hops.append(nh_config)
|
||||||
|
|
||||||
|
static_entry = {
|
||||||
|
"prefix": prefix,
|
||||||
|
"next-hops": {
|
||||||
|
"next-hop": next_hops
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static_list.append(static_entry)
|
||||||
|
|
||||||
|
openconfig["openconfig-network-instance:network-instances"]["network-instance"].append(vr_entry)
|
||||||
|
|
||||||
|
|
||||||
|
# Conversion des règles de sécurité en ACL
|
||||||
|
for rule in self.config['security_rules']:
|
||||||
|
acl_entry = {
|
||||||
|
"name": rule.name,
|
||||||
|
"type": "openconfig-acl:ACL_IPV4",
|
||||||
|
"config": {
|
||||||
|
"name": rule.name,
|
||||||
|
"type": "openconfig-acl:ACL_IPV4",
|
||||||
|
"description": getattr(rule, 'description', "")
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"description": getattr(rule, 'enabled', "")
|
||||||
|
},
|
||||||
|
"acl-entries": {
|
||||||
|
"acl-entry": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if getattr(rule, "action", "").lower() == "nat":
|
||||||
|
action_base = "openconfig-acl:NAT"
|
||||||
|
else:
|
||||||
|
action_base = (
|
||||||
|
"openconfig-acl:ACCEPT" if getattr(rule, "action", "").lower() == "allow"
|
||||||
|
else "openconfig-acl:DROP"
|
||||||
|
)
|
||||||
|
|
||||||
|
if hasattr(rule, "enabled") and not rule.enabled:
|
||||||
|
action_value = f"{action_base}_DISABLED"
|
||||||
|
else:
|
||||||
|
action_value = action_base
|
||||||
|
|
||||||
|
miscs_text = (
|
||||||
|
f"Misc: {', '.join(rule.miscs)}"
|
||||||
|
if hasattr(rule, "miscs") and rule.miscs
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
|
||||||
|
ports = []
|
||||||
|
for s in getattr(rule, "services", []):
|
||||||
|
if s.lower().startswith("port"):
|
||||||
|
ports.append(s[4:])
|
||||||
|
else:
|
||||||
|
ports.append(s)
|
||||||
|
|
||||||
|
desc_parts = []
|
||||||
|
if getattr(rule, "action", "").lower() == "nat":
|
||||||
|
if getattr(rule, "to_interface", ""):
|
||||||
|
desc_parts.append(rule.to_interface)
|
||||||
|
if getattr(rule, "translated_address", ""):
|
||||||
|
desc_parts.append(rule.translated_address)
|
||||||
|
if getattr(rule, "translated_port", ""):
|
||||||
|
desc_parts.append(rule.translated_port)
|
||||||
|
|
||||||
|
entry = {
|
||||||
|
"sequence-id": getattr(rule, "sequence_id", 1),
|
||||||
|
"config": {
|
||||||
|
"sequence-id": getattr(rule, "sequence_id", 1),
|
||||||
|
"description": desc_parts if desc_parts else getattr(rule, "applications", "")
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"sequence-id": getattr(rule, "sequence_id", 1),
|
||||||
|
"description": miscs_text
|
||||||
|
},
|
||||||
|
"ipv4": {
|
||||||
|
"config": {
|
||||||
|
"source-address": ",".join(rule.source_addresses) if hasattr(rule, "source_addresses") else "any",
|
||||||
|
"destination-address": ",".join(rule.destination_addresses) if hasattr(rule, "destination_addresses") else "any",
|
||||||
|
# "source-address-prefix-set": ",".join(rule.from_zones) if hasattr(rule, "from_zones") else "",
|
||||||
|
# "destination-address-prefix-set": ",".join(rule.to_zones) if hasattr(rule, "to_zones") else ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transport": {
|
||||||
|
"config": {
|
||||||
|
"source-port": "any",
|
||||||
|
"destination-port": ",".join(ports) if ports else "any",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"config": {
|
||||||
|
"forwarding-action": action_value,
|
||||||
|
"log-action": getattr(rule, "log_setting", "default")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
acl_entry["acl-entries"]["acl-entry"].append(entry)
|
||||||
|
openconfig["openconfig-acl:acl"]["acl-sets"]["acl-set"].append(acl_entry)
|
||||||
|
|
||||||
|
# Conversion des objets firewall personnalisés
|
||||||
|
|
||||||
|
# Address objects
|
||||||
|
for addr_obj in self.config['address_objects']:
|
||||||
|
address_config = {
|
||||||
|
"name": addr_obj.name,
|
||||||
|
"config": {
|
||||||
|
"name": addr_obj.name,
|
||||||
|
"ip_netmask": addr_obj.ip_netmask,
|
||||||
|
"description": addr_obj.description,
|
||||||
|
"misc": addr_obj.misc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openconfig["custom-firewall-objects:firewall-objects"]["address"].append(address_config)
|
||||||
|
|
||||||
|
# Address groups
|
||||||
|
for addr_group in self.config['address_groups']:
|
||||||
|
address_group_config = {
|
||||||
|
"name": addr_group.name,
|
||||||
|
"config": {
|
||||||
|
"name": addr_group.name,
|
||||||
|
"members": addr_group.members,
|
||||||
|
"description": addr_group.description,
|
||||||
|
"misc": addr_group.misc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openconfig["custom-firewall-objects:firewall-objects"]["address-group"].append(address_group_config)
|
||||||
|
|
||||||
|
# Service objects
|
||||||
|
for svc_obj in self.config['service_objects']:
|
||||||
|
service_config = {
|
||||||
|
"name": svc_obj.name,
|
||||||
|
"config": {
|
||||||
|
"name": svc_obj.name,
|
||||||
|
"protocol": svc_obj.protocol,
|
||||||
|
"port": svc_obj.port,
|
||||||
|
"source_port": svc_obj.source_port,
|
||||||
|
"description": svc_obj.description,
|
||||||
|
"misc": svc_obj.misc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openconfig["custom-firewall-objects:firewall-objects"]["service"].append(service_config)
|
||||||
|
|
||||||
|
# Service groups
|
||||||
|
for svc_group in self.config['service_groups']:
|
||||||
|
service_group_config = {
|
||||||
|
"name": svc_group.name,
|
||||||
|
"config": {
|
||||||
|
"name": svc_group.name,
|
||||||
|
"members": svc_group.members,
|
||||||
|
"description": svc_group.description,
|
||||||
|
"misc": svc_group.misc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openconfig["custom-firewall-objects:firewall-objects"]["service-group"].append(service_group_config)
|
||||||
|
|
||||||
|
return openconfig
|
||||||
|
|
||||||
|
def print_summary(self):
|
||||||
|
"""Affiche un résumé de la configuration parsée"""
|
||||||
|
print("\n" + "="*50)
|
||||||
|
print("RÉSUMÉ DE LA CONFIGURATION")
|
||||||
|
print("="*50)
|
||||||
|
print(f"Objets adresse: {len(self.config['address_objects'])}")
|
||||||
|
print(f"Groupes d'adresses: {len(self.config['address_groups'])}")
|
||||||
|
print(f"Objets service: {len(self.config['service_objects'])}")
|
||||||
|
print(f"Groupes de services: {len(self.config['service_groups'])}")
|
||||||
|
print(f"Interfaces: {len(self.config['interfaces'])}")
|
||||||
|
print(f"Règles de sécurité: {len(self.config['security_rules'])}")
|
||||||
215
src/scripts/json_Forcepoint.py
Normal file
215
src/scripts/json_Forcepoint.py
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Parser pour configuration Forcepoint XML vers un format json normalisé OpenConfig YANG
|
||||||
|
Extrait les groupes d'objets, objets, groupes de services, services, routes, interfaces et règles
|
||||||
|
"""
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
import json
|
||||||
|
from scripts.export_modele import ParserMixin
|
||||||
|
from scripts.objets.data import AddressObject, AddressGroup, ServiceObject, ServiceGroup, Interface, SecurityRule, StaticRoute, VirtualRouter
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class ForcepointParser(ParserMixin):
|
||||||
|
"""Parser pour fichier XML Forcepoint"""
|
||||||
|
|
||||||
|
def __init__(self, xml_file_path: str):
|
||||||
|
"""Initialise le parser avec le chemin du fichier XML"""
|
||||||
|
self.xml_file = xml_file_path
|
||||||
|
self.tree = None
|
||||||
|
self.root = None
|
||||||
|
self.config = {
|
||||||
|
'address_objects': [],
|
||||||
|
'address_groups': [],
|
||||||
|
'service_objects': [],
|
||||||
|
'service_groups': [],
|
||||||
|
'interfaces': [],
|
||||||
|
'virtual_routers': [],
|
||||||
|
'static_routes': [],
|
||||||
|
'security_rules': []
|
||||||
|
}
|
||||||
|
|
||||||
|
def load_xml(self):
|
||||||
|
"""Charge le fichier XML"""
|
||||||
|
try:
|
||||||
|
self.tree = ET.parse(self.xml_file)
|
||||||
|
self.root = self.tree.getroot()
|
||||||
|
print(f"✓ Fichier XML chargé: {self.xml_file}")
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"✗ Erreur de parsing XML: {e}")
|
||||||
|
raise
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"✗ Fichier non trouvé: {self.xml_file}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_address_objects(self):
|
||||||
|
"""Parse hosts, networks, address ranges et ip_lists"""
|
||||||
|
for obj in self.root.findall(".//host"):
|
||||||
|
name = obj.get("name")
|
||||||
|
ip = obj.find("mvia_address")
|
||||||
|
ip_addr = ip.get("address") if ip is not None else None
|
||||||
|
desc = obj.get("comment") or None
|
||||||
|
self.config['address_objects'].append(AddressObject(name=name, ip_netmask=ip_addr, description=desc))
|
||||||
|
|
||||||
|
for obj in self.root.findall(".//network"):
|
||||||
|
name = obj.get("name")
|
||||||
|
ip_netmask = obj.get("ipv4_network")
|
||||||
|
comment = obj.get("comment")
|
||||||
|
self.config['address_objects'].append(AddressObject(name=name, ip_netmask=ip_netmask, description=comment))
|
||||||
|
|
||||||
|
for obj in self.root.findall(".//address_range"):
|
||||||
|
name = obj.get("name")
|
||||||
|
ip_range = obj.get("ip_range")
|
||||||
|
comment = obj.get("comment")
|
||||||
|
self.config['address_objects'].append(AddressObject(name=name, ip_netmask=ip_range, description=comment))
|
||||||
|
|
||||||
|
for obj in self.root.findall(".//ip_list"):
|
||||||
|
name = obj.get("name")
|
||||||
|
ips = [ip.get("value") for ip in obj.findall(".//ip")]
|
||||||
|
for ip in ips:
|
||||||
|
self.config['address_objects'].append(AddressObject(name=f"{name}_{ip}", ip_netmask=ip))
|
||||||
|
|
||||||
|
def _parse_address_groups(self):
|
||||||
|
"""Parse les groupes d'adresses"""
|
||||||
|
for group in self.root.findall(".//group"):
|
||||||
|
name = group.get("name")
|
||||||
|
desc = group.get("comment") or None
|
||||||
|
members = [m.get("ref") for m in group.findall(".//ne_list")]
|
||||||
|
self.config['address_groups'].append(AddressGroup(name=name, members=members, description=desc))
|
||||||
|
|
||||||
|
def _parse_service_objects(self):
|
||||||
|
"""Parse services TCP/UDP"""
|
||||||
|
for svc in self.root.findall(".//service_tcp"):
|
||||||
|
name = svc.get("name")
|
||||||
|
port = svc.get("min_dst_port")
|
||||||
|
proto = "tcp"
|
||||||
|
self.config['service_objects'].append(ServiceObject(name=name, protocol=proto, port=port))
|
||||||
|
|
||||||
|
for svc in self.root.findall(".//service_udp"):
|
||||||
|
name = svc.get("name")
|
||||||
|
port = svc.get("min_dst_port")
|
||||||
|
proto = "udp"
|
||||||
|
self.config['service_objects'].append(ServiceObject(name=name, protocol=proto, port=port))
|
||||||
|
|
||||||
|
def _parse_interfaces(self):
|
||||||
|
"""Parse interfaces de cluster"""
|
||||||
|
for iface in self.root.findall(".//cluster_virtual_interface"):
|
||||||
|
name = iface.get("name")
|
||||||
|
iptmp = iface.find("mvia_address")
|
||||||
|
ip_addr = iptmp.get("address") if iptmp is not None else None
|
||||||
|
net = iface.get("network_value")
|
||||||
|
netmask = net.split("/")[-1] if net else None
|
||||||
|
comment = iface.get("comment")
|
||||||
|
self.config['interfaces'].append(Interface(name=name, ip=ip_addr, netmask=netmask, comment=comment))
|
||||||
|
|
||||||
|
def _parse_virtual_routers(self):
|
||||||
|
"""Parse routeurs simples"""
|
||||||
|
for router in self.root.findall(".//router"):
|
||||||
|
name = router.get("name")
|
||||||
|
ip = router.find("mvia_address")
|
||||||
|
ip_addr = ip.get("address") if ip is not None else None
|
||||||
|
self.config['virtual_routers'].append(VirtualRouter(name=name, interfaces=[ip_addr] if ip_addr else [], static_routes=[]))
|
||||||
|
|
||||||
|
def _parse_security_rules(self):
|
||||||
|
"""Parse règles FW Forcepoint"""
|
||||||
|
for rule_entry in self.root.findall(".//fw_policy//rule_entry"):
|
||||||
|
rule_type = rule_entry.find("./access_rule") or rule_entry.find("./nat_rule")
|
||||||
|
if rule_type is None:
|
||||||
|
continue
|
||||||
|
name = rule_entry.get("tag")
|
||||||
|
action = rule_type.find("./action")
|
||||||
|
action_type = action.get("type") if action is not None else "undefined"
|
||||||
|
|
||||||
|
sources = [s.get("value") for s in rule_type.findall(".//match_sources//match_source_ref")]
|
||||||
|
destinations = [d.get("value") for d in rule_type.findall(".//match_destinations//match_destination_ref")]
|
||||||
|
services = [s.get("value") for s in rule_type.findall(".//match_services//match_service_ref")]
|
||||||
|
enabled_attr = rule_entry.get("is_disabled")
|
||||||
|
enabled = False if enabled_attr == "true" else True
|
||||||
|
desc = rule_entry.get("comment") or None
|
||||||
|
|
||||||
|
self.config['security_rules'].append(
|
||||||
|
SecurityRule(
|
||||||
|
name=f"Rule_{name}",
|
||||||
|
source_addresses=sources,
|
||||||
|
destination_addresses=destinations,
|
||||||
|
services=services,
|
||||||
|
action=action_type,
|
||||||
|
from_zones=[],
|
||||||
|
to_zones=[],
|
||||||
|
applications=[],
|
||||||
|
description=desc,
|
||||||
|
enabled=enabled
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def parse_all(self):
|
||||||
|
"""Parse tous les éléments de configuration"""
|
||||||
|
print("Début du parsing de la configuration Forcepoint...")
|
||||||
|
self.load_xml()
|
||||||
|
|
||||||
|
self._parse_address_objects()
|
||||||
|
self._parse_address_groups()
|
||||||
|
self._parse_service_objects()
|
||||||
|
self._parse_interfaces()
|
||||||
|
self._parse_virtual_routers()
|
||||||
|
self._parse_security_rules()
|
||||||
|
|
||||||
|
print("✓ Parsing terminé avec succès!")
|
||||||
|
|
||||||
|
def export_to_json(self, output_file: str):
|
||||||
|
"""Exporte la configuration au format JSON OpenConfig"""
|
||||||
|
openconfig_data = self.to_openconfig_yang("forcepoint")
|
||||||
|
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(openconfig_data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"✓ Configuration exportée vers: {output_file}")
|
||||||
|
|
||||||
|
def generate_json_forcepoint(input_file: str, output_file: str):
|
||||||
|
"""Génère le fichier JSON OpenConfig à partir du fichier XML Forcepoint"""
|
||||||
|
xml_file = Path(input_file)
|
||||||
|
if not xml_file.exists():
|
||||||
|
print(f"✗ Erreur: Le fichier '{xml_file}' n'existe pas")
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
parser = ForcepointParser(str(xml_file))
|
||||||
|
parser.parse_all()
|
||||||
|
parser.print_summary()
|
||||||
|
|
||||||
|
output_file = output_file
|
||||||
|
parser.export_to_json(output_file)
|
||||||
|
print(f"\n✓ Conversion terminée! Vérifiez le fichier: {output_file}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Erreur: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Usage: python json_Forcepoint.py <fichier_config.xml>")
|
||||||
|
print("Exemple: python json_Forcepoint.py config_Forcepoint.xml")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
xml_file = sys.argv[1]
|
||||||
|
|
||||||
|
if not Path(xml_file).exists():
|
||||||
|
print(f"✗ Erreur: Le fichier '{xml_file}' n'existe pas")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
parser = ForcepointParser(xml_file)
|
||||||
|
parser.parse_all()
|
||||||
|
parser.print_summary()
|
||||||
|
|
||||||
|
input_path = Path(xml_file)
|
||||||
|
output_file = 'output_Forcepoint.json'
|
||||||
|
parser.export_to_json(output_file)
|
||||||
|
|
||||||
|
print(f"\n✓ Conversion terminée! Vérifiez le fichier: {output_file}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Erreur: {e}")
|
||||||
|
sys.exit(1)
|
||||||
508
src/scripts/json_PaloAlto.py
Normal file
508
src/scripts/json_PaloAlto.py
Normal file
@@ -0,0 +1,508 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Parser pour configuration Palo Alto XML vers un format json normalisé OpenConfig YANG
|
||||||
|
Extrait les groupes d'objets, objets, groupes de services, services, routes, interfaces et règles
|
||||||
|
"""
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
import json
|
||||||
|
from scripts.export_modele import ParserMixin
|
||||||
|
from scripts.objets.data import AddressObject, AddressGroup, ServiceObject, ServiceGroup, Interface, SecurityRule, StaticRoute, VirtualRouter
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class PaloAltoParser(ParserMixin):
|
||||||
|
"""Parser pour fichier XML Palo Alto"""
|
||||||
|
|
||||||
|
def __init__(self, xml_file_path: str):
|
||||||
|
"""Initialise le parser avec le chemin du fichier XML"""
|
||||||
|
self.xml_file = xml_file_path
|
||||||
|
self.tree = None
|
||||||
|
self.root = None
|
||||||
|
self.config = {
|
||||||
|
'address_objects': [],
|
||||||
|
'address_groups': [],
|
||||||
|
'service_objects': [],
|
||||||
|
'service_groups': [],
|
||||||
|
'interfaces': [],
|
||||||
|
'virtual_routers': [],
|
||||||
|
'static_routes': [],
|
||||||
|
'security_rules': []
|
||||||
|
}
|
||||||
|
|
||||||
|
def load_xml(self):
|
||||||
|
"""Charge le fichier XML"""
|
||||||
|
try:
|
||||||
|
self.tree = ET.parse(self.xml_file)
|
||||||
|
self.root = self.tree.getroot()
|
||||||
|
print(f"✓ Fichier XML chargé: {self.xml_file}")
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"✗ Erreur de parsing XML: {e}")
|
||||||
|
raise
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"✗ Fichier non trouvé: {self.xml_file}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_address_objects(self):
|
||||||
|
"""Parse les objets adresse"""
|
||||||
|
address_objects = []
|
||||||
|
|
||||||
|
paths = [
|
||||||
|
".//shared/address/entry",
|
||||||
|
".//devices/entry/vsys/entry/address/entry"
|
||||||
|
]
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
|
for addr in self.root.findall(path):
|
||||||
|
name = addr.get('name')
|
||||||
|
obj = AddressObject(name=name)
|
||||||
|
|
||||||
|
# IP/Netmask
|
||||||
|
ip_netmask = addr.find('ip-netmask')
|
||||||
|
if ip_netmask is not None:
|
||||||
|
obj.ip_netmask = ip_netmask.text
|
||||||
|
|
||||||
|
# Description
|
||||||
|
desc = addr.find('description')
|
||||||
|
if desc is not None:
|
||||||
|
obj.description = desc.text
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
misc_elem = addr.find('tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
for member in misc_elem.findall('member'):
|
||||||
|
obj.misc.append(member.text)
|
||||||
|
|
||||||
|
address_objects.append(obj)
|
||||||
|
|
||||||
|
self.config['address_objects'] = address_objects
|
||||||
|
print(f"✓ Trouvé {len(address_objects)} objets adresse")
|
||||||
|
|
||||||
|
def _parse_address_groups(self):
|
||||||
|
"""Parse les groupes d'adresses"""
|
||||||
|
address_groups = []
|
||||||
|
|
||||||
|
paths = [
|
||||||
|
".//shared/address-group/entry",
|
||||||
|
".//devices/entry/vsys/entry/address-group/entry"
|
||||||
|
]
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
|
for group in self.root.findall(path):
|
||||||
|
name = group.get('name')
|
||||||
|
members = []
|
||||||
|
|
||||||
|
# Membres statiques
|
||||||
|
static = group.find('static')
|
||||||
|
if static is not None:
|
||||||
|
for member in static.findall('member'):
|
||||||
|
members.append(member.text)
|
||||||
|
|
||||||
|
obj = AddressGroup(name=name, members=members)
|
||||||
|
|
||||||
|
# Description
|
||||||
|
desc = group.find('description')
|
||||||
|
if desc is not None:
|
||||||
|
obj.description = desc.text
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
misc_elem = group.find('tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
for member in misc_elem.findall('member'):
|
||||||
|
obj.misc.append(member.text)
|
||||||
|
|
||||||
|
address_groups.append(obj)
|
||||||
|
|
||||||
|
self.config['address_groups'] = address_groups
|
||||||
|
print(f"✓ Trouvé {len(address_groups)} groupes d'adresses")
|
||||||
|
|
||||||
|
def _parse_service_objects(self):
|
||||||
|
"""Parse les objets service"""
|
||||||
|
service_objects = []
|
||||||
|
|
||||||
|
paths = [
|
||||||
|
".//shared/service/entry",
|
||||||
|
".//devices/entry/vsys/entry/service/entry"
|
||||||
|
]
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
|
for service in self.root.findall(path):
|
||||||
|
name = service.get('name')
|
||||||
|
obj = ServiceObject(name=name)
|
||||||
|
|
||||||
|
# Protocol TCP
|
||||||
|
tcp = service.find('protocol/tcp')
|
||||||
|
if tcp is not None:
|
||||||
|
obj.protocol = 'tcp'
|
||||||
|
port = tcp.find('port')
|
||||||
|
if port is not None:
|
||||||
|
obj.port = port.text
|
||||||
|
source_port = tcp.find('source-port')
|
||||||
|
if source_port is not None:
|
||||||
|
obj.source_port = source_port.text
|
||||||
|
|
||||||
|
# Protocol UDP
|
||||||
|
udp = service.find('protocol/udp')
|
||||||
|
if udp is not None:
|
||||||
|
obj.protocol = 'udp'
|
||||||
|
port = udp.find('port')
|
||||||
|
if port is not None:
|
||||||
|
obj.port = port.text
|
||||||
|
source_port = udp.find('source-port')
|
||||||
|
if source_port is not None:
|
||||||
|
obj.source_port = source_port.text
|
||||||
|
|
||||||
|
# Description
|
||||||
|
desc = service.find('description')
|
||||||
|
if desc is not None:
|
||||||
|
obj.description = desc.text
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
misc_elem = service.find('tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
for member in misc_elem.findall('member'):
|
||||||
|
obj.misc.append(member.text)
|
||||||
|
|
||||||
|
service_objects.append(obj)
|
||||||
|
|
||||||
|
self.config['service_objects'] = service_objects
|
||||||
|
print(f"✓ Trouvé {len(service_objects)} objets service")
|
||||||
|
|
||||||
|
def _parse_service_groups(self):
|
||||||
|
"""Parse les groupes de services"""
|
||||||
|
service_groups = []
|
||||||
|
|
||||||
|
paths = [
|
||||||
|
".//shared/service-group/entry",
|
||||||
|
".//devices/entry/vsys/entry/service-group/entry"
|
||||||
|
]
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
|
for group in self.root.findall(path):
|
||||||
|
name = group.get('name')
|
||||||
|
members = []
|
||||||
|
|
||||||
|
# Membres
|
||||||
|
for member in group.findall('members/member'):
|
||||||
|
members.append(member.text)
|
||||||
|
|
||||||
|
obj = ServiceGroup(name=name, members=members)
|
||||||
|
|
||||||
|
# Description
|
||||||
|
desc = group.find('description')
|
||||||
|
if desc is not None:
|
||||||
|
obj.description = desc.text
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
misc_elem = group.find('tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
for member in misc_elem.findall('member'):
|
||||||
|
obj.misc.append(member.text)
|
||||||
|
|
||||||
|
service_groups.append(obj)
|
||||||
|
|
||||||
|
self.config['service_groups'] = service_groups
|
||||||
|
print(f"✓ Trouvé {len(service_groups)} groupes de services")
|
||||||
|
|
||||||
|
def _parse_interfaces(self):
|
||||||
|
"""Parse les interfaces réseau"""
|
||||||
|
interfaces = []
|
||||||
|
|
||||||
|
# Interfaces Ethernet
|
||||||
|
for interface in self.root.findall(".//devices/entry/network/interface/ethernet/entry"):
|
||||||
|
name = interface.get('name')
|
||||||
|
obj = Interface(name=name, interface_type='ethernet')
|
||||||
|
|
||||||
|
# Adresse IP
|
||||||
|
layer3 = interface.find('layer3')
|
||||||
|
if layer3 is not None:
|
||||||
|
ip_elem = layer3.find('ip/entry')
|
||||||
|
if ip_elem is not None:
|
||||||
|
ip_name = ip_elem.get('name')
|
||||||
|
if '/' in ip_name:
|
||||||
|
obj.ip, netmask = ip_name.split('/')
|
||||||
|
obj.netmask = netmask
|
||||||
|
else:
|
||||||
|
obj.ip = ip_name
|
||||||
|
|
||||||
|
# VLAN misc
|
||||||
|
misc_elem = interface.find('layer3/tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
obj.misc = int(misc_elem.text)
|
||||||
|
|
||||||
|
# Commentaire
|
||||||
|
comment = interface.find('comment')
|
||||||
|
if comment is not None:
|
||||||
|
obj.comment = comment.text
|
||||||
|
|
||||||
|
interfaces.append(obj)
|
||||||
|
|
||||||
|
# Interfaces Aggregate Ethernet
|
||||||
|
for interface in self.root.findall(".//devices/entry/network/interface/aggregate-ethernet/entry"):
|
||||||
|
name = interface.get('name')
|
||||||
|
obj = Interface(name=name, interface_type='aggregate-ethernet')
|
||||||
|
|
||||||
|
# Adresse IP
|
||||||
|
layer3 = interface.find('layer3')
|
||||||
|
if layer3 is not None:
|
||||||
|
ip_elem = layer3.find('ip/entry')
|
||||||
|
if ip_elem is not None:
|
||||||
|
ip_name = ip_elem.get('name')
|
||||||
|
if '/' in ip_name:
|
||||||
|
obj.ip, netmask = ip_name.split('/')
|
||||||
|
obj.netmask = netmask
|
||||||
|
else:
|
||||||
|
obj.ip = ip_name
|
||||||
|
|
||||||
|
# VLAN misc
|
||||||
|
misc_elem = interface.find('layer3/tag')
|
||||||
|
if misc_elem is not None:
|
||||||
|
obj.misc = int(misc_elem.text)
|
||||||
|
|
||||||
|
# Commentaire
|
||||||
|
comment = interface.find('comment')
|
||||||
|
if comment is not None:
|
||||||
|
obj.comment = comment.text
|
||||||
|
|
||||||
|
interfaces.append(obj)
|
||||||
|
|
||||||
|
self.config['interfaces'] = interfaces
|
||||||
|
print(f"✓ Trouvé {len(interfaces)} interfaces")
|
||||||
|
|
||||||
|
def _parse_virtual_routers(self):
|
||||||
|
"""Parse les virtual-routers et leurs routes statiques"""
|
||||||
|
virtual_routers = []
|
||||||
|
|
||||||
|
for vr_entry in self.root.findall(".//virtual-router/entry"):
|
||||||
|
vr_name = vr_entry.get("name")
|
||||||
|
interfaces = [iface.text for iface in vr_entry.findall(".//interface/member")]
|
||||||
|
|
||||||
|
static_routes = []
|
||||||
|
for route_entry in vr_entry.findall(".//routing-table/ip/static-route/entry"):
|
||||||
|
name = route_entry.get("name")
|
||||||
|
destination = route_entry.findtext("destination")
|
||||||
|
metric = int(route_entry.findtext("metric", "0"))
|
||||||
|
|
||||||
|
next_vr = route_entry.findtext("nexthop/next-vr")
|
||||||
|
next_hop_ip = route_entry.findtext("nexthop/ip-address")
|
||||||
|
interface = route_entry.findtext("interface")
|
||||||
|
bfd_profile = route_entry.findtext("bfd/profile")
|
||||||
|
|
||||||
|
static_route = StaticRoute(
|
||||||
|
name=name,
|
||||||
|
destination=destination,
|
||||||
|
metric=metric,
|
||||||
|
next_vr=next_vr,
|
||||||
|
next_hop_ip=next_hop_ip,
|
||||||
|
interface=interface,
|
||||||
|
bfd_profile=bfd_profile
|
||||||
|
)
|
||||||
|
static_routes.append(static_route)
|
||||||
|
|
||||||
|
virtual_routers.append(
|
||||||
|
VirtualRouter(
|
||||||
|
name=vr_name,
|
||||||
|
interfaces=interfaces,
|
||||||
|
static_routes=static_routes
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config['virtual_routers'] = virtual_routers
|
||||||
|
print(f"✓ Trouvé {len(virtual_routers)} virtual-routers")
|
||||||
|
|
||||||
|
def _parse_security_rules(self):
|
||||||
|
"""Parse les règles de sécurité"""
|
||||||
|
security_rules = []
|
||||||
|
|
||||||
|
rule_types = [
|
||||||
|
("security", ".//devices/entry/vsys/entry/rulebase/security/rules/entry"),
|
||||||
|
("nat", ".//devices/entry/vsys/entry/rulebase/nat/rules/entry"),
|
||||||
|
("default", ".//devices/entry/vsys/entry/rulebase/default-security-rules/rules/entry")
|
||||||
|
]
|
||||||
|
|
||||||
|
for rule_type, xpath in rule_types:
|
||||||
|
for rule in self.root.findall(xpath):
|
||||||
|
name = rule.get('name')
|
||||||
|
|
||||||
|
# Zones source
|
||||||
|
from_zones = []
|
||||||
|
from_elem = rule.find('from')
|
||||||
|
if from_elem is not None:
|
||||||
|
for member in from_elem.findall('member'):
|
||||||
|
from_zones.append(member.text)
|
||||||
|
|
||||||
|
# Zones destination
|
||||||
|
to_zones = []
|
||||||
|
to_elem = rule.find('to')
|
||||||
|
if to_elem is not None:
|
||||||
|
for member in to_elem.findall('member'):
|
||||||
|
to_zones.append(member.text)
|
||||||
|
|
||||||
|
# Adresses source
|
||||||
|
source_addresses = []
|
||||||
|
source_elem = rule.find('source')
|
||||||
|
if source_elem is not None:
|
||||||
|
for member in source_elem.findall('member'):
|
||||||
|
source_addresses.append(member.text)
|
||||||
|
|
||||||
|
# Adresses destination
|
||||||
|
destination_addresses = []
|
||||||
|
destination_elem = rule.find('destination')
|
||||||
|
if destination_elem is not None:
|
||||||
|
for member in destination_elem.findall('member'):
|
||||||
|
destination_addresses.append(member.text)
|
||||||
|
|
||||||
|
# Applications
|
||||||
|
applications = []
|
||||||
|
app_elem = rule.find('application')
|
||||||
|
if app_elem is not None:
|
||||||
|
for member in app_elem.findall('member'):
|
||||||
|
applications.append(member.text)
|
||||||
|
|
||||||
|
# Services
|
||||||
|
services = []
|
||||||
|
service_elem = rule.find('service')
|
||||||
|
if rule_type != "nat":
|
||||||
|
if service_elem is not None:
|
||||||
|
for member in service_elem.findall('member'):
|
||||||
|
services.append(member.text)
|
||||||
|
else:
|
||||||
|
services.append(service_elem.text)
|
||||||
|
|
||||||
|
# Statut (enabled/disabled)
|
||||||
|
enabled = True
|
||||||
|
rule.find('disabled')
|
||||||
|
if rule.find('disabled') is not None and rule.find('disabled').text == 'yes':
|
||||||
|
enabled = False
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
miscs = [m.text for m in rule.findall('tag/member')]
|
||||||
|
|
||||||
|
# Log setting
|
||||||
|
log_elem = rule.find('log-setting')
|
||||||
|
log_setting = log_elem.text if log_elem is not None else "default"
|
||||||
|
|
||||||
|
# Action
|
||||||
|
if rule_type == "nat":
|
||||||
|
action = 'nat'
|
||||||
|
else:
|
||||||
|
action = 'deny'
|
||||||
|
action_elem = rule.find('action')
|
||||||
|
if action_elem is not None:
|
||||||
|
action = action_elem.text
|
||||||
|
|
||||||
|
obj = SecurityRule(
|
||||||
|
name=name,
|
||||||
|
from_zones=from_zones,
|
||||||
|
to_zones=to_zones,
|
||||||
|
source_addresses=source_addresses,
|
||||||
|
destination_addresses=destination_addresses,
|
||||||
|
applications=applications,
|
||||||
|
services=services,
|
||||||
|
miscs=miscs,
|
||||||
|
action=action,
|
||||||
|
log_setting=log_setting,
|
||||||
|
enabled=enabled
|
||||||
|
)
|
||||||
|
|
||||||
|
# Description
|
||||||
|
desc = rule.find('description')
|
||||||
|
if desc is not None:
|
||||||
|
obj.description = desc.text
|
||||||
|
|
||||||
|
# Statut (enabled/disabled)
|
||||||
|
disabled = rule.find('disabled')
|
||||||
|
if disabled is not None and disabled.text == 'yes':
|
||||||
|
obj.enabled = False
|
||||||
|
|
||||||
|
if rule_type == "nat":
|
||||||
|
dt = rule.find('destination-translation')
|
||||||
|
translated_address = dt.findtext('translated-address', "") if dt is not None else ""
|
||||||
|
translated_port = dt.findtext('translated-port', "any") if dt is not None else "any"
|
||||||
|
to_interface = rule.find('to-interface')
|
||||||
|
|
||||||
|
else:
|
||||||
|
translated_address = None
|
||||||
|
translated_port = None
|
||||||
|
|
||||||
|
if rule_type == "nat":
|
||||||
|
obj.translated_address = translated_address
|
||||||
|
obj.translated_port = translated_port
|
||||||
|
obj.to_interface = to_interface.text if to_interface is not None else ""
|
||||||
|
|
||||||
|
security_rules.append(obj)
|
||||||
|
|
||||||
|
self.config['security_rules'] = security_rules
|
||||||
|
print(f"✓ Trouvé {len(security_rules)} règles de sécurité")
|
||||||
|
|
||||||
|
def parse_all(self):
|
||||||
|
"""Parse tous les éléments de configuration"""
|
||||||
|
print("Début du parsing de la configuration Palo Alto...")
|
||||||
|
|
||||||
|
self.load_xml()
|
||||||
|
self._parse_address_objects()
|
||||||
|
self._parse_address_groups()
|
||||||
|
self._parse_service_objects()
|
||||||
|
self._parse_service_groups()
|
||||||
|
self._parse_interfaces()
|
||||||
|
self._parse_virtual_routers()
|
||||||
|
self._parse_security_rules()
|
||||||
|
|
||||||
|
print("✓ Parsing terminé avec succès!")
|
||||||
|
|
||||||
|
def export_to_json(self, output_file: str):
|
||||||
|
"""Exporte la configuration au format JSON OpenConfig"""
|
||||||
|
openconfig_data = self.to_openconfig_yang("palo-alto")
|
||||||
|
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(openconfig_data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"✓ Configuration exportée vers: {output_file}")
|
||||||
|
|
||||||
|
def generate_json_paloalto(input_file: str, output_file: str):
|
||||||
|
"""Génère le fichier JSON OpenConfig à partir du fichier XML Palo Alto"""
|
||||||
|
xml_file = Path(input_file)
|
||||||
|
if not xml_file.exists():
|
||||||
|
print(f"✗ Erreur: Le fichier '{xml_file}' n'existe pas")
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
parser = PaloAltoParser(str(xml_file))
|
||||||
|
parser.parse_all()
|
||||||
|
parser.print_summary()
|
||||||
|
|
||||||
|
output_file = output_file
|
||||||
|
parser.export_to_json(output_file)
|
||||||
|
print(f"\n✓ Conversion terminée! Vérifiez le fichier: {output_file}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Erreur: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Usage: python json_PaloAlto.py <fichier_config.xml>")
|
||||||
|
print("Exemple: python json_PaloAlto.py config_palo_alto.xml")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
xml_file = sys.argv[1]
|
||||||
|
|
||||||
|
if not Path(xml_file).exists():
|
||||||
|
print(f"✗ Erreur: Le fichier '{xml_file}' n'existe pas")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
parser = PaloAltoParser(xml_file)
|
||||||
|
parser.parse_all()
|
||||||
|
parser.print_summary()
|
||||||
|
|
||||||
|
input_path = Path(xml_file)
|
||||||
|
output_file = 'output_PaloAlto.json'
|
||||||
|
parser.export_to_json(output_file)
|
||||||
|
|
||||||
|
print(f"\n✓ Conversion terminée! Vérifiez le fichier: {output_file}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Erreur: {e}")
|
||||||
|
sys.exit(1)
|
||||||
405
src/scripts/json_Stormshield.py
Normal file
405
src/scripts/json_Stormshield.py
Normal file
@@ -0,0 +1,405 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Parser pour configuration Stormshield vers un format json normalisé OpenConfig YANG
|
||||||
|
Extrait les groupes d'objets, objets, groupes de services, services, routes, interfaces et règles
|
||||||
|
"""
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
from scripts.export_modele import ParserMixin
|
||||||
|
from scripts.objets.data import AddressObject, AddressGroup, ServiceObject, ServiceGroup, Interface, SecurityRule, StaticRoute, VirtualRouter
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class StormshieldParser(ParserMixin):
|
||||||
|
"""Parser pour dossier Stormshield"""
|
||||||
|
def __init__(self, base_dir: str):
|
||||||
|
"""Initialise le parser avec le chemin du dossier Stormshield"""
|
||||||
|
self.base_dir = base_dir
|
||||||
|
|
||||||
|
self.config = {
|
||||||
|
"address_objects": [],
|
||||||
|
"address_groups": [],
|
||||||
|
"service_objects": [],
|
||||||
|
"service_groups": [],
|
||||||
|
"interfaces": [],
|
||||||
|
"virtual_routers": [],
|
||||||
|
'static_routes': [],
|
||||||
|
"security_rules": [],
|
||||||
|
"default_route": None # Ajout Stormshield
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_address_objects(self):
|
||||||
|
"""Parse le fichier object contenant [Host], [Network], [Service], etc."""
|
||||||
|
current_section = None
|
||||||
|
path = os.path.join(self.base_dir, "object")
|
||||||
|
|
||||||
|
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("[") and line.endswith("]"):
|
||||||
|
current_section = line.strip("[]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if current_section in ("Host", "Network", "Fqdn"):
|
||||||
|
match = re.match(r"([^=]+)=([^,#]+)", line)
|
||||||
|
if match:
|
||||||
|
name = match.group(1).strip()
|
||||||
|
ip = match.group(2).strip()
|
||||||
|
self.config["address_objects"].append(
|
||||||
|
AddressObject(name=name, ip_netmask=ip)
|
||||||
|
)
|
||||||
|
|
||||||
|
elif current_section == "Service":
|
||||||
|
match = re.match(r"([^=]+)=([\d\-]+)/(\w+)", line)
|
||||||
|
if match:
|
||||||
|
name = match.group(1).strip()
|
||||||
|
port = match.group(2)
|
||||||
|
proto = match.group(3).lower()
|
||||||
|
self.config["service_objects"].append(
|
||||||
|
ServiceObject(name=name, protocol=proto, port=port)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _parse_address_groups(self):
|
||||||
|
"""Parse le fichier objectgroup pour groupes d’adresses"""
|
||||||
|
current_group = None
|
||||||
|
members = []
|
||||||
|
path = os.path.join(self.base_dir, "objectgroup")
|
||||||
|
|
||||||
|
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("[") and "]" in line:
|
||||||
|
if current_group:
|
||||||
|
self.config["address_groups"].append(
|
||||||
|
AddressGroup(name=current_group, members=members)
|
||||||
|
)
|
||||||
|
current_group = line.split("]")[0][1:].strip()
|
||||||
|
members = []
|
||||||
|
continue
|
||||||
|
|
||||||
|
if current_group:
|
||||||
|
member = line.split("#")[0].strip()
|
||||||
|
if member:
|
||||||
|
members.append(member)
|
||||||
|
|
||||||
|
if current_group:
|
||||||
|
self.config["address_groups"].append(
|
||||||
|
AddressGroup(name=current_group, members=members)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _parse_service_groups(self):
|
||||||
|
"""Parse le fichier servicegroup pour groupes de services"""
|
||||||
|
current_group = None
|
||||||
|
members = []
|
||||||
|
path = os.path.join(self.base_dir, "servicegroup")
|
||||||
|
|
||||||
|
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("[") and "]" in line:
|
||||||
|
if current_group:
|
||||||
|
self.config["service_groups"].append(
|
||||||
|
ServiceGroup(name=current_group, members=members)
|
||||||
|
)
|
||||||
|
current_group = line.split("]")[0][1:].strip()
|
||||||
|
members = []
|
||||||
|
continue
|
||||||
|
|
||||||
|
if current_group:
|
||||||
|
member = line.split("#")[0].strip()
|
||||||
|
if member:
|
||||||
|
members.append(member)
|
||||||
|
|
||||||
|
if current_group:
|
||||||
|
self.config["service_groups"].append(
|
||||||
|
ServiceGroup(name=current_group, members=members)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _parse_interfaces(self):
|
||||||
|
"""Analyse du fichier network et extraction des interfaces"""
|
||||||
|
current_section = None
|
||||||
|
current_data = {}
|
||||||
|
path = os.path.join(self.base_dir, "network")
|
||||||
|
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||||
|
for raw_line in f:
|
||||||
|
line = raw_line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("[") and line.endswith("]"):
|
||||||
|
if current_section and current_section.lower() != "config":
|
||||||
|
self._add_interface(current_section, current_data)
|
||||||
|
current_section = line.strip("[]")
|
||||||
|
current_data = {}
|
||||||
|
continue
|
||||||
|
|
||||||
|
if "=" in line:
|
||||||
|
key, value = line.split("=", 1)
|
||||||
|
key = key.strip()
|
||||||
|
value = value.split("#")[0].strip()
|
||||||
|
current_data[key] = value
|
||||||
|
|
||||||
|
if current_section and current_section.lower() != "config":
|
||||||
|
self._add_interface(current_section, current_data)
|
||||||
|
|
||||||
|
def _add_interface(self, section_name, data):
|
||||||
|
"""Crée un objet Interface à partir d’une section complète"""
|
||||||
|
if section_name.lower().startswith("vlan"):
|
||||||
|
iface_type = "vlan"
|
||||||
|
elif section_name.lower().startswith("bridge"):
|
||||||
|
iface_type = "bridge"
|
||||||
|
elif section_name.lower().startswith("wifi"):
|
||||||
|
iface_type = "wifi"
|
||||||
|
elif section_name.lower().startswith("loopback"):
|
||||||
|
iface_type = "loopback"
|
||||||
|
elif section_name.lower().startswith("agg"):
|
||||||
|
iface_type = "aggregate"
|
||||||
|
else:
|
||||||
|
iface_type = "ethernet"
|
||||||
|
|
||||||
|
enabled = data.get("State", "0") == "1"
|
||||||
|
name = data.get("Name", section_name)
|
||||||
|
ip = data.get("Address")
|
||||||
|
netmask = data.get("Mask")
|
||||||
|
misc = data.get("Misc")
|
||||||
|
comment = data.get("Comment", "")
|
||||||
|
|
||||||
|
if not name or name.lower() == "dynamic":
|
||||||
|
return
|
||||||
|
|
||||||
|
interface = Interface(
|
||||||
|
name=name,
|
||||||
|
ip=ip if ip and ip.upper() != "DHCP" else None,
|
||||||
|
netmask=netmask,
|
||||||
|
misc=int(misc) if misc and misc.isdigit() else None,
|
||||||
|
comment=comment,
|
||||||
|
interface_type=iface_type,
|
||||||
|
enabled=enabled,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config["interfaces"].append(interface)
|
||||||
|
|
||||||
|
def _parse_virtual_routers(self):
|
||||||
|
route_path = os.path.join(self.base_dir, "route")
|
||||||
|
if not os.path.exists(route_path):
|
||||||
|
return
|
||||||
|
|
||||||
|
section = None
|
||||||
|
with open(route_path, encoding="utf-8", errors="ignore") as f:
|
||||||
|
for raw_line in f:
|
||||||
|
line = raw_line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("[") and line.endswith("]"):
|
||||||
|
section = line.strip("[]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if section == "Config" and line.startswith("DefaultRoute="):
|
||||||
|
self.config["default_route"] = line.split("=", 1)[1].strip()
|
||||||
|
|
||||||
|
elif section == "StaticRoutes" and not line.startswith("#"):
|
||||||
|
parts = line.split(",")
|
||||||
|
if len(parts) >= 2:
|
||||||
|
self.config["static_routes"].append({
|
||||||
|
"destination": parts[0],
|
||||||
|
"interface": parts[1],
|
||||||
|
"extra": parts[2:] if len(parts) > 2 else []
|
||||||
|
})
|
||||||
|
|
||||||
|
static_routes = []
|
||||||
|
if self.config["default_route"]:
|
||||||
|
static_routes.append(
|
||||||
|
StaticRoute(
|
||||||
|
name="default-route",
|
||||||
|
destination="0.0.0.0/0",
|
||||||
|
metric=1,
|
||||||
|
next_hop_ip=self.config["default_route"],
|
||||||
|
interface=None
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for idx, route in enumerate(self.config["static_routes"]):
|
||||||
|
static_routes.append(
|
||||||
|
StaticRoute(
|
||||||
|
name=f"static-{idx+1}",
|
||||||
|
destination=route["destination"],
|
||||||
|
metric=1,
|
||||||
|
next_hop_ip=None,
|
||||||
|
interface=route["interface"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
vr = VirtualRouter(
|
||||||
|
name="default-vr",
|
||||||
|
interfaces=[r["interface"] for r in self.config["static_routes"]],
|
||||||
|
static_routes=static_routes
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config["virtual_routers"] = [vr]
|
||||||
|
|
||||||
|
# def _parse_slotinfo_file(self):
|
||||||
|
# path = os.path.join(self.base_dir, "Filter", "slotinfo")
|
||||||
|
# if not os.path.exists(path):
|
||||||
|
# return
|
||||||
|
# current = None
|
||||||
|
# with open(path, encoding="utf-8", errors="ignore") as f:
|
||||||
|
# for raw_line in f:
|
||||||
|
# line = raw_line.strip()
|
||||||
|
# if not line or line.startswith("#"):
|
||||||
|
# continue
|
||||||
|
# if line.startswith("[") and line.endswith("]"):
|
||||||
|
# current = line.strip("[]")
|
||||||
|
# continue
|
||||||
|
# if current and line.startswith("Name="):
|
||||||
|
# name = line.split("=", 1)[1].strip('"')
|
||||||
|
# if name:
|
||||||
|
# self.filter_slots[current] = name
|
||||||
|
|
||||||
|
def _parse_security_rules(self):
|
||||||
|
filter_dir = os.path.join(self.base_dir, "Filter")
|
||||||
|
if not os.path.exists(filter_dir):
|
||||||
|
return
|
||||||
|
|
||||||
|
rule_regex = re.compile(
|
||||||
|
r'^(?P<disabled>off\s+)?'
|
||||||
|
r'(?P<action>pass|block|nat)\b'
|
||||||
|
r'(?:\s+noconnlog)?'
|
||||||
|
r'(?:\s+all)?'
|
||||||
|
r'(?:\s+inspection)?'
|
||||||
|
r'(?:\s+firewall)?'
|
||||||
|
r'(?:\s+route\s+[^\s]+)?'
|
||||||
|
r'(?:\s+ipproto\s+[^\s]+)?'
|
||||||
|
r'(?:\s+type\s+\d+)?'
|
||||||
|
r'(?:\s+code\s+\d+)?'
|
||||||
|
r'(?:\s+proto\s+[^\s]+)?'
|
||||||
|
r'\s+from\s+(?P<src>[^\s]+)'
|
||||||
|
r'(?:\s+on\s+(?P<zone>[^\s]+))?'
|
||||||
|
r'\s+to\s+(?P<dst>[^\s]+)'
|
||||||
|
r'(?:\s+port\s+(?P<ports>[^\s]+))?'
|
||||||
|
r'(?:\s+rulename\s+"(?P<rulename>[^"]+)")?',
|
||||||
|
re.IGNORECASE
|
||||||
|
)
|
||||||
|
|
||||||
|
slotinfo_path = os.path.join(filter_dir, "slotinfo")
|
||||||
|
active_slot = "Global"
|
||||||
|
if os.path.exists(slotinfo_path):
|
||||||
|
with open(slotinfo_path, encoding="utf-8", errors="ignore") as f:
|
||||||
|
for raw_line in f:
|
||||||
|
line = raw_line.strip()
|
||||||
|
if line.startswith("Active="):
|
||||||
|
active_slot = line.split("=", 1)[1].strip()
|
||||||
|
break
|
||||||
|
|
||||||
|
for filename in sorted(os.listdir(filter_dir)):
|
||||||
|
if not re.fullmatch(r"\d{2}", filename):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if filename.lstrip("0") != active_slot:
|
||||||
|
enabled = False
|
||||||
|
else:
|
||||||
|
enabled = True
|
||||||
|
|
||||||
|
path = os.path.join(filter_dir, filename)
|
||||||
|
with open(path, encoding="utf-8", errors="ignore") as f:
|
||||||
|
for raw_line in f:
|
||||||
|
line = raw_line.strip()
|
||||||
|
|
||||||
|
if not line or line.startswith("separator") or line.startswith("["):
|
||||||
|
continue
|
||||||
|
|
||||||
|
match = rule_regex.match(line)
|
||||||
|
if not match:
|
||||||
|
continue
|
||||||
|
|
||||||
|
data = match.groupdict()
|
||||||
|
|
||||||
|
# ----- Détermination de l'action finale -----
|
||||||
|
action_raw = data["action"].lower()
|
||||||
|
|
||||||
|
if action_raw == "nat":
|
||||||
|
final_action = "nat"
|
||||||
|
elif action_raw == "pass":
|
||||||
|
final_action = "allow"
|
||||||
|
elif action_raw == "block":
|
||||||
|
final_action = "block"
|
||||||
|
else:
|
||||||
|
final_action = "unknown"
|
||||||
|
|
||||||
|
rule = SecurityRule(
|
||||||
|
name=data.get("rulename")
|
||||||
|
or f"rule_{filename}_{len(self.config['security_rules'])}",
|
||||||
|
from_zones=[data.get("zone")] if data.get("zone") else [],
|
||||||
|
to_zones=[],
|
||||||
|
source_addresses=[data.get("src") or "any"],
|
||||||
|
destination_addresses=[data.get("dst") or "any"],
|
||||||
|
services=data["ports"].split("|") if data.get("ports") else [],
|
||||||
|
applications=["any"],
|
||||||
|
action=final_action,
|
||||||
|
description=self._extract_comment(raw_line),
|
||||||
|
enabled=enabled
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config["security_rules"].append(rule)
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_comment(self, line: str) -> str:
|
||||||
|
"""Extrait un commentaire après #"""
|
||||||
|
if "#" in line:
|
||||||
|
return line.split("#", 1)[1].strip()
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def parse_all(self):
|
||||||
|
print("🔍 Parsing de la configuration Stormshield...")
|
||||||
|
self._parse_virtual_routers()
|
||||||
|
self._parse_address_objects()
|
||||||
|
self._parse_address_groups()
|
||||||
|
self._parse_service_groups()
|
||||||
|
self._parse_interfaces()
|
||||||
|
self._parse_security_rules()
|
||||||
|
print("✓ Parsing terminé avec succès!")
|
||||||
|
|
||||||
|
def export_to_json(self, output_file: str):
|
||||||
|
"""Exporte la configuration au format JSON OpenConfig"""
|
||||||
|
openconfig_data = self.to_openconfig_yang("stormshield")
|
||||||
|
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(openconfig_data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"✓ Configuration exportée vers: {output_file}")
|
||||||
|
|
||||||
|
def generate_json_stormshield(input_dir: str, output_file: str):
|
||||||
|
input_dir = input_dir + "/usr/Firewall/ConfigFiles/"
|
||||||
|
parser = StormshieldParser(input_dir)
|
||||||
|
parser.parse_all()
|
||||||
|
parser.print_summary()
|
||||||
|
output_file = output_file
|
||||||
|
parser.export_to_json(output_file)
|
||||||
|
|
||||||
|
print(f"\n✓ Conversion terminée! Vérifiez le fichier: {output_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Usage: python json_Stormshield.py <dossier>")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
input_dir = sys.argv[1]
|
||||||
|
if not Path(input_dir).exists():
|
||||||
|
print(f"Erreur : dossier '{input_dir}' inexistant")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
output_path = Path("output_Stormshield.json")
|
||||||
|
generate_json_stormshield(input_dir, str(output_path))
|
||||||
95
src/scripts/objets/data.py
Normal file
95
src/scripts/objets/data.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AddressObject:
|
||||||
|
"""Objet adresse"""
|
||||||
|
name: str
|
||||||
|
ip_netmask: str = None
|
||||||
|
description: str = None
|
||||||
|
misc: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.misc is None:
|
||||||
|
self.misc = []
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AddressGroup:
|
||||||
|
"""Groupe d'adresses"""
|
||||||
|
name: str
|
||||||
|
members: List[str]
|
||||||
|
description: str = None
|
||||||
|
misc: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.misc is None:
|
||||||
|
self.misc = []
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ServiceObject:
|
||||||
|
"""Objet service"""
|
||||||
|
name: str
|
||||||
|
protocol: str = None
|
||||||
|
port: str = None
|
||||||
|
source_port: str = None
|
||||||
|
description: str = None
|
||||||
|
misc: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.misc is None:
|
||||||
|
self.misc = []
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ServiceGroup:
|
||||||
|
"""Groupe de services"""
|
||||||
|
name: str
|
||||||
|
members: List[str]
|
||||||
|
description: str = None
|
||||||
|
misc: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.misc is None:
|
||||||
|
self.misc = []
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Interface:
|
||||||
|
"""Interface réseau"""
|
||||||
|
name: str
|
||||||
|
ip: str = None
|
||||||
|
netmask: str = None
|
||||||
|
misc: int = None
|
||||||
|
comment: str = None
|
||||||
|
interface_type: str = None
|
||||||
|
enabled: bool = True
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SecurityRule:
|
||||||
|
"""Règle de sécurité"""
|
||||||
|
name: str
|
||||||
|
from_zones: List[str]
|
||||||
|
to_zones: List[str]
|
||||||
|
source_addresses: List[str]
|
||||||
|
destination_addresses: List[str]
|
||||||
|
applications: List[str]
|
||||||
|
services: List[str]
|
||||||
|
action: str
|
||||||
|
description: str = None
|
||||||
|
enabled: bool = True
|
||||||
|
log_setting: str = "default"
|
||||||
|
miscs: List[str] = None
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class StaticRoute:
|
||||||
|
name: str
|
||||||
|
destination: str
|
||||||
|
metric: int
|
||||||
|
next_vr: str = None
|
||||||
|
next_hop_ip: str = None
|
||||||
|
interface: str = None
|
||||||
|
bfd_profile: str = None
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class VirtualRouter:
|
||||||
|
name: str
|
||||||
|
interfaces: List[str]
|
||||||
|
static_routes: List[StaticRoute]
|
||||||
62
src/scripts/style_excel/style_address_groups.py
Normal file
62
src/scripts/style_excel/style_address_groups.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
|
||||||
|
center = Alignment(horizontal="center", vertical="center")
|
||||||
|
left = Alignment(horizontal="left", vertical="center")
|
||||||
|
|
||||||
|
red_fill = PatternFill(start_color="FF9999", fill_type="solid")
|
||||||
|
orange_fill = PatternFill(start_color="FFCC99", fill_type="solid")
|
||||||
|
yellow_fill = PatternFill(start_color="FFFF99", fill_type="solid")
|
||||||
|
|
||||||
|
thick_border = Border(*(Side(style="thick"),)*4)
|
||||||
|
thin_border = Border(*(Side(style="thin"),)*4)
|
||||||
|
|
||||||
|
def style_address_groups(ws, address_groups):
|
||||||
|
|
||||||
|
col_group, col_member, col_ip = 1, 2, 3
|
||||||
|
start_row = 2
|
||||||
|
|
||||||
|
max_width = {1: 0, 2: 0, 3: 0}
|
||||||
|
|
||||||
|
for row in range(2, ws.max_row + 1):
|
||||||
|
g = ws.cell(row=row, column=col_group).value
|
||||||
|
m = ws.cell(row=row, column=col_member).value
|
||||||
|
ip = ws.cell(row=row, column=col_ip).value
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_group).fill = red_fill
|
||||||
|
ws.cell(row=row, column=col_group).font = Font(bold=True)
|
||||||
|
ws.cell(row=row, column=col_group).border = thin_border
|
||||||
|
|
||||||
|
member_fill = orange_fill if m in address_groups else yellow_fill
|
||||||
|
ws.cell(row=row, column=col_member).fill = member_fill
|
||||||
|
ws.cell(row=row, column=col_ip).fill = member_fill
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_member).alignment = left
|
||||||
|
ws.cell(row=row, column=col_ip).alignment = left
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_member).border = thin_border
|
||||||
|
ws.cell(row=row, column=col_ip).border = thin_border
|
||||||
|
|
||||||
|
max_width[1] = max(max_width[1], len(str(g)))
|
||||||
|
max_width[2] = max(max_width[2], len(str(m)))
|
||||||
|
max_width[3] = max(max_width[3], len(str(ip)))
|
||||||
|
|
||||||
|
next_val = ws.cell(row=row+1, column=col_group).value if row < ws.max_row else None
|
||||||
|
if g != next_val:
|
||||||
|
ws.merge_cells(start_row=start_row, start_column=col_group,
|
||||||
|
end_row=row, end_column=col_group)
|
||||||
|
|
||||||
|
for r in range(start_row, row + 1):
|
||||||
|
ws.cell(r, col_group).border = thick_border
|
||||||
|
ws.cell(r, col_member).border = thick_border
|
||||||
|
ws.cell(r, col_ip).border = thick_border
|
||||||
|
|
||||||
|
ws.cell(r, col_group).alignment = center
|
||||||
|
|
||||||
|
start_row = row + 1
|
||||||
|
|
||||||
|
for col in max_width:
|
||||||
|
ws.column_dimensions[get_column_letter(col)].width = max_width[col] + 2
|
||||||
|
|
||||||
|
for row in range(2, ws.max_row + 1):
|
||||||
|
ws.row_dimensions[row].height = 18
|
||||||
65
src/scripts/style_excel/style_matrice_flux.py
Normal file
65
src/scripts/style_excel/style_matrice_flux.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
from openpyxl.styles import Alignment, PatternFill, Font, Border, Side
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
|
||||||
|
center = Alignment(horizontal="center", vertical="center")
|
||||||
|
left = Alignment(horizontal="left", vertical="center")
|
||||||
|
wrap_left = Alignment(horizontal="left", vertical="center", wrap_text=True)
|
||||||
|
|
||||||
|
header_fill = PatternFill(start_color="B4C6E7", fill_type="solid")
|
||||||
|
section_fill = PatternFill(start_color="D9E1F2", fill_type="solid")
|
||||||
|
thin_border = Border(*(Side(style="thin"),)*4)
|
||||||
|
|
||||||
|
def format_cell_multiline(value):
|
||||||
|
"""Convert comma-separated or list-style text into multiline text"""
|
||||||
|
if value is None:
|
||||||
|
return ""
|
||||||
|
val = str(value).strip()
|
||||||
|
if val.startswith("[") and val.endswith("]"):
|
||||||
|
val = val[1:-1]
|
||||||
|
val = val.replace("'", "").replace('"', "")
|
||||||
|
return val.replace(", ", "\n").replace(";", "\n").replace(",", "\n").replace(";", "\n")
|
||||||
|
|
||||||
|
def style_matrice_flux(ws):
|
||||||
|
headers = [
|
||||||
|
("Description",2),("Source",4),("Destination",4),
|
||||||
|
("Application",1),("Port",1),("Miscellaneous",1),("Action",1),("Tier",1),("Active",1)
|
||||||
|
]
|
||||||
|
|
||||||
|
col = 1
|
||||||
|
for label, span in headers:
|
||||||
|
ws.merge_cells(start_row=1, start_column=col, end_row=1, end_column=col + span - 1)
|
||||||
|
c = ws.cell(row=1, column=col, value=label)
|
||||||
|
c.alignment = center
|
||||||
|
c.fill = section_fill
|
||||||
|
c.font = Font(bold=True)
|
||||||
|
col += span
|
||||||
|
|
||||||
|
wrap_cols = ["Description", "Src Equipement", "Dst Equipement",
|
||||||
|
"Application", "Port", "Src CIDR", "Dst CIDR", "Src Site", "Dst Site", "Miscellaneous", "Action", "Tier", "Active"]
|
||||||
|
wrap_indexes = []
|
||||||
|
|
||||||
|
for col_idx, cell in enumerate(ws[2], start=1):
|
||||||
|
if cell.value in wrap_cols:
|
||||||
|
wrap_indexes.append(col_idx)
|
||||||
|
|
||||||
|
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
|
||||||
|
for cell in row:
|
||||||
|
if cell.row > 2:
|
||||||
|
if cell.col_idx in wrap_indexes:
|
||||||
|
cell.value = format_cell_multiline(cell.value)
|
||||||
|
cell.alignment = wrap_left
|
||||||
|
else:
|
||||||
|
cell.alignment = left
|
||||||
|
else:
|
||||||
|
cell.font = Font(bold=True)
|
||||||
|
cell.alignment = center
|
||||||
|
cell.fill = header_fill
|
||||||
|
cell.border = thin_border
|
||||||
|
|
||||||
|
col_widths = {
|
||||||
|
"A": 50, "B": 35, "C": 35, "D": 18, "E": 15, "F": 15,
|
||||||
|
"G": 35, "H": 18, "I": 15, "J": 15, "K": 12, "L": 20,
|
||||||
|
"M": 25, "N": 9, "O": 7, "P": 7
|
||||||
|
}
|
||||||
|
for col_letter, width in col_widths.items():
|
||||||
|
ws.column_dimensions[col_letter].width = width
|
||||||
59
src/scripts/style_excel/style_service_groups.py
Normal file
59
src/scripts/style_excel/style_service_groups.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
|
||||||
|
center = Alignment(horizontal="center", vertical="center")
|
||||||
|
left = Alignment(horizontal="left", vertical="center")
|
||||||
|
red_fill = PatternFill(start_color="FF9999", fill_type="solid")
|
||||||
|
orange_fill = PatternFill(start_color="FFCC99", fill_type="solid")
|
||||||
|
yellow_fill = PatternFill(start_color="FFFF99", fill_type="solid")
|
||||||
|
|
||||||
|
thick_border = Border(*(Side(style="thick"),)*4)
|
||||||
|
thin_border = Border(*(Side(style="thin"),)*4)
|
||||||
|
|
||||||
|
def style_service_groups(ws, service_groups):
|
||||||
|
col_group, col_member, col_proto, col_port = 1, 2, 3, 4
|
||||||
|
start_row = 2
|
||||||
|
|
||||||
|
max_width = {1: 0, 2: 0, 3: 0, 4: 0}
|
||||||
|
|
||||||
|
for row in range(2, ws.max_row + 1):
|
||||||
|
g = ws.cell(row=row, column=col_group).value
|
||||||
|
m = ws.cell(row=row, column=col_member).value
|
||||||
|
proto = ws.cell(row=row, column=col_proto).value
|
||||||
|
port = ws.cell(row=row, column=col_port).value
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_group).fill = red_fill
|
||||||
|
ws.cell(row=row, column=col_group).font = Font(bold=True)
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_member).fill = (
|
||||||
|
orange_fill if m in service_groups else yellow_fill
|
||||||
|
)
|
||||||
|
|
||||||
|
ws.cell(row=row, column=col_proto).fill = yellow_fill
|
||||||
|
ws.cell(row=row, column=col_port).fill = yellow_fill
|
||||||
|
|
||||||
|
for col in range(1, 5):
|
||||||
|
ws.cell(row=row, column=col).border = thin_border
|
||||||
|
|
||||||
|
max_width[1] = max(max_width[1], len(str(g or "")))
|
||||||
|
max_width[2] = max(max_width[2], len(str(m or "")))
|
||||||
|
max_width[3] = max(max_width[3], len(str(proto or "")))
|
||||||
|
max_width[4] = max(max_width[4], len(str(port or "")))
|
||||||
|
|
||||||
|
next_val = ws.cell(row=row + 1, column=col_group).value if row < ws.max_row else None
|
||||||
|
if g != next_val:
|
||||||
|
if row > start_row:
|
||||||
|
ws.merge_cells(f"A{start_row}:A{row}")
|
||||||
|
|
||||||
|
for r in range(start_row, row + 1):
|
||||||
|
for c in range(1, 5):
|
||||||
|
ws.cell(r, c).border = thick_border
|
||||||
|
ws.cell(r, c).alignment = center if c in [1, 3, 4] else left
|
||||||
|
|
||||||
|
start_row = row + 1
|
||||||
|
|
||||||
|
for col, width in max_width.items():
|
||||||
|
ws.column_dimensions[get_column_letter(col)].width = width + 4
|
||||||
|
|
||||||
|
for row in range(2, ws.max_row + 1):
|
||||||
|
ws.row_dimensions[row].height = 18
|
||||||
Reference in New Issue
Block a user