<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY daemon "stafd">
<!ENTITY deamondesc "STorage Appliance Finder">
<!ENTITY control "stafctl">
]>

<!--
    SPDX-License-Identifier: Apache-2.0
    Copyright (c) 2021, Dell Inc. or its subsidiaries.  All rights reserved.
-->

<refentry id="&daemon;" xmlns:xi="http://www.w3.org/2001/XInclude">
    <refentryinfo>
        <title>&daemon;</title>
        <productname>nvme-stas</productname>
        <author>
            <personname>
                <honorific>Mr</honorific>
                <firstname>Martin</firstname>
                <surname>Belanger</surname>
            </personname>
            <affiliation>
                <orgname>Dell, Inc.</orgname>
            </affiliation>
        </author>
    </refentryinfo>

    <refmeta>
        <refentrytitle>&daemon;</refentrytitle>
        <manvolnum>8</manvolnum>
    </refmeta>

    <refnamediv>
        <refname>&daemon;</refname>
        <refpurpose>&deamondesc;</refpurpose>
    </refnamediv>

    <refsynopsisdiv>
        <cmdsynopsis>
            <command>&daemon;</command>
            <arg choice="opt" rep="repeat">OPTIONS</arg>
        </cmdsynopsis>
    </refsynopsisdiv>

    <refsect1>
        <title>Description</title>

        <para>
            <command>&daemon;</command>
            is a system daemon that can be used to automatically locate and
            connect to NVMe-oF Discovery Controllers using mDNS service discovery.
            It can also be manually configured with
            <citerefentry>
                <refentrytitle>&daemon;.conf</refentrytitle>
                <manvolnum>5</manvolnum>
            </citerefentry>
            to connect to Discovery Controllers that cannot be located using
            mDNS.
        </para>
    </refsect1>

    <refsect1>
        <title>Options</title>
        <para>The following options are understood:</para>

        <variablelist>
            <xi:include href="standard-options.xml" xpointer="help"/>
            <xi:include href="standard-options.xml" xpointer="version"/>
        </variablelist>

        <varlistentry>
            <term><option>-fFILE</option></term>
            <term><option>--conf-file=FILE</option></term>
            <listitem>
                <para>
                    Specify a different configuration file than
                    <citerefentry>
                        <refentrytitle>&daemon;.conf</refentrytitle>
                        <manvolnum>5</manvolnum>
                    </citerefentry>
                    (default: <filename>/etc/stas/&daemon;.conf</filename>).
                </para>
            </listitem>
        </varlistentry>

        <varlistentry>
            <term><option>-s</option></term>
            <term><option>--syslog</option></term>
            <listitem>
                <para>
                    Send messages to syslog instead of stdout. Use this when
                    running &daemon; as a daemon. (default: <literal>false</literal>).
                </para>
            </listitem>
        </varlistentry>

        <varlistentry>
            <term><option>--tron</option></term>
            <listitem>
                <para>Trace ON. (default: <literal>false</literal>)</para>
            </listitem>
        </varlistentry>

        <varlistentry>
            <term><option>--idl=FILE</option></term>
            <listitem>
                <para>Print D-Bus IDL to FILE and exit.</para>
            </listitem>
        </varlistentry>
    </refsect1>

    <refsect1>
        <title>Exit status</title>
        <para>
            On success, 0 is returned, a non-zero failure code otherwise.
        </para>
    </refsect1>

    <refsect1>
        <title>Daemonization</title>
        <para>
            &daemon; is managed by <code>systemd</code>. The following
            operations are supported:
        </para>

        <table frame='all'>
            <tgroup cols="2" align='left' colsep='1' rowsep='1'>
                <thead>
                    <row>
                        <entry>Command</entry>
                        <entry>Description</entry>
                    </row>
                </thead>

                <tbody>
                    <row>
                        <entry><programlisting>$ systemctl start &daemon; </programlisting></entry>
                        <entry>Start daemon.</entry>
                    </row>

                    <row>
                        <entry><programlisting>$ systemctl stop &daemon; </programlisting></entry>
                        <entry>Stop daemon. The <code>SIGTERM</code> signal is used to tell the daemon to stop.</entry>
                    </row>

                    <row>
                        <entry><programlisting>$ systemctl restart &daemon; </programlisting></entry>
                        <entry>Effectively a <code>stop</code> + <code>start</code>.</entry>
                    </row>

                    <row>
                        <entry><programlisting>$ systemctl reload &daemon; </programlisting></entry>
                        <entry>Reload configuration. This is done in real time without restarting the daemon. The <code>SIGHUP</code> signal is used to tell the daemon to reload its configuration file. Note that configuration parameters that affect connections (e.g. <code>kato</code>), will not apply to existing connections. Only connections established after the configuration was changed will utilize the new configuration parameters.</entry>
                    </row>
                </tbody>
            </tgroup>
        </table>
    </refsect1>

    <refsect1>
      <title>Design</title>

      <para>
          <command>&daemon;</command> use the <code>GLib</code> main loop.
          The <code>GLib</code> Python module provides several low-level
          building blocks that <command>&daemon;</command> requires. In
          addition, many Python modules "play nice" with <code>GLib</code>
          such as <code>dasbus</code> (D-Bus package) and <code>pyudev</code>
          (UDev package). <code>GLib</code> also provides additional components
          such as timers, signal handlers, and much more.
      </para>

      <para>
          <command>&daemon;</command> connects to the <code>avahi-daemon</code>
          using D-Bus. The <code>avahi-daemon</code>, or simply
          <emphasis>Avahi</emphasis>, is an mDNS discovery service used for
          zero-configuration networking (zeroconf). <command>&daemon;</command>
          registers with Avahi to automatically locate Central Discovery
          Controllers (CDC) and Direct Discovery Controllers (DDC). When Avahi
          finds Discovery Controllers (DC), it notifies <command>&daemon;</command>
          which connects to the DC with the help of the <code>libnvme</code> library.
          Once a connection to a DC is established, <command>&daemon;</command>
          can retrieve the <emphasis>discovery log pages</emphasis> from
          that DC and cache them in memory.
      </para>
    </refsect1>


    <refsect1>
        <title>Configuration</title>
        <para>
            <command>&daemon;</command> can automatically locate discovery
            controllers (DC) with the help of Avahi and connect to them. However,
            <command>&daemon;</command> can also operate in a non-automatic
            mode based on manually entered configuration. In other words,
            DCs can be entered in a configuration named
            <filename>/etc/stas/&daemon;.conf</filename>.
            This configuration file also provides additional parameters, such
            as log-level attributes used for debugging purposes.
        </para>
    </refsect1>

    <refsect1>
        <title>D-Bus API</title>
        <para>
            The interface to <command>&daemon;</command> is D-Bus.
            This allows other programs, such as <command>&control;</command>,
            to communicate with <command>&daemon;</command>. The D-Bus address
            is <code>org.nvmexpress.staf</code>.
        </para>
    </refsect1>

    <refsect1>
        <title>See Also</title>

        <para>
            <citerefentry>
                <refentrytitle>&daemon;.conf</refentrytitle>
                <manvolnum>5</manvolnum>
            </citerefentry>,
            <citerefentry>
                <refentrytitle>&daemon;.service</refentrytitle>
                <manvolnum>8</manvolnum>
            </citerefentry>,
            <citerefentry>
                <refentrytitle>stafctl</refentrytitle>
                <manvolnum>1</manvolnum>
            </citerefentry>,
            <citerefentry>
                <refentrytitle>org.nvmexpress.staf</refentrytitle>
                <manvolnum>5</manvolnum>
            </citerefentry>.
        </para>
    </refsect1>
</refentry>
