Skip to content

Commit

Permalink
policy: T6751: add missing completion helpers for community-list
Browse files Browse the repository at this point in the history
Add all missing, well-known values for the community-list regex.
  • Loading branch information
c-po committed Sep 30, 2024
1 parent 2ba5089 commit c7ee366
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 2 deletions.
52 changes: 50 additions & 2 deletions interface-definitions/policy.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,11 @@
<properties>
<help>Regular expression to match against a community-list</help>
<completionHelp>
<list>local-AS no-advertise no-export internet additive</list>
<list>local-AS no-advertise no-export internet graceful-shutdown accept-own-nexthop accept-own route-filter-translated-v4 route-filter-v4 route-filter-translated-v6 route-filter-v6 llgr-stale no-llgr blackhole no-peer additive</list>
</completionHelp>
<valueHelp>
<format>&lt;aa:nn&gt;</format>
<description>Community number in AA:NN format</description>
<description>Community number in AA:NN format where AA and NN are (0-65535)</description>
</valueHelp>
<valueHelp>
<format>local-AS</format>
Expand All @@ -224,10 +224,58 @@
<format>internet</format>
<description>Well-known communities value 0</description>
</valueHelp>
<valueHelp>
<format>graceful-shutdown</format>
<description>Well-known communities value GRACEFUL_SHUTDOWN 0xFFFF0000</description>
</valueHelp>
<valueHelp>
<format>accept-own-nexthop</format>
<description>Well-known communities value ACCEPT_OWN_NEXTHOP 0xFFFF0008</description>
</valueHelp>
<valueHelp>
<format>accept-own</format>
<description>Well-known communities value ACCEPT_OWN 0xFFFF0001 65535:1</description>
</valueHelp>
<valueHelp>
<format>route-filter-translated-v4</format>
<description>Well-known communities value ROUTE_FILTER_TRANSLATED_v4 0xFFFF0002 65535:2</description>
</valueHelp>
<valueHelp>
<format>route-filter-v4</format>
<description>Well-known communities value ROUTE_FILTER_v4 0xFFFF0003 65535:3</description>
</valueHelp>
<valueHelp>
<format>route-filter-translated-v6</format>
<description>Well-known communities value ROUTE_FILTER_TRANSLATED_v6 0xFFFF0004 65535:4</description>
</valueHelp>
<valueHelp>
<format>route-filter-v6</format>
<description>Well-known communities value ROUTE_FILTER_v6 0xFFFF0005 65535:5</description>
</valueHelp>
<valueHelp>
<format>llgr-stale</format>
<description>Well-known communities value LLGR_STALE 0xFFFF0006 65535:6</description>
</valueHelp>
<valueHelp>
<format>no-llgr</format>
<description>Well-known communities value NO_LLGR 0xFFFF0007 65535:7</description>
</valueHelp>
<valueHelp>
<format>blackhole</format>
<description>Well-known communities value BLACKHOLE 0xFFFF029A 65535:666</description>
</valueHelp>
<valueHelp>
<format>no-peer</format>
<description>Well-known communities value NOPEER 0xFFFFFF04 65535:65284</description>
</valueHelp>
<valueHelp>
<format>additive</format>
<description>New value is appended to the existing value</description>
</valueHelp>
<constraint>
<regex>(local-AS|no-advertise|no-export|internet|graceful-shutdown|accept-own-nexthop|accept-own|route-filter-translated-v4|route-filter-v4|route-filter-translated-v6|route-filter-v6|llgr-stale|no-llgr|blackhole|no-peer|additive)</regex>
<validator name="bgp-community-list"/>
</constraint>
</properties>
</leafNode>
</children>
Expand Down
53 changes: 53 additions & 0 deletions src/validators/bgp-community-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env python3

# Copyright 2024 VyOS maintainers and contributors <[email protected]>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.

from argparse import ArgumentParser
from sys import exit

from vyos.template import is_ipv4

COMM_MAX_2_OCTET: int = 65535

if __name__ == '__main__':
# add an argument with community
parser: ArgumentParser = ArgumentParser()
parser.add_argument('community', type=str)
args = parser.parse_args()

for community in args.community.split():
if community.count(':') != 1:
print("Invalid community format")
exit(1)
try:
# try to extract community parts from an argument
comm_left: str = community.split(':')[0]
comm_right: int = int(community.split(':')[1])

# check if left part is an IPv4 address
if is_ipv4(comm_left) and 0 <= comm_right <= COMM_MAX_2_OCTET:
continue
# check if a left part is a number
if 0 <= int(comm_left) <= COMM_MAX_2_OCTET \
and 0 <= comm_right <= COMM_MAX_2_OCTET:
continue

raise Exception()

except Exception:
# fail if something was wrong
print("Invalid community format")
exit(1)

0 comments on commit c7ee366

Please sign in to comment.