F5LTM

Manages F5 LTM.

IT Services · F5 LTM

Details

IDF5LTM
ProviderF5
CategoryIT Services
From Version6.0.0
Docker Imagedemisto/python3:3.12.8.3296088
Supported ModulesAgentix XSIAM

README

Manages F5 LTM
This integration was integrated and tested with version 16.1.0 of F5LTM

Configure F5 LTM in Cortex

Parameter Description Required
Server Address   True
Port Number   True
The administrative partition   False
Username The Username to use for connection True
Password   True
Trust any certificate (not secure) Trust any certificate (not secure). False
Use system proxy settings Use system proxy settings. False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

f5-ltm-get-pools


Get a list of all pools

Base Command

f5-ltm-get-pools

Input

Argument Name Description Required
expand Expand pools in the response. Possible values are: True, False. Default is False. Optional
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Pools.membersReference.isSubcollection Boolean Member reference subcollection retrieved
F5.LTM.Pools.membersReference.link String Member reference links
F5.LTM.Pools.monitor String Pool monitor listener
F5.LTM.Pools.name String Pool names
F5.LTM.Pools.partition String Configuration partition

Command Example

!f5-ltm-get-pools expand="false"

Context Example

{
    "F5": {
        "LTM": {
            "Pools": [
                {
                    "membersReference": {
                        "isSubcollection": true,
                        "link": "https://localhost/mgmt/tm/ltm/pool/~Common~Temp/members?ver=16.1.0"
                    },
                    "monitor": "/Common/https_443",
                    "name": "Temp",
                    "partition": "Common"
                },
                {
                    "membersReference": {
                        "isSubcollection": true,
                        "link": "https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members?ver=16.1.0"
                    },
                    "monitor": "/Common/https_443",
                    "name": "XSOAR",
                    "partition": "Common"
                }
            ]
        }
    }
}

Human Readable Output

Results

membersReference monitor name partition
link: https://localhost/mgmt/tm/ltm/pool/~Common~Temp/members?ver=16.1.0
isSubcollection: true
/Common/https_443 Temp Common
link: https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members?ver=16.1.0
isSubcollection: true
/Common/https_443 XSOAR Common

f5-ltm-get-pool


Get pool details

Base Command

f5-ltm-get-pool

Input

Argument Name Description Required
pool_name Pool Name. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Pools.allowNat String Pool Nat allowed
F5.LTM.Pools.allowSnat String Pool SNat allowed
F5.LTM.Pools.fullPath String Pool full path
F5.LTM.Pools.generation Number Pool generation
F5.LTM.Pools.ignorePersistedWeight String Ignore Persisted Weight status
F5.LTM.Pools.ipTosToClient String Client pass through status
F5.LTM.Pools.ipTosToServer String Server pass through status
F5.LTM.Pools.kind String Pool kind
F5.LTM.Pools.linkQosToClient String Link QOS to client status
F5.LTM.Pools.linkQosToServer String Link QOS to server status
F5.LTM.Pools.loadBalancingMode String Pool load balancing mode
F5.LTM.Pools.membersReference.isSubcollection Boolean Members reference subcollection retrieved
F5.LTM.Pools.membersReference.link String Members reference link
F5.LTM.Pools.minActiveMembers Number Pool minimum active members
F5.LTM.Pools.minUpMembers Number Pool minimum Up members
F5.LTM.Pools.minUpMembersAction String Pool minimum Up members action
F5.LTM.Pools.minUpMembersChecking String Pool minimum Up members checking
F5.LTM.Pools.monitor String Pool monitor listener
F5.LTM.Pools.name String Pool name
F5.LTM.Pools.partition String Configuration partition
F5.LTM.Pools.queueDepthLimit Number Pool depth limit
F5.LTM.Pools.queueOnConnectionLimit String Pool depth queue on connection limit
F5.LTM.Pools.queueTimeLimit Number Pool queue time limit
F5.LTM.Pools.reselectTries Number Pool reselect tries
F5.LTM.Pools.selfLink String Pool self link
F5.LTM.Pools.serviceDownAction String Pool service down action
F5.LTM.Pools.slowRampTime Number Pool slow ramp time

Command Example

!f5-ltm-get-pool pool_name="XSOAR"

Context Example

{
    "F5": {
        "LTM": {
            "Pools": {
                "allowNat": "yes",
                "allowSnat": "yes",
                "fullPath": "/Common/XSOAR",
                "generation": 1,
                "ignorePersistedWeight": "disabled",
                "ipTosToClient": "pass-through",
                "ipTosToServer": "pass-through",
                "kind": "tm:ltm:pool:poolstate",
                "linkQosToClient": "pass-through",
                "linkQosToServer": "pass-through",
                "loadBalancingMode": "round-robin",
                "membersReference": {
                    "isSubcollection": true,
                    "link": "https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members?ver=16.1.0"
                },
                "minActiveMembers": 0,
                "minUpMembers": 0,
                "minUpMembersAction": "failover",
                "minUpMembersChecking": "disabled",
                "monitor": "/Common/https_443",
                "name": "XSOAR",
                "partition": "Common",
                "queueDepthLimit": 0,
                "queueOnConnectionLimit": "disabled",
                "queueTimeLimit": 0,
                "reselectTries": 0,
                "selfLink": "https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR?ver=16.1.0",
                "serviceDownAction": "none",
                "slowRampTime": 10
            }
        }
    }
}

Human Readable Output

Results

allowNat allowSnat fullPath generation ignorePersistedWeight ipTosToClient ipTosToServer kind linkQosToClient linkQosToServer loadBalancingMode membersReference minActiveMembers minUpMembers minUpMembersAction minUpMembersChecking monitor name partition queueDepthLimit queueOnConnectionLimit queueTimeLimit reselectTries selfLink serviceDownAction slowRampTime
yes yes /Common/XSOAR 1 disabled pass-through pass-through tm:ltm:pool:poolstate pass-through pass-through round-robin link: https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members?ver=16.1.0
isSubcollection: true
0 0 failover disabled /Common/https_443 XSOAR Common 0 disabled 0 0 https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR?ver=16.1.0 none 10

f5-ltm-get-pool-members


Get Pool Members

Base Command

f5-ltm-get-pool-members

Input

Argument Name Description Required
pool_name Pool Name. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Pools.members.address String Pool member address
F5.LTM.Pools.members.connectionLimit Number Pool member connection limit
F5.LTM.Pools.members.dynamicRatio Number Pool member dynamic ratio
F5.LTM.Pools.members.ephemeral String Pool member ephemeral
F5.LTM.Pools.members.fqdn.autopopulate String Pool member fqdn autopopulate
F5.LTM.Pools.members.fullPath String Pool member full path
F5.LTM.Pools.members.generation Number Pool member generation
F5.LTM.Pools.members.inheritProfile String Pool member inherit profile
F5.LTM.Pools.members.kind String Pool member kind
F5.LTM.Pools.members.logging String Pool member logging
F5.LTM.Pools.members.monitor String Pool member monitor
F5.LTM.Pools.members.name String Pool member name
F5.LTM.Pools.members.partition String Pool member config partition
F5.LTM.Pools.members.priorityGroup Number Pool member priority group
F5.LTM.Pools.members.rateLimit String Pool member rate limit
F5.LTM.Pools.members.ratio Number Pool member ratio
F5.LTM.Pools.members.selfLink String Pool member self link
F5.LTM.Pools.members.session String Pool member session
F5.LTM.Pools.members.state String Pool member state

Command Example

!f5-ltm-get-pool-members pool_name="XSOAR"

Context Example

{
    "F5": {
        "LTM": {
            "Pools": {
                "members": [
                    {
                        "address": "10.10.10.102",
                        "connectionLimit": 0,
                        "dynamicRatio": 1,
                        "ephemeral": "false",
                        "fqdn": {
                            "autopopulate": "disabled"
                        },
                        "fullPath": "/Common/XSOAR1:443",
                        "generation": 1,
                        "inheritProfile": "enabled",
                        "kind": "tm:ltm:pool:members:membersstate",
                        "logging": "disabled",
                        "monitor": "default",
                        "name": "XSOAR1:443",
                        "partition": "Common",
                        "priorityGroup": 0,
                        "rateLimit": "disabled",
                        "ratio": 1,
                        "selfLink": "https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members/~Common~XSOAR1:443?ver=16.1.0",
                        "session": "monitor-enabled",
                        "state": "up"
                    },
                    {
                        "address": "1.1.1.1",
                        "connectionLimit": 0,
                        "dynamicRatio": 1,
                        "ephemeral": "false",
                        "fqdn": {
                            "autopopulate": "disabled"
                        },
                        "fullPath": "/Common/XSOAR2:443",
                        "generation": 1,
                        "inheritProfile": "enabled",
                        "kind": "tm:ltm:pool:members:membersstate",
                        "logging": "disabled",
                        "monitor": "default",
                        "name": "XSOAR2:443",
                        "partition": "Common",
                        "priorityGroup": 0,
                        "rateLimit": "disabled",
                        "ratio": 1,
                        "selfLink": "https://localhost/mgmt/tm/ltm/pool/~Common~XSOAR/members/~Common~XSOAR2:443?ver=16.1.0",
                        "session": "monitor-enabled",
                        "state": "up"
                    }
                ],
                "name": "XSOAR"
            }
        }
    }
}

Human Readable Output

Pool Members

members name
XSOAR1:443,
XSOAR2:443
XSOAR

f5-ltm-get-nodes


Get a list of all nodes

Input

Argument Name Description Required
partition The administrative partition. Optional

Base Command

f5-ltm-get-nodes

Input

There are no input arguments for this command.

Context Output

Path Type Description
F5.LTM.Nodes.address String Node address
F5.LTM.Nodes.name String Node name
F5.LTM.Nodes.partition String Configuration parition
F5.LTM.Nodes.session String Node session status
F5.LTM.Nodes.state String Node checking state

Command Example


#### Context Example

```json
{
    "F5": {
        "LTM": {
            "Nodes": [
                {
                    "address": "2.2.2.2",
                    "name": "Test",
                    "partition": "Common",
                    "session": "user-enabled",
                    "state": "unchecked"
                },
                {
                    "address": "10.10.10.102",
                    "name": "XSOAR1",
                    "partition": "Common",
                    "session": "user-enabled",
                    "state": "unchecked"
                },
                {
                    "address": "1.1.1.1",
                    "name": "XSOAR2",
                    "partition": "Common",
                    "session": "user-enabled",
                    "state": "unchecked"
                }
            ]
        }
    }
}

Human Readable Output

Results

address name partition session state
2.2.2.2 Test Common user-enabled unchecked
10.10.10.102 XSOAR1 Common user-enabled unchecked
1.1.1.1 XSOAR2 Common user-enabled unchecked

f5-ltm-get-node


Get node details

Base Command

f5-ltm-get-node

Input

Argument Name Description Required
node_name Node Name. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.address String Node address
F5.LTM.Nodes.connectionLimit Number Pool node connection limit
F5.LTM.Nodes.dynamicRatio Number Pool node dynamic ratio
F5.LTM.Nodes.ephemeral String Pool node ephemeral
F5.LTM.Nodes.fqdn.addressFamily String Pool node fqdn address family
F5.LTM.Nodes.fqdn.autopopulate String Pool node fqdn autopopulate
F5.LTM.Nodes.fqdn.downInterval Number Pool node fqdn down interval
F5.LTM.Nodes.fqdn.interval String Pool node fqdn interval
F5.LTM.Nodes.fullPath String Pool member full path
F5.LTM.Nodes.generation Number Pool node generation
F5.LTM.Nodes.kind String Pool node kind
F5.LTM.Nodes.logging String Pool node logging status
F5.LTM.Nodes.monitor String Pool node monitor listener
F5.LTM.Nodes.name String Pool node name
F5.LTM.Nodes.partition String Pool node configuration partition
F5.LTM.Nodes.rateLimit String Pool node rate limit
F5.LTM.Nodes.ratio Number Pool node ratio
F5.LTM.Nodes.selfLink String Pool node self link
F5.LTM.Nodes.session String Pool node session status
F5.LTM.Nodes.state String Pool node checking state

Command Example

!f5-ltm-get-node node_name="Test"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "address": "2.2.2.2",
                "connectionLimit": 0,
                "dynamicRatio": 1,
                "ephemeral": "false",
                "fqdn": {
                    "addressFamily": "ipv4",
                    "autopopulate": "disabled",
                    "downInterval": 5,
                    "interval": "3600"
                },
                "fullPath": "/Common/Test",
                "generation": 1,
                "kind": "tm:ltm:node:nodestate",
                "logging": "disabled",
                "monitor": "default",
                "name": "Test",
                "partition": "Common",
                "rateLimit": "disabled",
                "ratio": 1,
                "selfLink": "https://localhost/mgmt/tm/ltm/node/~Common~Test?ver=16.1.0",
                "session": "user-enabled",
                "state": "unchecked"
            }
        }
    }
}

Human Readable Output

Results

address connectionLimit dynamicRatio ephemeral fqdn fullPath generation kind logging monitor name partition rateLimit ratio selfLink session state
2.2.2.2 0 1 false addressFamily: ipv4
autopopulate: disabled
downInterval: 5
interval: 3600
/Common/Test 1 tm:ltm:node:nodestate disabled default Test Common disabled 1 https://localhost/mgmt/tm/ltm/node/~Common~Test?ver=16.1.0 user-enabled unchecked

f5-ltm-disable-node


Disable a node

Base Command

f5-ltm-disable-node

Input

Argument Name Description Required
node_name Node to disable. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.address String Node address
F5.LTM.Nodes.connectionLimit Number Pool node connection limit
F5.LTM.Nodes.dynamicRatio Number Pool node dynamic ratio
F5.LTM.Nodes.ephemeral String Pool node ephemeral
F5.LTM.Nodes.fqdn.addressFamily String Pool node fqdn address family
F5.LTM.Nodes.fqdn.autopopulate String Pool node fqdn autopopulate
F5.LTM.Nodes.fqdn.downInterval Number Pool node fqdn down interval
F5.LTM.Nodes.fqdn.interval String Pool node fqdn interval
F5.LTM.Nodes.fullPath String Pool member full path
F5.LTM.Nodes.generation Number Pool node generation
F5.LTM.Nodes.kind String Pool node kind
F5.LTM.Nodes.logging String Pool node logging status
F5.LTM.Nodes.monitor String Pool node monitor listener
F5.LTM.Nodes.name String Pool node name
F5.LTM.Nodes.partition String Pool node configuration partition
F5.LTM.Nodes.rateLimit String Pool node rate limit
F5.LTM.Nodes.ratio Number Pool node ratio
F5.LTM.Nodes.selfLink String Pool node self link
F5.LTM.Nodes.session String Pool node session status
F5.LTM.Nodes.state String Pool node checking state

Command Example

!f5-ltm-disable-node node_name="XSOAR1"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "address": "10.10.10.102",
                "connectionLimit": 0,
                "dynamicRatio": 1,
                "ephemeral": "false",
                "fqdn": {
                    "addressFamily": "ipv4",
                    "autopopulate": "disabled",
                    "downInterval": 5,
                    "interval": "3600"
                },
                "fullPath": "/Common/XSOAR1",
                "generation": 68,
                "kind": "tm:ltm:node:nodestate",
                "logging": "disabled",
                "monitor": "default",
                "name": "XSOAR1",
                "partition": "Common",
                "rateLimit": "disabled",
                "ratio": 1,
                "selfLink": "https://localhost/mgmt/tm/ltm/node/~Common~XSOAR1?ver=16.1.0",
                "session": "user-disabled",
                "state": "unchecked"
            }
        }
    }
}

Human Readable Output

Results

address connectionLimit dynamicRatio ephemeral fqdn fullPath generation kind logging monitor name partition rateLimit ratio selfLink session state
10.10.10.102 0 1 false addressFamily: ipv4
autopopulate: disabled
downInterval: 5
interval: 3600
/Common/XSOAR1 68 tm:ltm:node:nodestate disabled default XSOAR1 Common disabled 1 https://localhost/mgmt/tm/ltm/node/~Common~XSOAR1?ver=16.1.0 user-disabled unchecked

f5-ltm-enable-node


Enable a node

Base Command

f5-ltm-enable-node

Input

Argument Name Description Required
node_name Node to enable. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.address String Node address
F5.LTM.Nodes.connectionLimit Number Pool node connection limit
F5.LTM.Nodes.dynamicRatio Number Pool node dynamic ratio
F5.LTM.Nodes.ephemeral String Pool node ephemeral
F5.LTM.Nodes.fqdn.addressFamily String Pool node fqdn address family
F5.LTM.Nodes.fqdn.autopopulate String Pool node fqdn autopopulate
F5.LTM.Nodes.fqdn.downInterval Number Pool node fqdn down interval
F5.LTM.Nodes.fqdn.interval String Pool node fqdn interval
F5.LTM.Nodes.fullPath String Pool member full path
F5.LTM.Nodes.generation Number Pool node generation
F5.LTM.Nodes.kind String Pool node kind
F5.LTM.Nodes.logging String Pool node logging status
F5.LTM.Nodes.monitor String Pool node monitor listener
F5.LTM.Nodes.name String Pool node name
F5.LTM.Nodes.partition String Pool node configuration partition
F5.LTM.Nodes.rateLimit String Pool node rate limit
F5.LTM.Nodes.ratio Number Pool node ratio
F5.LTM.Nodes.selfLink String Pool node self link
F5.LTM.Nodes.session String Pool node session status
F5.LTM.Nodes.state String Pool node checking state

Command Example

!f5-ltm-enable-node node_name="XSOAR1"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "address": "10.10.10.102",
                "connectionLimit": 0,
                "dynamicRatio": 1,
                "ephemeral": "false",
                "fqdn": {
                    "addressFamily": "ipv4",
                    "autopopulate": "disabled",
                    "downInterval": 5,
                    "interval": "3600"
                },
                "fullPath": "/Common/XSOAR1",
                "generation": 67,
                "kind": "tm:ltm:node:nodestate",
                "logging": "disabled",
                "monitor": "default",
                "name": "XSOAR1",
                "partition": "Common",
                "rateLimit": "disabled",
                "ratio": 1,
                "selfLink": "https://localhost/mgmt/tm/ltm/node/~Common~XSOAR1?ver=16.1.0",
                "session": "user-enabled",
                "state": "unchecked"
            }
        }
    }
}

Human Readable Output

Results

address connectionLimit dynamicRatio ephemeral fqdn fullPath generation kind logging monitor name partition rateLimit ratio selfLink session state
10.10.10.102 0 1 false addressFamily: ipv4
autopopulate: disabled
downInterval: 5
interval: 3600
/Common/XSOAR1 67 tm:ltm:node:nodestate disabled default XSOAR1 Common disabled 1 https://localhost/mgmt/tm/ltm/node/~Common~XSOAR1?ver=16.1.0 user-enabled unchecked

f5-ltm-get-pool-member-stats


Get Pool Member Stats

Base Command

f5-ltm-get-pool-member-stats

Input

Argument Name Description Required
pool_name Pool to get its stats. Required
member_name Member to get its stats. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Stats.members.stats.serverside.curConns.value String The current connections of the Pool Member
F5.LTM.Stats.members.name String The pool member name
F5.LTM.Stats.members.stats.sessionStatus.description String The pool member status

Command Example

!f5-ltm-get-pool-member-stats pool_name="XSOAR" member_name="XSOAR1:443"

Context Example

{
    "F5": {
        "LTM": {
            "Stats": {
                "members": [
                    {
                        "name": "XSOAR1:443",
                        "stats": {
                            "addr": {
                                "description": "10.10.10.102"
                            },
                            "connq.ageEdm": {
                                "value": 0
                            },
                            "connq.ageEma": {
                                "value": 0
                            },
                            "connq.ageHead": {
                                "value": 0
                            },
                            "connq.ageMax": {
                                "value": 0
                            },
                            "connq.depth": {
                                "value": 0
                            },
                            "connq.serviced": {
                                "value": 0
                            },
                            "curSessions": {
                                "value": 0
                            },
                            "monitorRule": {
                                "description": "/Common/https_443 (pool monitor)"
                            },
                            "monitorStatus": {
                                "description": "up"
                            },
                            "mr.msgIn": {
                                "value": 0
                            },
                            "mr.msgOut": {
                                "value": 0
                            },
                            "mr.reqIn": {
                                "value": 0
                            },
                            "mr.reqOut": {
                                "value": 0
                            },
                            "mr.respIn": {
                                "value": 0
                            },
                            "mr.respOut": {
                                "value": 0
                            },
                            "nodeName": {
                                "description": "/Common/XSOAR1"
                            },
                            "poolName": {
                                "description": "/Common/XSOAR"
                            },
                            "port": {
                                "value": 443
                            },
                            "serverside.bitsIn": {
                                "value": 0
                            },
                            "serverside.bitsOut": {
                                "value": 0
                            },
                            "serverside.curConns": {
                                "value": 0
                            },
                            "serverside.maxConns": {
                                "value": 0
                            },
                            "serverside.pktsIn": {
                                "value": 0
                            },
                            "serverside.pktsOut": {
                                "value": 0
                            },
                            "serverside.totConns": {
                                "value": 0
                            },
                            "sessionStatus": {
                                "description": "enabled"
                            },
                            "status.availabilityState": {
                                "description": "available"
                            },
                            "status.enabledState": {
                                "description": "enabled"
                            },
                            "status.statusReason": {
                                "description": "Pool member is available"
                            },
                            "totRequests": {
                                "value": 0
                            }
                        }
                    }
                ],
                "pool": "XSOAR",
                "stats": {
                    "activeMemberCnt": {
                        "value": 2
                    },
                    "availableMemberCnt": {
                        "value": 2
                    },
                    "connq.ageEdm": {
                        "value": 0
                    },
                    "connq.ageEma": {
                        "value": 0
                    },
                    "connq.ageHead": {
                        "value": 0
                    },
                    "connq.ageMax": {
                        "value": 0
                    },
                    "connq.depth": {
                        "value": 0
                    },
                    "connq.serviced": {
                        "value": 0
                    },
                    "connqAll.ageEdm": {
                        "value": 0
                    },
                    "connqAll.ageEma": {
                        "value": 0
                    },
                    "connqAll.ageHead": {
                        "value": 0
                    },
                    "connqAll.ageMax": {
                        "value": 0
                    },
                    "connqAll.depth": {
                        "value": 0
                    },
                    "connqAll.serviced": {
                        "value": 0
                    },
                    "curPriogrp": {
                        "value": 0
                    },
                    "curSessions": {
                        "value": 0
                    },
                    "highestPriogrp": {
                        "value": 0
                    },
                    "lowestPriogrp": {
                        "value": 0
                    },
                    "memberCnt": {
                        "value": 2
                    },
                    "monitorRule": {
                        "description": "/Common/https_443"
                    },
                    "status.statusReason": {
                        "description": "The pool is available"
                    }
                }
            }
        }
    }
}

Human Readable Output

Pool Member Stats

curConns member pool
0 XSOAR1:443 XSOAR

f5-ltm-get-node-stats


Get Node Stats

Base Command

f5-ltm-get-node-stats

Input

Argument Name Description Required
node_name Node To Query. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.stats.serverside.curConns.value String The current connections of the Node
F5.LTM.Nodes.name String The node name
F5.LTM.Nodes.stats.sessionStatus.description String The node status

Command Example

!f5-ltm-get-node-stats node_name="XSOAR1"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "name": "XSOAR1",
                "stats": {
                    "addr": {
                        "description": "10.10.10.102"
                    },
                    "curSessions": {
                        "value": 0
                    },
                    "monitorRule": {
                        "description": "none"
                    },
                    "monitorStatus": {
                        "description": "unchecked"
                    },
                    "serverside.bitsIn": {
                        "value": 0
                    },
                    "serverside.bitsOut": {
                        "value": 0
                    },
                    "serverside.curConns": {
                        "value": 0
                    },
                    "serverside.maxConns": {
                        "value": 0
                    },
                    "serverside.pktsIn": {
                        "value": 0
                    },
                    "serverside.pktsOut": {
                        "value": 0
                    },
                    "serverside.totConns": {
                        "value": 0
                    },
                    "sessionStatus": {
                        "description": "enabled"
                    },
                    "status.availabilityState": {
                        "description": "unknown"
                    },
                    "status.enabledState": {
                        "description": "enabled"
                    },
                    "status.statusReason": {
                        "description": "Node address does not have service checking enabled"
                    },
                    "tmName": {
                        "description": "/Common/XSOAR1"
                    },
                    "totRequests": {
                        "value": 0
                    }
                }
            }
        }
    }
}

Human Readable Output

Node Stats

curConns node
0 XSOAR1

f5-ltm-get-node-by-address


Get node information by address

Base Command

f5-ltm-get-node-by-address

Input

Argument Name Description Required
ip_address IP address of the node. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.name String The node name
F5.LTM.Nodes.address String The node address

Command Example

!f5-ltm-get-node-by-address ip_address="10.10.10.102"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "address": "10.10.10.102",
                "name": "XSOAR1",
                "partition": "Common",
                "session": "user-enabled",
                "state": "unchecked"
            }
        }
    }
}

Human Readable Output

Results

address name partition session state
10.10.10.102 XSOAR1 Common user-enabled unchecked

f5-ltm-get-pool-by-node


Get pool information by node

Base Command

f5-ltm-get-pool-by-node

Input

Argument Name Description Required
node_name Node name. Required
partition The administrative partition. Optional

Context Output

Path Type Description
F5.LTM.Nodes.pools String The pool names
F5.LTM.Nodes.name String The node name

Command Example

!f5-ltm-get-pool-by-node node_name="XSOAR1"

Context Example

{
    "F5": {
        "LTM": {
            "Nodes": {
                "name": "XSOAR1",
                "pools": [
                    "XSOAR"
                ]
            }
        }
    }
}

Human Readable Output

Results

name pools
XSOAR1 XSOAR

Configuration parameters

  • server — Server Address (required)
  • port — Port Number (required)
  • partition — The administrative partition
  • credentials — Username (required)
  • insecure — Trust any certificate (not secure)
  • proxy — Use system proxy settings

Commands (11)

  • f5-ltm-disable-node

    Disable a node

  • f5-ltm-enable-node

    Enable a node

  • f5-ltm-get-node

    Get node details

  • f5-ltm-get-node-by-address

    Get node information by address

  • f5-ltm-get-node-stats

    Get Node Stats

  • f5-ltm-get-nodes

    Get a list of all nodes

  • f5-ltm-get-pool

    Get pool details

  • f5-ltm-get-pool-by-node

    Get pool information by node

  • f5-ltm-get-pool-member-stats

    Get Pool Member Stats

  • f5-ltm-get-pool-members

    Get Pool Members

  • f5-ltm-get-pools

    Get a list of all pools

import traceback

import requests
import urllib3
from CommonServerPython import *

from CommonServerUserPython import *

urllib3.disable_warnings()

""" CONSTANTS """

DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"

""" CLIENT CLASS """


class Client(BaseClient):
    def __init__(self, base_url: str, token: object, partition: str, use_ssl: bool, use_proxy: bool, **kwargs):
        super().__init__(base_url, verify=use_ssl, proxy=use_proxy, **kwargs)
        self.headers = {"Content-Type": "application/json", "X-F5-Auth-Token": token}
        self.partition = partition
        self.stats_keys = {
            "activeMemberCnt",
            "availableMemberCnt",
            "connq.ageEdm",
            "connq.ageEma",
            "connq.ageHead",
            "connq.ageMax",
            "connq.depth",
            "connq.serviced",
            "connqAll.ageEdm",
            "connqAll.ageEma",
            "connqAll.ageHead",
            "connqAll.ageMax",
            "connqAll.depth",
            "connqAll.serviced",
            "curPriogrp",
            "curSessions",
            "highestPriogrp",
            "lowestPriogrp",
            "memberCnt",
            "monitorRule",
            "status.statusReason",
        }

    def get_pools(self, expand_collection=False, partition=None):
        url_suffix = (
            f"ltm/pool?expandSubcollections={str(expand_collection).lower()}&"
            f"$select=membersReference,name,partition,monitor&$filter=partition eq"
            f" {partition if partition else self.partition}"
        )
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        if str(expand_collection).lower() == "true":
            pools = []
            for item in response.get("items"):
                if "items" in item.get("membersReference"):
                    pools.append(
                        {
                            "name": item.get("name"),
                            "partition": item.get("partition"),
                            "monitor": item.get("monitor"),
                            "members": item.get("membersReference")["items"],
                        }
                    )
        else:
            pools = response.get("items")
        return pools

    def get_pool(self, pool, partition=None):
        url_suffix = f"ltm/pool/~{partition if partition else self.partition}~{pool}"
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        return response

    def get_pool_members(self, pool, partition=None):
        url_suffix = f"ltm/pool/~{partition if partition else self.partition}~{pool}/members"
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        return {"name": pool, "members": response.get("items")}

    def get_nodes(self, partition=None):
        url_suffix = (
            f"ltm/node?$select=name,partition,address,ration,session,state&$filter=partition eq "
            f"{partition if partition else self.partition}"
        )
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        return response.get("items")

    def get_node(self, node, partition=None):
        url_suffix = f"ltm/node/~{partition if partition else self.partition}~{node}"
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        return response

    def disable_node(self, node, partition=None):
        url_suffix = f"ltm/node/~{partition if partition else self.partition}~{node}"
        response = self._http_request(
            method="PATCH", url_suffix=url_suffix, headers=self.headers, json_data={"session": "user-disabled"}
        )
        return response

    def enable_node(self, node, partition=None):
        url_suffix = f"ltm/node/~{partition if partition else self.partition}~{node}"
        response = self._http_request(
            method="PATCH", url_suffix=url_suffix, headers=self.headers, json_data={"session": "user-enabled"}
        )
        return response

    def get_pool_member_stats(self, pool, member, partition=None):
        pool_stats = {}
        partition_name = partition if partition else self.partition
        url_suffix = f"ltm/pool/~{partition_name}~{pool}/members/~{partition_name}~{member}/stats"
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        member_stats = response.get("entries")[
            f"https://localhost/mgmt/tm/ltm/pool/~{partition_name}~{pool}/members/~{partition_name}~{member}/stats"
        ]["nestedStats"]["entries"]

        for key, value in response.get("entries").items():
            raw_stats = value.get("nestedStats")["entries"]
            pool_stats = {key: raw_stats[key] for key in raw_stats.keys() & self.stats_keys}

        return {"pool": pool, "stats": pool_stats, "members": [{"name": member, "stats": member_stats}]}

    def get_node_stats(self, node, partition=None):
        url_suffix = f"ltm/node/~{partition if partition else self.partition}~{node}/stats"
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params={})
        node_stats = response.get("entries")[
            f"https://localhost/mgmt/tm/ltm/node/~{partition if partition else self.partition}~{node}/stats"
        ]["nestedStats"]["entries"]
        return {"name": node, "stats": node_stats}


""" HELPER FUNCTIONS """


def login(server: str, port: str, username: str, password: str, verify_certificate: bool):
    response = requests.post(
        f"https://{server}:{port}/mgmt/shared/authn/login",
        verify=verify_certificate,
        json={"username": username, "password": password, "loginProviderName": "tmos"},
    ).json()
    token = dict_safe_get(response, ["token", "token"], "", str)
    if not token:
        raise DemistoException(f"Authorization Error: please check your credentials. \n\nError:\n{response}")

    return token


""" COMMAND FUNCTIONS """


def test_module(client: Client):
    try:
        client.get_pools()
    except DemistoException as exception:
        if "Authorization Required" in str(exception) or "Authentication failed" in str(exception):
            return_error(f"Authorization Error: please check your credentials.\n\nError:\n{exception}")

        if "HTTPSConnectionPool" in str(exception):
            return_error(f"Connection Error: please check your server ip address.\n\nError: {exception}")
        raise
    return "ok"


def ltm_get_pools_command(client, args) -> CommandResults:
    expand_collection = args.get("expand")
    partition = args.get("partition")
    results = client.get_pools(expand_collection=expand_collection, partition=partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Pools",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_get_pool_command(client, args) -> CommandResults:
    pool = args.get("pool_name")
    partition = args.get("partition")
    results = client.get_pool(pool=pool, partition=partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Pools",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_get_nodes_command(client, args) -> CommandResults:
    partition = args.get("partition")
    results = client.get_nodes(partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Nodes",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_get_node_command(client, args) -> CommandResults:
    node = args.get("node_name")
    partition = args.get("partition")
    results = client.get_node(node=node, partition=partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Nodes",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_get_pool_members_command(client, args) -> CommandResults:
    pool = args.get("pool_name")
    partition = args.get("partition")
    results = client.get_pool_members(pool=pool, partition=partition)
    readable_output = tableToMarkdown(
        "Pool Members:", {"name": results.get("name"), "members": [member["name"] for member in results.get("members")]}
    )

    return CommandResults(
        outputs_prefix="F5.LTM.Pools", outputs_key_field="name", outputs=results, readable_output=readable_output
    )


def ltm_disable_node_command(client, args) -> CommandResults:
    node = args.get("node_name")
    partition = args.get("partition")
    results = client.disable_node(node=node, partition=partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Nodes",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_enable_node_command(client, args) -> CommandResults:
    node = args.get("node_name")
    partition = args.get("partition")
    results = client.enable_node(node=node, partition=partition)

    return CommandResults(
        outputs_prefix="F5.LTM.Nodes",
        outputs_key_field="name",
        outputs=results,
    )


def ltm_get_pool_member_stats_command(client, args) -> CommandResults:
    pool = args.get("pool_name")
    member = args.get("member_name")
    partition = args.get("partition")
    results = client.get_pool_member_stats(pool=pool, member=member, partition=partition)
    readable_output = tableToMarkdown(
        "Pool Member Stats:",
        {
            "pool": results.get("pool"),
            "member": [member.get("name") for member in results.get("members")],
            "curConns": [member.get("stats")["serverside.curConns"]["value"] for member in results.get("members")],
        },
    )

    return CommandResults(
        outputs_prefix="F5.LTM.Stats", outputs_key_field="name", outputs=results, readable_output=readable_output
    )


def ltm_get_node_stats_command(client, args) -> CommandResults:
    node = args.get("node_name")
    partition = args.get("partition")
    results = client.get_node_stats(node=node, partition=partition)
    readable_output = tableToMarkdown(
        "Node Stats:", {"node": results.get("name"), "curConns": results.get("stats")["serverside.curConns"]["value"]}
    )
    return CommandResults(
        outputs_prefix="F5.LTM.Nodes", outputs_key_field="name", outputs=results, readable_output=readable_output
    )


def ltm_get_node_by_address_command(client, args):
    partition = args.get("partition")
    ip_address = args.get("ip_address")
    results = client.get_nodes(partition=partition)
    for item in results:
        if item.get("address") == ip_address:
            node = item
            return CommandResults(
                outputs_prefix="F5.LTM.Nodes",
                outputs_key_field="name",
                outputs=node,
            )
    return_error(f"No nodes found matching the address: {ip_address}")
    return None


def ltm_get_pools_by_node_command(client, args) -> CommandResults:
    node = args.get("node_name")
    pools = []
    partition = args.get("partition")
    results = client.get_pools(expand_collection="true", partition=partition)
    for item in results:
        for subitem in item.get("members"):
            if subitem.get("name").split(":")[0] == node:
                pools.append(item.get("name"))
                break
    node_mapping = {"name": node, "pools": pools}
    return CommandResults(
        outputs_prefix="F5.LTM.Nodes",
        outputs_key_field="name",
        outputs=node_mapping,
    )


""" MAIN FUNCTION """


def main() -> None:
    args = demisto.args()
    params = demisto.params()
    server = params.get("server")
    port = params.get("port", "443")
    verify_certificate = not params.get("insecure", False)
    proxy = not params.get("insecure", False)
    partition = params.get("partition")
    username = params.get("credentials", {}).get("identifier")
    password = params.get("credentials", {}).get("password")

    base_url = f"https://{server}:{port}/mgmt/tm/"

    handle_proxy()

    token = login(server, port, username, password, verify_certificate)

    demisto.debug(f"Command being called is {demisto.command()}")
    try:
        client = Client(base_url=base_url, token=token, partition=partition, use_ssl=verify_certificate, use_proxy=proxy)

        if demisto.command() == "test-module":
            result = test_module(client)
            return_results(result)

        elif demisto.command() == "f5-ltm-get-pools":
            return_results(ltm_get_pools_command(client, args))

        elif demisto.command() == "f5-ltm-get-pool":
            return_results(ltm_get_pool_command(client, args))

        elif demisto.command() == "f5-ltm-get-pool-members":
            return_results(ltm_get_pool_members_command(client, args))

        elif demisto.command() == "f5-ltm-get-nodes":
            return_results(ltm_get_nodes_command(client, args))

        elif demisto.command() == "f5-ltm-get-node":
            return_results(ltm_get_node_command(client, args))

        elif demisto.command() == "f5-ltm-disable-node":
            return_results(ltm_disable_node_command(client, args))

        elif demisto.command() == "f5-ltm-enable-node":
            return_results(ltm_enable_node_command(client, args))

        elif demisto.command() == "f5-ltm-get-pool-member-stats":
            return_results(ltm_get_pool_member_stats_command(client, args))

        elif demisto.command() == "f5-ltm-get-node-stats":
            return_results(ltm_get_node_stats_command(client, args))

        elif demisto.command() == "f5-ltm-get-node-by-address":
            return_results(ltm_get_node_by_address_command(client, args))

        elif demisto.command() == "f5-ltm-get-pool-by-node":
            return_results(ltm_get_pools_by_node_command(client, args))

    except Exception as e:
        demisto.error(traceback.format_exc())
        return_error(f"Failed to execute {demisto.command()} command.\nError:\n{e!s}")


""" ENTRY POINT """

if __name__ in ("__main__", "__builtin__", "builtins"):
    main()