# Command-line utilities

The IP set library comes with several command-line utilities for building and interacting with IP sets.

## ipsetbuild

The `ipsetbuild` command is used to an build binary IP set file from a text file containing a list of IP addresses and CIDR networks.

    $ ipsetbuild [options] <input file>...

`--output``<filename>``,` `-o``<filename>`

  Writes the binary IP set file to filename. If this option isn’t given, then the binary set will be written to standard output.

`--loose-cidr````,` `-l```

  Be more lenient about the address portion of any CIDR network blocks found in the input file. (This is described in more detail below.)

`--verbose````,` `-v```

  Show summary information about the IP set that’s built, as well as progress information about the files being read and written. If this option is not given, the only output will be any error, alert, or warning messages that occur.

`--quiet````,` `-q```

  Show only error message for malformed input. All warnings, alerts, and summary information about the IP set is suppressed.

`--help```

  Display some help text and exit.

Each input file must contain one IP address or network per line. Lines beginning with a `#` are considered comments and are ignored. Each IP address must have one of the following formats:

    x.x.x.x
    x.x.x.x/cidr
    xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
    xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/cidr

The first two are for IPv4 addresses and networks; the second two for IPv6 addresses and networks. For IPv6 addresses, you can use the `::` shorthand notation to collapse consecutive `0` portions.

If an address contains a `/cidr` suffix, then the entire CIDR network of addresses will be added to the set. You must ensure that the low- order bits of the address are set to 0; if not, we’ll raise an error. (If you pass in the `--loose-cidr` option, we won’t perform this sanity check.)

You can also prefix any input line with an exclamation point (`!`). This causes the given address or network to be removed from the output set. This notation can be useful to define a set that contains most of the addresses in a large CIDR block, except for addresses at certain “holes”.

The order of the addresses and networks given to ipsetbuild does not matter. If a particular address is added to the set more than once, or removed from the set more than once, whether on its own or via a CIDR network, then you will get a warning message. (You can silence these warnings with the `--quiet` option.) If an address is both added to and removed from the set, then the removal takes precedence, regardless of where the relevant lines appear in the input file.

## ipsetcat

The `ipsetcat` command is used to print out the (non-sorted) contents of a binary IP set file.

    $ ipsetcat [options] <input file>

To read from stdin, use `-` as the filename.

`--output``<filename>``,` `-o``<filename>`

  Writes the contents of the binary IP set file to filename. If this option isn’t given, then the contents will be written to standard output.

`--networks````,` `-n```

  Where possible, group the IP addresses in the set into CIDR network blocks. For dense sets, this can greatly reduce the amount of output that’s generated.

`--verbose````,` `-v```

  Show progress information about the files being read and written. If this option is not given, the only output will be any error messages that occur.

`--help```

  Display some help text and exit.

The output will contain one IP address or network per line. If you give the `--networks` option, then we will collapse addresses into CIDR networks where possible. CIDR network blocks will have one of the following formats:

    x.x.x.x/cidr
    xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/cidr

Individual IP addresses will have one of the following formats:

    x.x.x.x
    xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

Note that we never include a /32 or /128 suffix for individual addresses, even if you’ve requested CIDR networks via the `--networks` option.

Note

Please note that the output is unsorted. There are no guarantees made about the order of the IP addresses and networks in the output.

## ipsetdot

The `ipsetdot` command is used to create a GraphViz file showing the BDD structure of an IP set.

    $ ipsetdot [options] <input file>

To read from stdin, use `-` as the filename.

`--output``<filename>``,` `-o``<filename>`

  Writes the GraphViz representation of the binary IP set file to filename. If this option isn’t given, then the contents will be written to standard output.

`--verbose````,` `-v```

  Show progress information about the files being read and written. If this option is not given, the only output will be any error messages that occur.

`--help```

  Display some help text and exit.

Internally, IP sets are represented by a binary-decision diagram (BDD). The `ipsetdot` program can be used to produce a GraphViz file that describes the internal BDD structure for an IP set. The GraphViz representation can then be passed in to GraphViz’s `dot` program, for instance, to generate an image of the BDD’s graph structure.