94 lines
2.3 KiB
Python
94 lines
2.3 KiB
Python
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
# FRR CLI preprocessor
|
||
|
#
|
||
|
# Copyright (C) 2017 David Lamparter for NetDEF, Inc.
|
||
|
|
||
|
import os, stat
|
||
|
|
||
|
try:
|
||
|
from enum import IntFlag as _IntFlag
|
||
|
except ImportError:
|
||
|
# python <3.6
|
||
|
from enum import IntEnum as _IntFlag # type: ignore
|
||
|
|
||
|
import _clippy
|
||
|
from _clippy import (
|
||
|
parse,
|
||
|
Graph,
|
||
|
GraphNode,
|
||
|
CMD_ATTR_YANG,
|
||
|
CMD_ATTR_HIDDEN,
|
||
|
CMD_ATTR_DEPRECATED,
|
||
|
CMD_ATTR_NOSH,
|
||
|
elf_notes,
|
||
|
)
|
||
|
|
||
|
|
||
|
frr_top_src = os.path.dirname(
|
||
|
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||
|
)
|
||
|
|
||
|
|
||
|
def graph_iterate(graph):
|
||
|
"""iterator yielding all nodes of a graph
|
||
|
|
||
|
nodes arrive in input/definition order, graph circles are avoided.
|
||
|
"""
|
||
|
|
||
|
queue = [(graph.first(), frozenset(), 0)]
|
||
|
while len(queue) > 0:
|
||
|
node, stop, depth = queue.pop(0)
|
||
|
yield node, depth
|
||
|
|
||
|
join = node.join()
|
||
|
if join is not None:
|
||
|
queue.insert(0, (join, stop.union(frozenset([node])), depth))
|
||
|
join = frozenset([join])
|
||
|
|
||
|
stop = join or stop
|
||
|
nnext = node.next()
|
||
|
for n in reversed(nnext):
|
||
|
if n not in stop and n is not node:
|
||
|
queue.insert(0, (n, stop, depth + 1))
|
||
|
|
||
|
|
||
|
def dump(graph):
|
||
|
"""print out clippy.Graph"""
|
||
|
|
||
|
for i, depth in graph_iterate(graph):
|
||
|
print("\t%s%s %r" % (" " * (depth * 2), i.type, i.text))
|
||
|
|
||
|
|
||
|
def wrdiff(filename, buf, reffiles=[]):
|
||
|
"""write buffer to file if contents changed"""
|
||
|
|
||
|
expl = ""
|
||
|
if hasattr(buf, "getvalue"):
|
||
|
buf = buf.getvalue()
|
||
|
old = None
|
||
|
try:
|
||
|
old = open(filename, "r").read()
|
||
|
except:
|
||
|
pass
|
||
|
if old == buf:
|
||
|
for reffile in reffiles:
|
||
|
# ensure output timestamp is newer than inputs, for make
|
||
|
reftime = os.stat(reffile)[stat.ST_MTIME]
|
||
|
outtime = os.stat(filename)[stat.ST_MTIME]
|
||
|
if outtime <= reftime:
|
||
|
os.utime(filename, (reftime + 1, reftime + 1))
|
||
|
# sys.stderr.write('%s unchanged, not written\n' % (filename))
|
||
|
return
|
||
|
|
||
|
newname = "%s.new-%d" % (filename, os.getpid())
|
||
|
with open(newname, "w") as out:
|
||
|
out.write(buf)
|
||
|
os.rename(newname, filename)
|
||
|
|
||
|
|
||
|
class CmdAttr(_IntFlag):
|
||
|
YANG = CMD_ATTR_YANG
|
||
|
HIDDEN = CMD_ATTR_HIDDEN
|
||
|
DEPRECATED = CMD_ATTR_DEPRECATED
|
||
|
NOSH = CMD_ATTR_NOSH
|