{
  "id": "network-tools",
  "title": "Network tools and inventory",
  "summary": "Parse and classify IPv4 and IPv6 addresses, CIDR and subnet maths, ports, MAC addresses and host names, and a network inventory with device status.",
  "synonyms": [
    "networking",
    "network tools",
    "ip address",
    "ip calculator",
    "subnet calculator",
    "cidr",
    "ipv4",
    "ipv6",
    "netmask",
    "ports",
    "mac address",
    "network inventory",
    "ipam",
    "device monitoring"
  ],
  "apps": [
    "subnet calculator",
    "ip address management tool",
    "network inventory",
    "device monitor",
    "firewall rule editor",
    "home lab dashboard",
    "network admin tool"
  ],
  "language": "python",
  "includes": [],
  "includedBy": [],
  "caveats": [],
  "sections": [
    {
      "key": "addresses",
      "title": "Addresses",
      "purpose": "Read, write and classify IP addresses strictly.",
      "from": "network-tools",
      "members": [
        {
          "id": "net.ipv4",
          "tier": "core",
          "why": "Parses, formats and checks dotted-quad IPv4, refusing leading zeros, octal and short forms.",
          "section": "addresses",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Parse, format and check dotted-quad IPv4 addresses, refusing leading zeros, octal, hex and short forms.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": true,
          "functions": [
            "parseIpv4",
            "formatIpv4",
            "isIpv4"
          ],
          "signatures": [
            "def parse_ipv4(text: str) -> int",
            "def format_ipv4(value: int) -> str",
            "def is_ipv4(text: str) -> bool"
          ],
          "reference": "from fune.net.ipv4 import parse_ipv4, format_ipv4, is_ipv4  # net.ipv4@^1",
          "url": "http://www.functionalweave.com/functions/net.ipv4"
        },
        {
          "id": "net.ipv6",
          "tier": "core",
          "why": "Parses IPv6 and writes it in RFC 5952 canonical form.",
          "section": "addresses",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Parse IPv6 addresses and write them in RFC 5952 canonical form: lower-case, zeros compressed, IPv4 embedded.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": true,
          "functions": [
            "parseIpv6",
            "formatIpv6",
            "isIpv6"
          ],
          "signatures": [
            "def parse_ipv6(text: str) -> List[int]",
            "def format_ipv6(groups: Sequence[int]) -> str",
            "def is_ipv6(text: str) -> bool"
          ],
          "reference": "from fune.net.ipv6 import parse_ipv6, format_ipv6, is_ipv6  # net.ipv6@^1",
          "url": "http://www.functionalweave.com/functions/net.ipv6"
        },
        {
          "id": "net.ip-classify",
          "tier": "core",
          "why": "Loopback, private, link-local, multicast, documentation, CGNAT or global.",
          "section": "addresses",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Classify an IPv4 or IPv6 address as loopback, private, link-local, multicast, documentation, CGNAT or global.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "classifyIp"
          ],
          "signatures": [
            "def classify_ip(address: str) -> IpClassification"
          ],
          "reference": "from fune.net.ip_classify import classify_ip  # net.ip-classify@^1",
          "url": "http://www.functionalweave.com/functions/net.ip-classify"
        }
      ],
      "gaps": []
    },
    {
      "key": "subnets",
      "title": "Subnets",
      "purpose": "CIDR blocks and the hosts in them.",
      "from": "network-tools",
      "members": [
        {
          "id": "net.cidr",
          "tier": "core",
          "why": "Network, broadcast, first and last host, host count, netmask and membership of a CIDR block.",
          "section": "subnets",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "CIDR blocks: network, broadcast, first and last host, host count, netmask and prefix, and membership.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": true,
          "functions": [
            "cidrInfo",
            "cidrContains",
            "isCidr",
            "prefixToNetmask",
            "netmaskToPrefix"
          ],
          "signatures": [
            "def cidr_info(cidr: str) -> CidrInfo",
            "def cidr_contains(cidr: str, address: str) -> bool",
            "def is_cidr(text: str) -> bool",
            "def prefix_to_netmask(prefix: int) -> str",
            "def netmask_to_prefix(netmask: str) -> int"
          ],
          "reference": "from fune.net.cidr import cidr_info, cidr_contains, is_cidr, prefix_to_netmask, netmask_to_prefix  # net.cidr@^1",
          "url": "http://www.functionalweave.com/functions/net.cidr"
        },
        {
          "id": "net.cidr-hosts",
          "tier": "optional",
          "why": "Lists every usable host in an IPv4 block, refusing blocks over a limit.",
          "section": "subnets",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "List every usable host address in an IPv4 CIDR block, refusing blocks larger than a limit.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "cidrHosts"
          ],
          "signatures": [
            "def cidr_hosts(cidr: str, max_count: int) -> List[str]"
          ],
          "reference": "from fune.net.cidr_hosts import cidr_hosts  # net.cidr-hosts@^1",
          "url": "http://www.functionalweave.com/functions/net.cidr-hosts"
        }
      ],
      "gaps": []
    },
    {
      "key": "names-ports",
      "title": "Names, ports and hardware",
      "purpose": "Validate the other identifiers an inventory holds.",
      "from": "network-tools",
      "members": [
        {
          "id": "net.hostname-validate",
          "tier": "core",
          "why": "Checks a host name against RFC 1123/952 label rules and normalises it.",
          "section": "names-ports",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Check a host name against RFC 1123 and RFC 952 label rules and length limits, and normalise it.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "validateHostname"
          ],
          "signatures": [
            "def validate_hostname(text: str) -> HostnameValidation"
          ],
          "reference": "from fune.net.hostname_validate import validate_hostname  # net.hostname-validate@^1",
          "url": "http://www.functionalweave.com/functions/net.hostname-validate"
        },
        {
          "id": "net.port",
          "tier": "core",
          "why": "Checks a port number and names its IANA service and range.",
          "section": "names-ports",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Check a TCP/UDP port number and name the IANA service registered on it, with its system/user/dynamic range.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": true,
          "functions": [
            "isPort",
            "portService"
          ],
          "signatures": [
            "def is_port(value: int) -> bool",
            "def port_service(port: int, protocol: Protocol) -> PortService"
          ],
          "reference": "from fune.net.port import is_port, port_service  # net.port@^1",
          "url": "http://www.functionalweave.com/functions/net.port"
        },
        {
          "id": "net.port-list",
          "tier": "optional",
          "why": "Parses \"22,80,8000-8010\" into port numbers.",
          "section": "names-ports",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Parse a port list such as 22,80,8000-8010 into port numbers, in order and without duplicates.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "parsePortList"
          ],
          "signatures": [
            "def parse_port_list(text: str) -> List[int]"
          ],
          "reference": "from fune.net.port_list import parse_port_list  # net.port-list@^1",
          "url": "http://www.functionalweave.com/functions/net.port-list"
        },
        {
          "id": "net.mac-address",
          "tier": "optional",
          "why": "Validates and normalises a MAC address in any common form.",
          "section": "names-ports",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Validate a MAC address in colon, hyphen, Cisco dot or bare form and normalise it, with multicast and local bits.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "validateMacAddress"
          ],
          "signatures": [
            "def validate_mac_address(text: str) -> MacValidation"
          ],
          "reference": "from fune.net.mac_address import validate_mac_address  # net.mac-address@^1",
          "url": "http://www.functionalweave.com/functions/net.mac-address"
        }
      ],
      "gaps": []
    },
    {
      "key": "inventory",
      "title": "Inventory and status",
      "purpose": "Keep a list of devices and say how each is doing.",
      "from": "network-tools",
      "members": [
        {
          "id": "net.device-validate",
          "tier": "core",
          "why": "Validates an inventory entry (name, host, ports, MAC, subnet), listing every problem.",
          "section": "inventory",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Validate one network inventory entry: name, host, ports, optional MAC and subnet, with every problem listed.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "validateDevice"
          ],
          "signatures": [
            "def validate_device(entry: Mapping[str, Any]) -> DeviceValidation"
          ],
          "reference": "from fune.net.device_validate import validate_device  # net.device-validate@^1",
          "url": "http://www.functionalweave.com/functions/net.device-validate"
        },
        {
          "id": "net.latency-summary",
          "tier": "optional",
          "why": "Loss, min/avg/max, p95 and jitter from probe results.",
          "section": "inventory",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Summarise probe results: sent, received, loss, min/avg/max, p95 and jitter, in whole microseconds.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "summariseLatency"
          ],
          "signatures": [
            "def summarise_latency(samples_us: Sequence[Optional[int]]) -> LatencySummary"
          ],
          "reference": "from fune.net.latency_summary import summarise_latency  # net.latency-summary@^1",
          "url": "http://www.functionalweave.com/functions/net.latency-summary"
        },
        {
          "id": "net.device-status",
          "tier": "optional",
          "why": "Up, degraded or down from that summary and thresholds.",
          "section": "inventory",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Classify a device as up, degraded or down from its latency summary and loss, p95 and jitter thresholds.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "deviceStatus"
          ],
          "signatures": [
            "def device_status(summary: LatencySummary, thresholds: StatusThresholds) -> StatusResult"
          ],
          "reference": "from fune.net.device_status import device_status  # net.device-status@^1",
          "url": "http://www.functionalweave.com/functions/net.device-status"
        },
        {
          "id": "collections.sort-by",
          "tier": "optional",
          "why": "Sorts device records by a column.",
          "section": "inventory",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Stably sort records by one key, ascending or descending, with a total order across mixed types.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "sortBy"
          ],
          "signatures": [
            "def sort_by(records: Sequence[Mapping[str, Any]], key: str, direction: SortDirection) -> List[Mapping[str, Any]]"
          ],
          "reference": "from fune.collections.sort_by import sort_by  # collections.sort-by@^1",
          "url": "http://www.functionalweave.com/functions/collections.sort-by"
        },
        {
          "id": "collections.search-text",
          "tier": "optional",
          "why": "Filters device records by a search box.",
          "section": "inventory",
          "from": "network-tools",
          "version": "1.0.0",
          "summary": "Filter records by a case-insensitive substring match across named fields, in input order.",
          "status": "stable",
          "license": "NOASSERTION",
          "languages": [
            "typescript",
            "python",
            "rust"
          ],
          "available": true,
          "group": false,
          "functions": [
            "searchText"
          ],
          "signatures": [
            "def search_text(records: Sequence[Mapping[str, Any]], fields: Sequence[str], query: str) -> List[Mapping[str, Any]]"
          ],
          "reference": "from fune.collections.search_text import search_text  # collections.search-text@^1",
          "url": "http://www.functionalweave.com/functions/collections.search-text"
        }
      ],
      "gaps": [
        {
          "key": "probing",
          "text": "Pinging, port scanning and SNMP polling: the network I/O itself is yours.",
          "section": "inventory",
          "from": "network-tools"
        }
      ]
    }
  ],
  "gaps": [
    {
      "key": "probing",
      "text": "Pinging, port scanning and SNMP polling: the network I/O itself is yours.",
      "section": "inventory",
      "from": "network-tools"
    },
    {
      "key": "ipv6-subnets",
      "text": "Describing IPv6 prefixes (network, range, size, host lists): net.cidr describes IPv4 blocks and only tests IPv6 membership.",
      "section": null,
      "from": "network-tools"
    },
    {
      "key": "dns",
      "text": "DNS lookups (A, AAAA, PTR, MX records) and whois are network work, not in caps.",
      "section": null,
      "from": "network-tools"
    },
    {
      "key": "discovery",
      "text": "Discovering devices on a network (ARP, mDNS, scans) and importing them.",
      "section": null,
      "from": "network-tools"
    }
  ],
  "counts": {
    "members": 14,
    "core": 7,
    "optional": 7,
    "unreviewed": 0,
    "deprecated": [],
    "unavailable": [],
    "missing": [],
    "gaps": 4
  },
  "warnings": [],
  "url": "http://www.functionalweave.com/suites/network-tools",
  "owner": null
}
