Scan
=====

Description
-----------
Runs cdist as a daemon that discover/watch on hosts and reconfigure them
periodically. It is especially useful in netboot-based environment where hosts
boot unconfigured, and to ensure your infrastructure stays in sync with your
configuration.

This feature is still consider to be in **beta** stage, and only operate on
IPv6 (including link-local).

Usage (Examples)
----------------

Discover hosts on local network and configure those whose name is resolved by
the name mapper script.

.. code-block:: sh

    $ cdist scan --beta --interface eth0 \
      --mode scan --name-mapper path/to/script \
      --mode trigger --mode config

List known hosts and exit.

.. code-block:: sh

    $ cdist scan --beta --list --name-mapper path/to/script

Please refer to `cdist(1)` for a detailed list of parameters.

Modes
-----

The scanner has 3 modes that can be independently toggled. If the `--mode`
parameter is not specified, only `tigger` and `scan` are enabled (= hosts are
not configured).

trigger
  Send ICMPv6 requests to specific hosts or broadcast over IPv6 link-local to
  trigger detection by the `scan` module.

scan
  Watch for incoming ICMPv6 replies and optionally configure detected hosts.

config
  Enable configuration of hosts detected by `scan`.

Name Mapper Script
------------------

The name mapper script takes an IPv6 address as first argument and writes the
resolved name to stdout - if any. The script must be executable.

Simplest script:

.. code-block:: sh

  #!/bin/sh

  case "$1" in
  	"fe80::20d:b9ff:fe57:3524")
  		printf "my-host-01"
  		;;
  	"fe80::7603:bdff:fe05:89bb")
  		printf "my-host-02"
  		;;
  esac

Resolving name from `PTR` DNS record:

.. code-block:: sh

  #!/bin/sh

  for cmd in dig sed; do
  	if ! command -v $cmd > /dev/null; then
  		exit 1
  	fi
  done

  dig +short -x "$1" | sed -e 's/.$//'