{
  "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": "typescript",
  "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": [
            "export function parseIpv4(text: string): number",
            "export function formatIpv4(value: number): string",
            "export function isIpv4(text: string): boolean"
          ],
          "reference": "import { parseIpv4, formatIpv4, isIpv4 } from \"#fune/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": [
            "export function parseIpv6(text: string): readonly number[]",
            "export function formatIpv6(groups: readonly number[]): string",
            "export function isIpv6(text: string): boolean"
          ],
          "reference": "import { parseIpv6, formatIpv6, isIpv6 } from \"#fune/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": [
            "export function classifyIp(address: string): IpClassification"
          ],
          "reference": "import { classifyIp } from \"#fune/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": [
            "export function cidrInfo(cidr: string): CidrInfo",
            "export function cidrContains(cidr: string, address: string): boolean",
            "export function isCidr(text: string): boolean",
            "export function prefixToNetmask(prefix: number): string",
            "export function netmaskToPrefix(netmask: string): number"
          ],
          "reference": "import { cidrInfo, cidrContains, isCidr, prefixToNetmask, netmaskToPrefix } from \"#fune/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": [
            "export function cidrHosts(cidr: string, maxCount: number): readonly string[]"
          ],
          "reference": "import { cidrHosts } from \"#fune/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": [
            "export function validateHostname(text: string): HostnameValidation"
          ],
          "reference": "import { validateHostname } from \"#fune/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": [
            "export function isPort(value: number): boolean",
            "export function portService(port: number, protocol: Protocol): PortService"
          ],
          "reference": "import { isPort, portService } from \"#fune/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": [
            "export function parsePortList(text: string): readonly number[]"
          ],
          "reference": "import { parsePortList } from \"#fune/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": [
            "export function validateMacAddress(text: string): MacValidation"
          ],
          "reference": "import { validateMacAddress } from \"#fune/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": [
            "export function validateDevice(entry: Readonly<Record<string, unknown>>): DeviceValidation"
          ],
          "reference": "import { validateDevice } from \"#fune/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": [
            "export function summariseLatency(samplesUs: readonly (number | null)[]): LatencySummary"
          ],
          "reference": "import { summariseLatency } from \"#fune/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": [
            "export function deviceStatus(summary: LatencySummary, thresholds: StatusThresholds): StatusResult"
          ],
          "reference": "import { deviceStatus } from \"#fune/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": [
            "export function sortBy(records: readonly Readonly<Record<string, unknown>>[], key: string, direction: SortDirection): readonly Readonly<Record<string, unknown>>[]"
          ],
          "reference": "import { sortBy } from \"#fune/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": [
            "export function searchText(records: readonly Readonly<Record<string, unknown>>[], fields: readonly string[], query: string): readonly Readonly<Record<string, unknown>>[]"
          ],
          "reference": "import { searchText } from \"#fune/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
}
