package swModels import ( "regexp" "strconv" "strings" ) var ( IPACLRE = regexp.MustCompile(`(?i)(i|)(p|pv6)\s+access-list\s+(\S+)\n((.|\n)*?)(\n\S|$)`) IPEXTACLRE = regexp.MustCompile(`(?i)(i|)(p|pv6)\s+access-list\s+extended\s+(\S+)\n((.|\n)*?)(\n\S|$)`) LINEACLRE = regexp.MustCompile(`(?i)([0-9]+)\s+(.*?)$`) ) type ( AccessLists struct { AccessLists []*AccessList `json:"access_lists"` } AccessList struct { Name string `json:"name"` IPV6 bool `json:"ipv6"` Extended bool `json:"extended"` Rules []*ACLRule `json:"rules"` } ACLRule struct { Line int `json:"line"` Rule string `json:"rule"` } ) func (a *AccessLists) Parse(s *string) { for _, acl := range IPACLRE.FindAllStringSubmatch(*s, -1) { a.AccessLists = append(a.AccessLists, &AccessList{ Name: acl[3], IPV6: isV6(&acl[2]), Rules: parseACL(&acl[4]), }) } for _, acl := range IPEXTACLRE.FindAllStringSubmatch(*s, -1) { a.AccessLists = append(a.AccessLists, &AccessList{ Name: acl[3], IPV6: isV6(&acl[2]), Extended: true, Rules: parseACL(&acl[4]), }) } } func isV6(s *string) bool { if *s == "pv6" { return true } return false } func parseACL(s *string) (rules []*ACLRule) { for i, r := range strings.Split(*s, "\n") { r = strings.TrimRight(r, " ") r = strings.TrimLeft(r, " ") if r == "" { continue } m := LINEACLRE.FindStringSubmatch(r) if len(m) == 0 { rules = append(rules, &ACLRule{ Line: i + 1, Rule: r, }) continue } rules = append(rules, &ACLRule{ Line: func() int { if n, err := strconv.Atoi(m[1]); err == nil { return n } return 0 }(), Rule: m[2], }) } return }