package asaModels import ( "regexp" "strings" ) var connRE = regexp.MustCompile(`(\S+)[ ]+(\S+)[ ]+(\S+)[ ]+(\S+)[ ]+(\S+)[ ](idle)[ ](\S+)[ ](bytes)[ ](\S+)[ ]+(flags)[ ]+(\S*)`) type ( Conns struct { ConnTable []*ConnEntry `json:"conn_table"` } ConnEntry struct { Proto string `json:"protocol"` OutInt string `json:"outside_interface"` OutAddr string `json:"outside_addr"` OutPort string `json:"outside_port"` InInt string `json:"inside_interface"` InAddr string `json:"inside_addr"` InPort string `json:"inside_port"` Idle string `json:"idle_time"` Bytes string `json:"bytes"` Flags string `json:"flags"` } ) // Function to parse ASA 'show conn' output func (a *Conns) Parse(s string) { match := connRE.FindAllStringSubmatch(s, -1) if len(match) > 0 { for _, v := range match { protocol := v[1] connFlags := v[11] insideInt := v[4] outsideInt := v[2] // Split addr:port tuples outTuple := strings.Split(v[3], ":") outsideAddr, outsidePort := outTuple[0], outTuple[1] inTuple := strings.Split(v[5], ":") insideAddr, insidePort := inTuple[0], inTuple[1] // Pop them trailing commas, bro insidePort = strings.Replace(insidePort, ",", "", -1) idleTimer := strings.Replace(v[7], ",", "", -1) byteCount := strings.Replace(v[9], ",", "", -1) // Populate the model struct entries a.ConnTable = append(a.ConnTable, &ConnEntry{ Proto: protocol, OutInt: outsideInt, OutAddr: outsideAddr, OutPort: outsidePort, InInt: insideInt, InAddr: insideAddr, InPort: insidePort, Idle: idleTimer, Bytes: byteCount, Flags: connFlags, }) } } }