Global IP and MAC Search
In version 6.9.0 of the ipfabric Python SDK a new ipf_global_search CLI tool was added.
After installing the package it can be run from the command line.
Requirements
Required environment variables exported (IPF_URL and IPF_TOKEN or IPF_USERNAME & IPF_PASSWORD) or a
.env file located in the current working directory or your home directory.
Installing rich will enable prettier output (pip install rich or pip install ipfabric[cli]).
Documentation
# ipf_global_search -h
usage: ipf_global_search [-h] [-f] [-r {ipv4,ipv6,mac}] [-B] [-s SNAPSHOT] [-b BASE_URL] [-t TOKEN] [-u USERNAME] [-p PASSWORD] [-c] [-v] [-j] [-R] address
Search all tables for an IPv4, IPv6, or MAC address. This does not include IPv4 or IPv6 Route tables as too many results would be returned.
positional arguments:
  address               IPv4, IPv6, or MAC address to search for.
optional arguments:
  -h, --help            show this help message and exit
  -f, --full-scan       Scan all tables not just default.  It will take more time so it is recommended to use if first search could not locate anything.
  -r {ipv4,ipv6,mac}, --regex {ipv4,ipv6,mac}
                        Perform a regex search instead of an exact match on the tables, please quote your regex.
  -B, --break-on-match  Breaks out of searching tables when the first match is found.
  -s SNAPSHOT, --snapshot SNAPSHOT
                        Snapshot to use which can be a UUID or one of ['last', 'prev', 'lastLocked']with or without `$` for *nix compatability.
  -b BASE_URL, --base-url BASE_URL
                        Base URL for IPFabric API or IPF_URL env variable.
  -t TOKEN, --token TOKEN
                        IP Fabric API Token or IPF_TOKEN env variable.
  -u USERNAME, --username USERNAME
                        IP Fabric username (requires --password) or IPF_USERNAME env variable.
  -p PASSWORD, --password PASSWORD
                        IP Fabric password or IPF_PASSWORD env variable.
  -c, --count           Print count of rows instead of the actual data.
  -v, --verbose         Verbose output will enable debugging and print all tables even if no data.
  -j, --json            Enable JSON output which will also print all tables even if no data.
  -R, --rich-disable    Disable rich formatting if installed. Useful for sending JSON output to jq.
Default Tables for IPv4 Search:
1. /tables/addressing/managed-devs
2. /tables/inventory/interfaces
3. /tables/addressing/hosts
4. /tables/addressing/arp
5. /tables/wireless/clients
6. /tables/inventory/phones
7. /tables/cloud/virtual-machines-interfaces
8. /tables/neighbors/unmanaged
9. /tables/interfaces/connectivity-matrix/unmanaged-neighbors/detail
10. /tables/routing/protocols/bgp/neighbors
11. /tables/routing/protocols/eigrp/neighbors
12. /tables/routing/protocols/is-is/neighbors
13. /tables/routing/protocols/ospf/neighbors
14. /tables/routing/protocols/rip/neighbors
Default Tables for IPv6 Search:
1. /tables/addressing/ipv6-managed-devs
2. /tables/addressing/ipv6-hosts
3. /tables/addressing/ipv6-neighbors
4. /tables/neighbors/unmanaged
5. /tables/interfaces/connectivity-matrix/unmanaged-neighbors/detail
6. /tables/cloud/virtual-machines-interfaces
7. /tables/routing/protocols/bgp/neighbors
8. /tables/routing/protocols/is-is/neighbors
9. /tables/routing/protocols/ospf-v3/neighbors
Default Tables for MAC Search:
1. /tables/addressing/managed-devs
2. /tables/addressing/ipv6-managed-devs
3. /tables/inventory/interfaces
4. /tables/addressing/hosts
5. /tables/addressing/ipv6-hosts
6. /tables/addressing/ipv6-neighbors
7. /tables/addressing/arp
8. /tables/cloud/virtual-machines-interfaces
9. /tables/addressing/mac
10. /tables/wireless/radio
Usage
# ipf_global_search 10.77.255.8
Technology — Addressing — Managed IP: "Managed IPv4 addresses"
https://demo1.us.ipfabric.io/technology/addressing/managed-ip?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22eq%22%2C%2210.77.255.8%22%5D%7D%5D%7D%7D
[
    {
        "dnsReverseMatch": -1,
        "vlanId": null,
        "hostname": "L77R8-LEAF2",
        "dnsHostnameMatch": -1,
        "type": "primary",
        "vrf": "default",
        "mac": null,
        "stateL2": "up",
        "sn": "a4dff08",
        "net": "10.77.255.8/32",
        "intName": "Lo0",
        "ip": "10.77.255.8",
        "siteName": "L77",
        "dnsName": null,
        "stateL1": "up",
        "id": "d92d287622ac0e9241bb1f9209aacb2c"
    }
]
Inventory — Interfaces: "Interface Inventory"
...
If no results are found you can add the -f|--full-scan which will check all tables which will increase time.
However adding -B|--break-on-match will stop search after the first match is found.
# ipf_global_search 5.6.7.8
Address "5.6.7.8" not found in tables, try running with '-f|--full-scan' to query all tables.
# ipf_global_search 5.6.7.8 -f
Technology — Management — AAA: "AAA Servers"
https://demo1.us.ipfabric.io/technology/management/aaa/servers?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22eq%22%2C%225.6.7.8%22%5D%7D%2C%7B%22srcIp%22%3A%5B%22eq%22%2C%225.6.7.8%22%5D%7D%5D%7D%7D
[
    {
        "srcIp": null,
        "hostname": "hwl-r1-13-HP-comware",
        "type": "authen",
        "cfgName": null,
        "sn": "SG41F6L04V",
        "port": 1920,
        "protocol": "radius",
        "intName": null,
        "ip": "5.6.7.8",
        "siteName": "HWLAB",
        "dstHostname": null,
        "srvGroupName": "radius",
        "id": "18182363340"
    }
]
Regex
For Windows you may be required to escape special characters (& \ < > ^ |) using a caret ^ ("^(10.0.0.1|192.168.0.1)$" 
becomes "^^(10.0.0.1^|192.168.0.1)$").
# ipf_global_search -r ipv4 "10.77.255.\d$"
Technology — Addressing — Managed IP: "Managed IPv4 addresses"
https://demo1.us.ipfabric.io/technology/addressing/managed-ip?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22reg%22%2C%2210.77.255.%5C%5Cd%24%22%5D%7D%5D%7D%7D
[
    {
        "dnsReverseMatch": -1,
        "vlanId": null,
        "hostname": "L77EXR1",
        "dnsHostnameMatch": -1,
        "type": "primary",
        "vrf": "",
        "mac": null,
        "stateL2": "up",
        "sn": "a4dff01",
        "net": "10.77.255.1/32",
        "intName": "Lo0",
        "ip": "10.77.255.1",
        "siteName": "L77",
        "dnsName": null,
        "stateL1": "up",
        "id": "4b3cc351d6d47b0b6d86042cd8f62d9a"
    },
...
Count
# ipf_global_search -r ipv4 "10.77.255.\d$" -c
Technology — Addressing — Managed IP: "Managed IPv4 addresses": 8
https://demo1.us.ipfabric.io/technology/addressing/managed-ip?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22reg%22%2C%2210.77.255.%5C%5Cd%24%22%5D%7D%5D%7D%7D
# ipf_global_search 10.77.255.8 -c
Technology — Addressing — Managed IP: "Managed IPv4 addresses": 1
https://demo1.us.ipfabric.io/technology/addressing/managed-ip?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22eq%22%2C%2210.77.255.8%22%5D%7D%5D%7D%7D
JSON Output
If using JSON output disable rich with the -R|--rich-disable flag prior to sending to jq.
# ipf_global_search 10.77.255.8 -j -R | jq '.[0]'
{
  "data": [
    {
      "dnsReverseMatch": -1,
      "vlanId": null,
      "hostname": "L77R8-LEAF2",
      "dnsHostnameMatch": -1,
      "type": "primary",
      "vrf": "default",
      "mac": null,
      "stateL2": "up",
      "sn": "a4dff08",
      "net": "10.77.255.8/32",
      "intName": "Lo0",
      "ip": "10.77.255.8",
      "siteName": "L77",
      "dnsName": null,
      "stateL1": "up",
      "id": "d92d287622ac0e9241bb1f9209aacb2c"
    }
  ],
  "path": "/tables/addressing/managed-devs",
  "webPath": "/technology/addressing/managed-ip",
  "url": "https://demo1.us.ipfabric.io/technology/addressing/managed-ip?options=%7B%22filters%22%3A%7B%22or%22%3A%5B%7B%22ip%22%3A%5B%22eq%22%2C%2210.77.255.8%22%5D%7D%5D%7D%7D",
  "menu": "Technology — Addressing — Managed IP: \"Managed IPv4 addresses\""
}