Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F118310302
lldp.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
lldp.py
View Options
#!/usr/bin/env python3
#
# Copyright (C) 2017 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
#
import
re
import
sys
from
vyos.config
import
Config
from
vyos.util
import
ConfigError
def
get_options
(
config
):
options
=
{}
config
.
set_level
(
'service lldp'
)
options
[
'listen_vlan'
]
=
config
.
exists
(
'listen-vlan'
)
options
[
"addr"
]
=
config
.
return_value
(
'management-address'
)
snmp
=
config
.
exists
(
'snmp enable'
)
options
[
"snmp"
]
=
snmp
if
snmp
:
config
.
set_level
(
''
)
options
[
"sys_snmp"
]
=
config
.
exists
(
'service snmp'
)
config
.
set_level
(
'service lldp'
)
config
.
set_level
(
'service lldp legacy-protocols'
)
options
[
"cdp"
]
=
config
.
exists
(
"cdp"
)
options
[
"edp"
]
=
config
.
exists
(
"edp"
)
options
[
"fdp"
]
=
config
.
exists
(
"fdp"
)
options
[
"sonmp"
]
=
config
.
exists
(
"sonmp"
)
return
options
def
get_interface_list
(
config
):
config
.
set_level
(
'service lldp'
)
intfs_names
=
config
.
list_nodes
(
'interface'
)
if
len
(
intfs_names
)
<
0
:
return
0
interface_list
=
[]
for
name
in
intfs_names
:
config
.
set_level
(
"service lldp interface {0}"
.
format
(
name
))
disable
=
config
.
exists
(
'disable'
)
intf
=
{
"name"
:
name
,
"disable"
:
disable
}
interface_list
.
append
(
intf
)
return
interface_list
def
get_location_intf
(
config
,
name
):
path
=
"service lldp interface {0}"
.
format
(
name
)
config
.
set_level
(
path
)
if
config
.
exists
(
"location"
):
return
0
config
.
set_level
(
"{} location"
.
format
(
path
))
civic_based
=
{}
elin
=
None
coordinate_based
=
{}
if
config
.
exists
(
'civic-based'
):
config
.
set_level
(
"{} location civic-based"
.
format
(
path
))
cc
=
config
.
return_value
(
"country-code"
)
civic_based
[
"country_code"
]
=
cc
civic_based
[
"ca_type"
]
=
[]
ca_types_names
=
config
.
list_nodes
(
'ca-type'
)
if
ca_types_names
:
for
ca_types_name
in
ca_types_names
:
config
.
set_level
(
"{0} location civic-based ca-type {1}"
.
format
(
path
,
ca_types_name
))
ca_val
=
config
.
return_value
(
'ca-value'
)
ca_type
=
{
"name"
:
ca_types_name
,
"ca_val"
:
ca_val
}
civic_based
[
"ca_type"
]
.
append
(
ca_type
)
elif
config
.
exists
(
"elin"
):
elin
=
config
.
return_value
(
"elin"
)
elif
config
.
exists
(
"coordinate-based"
):
config
.
set_level
(
"{} location coordinate-based"
.
format
(
path
))
alt
=
config
.
return_value
(
"altitude"
)
lat
=
config
.
return_value
(
"latitude"
)
long
=
config
.
return_value
(
"longitude"
)
datum
=
config
.
return_value
(
"datum"
)
coordinate_based
[
"altitude"
]
=
alt
coordinate_based
[
"latitude"
]
=
lat
coordinate_based
[
"longitude"
]
=
long
coordinate_based
[
"datum"
]
=
datum
intf
=
{
"name"
:
name
,
"civic_based"
:
civic_based
,
"elin"
:
elin
,
"coordinate_based"
:
coordinate_based
}
return
intf
def
get_location
(
config
):
config
.
set_level
(
'service lldp'
)
intfs_names
=
config
.
list_nodes
(
'interface'
)
if
len
(
intfs_names
)
<
0
:
return
0
if
config
.
exists
(
"disable"
):
return
0
intfs_location
=
[]
for
name
in
intfs_names
:
intf
=
get_location_intf
(
config
,
name
)
intfs_location
.
append
(
intf
)
return
intfs_location
def
get_config
():
conf
=
Config
()
options
=
get_options
(
conf
)
interface_list
=
get_interface_list
(
conf
)
location
=
get_location
(
conf
)
lldp
=
{
"options"
:
options
,
"interface_list"
:
interface_list
,
"location"
:
location
}
return
lldp
def
verify
(
lldp
):
# check location
for
location
in
lldp
[
"location"
]:
# check civic-based
if
len
(
location
[
"civic_based"
])
>
0
:
if
len
(
location
[
"coordinate_based"
])
>
0
or
location
[
"elin"
]:
raise
ConfigError
(
"Can only configure 1 location type for interface {0}"
.
format
(
location
[
"name"
]))
# check country-code
if
not
location
[
"civic_based"
][
"country_code"
]:
raise
ConfigError
(
"Invalid location for interface {0}: must configure the country code"
.
format
(
location
[
"name"
]))
if
not
re
.
match
(
r"^[a-zA-Z]{2}$"
,
location
[
"civic_based"
][
"country_code"
]):
raise
ConfigError
(
"Invalid location for interface {0}: country-code must be 2 characters"
.
format
(
location
[
"name"
]))
# check ca-type
if
len
(
location
[
"civic_based"
][
"ca_type"
])
<
0
:
raise
ConfigError
(
"Invalid location for interface {0}: must define at least 1 ca-type"
.
format
(
location
[
"name"
]))
for
ca_type
in
location
[
"civic_based"
][
"ca_type"
]:
if
not
int
(
ca_type
[
"name"
])
in
range
(
0
,
129
):
raise
ConfigError
(
"Invalid location for interface {0}: ca-type must between 0-128"
.
format
(
location
[
"name"
]))
if
not
ca_type
[
"ca_val"
]:
raise
ConfigError
(
"Invalid location for interface {0}: must configure the ca-value for ca-type {1}"
.
format
(
location
[
"name"
],
ca_type
[
"name"
]))
# check coordinate-based
elif
len
(
location
[
"coordinate_based"
])
>
0
:
# check longitude and latitude
if
not
location
[
"coordinate_based"
][
"longitude"
]:
raise
ConfigError
(
"Must define longitude for interface {0}"
.
format
(
location
[
"name"
]))
if
not
location
[
"coordinate_based"
][
"latitude"
]:
raise
ConfigError
(
"Must define latitude for interface {0}"
.
format
(
location
[
"name"
]))
if
not
re
.
match
(
r"^(\d+)(\.\d+)?[nNsS]$"
,
location
[
"coordinate_based"
][
"latitude"
]):
raise
ConfigError
(
"Invalid location for interface {0}: latitude should be a number followed by S or N"
.
format
(
location
[
"name"
]))
if
not
re
.
match
(
r"^(\d+)(\.\d+)?[eEwW]$"
,
location
[
"coordinate_based"
][
"longitude"
]):
raise
ConfigError
(
"Invalid location for interface {0}: longitude should be a number followed by E or W"
.
format
(
location
[
"name"
]))
# check altitude and datum if exist
if
location
[
"coordinate_based"
][
"altitude"
]:
if
not
re
.
match
(
r"^[-+0-9\.]+$"
,
location
[
"coordinate_based"
][
"altitude"
]):
raise
ConfigError
(
"Invalid location for interface {0}: altitude should be a positive or negative number"
.
format
(
location
[
"name"
]))
if
location
[
"coordinate_based"
][
"datum"
]:
if
not
re
.
match
(
r"^(WGS84|NAD83|MLLW)$"
,
location
[
"coordinate_based"
][
"datum"
]):
raise
ConfigError
(
"Invalid location for interface {0}: datum should be WGS84, NAD83, or MLLW"
.
format
(
location
[
"name"
]))
# check elin
elif
len
(
location
[
"elin"
])
>
0
:
if
not
re
.
match
(
r"^[0-9]{10,25}$"
,
location
[
"elin"
]):
raise
ConfigError
(
"Invalid location for interface {0}: ELIN number must be between 10-25 numbers"
.
format
(
location
[
"name"
]))
# check options
if
lldp
[
"options"
][
"snmp"
]:
if
not
lldp
[
"options"
][
"sys_snmp"
]:
raise
ConfigError
(
"SNMP must be configured to enable LLDP SNMP"
)
def
generate
(
config
):
pass
def
apply
(
config
):
pass
if
__name__
==
'__main__'
:
try
:
c
=
get_config
()
verify
(
c
)
generate
(
c
)
apply
(
c
)
except
ConfigError
as
e
:
print
(
e
)
sys
.
exit
(
1
)
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Sat, Oct 17, 12:57 AM (1 d, 7 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4349882
Default Alt Text
lldp.py (7 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment