From 3bccf682723dbdd25f2b22ff37be494df2fa9922 Mon Sep 17 00:00:00 2001 From: Manuel Kieweg <mail@manuelkieweg.de> Date: Fri, 22 Jan 2021 13:43:08 +0100 Subject: [PATCH] lib path traversal v0.0.1 --- cmd/path-traversal/path_traversal.go | 11 +++-- nucleus/util/path_traversal.go | 74 ++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/cmd/path-traversal/path_traversal.go b/cmd/path-traversal/path_traversal.go index 5275f794b..353c2b8e1 100644 --- a/cmd/path-traversal/path_traversal.go +++ b/cmd/path-traversal/path_traversal.go @@ -3,16 +3,19 @@ package main import ( "code.fbi.h-da.de/cocsn/gosdn/nucleus/util" "code.fbi.h-da.de/cocsn/yang-models/generated/arista" + log "github.com/sirupsen/logrus" ) func main() { - schema,_ := arista.Schema() + log.SetLevel(log.DebugLevel) + schema, _ := arista.Schema() paths := util.NewPaths() - paths.ParseSchema(schema, "device") - for _,v := range paths { + for _, v := range paths { v.Print() } -} + p := paths.StringBuilder() + log.Debug(p) +} diff --git a/nucleus/util/path_traversal.go b/nucleus/util/path_traversal.go index 713f05f7c..9811d6341 100644 --- a/nucleus/util/path_traversal.go +++ b/nucleus/util/path_traversal.go @@ -4,14 +4,18 @@ import ( "fmt" "github.com/openconfig/goyang/pkg/yang" "github.com/openconfig/ygot/ytypes" + log "github.com/sirupsen/logrus" + "strings" ) +const DELIM = "/" + type PathElement struct { Children []*PathElement Name string } -func (p *PathElement)Print() { +func (p *PathElement) Print() { printPE(0, p) } @@ -21,7 +25,7 @@ func printPE(indent int, pe *PathElement) { } fmt.Println(pe.Name) if len(pe.Children) > 0 { - for _,p := range pe.Children { + for _, p := range pe.Children { printPE(indent+1, p) } } @@ -33,34 +37,84 @@ func NewPaths() Paths { type Paths map[string]*PathElement -func (p Paths) processEntry(e *yang.Entry) *PathElement { +func processEntry(e *yang.Entry) *PathElement { if e.Dir != nil { elem := &PathElement{ Children: make([]*PathElement, len(e.Dir)), Name: e.Name, } i := 0 - for _,v := range e.Dir { - elem.Children[i] = p.processEntry(v) + for _, v := range e.Dir { + elem.Children[i] = processEntry(v) i++ } - p[e.Name] = elem return elem } leaf := &PathElement{ - Name: e.Name, + Name: e.Name, } return leaf } func (p Paths) ParseSchema(schema *ytypes.Schema, root string) error { tree := schema.SchemaTree - for _,v := range tree { + for k, v := range tree { if v.Parent != nil { if v.Parent.Name == root { - p.processEntry(v) + path := processEntry(v) + p[k] = path } } } return nil -} \ No newline at end of file +} + +func (p Paths) StringBuilder() []string { + paths := make([]string, 0) + ch := make(chan string) + stop := make(chan bool) + val := make(chan []string) + go appendix(ch, stop, val) + for _, v := range p { + var b strings.Builder + stringBuilder(ch, &b, v) + } + stop <- true + paths = <-val + return paths +} + +func appendix(c chan string, stop chan bool,p chan []string) { + paths := make([]string, 0) + var sig bool + for { + select { + case path := <-c: + paths = append(paths, path) + log.Debug(path) + case sig = <-stop: + log.Debug("Signal received: %v", sig) + + } + if sig {break} + } + p <- paths +} + +func stringBuilder(ch chan string, b *strings.Builder, v *PathElement) { + if b.Len() == 0 { + b.WriteString("/") + } + b.WriteString(v.Name) + if v.Children != nil { + b.WriteString(DELIM) + for _, c := range v.Children { + var b_cpy strings.Builder + b_cpy.WriteString(b.String()) + stringBuilder(ch, &b_cpy, c) + } + } else { + log.Debug("leaf") + ch <- b.String() + } +} -- GitLab