Config Mode
===========

As of 2014.4 `gluon-config-mode` consists of several modules.

gluon-config-mode-core
    This modules provides the core functionality for the config mode.
    All modules must depend on it.

gluon-config-mode-hostname
    Provides a hostname field.

gluon-config-mode-autoupdater
    Informs whether the autoupdater is enabled.

gluon-config-mode-mesh-vpn
    Allows toggling of mesh-vpn-fastd and setting a bandwidth limit.

gluon-config-mode-geo-location
    Enables the user to set the geographical location of the node.

gluon-config-mode-contact-info
    Adds a field where the user can provide contact information.

In order to get a config mode close to the one found in 2014.3.x you may add
these modules to your `site.mk`:
gluon-config-mode-hostname,
gluon-config-mode-autoupdater,
gluon-config-mode-mesh-vpn,
gluon-config-mode-geo-location,
gluon-config-mode-contact-info

Writing Config Mode Modules
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Config mode modules are located at `/lib/gluon/config-mode/wizard` and
`/lib/gluon/config-mode/reboot`. Modules are named like `0000-name.lua` and
are executed in lexical order. If you take the standard set of modules, the
order is, for wizard modules:

  - 0050-autoupdater-info
  - 0100-hostname
  - 0300-mesh-vpn
  - 0400-geo-location
  - 0500-contact-info

While for reboot modules it is:

  - 0100-mesh-vpn
  - 0900-msg-reboot

Wizards
-------

Wizard modules return a UCI section. A simple module capable of changing the
hostname might look like this::

  local cbi = require "luci.cbi"
  local uci = luci.model.uci.cursor()

  local M = {}

  function M.section(form)
    local s = form:section(cbi.SimpleSection, nil, nil)
    local o = s:option(cbi.Value, "_hostname", "Hostname")
    o.value = uci:get_first("system", "system", "hostname")
    o.rmempty = false
    o.datatype = "hostname"
  end

  function M.handle(data)
    uci:set("system", uci:get_first("system", "system"), "hostname", data._hostname)
    uci:save("system")
    uci:commit("system")
  end

  return M

Reboot page
-----------

Reboot modules return a function that will be called when the page is to be
rendered or nil (i.e. the module is skipped)::

  if no_hello_world_today then
    return nil
  else
    return function ()
      luci.template.render_string("Hello World!")
    end
  end