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