package pkg import ( "errors" "strconv" "strings" ) type FastL4Profile struct { ProfileCommon ClientTimeout int `json:"client_timeout"` ExplicitFlowMigration string `json:"explicit_flow_migration"` HardwareSYNCookie string `json:"hardware_syn_cookie"` IdleTimeout int `json:"idle_timeout"` IPDFMode string `json:"ip_df_mode"` IPTOSToClient string `json:"ip_tos_to_client"` IPTOSToServer string `json:"ip_tos_to_server"` IPTTLMode string `json:"ip_ttl_mode"` IPTTLv4 int `json:"ip_ttl_v4"` IPTTLv6 int `json:"ip_ttl_v6"` KeepAliveInterval string `json:"keep_alive_interval"` LateBinding string `json:"late_binding"` LinkQOSToClient string `json:"link_qos_to_client"` LinkQOSToServer string `json:"link_qos_to_server"` LooseClose string `json:"loose_close"` LooseInitialization string `json:"loose_initialization"` // disabled MSSOverride int `json:"mss_override"` // 0 PriorityToClient string `json:"priority_to_client"` // pass_through PriorityToServer string `json:"priority_to_server"` // pass_through PVAAcceleration string `json:"pva_acceleration"` // full PVADynamicClientPackets int `json:"pva_dynamic_client_packets"` // 1 PVADynamicServerPackets int `json:"pva_dynamic_server_packets"` // 0 PVAFlowAging string `json:"pva_flow_aging"` // enabled PVAFlowEvict string `json:"pva_flow_evict"` // enabled PVAOffloadDynamic string `json:"pva_offload_dynamic"` // enabled PVAOffloadState string `json:"pva_offload_state"` // embryonic ReassembleFragments string `json:"reassemble_fragments"` // disabled ReceiveWindowSize int `json:"receive_window_size"` // 0 ResetOnTimeout string `json:"reset_on_timeout"` // enabled RTTFromClient string `json:"rtt_from_client"` // disabled RTTFromServer string `json:"rtt_from_server"` // disabled ServerSack string `json:"server_sack"` // disabled ServerTimestamp string `json:"server_timestamp"` // disabled SoftwareSYNCookie string `json:"software_syn_cookie"` // disabled SYNCookieWhitelist string `json:"syn_cookie_whitelist"` // disabled TCPCloseTimeout int `json:"tcp_close_timeout"` // 5 TCPGenerateISN string `json:"tcp_generate_isn"` // disabled TCPHandshakeTimeout int `json:"tcp_handshake_timeout"` // 5 TCPStripSack string `json:"tcp_strip_sack"` // disabled TCPTimestampMode string `json:"tcp_timestamp_mode"` // preserve TCPWScaleMode string `json:"tcp_wscale_mode"` // preserve TimeoutReceovery string `json:"timeout_recovery"` // disconnect } func ParseFastL4Profile(raw string) (*FastL4Profile, error) { p := new(FastL4Profile) split := strings.Split(raw, "\n") if !strings.Contains(split[0], "ltm profile fastl4") { return nil, errors.New("not a fastl4 profile") } p.ProfileCommon = parseCommon(raw) for _, line := range split { f := strings.Fields(line) switch strings.ToLower(f[0]) { case "client-timeout": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.ClientTimeout = i case "explicit-flow-migration": p.ExplicitFlowMigration = strings.Join(f[1:], " ") case "hardware-syn-cookie": p.HardwareSYNCookie = strings.Join(f[1:], " ") case "idle-timeout": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.IdleTimeout = i case "ip-df-mode": p.IPDFMode = strings.Join(f[1:], " ") case "ip-tos-to-client": p.IPTOSToClient = strings.Join(f[1:], " ") case "ip-tos-to-server": p.IPTOSToServer = strings.Join(f[1:], " ") case "ip-ttl-mode": p.IPTTLMode = strings.Join(f[1:], " ") case "ip-ttl-v4": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.IPTTLv4 = i case "ip-ttl-v6": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.IPTTLv6 = i case "keep-alive-interval": p.KeepAliveInterval = strings.Join(f[1:], " ") case "late-binding": p.LateBinding = strings.Join(f[1:], " ") case "link-qos-to-client": p.LinkQOSToClient = strings.Join(f[1:], " ") case "link-qos-to-server": p.LinkQOSToServer = strings.Join(f[1:], " ") case "loose-close": p.LooseClose = strings.Join(f[1:], " ") case "loose-initialization": p.LooseInitialization = strings.Join(f[1:], " ") case "mss-override": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.MSSOverride = i case "priority-to-client": p.PriorityToClient = strings.Join(f[1:], " ") case "priority-to-server": p.PriorityToServer = strings.Join(f[1:], " ") case "pva-acceleration": p.PVAAcceleration = strings.Join(f[1:], " ") case "pva-dynamic-client-packets": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.PVADynamicClientPackets = i case "pva-dynamic-server-packets": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.PVADynamicServerPackets = i case "pva-flow-aging": p.PVAFlowAging = strings.Join(f[1:], " ") case "pva-flow-evict": p.PVAFlowEvict = strings.Join(f[1:], " ") case "pva-offload-dynamic": p.PVAOffloadDynamic = strings.Join(f[1:], " ") case "pva-offload-state": p.PVAOffloadState = strings.Join(f[1:], " ") case "reassemble-fragments": p.ReassembleFragments = strings.Join(f[1:], " ") case "receive-window-size": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.ReceiveWindowSize = i case "reset-on-timeout": p.ResetOnTimeout = strings.Join(f[1:], " ") case "rtt-from-client": p.RTTFromClient = strings.Join(f[1:], " ") case "rtt-from-server": p.RTTFromServer = strings.Join(f[1:], " ") case "server-sack": p.ServerSack = strings.Join(f[1:], " ") case "server-timestamp": p.ServerTimestamp = strings.Join(f[1:], " ") case "software-syn-cookie": p.SoftwareSYNCookie = strings.Join(f[1:], " ") case "syn-cookie-whitelist": p.SYNCookieWhitelist = strings.Join(f[1:], " ") case "tcp-close-timeout": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.TCPCloseTimeout = i case "tcp-generate-isn": p.TCPGenerateISN = strings.Join(f[1:], " ") case "tcp-handshake-timeout": i, err := strconv.Atoi(f[1]) if err != nil { log.WithField("data", f[1]).Error(err.Error()) return nil, err } p.TCPHandshakeTimeout = i case "tcp-strip-sack": p.TCPStripSack = strings.Join(f[1:], " ") case "tcp-timestamp-mode": p.TCPTimestampMode = strings.Join(f[1:], " ") case "tcp-wscale-mode": p.TCPWScaleMode = strings.Join(f[1:], " ") case "timeout-recovery": p.TimeoutReceovery = strings.Join(f[1:], " ") } } return p, nil }