treewide: convert all LuCI-based packages to gluon-web
This commit is contained in:
		
							parent
							
								
									e4b74be506
								
							
						
					
					
						commit
						31d3f08f25
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@ -99,7 +99,7 @@ config: FORCE
 | 
				
			|||||||
		&& scripts/target_config.sh generic \
 | 
							&& scripts/target_config.sh generic \
 | 
				
			||||||
		&& GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/target_config.sh '$(GLUON_TARGET)' \
 | 
							&& GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/target_config.sh '$(GLUON_TARGET)' \
 | 
				
			||||||
		$(foreach pkg,$(GLUON_PACKAGES_YES),&& echo 'CONFIG_PACKAGE_$(pkg)=y') \
 | 
							$(foreach pkg,$(GLUON_PACKAGES_YES),&& echo 'CONFIG_PACKAGE_$(pkg)=y') \
 | 
				
			||||||
		$(foreach lang,$(GLUON_LANGS),&& echo 'CONFIG_LUCI_LANG_$(lang)=y') \
 | 
							$(foreach lang,$(GLUON_LANGS),&& echo 'CONFIG_GLUON_WEB_LANG_$(lang)=y') \
 | 
				
			||||||
		&& echo 'CONFIG_GLUON_RELEASE="$(GLUON_RELEASE)"' \
 | 
							&& echo 'CONFIG_GLUON_RELEASE="$(GLUON_RELEASE)"' \
 | 
				
			||||||
		&& echo 'CONFIG_GLUON_SITEDIR="$(GLUON_SITEDIR)"' \
 | 
							&& echo 'CONFIG_GLUON_SITEDIR="$(GLUON_SITEDIR)"' \
 | 
				
			||||||
		&& echo 'CONFIG_GLUON_BRANCH="$(GLUON_BRANCH)"' \
 | 
							&& echo 'CONFIG_GLUON_BRANCH="$(GLUON_BRANCH)"' \
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,8 @@
 | 
				
			|||||||
Config Mode
 | 
					Config Mode
 | 
				
			||||||
===========
 | 
					===========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
As of 2014.4 `gluon-config-mode` consists of several modules.
 | 
					The `Config Mode` consists of several modules that provide a range of different
 | 
				
			||||||
 | 
					condiguration options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gluon-config-mode-core
 | 
					gluon-config-mode-core
 | 
				
			||||||
    This modules provides the core functionality for the config mode.
 | 
					    This modules provides the core functionality for the config mode.
 | 
				
			||||||
@ -22,20 +23,13 @@ gluon-config-mode-geo-location
 | 
				
			|||||||
gluon-config-mode-contact-info
 | 
					gluon-config-mode-contact-info
 | 
				
			||||||
    Adds a field where the user can provide contact information.
 | 
					    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
 | 
					Writing Config Mode modules
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Config mode modules are located at `/lib/gluon/config-mode/wizard` and
 | 
					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
 | 
					``/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
 | 
					are executed in lexical order. In the standard package set, the
 | 
				
			||||||
order is, for wizard modules:
 | 
					order is, for wizard modules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - 0050-autoupdater-info
 | 
					  - 0050-autoupdater-info
 | 
				
			||||||
@ -44,49 +38,45 @@ order is, for wizard modules:
 | 
				
			|||||||
  - 0400-geo-location
 | 
					  - 0400-geo-location
 | 
				
			||||||
  - 0500-contact-info
 | 
					  - 0500-contact-info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
While for reboot modules it is:
 | 
					The reboot module order is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - 0100-mesh-vpn
 | 
					  - 0100-mesh-vpn
 | 
				
			||||||
  - 0900-msg-reboot
 | 
					  - 0900-msg-reboot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All modules are run in the gluon-web model context and have access to the same
 | 
				
			||||||
 | 
					variables as "full" gluon-web modules.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Wizards
 | 
					Wizards
 | 
				
			||||||
-------
 | 
					-------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Wizard modules return a UCI section. A simple module capable of changing the
 | 
					Wizard modules must return a function that is provided with the wizard form and an
 | 
				
			||||||
hostname might look like this::
 | 
					UCI cursor. The function can create configuration sections in the form:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local cbi = require "luci.cbi"
 | 
					.. code-block:: lua
 | 
				
			||||||
  local uci = luci.model.uci.cursor()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local M = {}
 | 
					  return function(form, uci)
 | 
				
			||||||
 | 
					    local s = form:section(Section)
 | 
				
			||||||
  function M.section(form)
 | 
					    local o = s:option(Value, "hostname", "Hostname")
 | 
				
			||||||
    local s = form:section(cbi.SimpleSection, nil, nil)
 | 
					    o.default = uci:get_first("system", "system", "hostname")
 | 
				
			||||||
    local o = s:option(cbi.Value, "_hostname", "Hostname")
 | 
					 | 
				
			||||||
    o.value = uci:get_first("system", "system", "hostname")
 | 
					 | 
				
			||||||
    o.rmempty = false
 | 
					 | 
				
			||||||
    o.datatype = "hostname"
 | 
					    o.datatype = "hostname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function o:write(data)
 | 
				
			||||||
 | 
					      uci:set("system", uci:get_first("system", "system"), "hostname", data)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function M.handle(data)
 | 
					    return {'system'}
 | 
				
			||||||
    uci:set("system", uci:get_first("system", "system"), "hostname", data._hostname)
 | 
					 | 
				
			||||||
    uci:save("system")
 | 
					 | 
				
			||||||
    uci:commit("system")
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return M
 | 
					The function may return a table of UCI packages to commit after the individual
 | 
				
			||||||
 | 
					fields' `write` methods have been executed. This is done to avoid committing the
 | 
				
			||||||
 | 
					packages repeatedly when multiple wizard modules modify the same package.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reboot page
 | 
					Reboot page
 | 
				
			||||||
-----------
 | 
					-----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reboot modules return a function that will be called when the page is to be
 | 
					Reboot modules are simply executed when the reboot page is
 | 
				
			||||||
rendered or nil (i.e. the module is skipped)::
 | 
					rendered:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if no_hello_world_today then
 | 
					.. code-block:: lua
 | 
				
			||||||
    return nil
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    return function ()
 | 
					 | 
				
			||||||
      luci.template.render_string("Hello World!")
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  renderer.render_string("Hello World!")
 | 
				
			||||||
 | 
				
			|||||||
@ -10,53 +10,56 @@ General guidelines
 | 
				
			|||||||
  nice-to-have, but not required. If you don't know a language well, rather leave the translation
 | 
					  nice-to-have, but not required. If you don't know a language well, rather leave the translation
 | 
				
			||||||
  blank, so it is obvious that there is no proper translation yet.
 | 
					  blank, so it is obvious that there is no proper translation yet.
 | 
				
			||||||
* Existing expert mode packages should be made translatable as soon as possible.
 | 
					* Existing expert mode packages should be made translatable as soon as possible.
 | 
				
			||||||
* The "message IDs" (which are the arguments to the ``translate`` function) should be the
 | 
					* The "message IDs" (which are the arguments to the *translate* function) should be the
 | 
				
			||||||
  English texts.
 | 
					  English texts.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
i18n support in LuCI
 | 
					i18n support in Gluon
 | 
				
			||||||
--------------------
 | 
					---------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Internationalization support can be found in the ``luci.i18n`` package.
 | 
					Internationalization support is available in all components (models, view and
 | 
				
			||||||
Strings are translated using the ``i18n.translate`` and ``i18n.translatef`` functions
 | 
					contrllers) of *gluon-web*-based packages. Strings are translated using the *translate*
 | 
				
			||||||
(``translate`` for static strings, ``translatef`` for printf-like formatted string).
 | 
					and *translatef* functions (*translate* for static strings, *translatef*
 | 
				
			||||||
 | 
					for printf-like formatted string); in views, the special tags ``<%:...%>`` can
 | 
				
			||||||
 | 
					be used to translate the contained string.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example from the ``gluon-config-mode-geo-location`` package::
 | 
					Example from the *gluon-config-mode-geo-location* package:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local i18n = require "luci.i18n"
 | 
					.. code-block:: lua
 | 
				
			||||||
  o = s:option(cbi.Flag, "_location", i18n.translate("Show node on the map"))
 | 
					
 | 
				
			||||||
 | 
					  local share_location = s:option(Flag, "location", translate("Show node on the map"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Adding translation templates to Gluon packages
 | 
					Adding translation templates to Gluon packages
 | 
				
			||||||
----------------------------------------------
 | 
					----------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The i18n support is based on the standard gettext system. For each translatable package,
 | 
					The i18n support is based on the standard gettext system. For each translatable package,
 | 
				
			||||||
a translation template with extension ``.pot`` can be created using the ``i18n-scan.pl``
 | 
					a translation template with extension ``.pot`` can be created using the *i18n-scan.pl*
 | 
				
			||||||
script from the LuCI repository::
 | 
					script in the ``contrib`` directory:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cd package/gluon-config-mode-geo-location
 | 
					.. code-block:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cd package/gluon-web-mesh-vpn-fastd
 | 
				
			||||||
  mkdir i18n
 | 
					  mkdir i18n
 | 
				
			||||||
  cd i18n
 | 
					  cd i18n
 | 
				
			||||||
  ../../../packages/luci/build/i18n-scan.pl ../files > gluon-config-mode-geo-location.pot
 | 
					  ../../../contrib/i18n-scan.pl ../files ../luasrc > gluon-web-mesh-vpn-fastd.pot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The entries in the template can be reordered after the generation if desirable. Lots of standard
 | 
					The same command can be run again to update the template.
 | 
				
			||||||
translations like "Cancel" are already available in the LuCI base translation file (see
 | 
					 | 
				
			||||||
``packages/luci/po/templates/base.pot``) and can be removed from the template.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
In addition, some additions to the Makefile must be made. Instead of OpenWrt's default ``package.mk``,
 | 
					In addition, some additions to the Makefile must be made. Instead of LEDE's default *package.mk*,
 | 
				
			||||||
the Gluon version ``$(GLUONDIR)/include/package.mk`` must be used. The i18n files must be installed
 | 
					the Gluon version (``../gluon.mk`` for core packages) must be used. The i18n files must be installed
 | 
				
			||||||
and PKG_CONFIG_DEPENDS must be added::
 | 
					and PKG_CONFIG_DEPENDS must be added::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
  include $(GLUONDIR)/include/package.mk
 | 
					  include ../gluon.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					  PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
  define Build/Compile
 | 
					  define Build/Compile
 | 
				
			||||||
    $(call GluonBuildI18N,gluon-config-mode-geo-location,i18n)
 | 
					    $(call GluonBuildI18N,gluon-web-mesh-vpn-fastd,i18n)
 | 
				
			||||||
  endef
 | 
					  endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  define Package/gluon-config-mode-geo-location/install
 | 
					  define Package/gluon-web-mesh-vpn-fastd/install
 | 
				
			||||||
    ...
 | 
					    ...
 | 
				
			||||||
    $(call GluonInstallI18N,gluon-config-mode-geo-location,$(1))
 | 
					    $(call GluonInstallI18N,gluon-web-mesh-vpn-fastd,$(1))
 | 
				
			||||||
  endef
 | 
					  endef
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -64,29 +67,29 @@ and PKG_CONFIG_DEPENDS must be added::
 | 
				
			|||||||
Adding translations
 | 
					Adding translations
 | 
				
			||||||
-------------------
 | 
					-------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A new translation file for a template can be added using the ``msginit`` command::
 | 
					A new translation file for a template can be added using the *msginit* command:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cd package/gluon-config-mode-geo-location/i18n
 | 
					.. code-block:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cd package/gluon-web-mesh-vpn-fastd/i18n
 | 
				
			||||||
  msginit -l de
 | 
					  msginit -l de
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This will create the file ``de.po`` in which the translations can be added.
 | 
					This will create the file *de.po* in which the translations can be added.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The translation file can be updated to a new template version using the ``msgmerge`` command::
 | 
					The translation file can be updated to a new template version using the *msgmerge* command:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msgmerge -U de.po gluon-config-mode-geo-location.pot
 | 
					.. code-block:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msgmerge -U de.po gluon-web-mesh-vpn-fastd.pot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
After the merge, the translation file should be checked for "fuzzy matched" entries where
 | 
					After the merge, the translation file should be checked for "fuzzy matched" entries where
 | 
				
			||||||
the original English texts have changed. All entries from the translation file should be
 | 
					the original English texts have changed. All entries from the translation file should be
 | 
				
			||||||
translated in the ``.po`` file (or removed from it, so the original English texts are displayed
 | 
					translated in the *.po* file (or removed from it, so the original English texts are displayed
 | 
				
			||||||
instead).
 | 
					instead).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Adding support for new languages
 | 
					Adding support for new languages
 | 
				
			||||||
--------------------------------
 | 
					--------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A list of all languages supported by LuCI can be found in the ``packages/luci/luci.mk`` file after
 | 
					A list of all languages supported by *gluon-web* can be found in ``package/gluon.mk``.
 | 
				
			||||||
Gluon's dependencies have been downloaded using ``make update``. Adding translations for these
 | 
					New languages just need to be added to *GLUON_SUPPORTED_LANGS*, after a human-readable
 | 
				
			||||||
languages is straightforward using the ``msginit`` command.
 | 
					language name has been defined in the same file.
 | 
				
			||||||
 | 
					 | 
				
			||||||
For other languages, support must be added to LuCI first, which constitutes completely translating
 | 
					 | 
				
			||||||
the ``base.pot``. Please contact the upstream LuCI maintainers at https://github.com/openwrt/luci/
 | 
					 | 
				
			||||||
if you'd like to do this.
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ Best practices
 | 
				
			|||||||
--------------
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Most upgrade scripts are written in Lua. This allows using lots of helper functions provided
 | 
					* Most upgrade scripts are written in Lua. This allows using lots of helper functions provided
 | 
				
			||||||
  by LuCi and Gluon, e.g. to access the site configuration or edit UCI configuration files.
 | 
					  by Gluon, e.g. to access the site configuration or edit UCI configuration files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Whenever possible, scripts shouldn't check if they are running for the first time, but just edit configuration
 | 
					* Whenever possible, scripts shouldn't check if they are running for the first time, but just edit configuration
 | 
				
			||||||
  files to achive a valid configuration (without overwriting configuration changes made by the user where desirable).
 | 
					  files to achive a valid configuration (without overwriting configuration changes made by the user where desirable).
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ Private WLAN
 | 
				
			|||||||
It is possible to set up a private WLAN that bridges the WAN port and is seperated from the mesh network.
 | 
					It is possible to set up a private WLAN that bridges the WAN port and is seperated from the mesh network.
 | 
				
			||||||
Please note that you should not enable ``mesh_on_wan`` simultaneously.
 | 
					Please note that you should not enable ``mesh_on_wan`` simultaneously.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The private WLAN can be enabled through the config mode if the package ``gluon-luci-private-wifi`` is installed.
 | 
					The private WLAN can be enabled through the config mode if the package ``gluon-web-private-wifi`` is installed.
 | 
				
			||||||
You may also enable a private WLAN using the command line::
 | 
					You may also enable a private WLAN using the command line::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uci set wireless.wan_radio0=wifi-iface
 | 
					  uci set wireless.wan_radio0=wifi-iface
 | 
				
			||||||
 | 
				
			|||||||
@ -18,13 +18,13 @@ For this the section ``roles`` in ``site.conf`` is needed::
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The strings to display in the LuCI interface are configured per language in the
 | 
					The strings to display in the web interface are configured per language in the
 | 
				
			||||||
``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like
 | 
					``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like
 | 
				
			||||||
``gluon-luci-node-role:role:node`` and ``gluon-luci-node-role:role:backbone``.
 | 
					``gluon-web-node-role:role:node`` and ``gluon-web-node-role:role:backbone``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The value of ``default`` is the role every node will initially own. This value should be part of ``list`` as well.
 | 
					The value of ``default`` is the role every node will initially own. This value should be part of ``list`` as well.
 | 
				
			||||||
If you want node owners to change the defined roles via config-mode you can add the package
 | 
					If you want node owners to change the defined roles via config-mode you can add the package
 | 
				
			||||||
``gluon-luci-node-role`` to your ``site.mk``.
 | 
					``gluon-web-node-role`` to your ``site.mk``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The role is saved in ``gluon-node-info.system.role``. To change the role using command line do::
 | 
					The role is saved in ``gluon-node-info.system.role``. To change the role using command line do::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ Configuration
 | 
				
			|||||||
~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Both Mesh-on-WAN and Mesh-on-LAN can be configured on the "Network" page
 | 
					Both Mesh-on-WAN and Mesh-on-LAN can be configured on the "Network" page
 | 
				
			||||||
of the *Advanced settings* (if the package ``gluon-luci-portconfig`` is installed).
 | 
					of the *Advanced settings* (if the package ``gluon-web-network`` is installed).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is also possible to enable Mesh-on-WAN and Mesh-on-LAN by default by
 | 
					It is also possible to enable Mesh-on-WAN and Mesh-on-LAN by default by
 | 
				
			||||||
adding ``mesh_on_wan = true`` and ``mesh_on_lan = true`` to ``site.conf``.
 | 
					adding ``mesh_on_wan = true`` and ``mesh_on_lan = true`` to ``site.conf``.
 | 
				
			||||||
 | 
				
			|||||||
@ -15,10 +15,10 @@ GLUON_SITE_PACKAGES := \
 | 
				
			|||||||
	gluon-config-mode-mesh-vpn \
 | 
						gluon-config-mode-mesh-vpn \
 | 
				
			||||||
	gluon-ebtables-filter-multicast \
 | 
						gluon-ebtables-filter-multicast \
 | 
				
			||||||
	gluon-ebtables-filter-ra-dhcp \
 | 
						gluon-ebtables-filter-ra-dhcp \
 | 
				
			||||||
	gluon-luci-admin \
 | 
						gluon-web-admin \
 | 
				
			||||||
	gluon-luci-autoupdater \
 | 
						gluon-web-autoupdater \
 | 
				
			||||||
	gluon-luci-portconfig \
 | 
						gluon-web-network \
 | 
				
			||||||
	gluon-luci-wifi-config \
 | 
						gluon-web-wifi-config \
 | 
				
			||||||
	gluon-mesh-batman-adv-15 \
 | 
						gluon-mesh-batman-adv-15 \
 | 
				
			||||||
	gluon-mesh-vpn-fastd \
 | 
						gluon-mesh-vpn-fastd \
 | 
				
			||||||
	gluon-radvd \
 | 
						gluon-radvd \
 | 
				
			||||||
 | 
				
			|||||||
@ -182,7 +182,7 @@ fastd_mesh_vpn
 | 
				
			|||||||
    with the list from the site configuration. Setting `configurable` to `true` will allow the user to
 | 
					    with the list from the site configuration. Setting `configurable` to `true` will allow the user to
 | 
				
			||||||
    add the method ``null`` to the beginning of the method list or remove ``null`` from it,
 | 
					    add the method ``null`` to the beginning of the method list or remove ``null`` from it,
 | 
				
			||||||
    and make this change survive updates. Setting `configurable` is necessary for the
 | 
					    and make this change survive updates. Setting `configurable` is necessary for the
 | 
				
			||||||
    package `gluon-luci-mesh-vpn-fastd`, which adds a UI for this configuration.
 | 
					    package `gluon-web-mesh-vpn-fastd`, which adds a UI for this configuration.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    In any case, the ``null`` method should always be the first method in the list
 | 
					    In any case, the ``null`` method should always be the first method in the list
 | 
				
			||||||
    if it is supported at all. You should only set `configurable` to `true` if the
 | 
					    if it is supported at all. You should only set `configurable` to `true` if the
 | 
				
			||||||
@ -288,11 +288,11 @@ roles \: optional
 | 
				
			|||||||
    the community which roles to define. See the section below as an example.
 | 
					    the community which roles to define. See the section below as an example.
 | 
				
			||||||
    ``default`` takes the default role which is set initially. This value should be
 | 
					    ``default`` takes the default role which is set initially. This value should be
 | 
				
			||||||
    part of ``list``. If you want node owners to change the role via config mode add
 | 
					    part of ``list``. If you want node owners to change the role via config mode add
 | 
				
			||||||
    the package ``gluon-luci-node-role`` to ``site.mk``.
 | 
					    the package ``gluon-web-node-role`` to ``site.mk``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    The strings to display in the LuCI interface are configured per language in the
 | 
					    The strings to display in the web interface are configured per language in the
 | 
				
			||||||
    ``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like
 | 
					    ``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like
 | 
				
			||||||
    ``gluon-luci-node-role:role:node`` and ``gluon-luci-node-role:role:backbone``.
 | 
					    ``gluon-web-node-role:role:node`` and ``gluon-web-node-role:role:backbone``.
 | 
				
			||||||
    ::
 | 
					    ::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      roles = {
 | 
					      roles = {
 | 
				
			||||||
 | 
				
			|||||||
@ -13,14 +13,10 @@ PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			|||||||
define Package/gluon-config-mode-autoupdater
 | 
					define Package/gluon-config-mode-autoupdater
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Let the user know whether the autoupdater is enabled or not.
 | 
					  TITLE:=Config Mode: Let the user know whether the autoupdater is enabled or not
 | 
				
			||||||
  DEPENDS:=gluon-config-mode-core-virtual +gluon-autoupdater
 | 
					  DEPENDS:=gluon-config-mode-core-virtual +gluon-autoupdater
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-config-mode-autoupdater/description
 | 
					 | 
				
			||||||
	Luci based config mode
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define Build/Prepare
 | 
					define Build/Prepare
 | 
				
			||||||
	mkdir -p $(PKG_BUILD_DIR)
 | 
						mkdir -p $(PKG_BUILD_DIR)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,8 @@
 | 
				
			|||||||
local cbi = require "luci.cbi"
 | 
					return function(form, uci)
 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
						if uci:get_bool("autoupdater", "settings", "enabled") then
 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
							local s = form:section(
 | 
				
			||||||
 | 
								Section, nil,
 | 
				
			||||||
local M = {}
 | 
								translate('This node will automatically update its firmware when a new version is available.')
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
function M.section(form)
 | 
					 | 
				
			||||||
  local enabled = uci:get_bool("autoupdater", "settings", "enabled")
 | 
					 | 
				
			||||||
  if enabled then
 | 
					 | 
				
			||||||
    local s = form:section(cbi.SimpleSection, nil,
 | 
					 | 
				
			||||||
      i18n.translate('This node will automatically update its firmware when a new version is available.'))
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					 | 
				
			||||||
function M.handle(data)
 | 
					 | 
				
			||||||
  return
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return M
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,35 +1,27 @@
 | 
				
			|||||||
local cbi = require "luci.cbi"
 | 
					return function(form, uci)
 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
						local site = require 'gluon.site_config'
 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local site = require 'gluon.site_config'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
local M = {}
 | 
						local owner = uci:get_first("gluon-node-info", "owner")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function M.section(form)
 | 
						local s = form:section(Section, nil, translate(
 | 
				
			||||||
  local s = form:section(cbi.SimpleSection, nil, i18n.translate(
 | 
					 | 
				
			||||||
		'Please provide your contact information here to '
 | 
							'Please provide your contact information here to '
 | 
				
			||||||
		.. 'allow others to contact you. Note that '
 | 
							.. 'allow others to contact you. Note that '
 | 
				
			||||||
		.. 'this information will be visible <em>publicly</em> '
 | 
							.. 'this information will be visible <em>publicly</em> '
 | 
				
			||||||
		.. 'on the internet together with your node\'s coordinates.'
 | 
							.. 'on the internet together with your node\'s coordinates.'
 | 
				
			||||||
    )
 | 
						))
 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local o = s:option(cbi.Value, "_contact", i18n.translate("Contact info"))
 | 
						local o = s:option(Value, "contact", translate("Contact info"), translate("e.g. E-mail or phone number"))
 | 
				
			||||||
  o.default = uci:get_first("gluon-node-info", "owner", "contact", "")
 | 
						o.default = uci:get("gluon-node-info", owner, "contact")
 | 
				
			||||||
  o.rmempty = not ((site.config_mode or {}).owner or {}).obligatory
 | 
						o.optional = not ((site.config_mode or {}).owner or {}).obligatory
 | 
				
			||||||
  o.datatype = "string"
 | 
						-- without a minimal length, an empty string will be accepted even with "optional = false"
 | 
				
			||||||
  o.description = i18n.translate("e.g. E-mail or phone number")
 | 
						o.datatype = "minlength(1)"
 | 
				
			||||||
  o.maxlen = 140
 | 
						function o:write(data)
 | 
				
			||||||
end
 | 
							if data then
 | 
				
			||||||
 | 
								uci:set("gluon-node-info", owner, "contact", data)
 | 
				
			||||||
function M.handle(data)
 | 
					 | 
				
			||||||
  if data._contact ~= nil then
 | 
					 | 
				
			||||||
    uci:set("gluon-node-info", uci:get_first("gluon-node-info", "owner"), "contact", data._contact)
 | 
					 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
    uci:delete("gluon-node-info", uci:get_first("gluon-node-info", "owner"), "contact")
 | 
								uci:delete("gluon-node-info", owner, "contact")
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
  uci:save("gluon-node-info")
 | 
					 | 
				
			||||||
  uci:commit("gluon-node-info")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
return M
 | 
						return {'gluon-node-info'}
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
@ -16,8 +16,8 @@ PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			|||||||
define Package/gluon-config-mode-core
 | 
					define Package/gluon-config-mode-core
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci based config mode for user friendly setup of new mesh nodes
 | 
					  TITLE:=Configuration wizard for user friendly setup of new mesh nodes
 | 
				
			||||||
  DEPENDS:=gluon-setup-mode-virtual +gluon-luci-theme +gluon-lock-password +pretty-hostname $(GLUON_I18N_PACKAGES)
 | 
					  DEPENDS:=gluon-setup-mode-virtual +gluon-web-theme +gluon-lock-password +pretty-hostname
 | 
				
			||||||
  PROVIDES:=gluon-config-mode-core-virtual
 | 
					  PROVIDES:=gluon-config-mode-core-virtual
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					<h2><%:Your node's setup is now complete.%></h2>
 | 
				
			||||||
 | 
					<%
 | 
				
			||||||
 | 
						local fs = require "nixio.fs"
 | 
				
			||||||
 | 
						local util = require "nixio.util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local parts_dir = "/lib/gluon/config-mode/reboot/"
 | 
				
			||||||
 | 
						local files = util.consume(fs.dir(parts_dir) or function() end)
 | 
				
			||||||
 | 
						table.sort(files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local parts = {}
 | 
				
			||||||
 | 
						for _, entry in ipairs(files) do
 | 
				
			||||||
 | 
							if entry:sub(1, 1) ~= '.' then
 | 
				
			||||||
 | 
								local p = assert(loadfile(parts_dir .. entry))
 | 
				
			||||||
 | 
								setfenv(p, getfenv())
 | 
				
			||||||
 | 
								table.insert(parts, p)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, p in ipairs(parts) do
 | 
				
			||||||
 | 
							p()
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					%>
 | 
				
			||||||
@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					<%-
 | 
				
			||||||
 | 
						local sysconfig = require 'gluon.sysconfig'
 | 
				
			||||||
 | 
					-%>
 | 
				
			||||||
 | 
					<p>
 | 
				
			||||||
 | 
						<%=
 | 
				
			||||||
 | 
							renderer.render_string(translate('gluon-config-mode:welcome'), {
 | 
				
			||||||
 | 
								hostname = hostname,
 | 
				
			||||||
 | 
								sysconfig = sysconfig,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						%>
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
@ -1,53 +0,0 @@
 | 
				
			|||||||
<%-
 | 
					 | 
				
			||||||
	local gluon_luci = require 'gluon.luci'
 | 
					 | 
				
			||||||
	local sysconfig = require 'gluon.sysconfig'
 | 
					 | 
				
			||||||
	local i18n = require 'luci.i18n'
 | 
					 | 
				
			||||||
	local template = require 'luci.template'
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<h2><%:Welcome!%></h2>
 | 
					 | 
				
			||||||
<p>
 | 
					 | 
				
			||||||
	<%= template.render_string(i18n.translate('gluon-config-mode:welcome'), {
 | 
					 | 
				
			||||||
		hostname = hostname,
 | 
					 | 
				
			||||||
		sysconfig = sysconfig,
 | 
					 | 
				
			||||||
		escape = gluon_luci.escape,
 | 
					 | 
				
			||||||
		urlescape = gluon_luci.urlescape,
 | 
					 | 
				
			||||||
	}) %>
 | 
					 | 
				
			||||||
</p>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<% if not self.embedded then %>
 | 
					 | 
				
			||||||
<form method="post" enctype="multipart/form-data" action="<%=REQUEST_URI%>">
 | 
					 | 
				
			||||||
	<div>
 | 
					 | 
				
			||||||
		<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 | 
					 | 
				
			||||||
		<input type="hidden" name="token" value="<%=token%>" />
 | 
					 | 
				
			||||||
		<input type="hidden" name="cbi.submit" value="1" />
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
<% end %>
 | 
					 | 
				
			||||||
	<div class="cbi-map" id="cbi-<%=self.config%>">
 | 
					 | 
				
			||||||
		<% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
 | 
					 | 
				
			||||||
		<% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
 | 
					 | 
				
			||||||
		<% self:render_children() %>
 | 
					 | 
				
			||||||
		<br />
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
<%- if self.message then %>
 | 
					 | 
				
			||||||
	<div><%=self.message%></div>
 | 
					 | 
				
			||||||
<%- end %>
 | 
					 | 
				
			||||||
<%- if self.errmessage then %>
 | 
					 | 
				
			||||||
	<div class="error"><%=self.errmessage%></div>
 | 
					 | 
				
			||||||
<%- end %>
 | 
					 | 
				
			||||||
<% if not self.embedded then %>
 | 
					 | 
				
			||||||
	<div class="cbi-page-actions">
 | 
					 | 
				
			||||||
<%-
 | 
					 | 
				
			||||||
		if type(self.hidden) == "table" then
 | 
					 | 
				
			||||||
		  for k, v in pairs(self.hidden) do
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
		<input type="hidden" id="<%=k%>" name="<%=k%>" value="<%=pcdata(v)%>" />
 | 
					 | 
				
			||||||
<%-
 | 
					 | 
				
			||||||
		  end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
%>
 | 
					 | 
				
			||||||
		<input class="cbi-button cbi-button-save" type="submit" value="<%:Save & restart%>" />
 | 
					 | 
				
			||||||
		<script type="text/javascript">cbi_d_update();</script>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
</form>
 | 
					 | 
				
			||||||
<% end %>
 | 
					 | 
				
			||||||
@ -1,17 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
 | 
					 | 
				
			||||||
  <head>
 | 
					 | 
				
			||||||
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
					 | 
				
			||||||
    <title><%=escape(hostname)%> is rebooting</title>
 | 
					 | 
				
			||||||
    <link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
 | 
					 | 
				
			||||||
  </head>
 | 
					 | 
				
			||||||
  <body>
 | 
					 | 
				
			||||||
    <div id="maincontainer">
 | 
					 | 
				
			||||||
      <div id="maincontent">
 | 
					 | 
				
			||||||
        <h2><%:Your node's setup is now complete.%></h2>
 | 
					 | 
				
			||||||
        <% for k, v in ipairs(parts) do v() end %>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
@ -1,6 +1,4 @@
 | 
				
			|||||||
local i18n = require 'luci.i18n'
 | 
					 | 
				
			||||||
local site = require 'gluon.site_config'
 | 
					local site = require 'gluon.site_config'
 | 
				
			||||||
local gluon_luci = require 'gluon.luci'
 | 
					 | 
				
			||||||
local sysconfig = require 'gluon.sysconfig'
 | 
					local sysconfig = require 'gluon.sysconfig'
 | 
				
			||||||
local pretty_hostname = require 'pretty_hostname'
 | 
					local pretty_hostname = require 'pretty_hostname'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -9,15 +7,11 @@ local uci = require("simple-uci").cursor()
 | 
				
			|||||||
local hostname = pretty_hostname.get(uci)
 | 
					local hostname = pretty_hostname.get(uci)
 | 
				
			||||||
local contact = uci:get_first('gluon-node-info', 'owner', 'contact')
 | 
					local contact = uci:get_first('gluon-node-info', 'owner', 'contact')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local msg = i18n.translate('gluon-config-mode:reboot')
 | 
					local msg = translate('gluon-config-mode:reboot')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
return function ()
 | 
					renderer.render_string(msg, {
 | 
				
			||||||
  luci.template.render_string(msg, {
 | 
					 | 
				
			||||||
	hostname = hostname,
 | 
						hostname = hostname,
 | 
				
			||||||
	site = site,
 | 
						site = site,
 | 
				
			||||||
	sysconfig = sysconfig,
 | 
						sysconfig = sysconfig,
 | 
				
			||||||
	contact = contact,
 | 
						contact = contact,
 | 
				
			||||||
    escape = gluon_luci.escape,
 | 
					})
 | 
				
			||||||
    urlescape = gluon_luci.urlescape,
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					entry({}, alias("wizard"))
 | 
				
			||||||
 | 
					entry({"wizard"}, model("gluon-config-mode/wizard"), _("Wizard"), 5)
 | 
				
			||||||
@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					local disp = require 'gluon.web.dispatcher'
 | 
				
			||||||
 | 
					local fs = require "nixio.fs"
 | 
				
			||||||
 | 
					local util = require "gluon.web.util"
 | 
				
			||||||
 | 
					local nixio_util = require "nixio.util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local wizard_dir = "/lib/gluon/config-mode/wizard/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local files = nixio_util.consume(fs.dir(wizard_dir) or function() end)
 | 
				
			||||||
 | 
					table.sort(files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local wizard = {}
 | 
				
			||||||
 | 
					for _, entry in ipairs(files) do
 | 
				
			||||||
 | 
						if entry:sub(1, 1) ~= '.' then
 | 
				
			||||||
 | 
							local f = assert(loadfile(wizard_dir .. entry))
 | 
				
			||||||
 | 
							setfenv(f, getfenv())
 | 
				
			||||||
 | 
							local w = f()
 | 
				
			||||||
 | 
							table.insert(wizard, w)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f = Form(translate("Welcome!"))
 | 
				
			||||||
 | 
					f.submit = translate('Save & restart')
 | 
				
			||||||
 | 
					f.reset = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section)
 | 
				
			||||||
 | 
					s.template = "gluon/config-mode/welcome"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local commit = {'gluon-setup-mode'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for _, w in ipairs(wizard) do
 | 
				
			||||||
 | 
						for _, c in ipairs(w(f, uci) or {}) do
 | 
				
			||||||
 | 
							if not util.contains(commit, c) then
 | 
				
			||||||
 | 
								table.insert(commit, c)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function f:write()
 | 
				
			||||||
 | 
						local nixio = require "nixio"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:set("gluon-setup-mode", uci:get_first("gluon-setup-mode", "setup_mode"), "configured", true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, c in ipairs(commit) do
 | 
				
			||||||
 | 
							uci:commit(c)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						f.template = "gluon/config-mode/reboot"
 | 
				
			||||||
 | 
						f.hidenav = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if nixio.fork() == 0 then
 | 
				
			||||||
 | 
							-- Replace stdout with /dev/null
 | 
				
			||||||
 | 
							nixio.dup(nixio.open('/dev/null', 'w'), nixio.stdout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							-- Sleep a little so the browser can fetch everything required to
 | 
				
			||||||
 | 
							-- display the reboot page, then reboot the device.
 | 
				
			||||||
 | 
							nixio.nanosleep(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nixio.execp("reboot")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f
 | 
				
			||||||
@ -1,93 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module("luci.controller.gluon-config-mode.index", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
  local uci_state = luci.model.uci.cursor_state()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if uci_state:get_first("gluon-setup-mode", "setup_mode", "running", "0") == "1" then
 | 
					 | 
				
			||||||
    local root = node()
 | 
					 | 
				
			||||||
    if not root.target then
 | 
					 | 
				
			||||||
      root.target = alias("gluon-config-mode")
 | 
					 | 
				
			||||||
      root.index = true
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    page          = node()
 | 
					 | 
				
			||||||
    page.lock     = true
 | 
					 | 
				
			||||||
    page.target   = alias("gluon-config-mode")
 | 
					 | 
				
			||||||
    page.subindex = true
 | 
					 | 
				
			||||||
    page.index    = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    page          = node("gluon-config-mode")
 | 
					 | 
				
			||||||
    page.title    = _("Wizard")
 | 
					 | 
				
			||||||
    page.target   = alias("gluon-config-mode", "wizard")
 | 
					 | 
				
			||||||
    page.order    = 5
 | 
					 | 
				
			||||||
    page.sysauth = "root"
 | 
					 | 
				
			||||||
    page.sysauth_authenticator = function() return "root" end
 | 
					 | 
				
			||||||
    page.index    = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    entry({"gluon-config-mode", "wizard"}, cbi("gluon-config-mode/wizard")).index = true
 | 
					 | 
				
			||||||
    entry({"gluon-config-mode", "reboot"}, call("action_reboot"))
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function action_reboot()
 | 
					 | 
				
			||||||
  local uci = luci.model.uci.cursor()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uci:set("gluon-setup-mode", uci:get_first("gluon-setup-mode", "setup_mode"), "configured", "1")
 | 
					 | 
				
			||||||
  uci:save("gluon-setup-mode")
 | 
					 | 
				
			||||||
  uci:commit("gluon-setup-mode")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  local gluon_luci = require "gluon.luci"
 | 
					 | 
				
			||||||
  local fs = require "nixio.fs"
 | 
					 | 
				
			||||||
  local util = require "nixio.util"
 | 
					 | 
				
			||||||
  local pretty_hostname = require "pretty_hostname"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  local parts_dir = "/lib/gluon/config-mode/reboot/"
 | 
					 | 
				
			||||||
  local files = util.consume(fs.dir(parts_dir))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  table.sort(files)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  local parts = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for _, entry in ipairs(files) do
 | 
					 | 
				
			||||||
    if entry:sub(1, 1) ~= '.' then
 | 
					 | 
				
			||||||
      local f = dofile(parts_dir .. '/' .. entry)
 | 
					 | 
				
			||||||
      if f ~= nil then
 | 
					 | 
				
			||||||
        table.insert(parts, f)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  local hostname = pretty_hostname.get(uci)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  luci.template.render("gluon/config-mode/reboot",
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      parts = parts,
 | 
					 | 
				
			||||||
      hostname = hostname,
 | 
					 | 
				
			||||||
      escape = gluon_luci.escape,
 | 
					 | 
				
			||||||
      urlescape = gluon_luci.urlescape,
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if nixio.fork() == 0 then
 | 
					 | 
				
			||||||
    -- Replace stdout with /dev/null
 | 
					 | 
				
			||||||
    nixio.dup(nixio.open('/dev/null', 'w'), nixio.stdout)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    -- Sleep a little so the browser can fetch everything required to
 | 
					 | 
				
			||||||
    -- display the reboot page, then reboot the device.
 | 
					 | 
				
			||||||
    nixio.nanosleep(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    nixio.execp("reboot")
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,42 +0,0 @@
 | 
				
			|||||||
local wizard_dir = "/lib/gluon/config-mode/wizard/"
 | 
					 | 
				
			||||||
local i18n = luci.i18n
 | 
					 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local fs = require "nixio.fs"
 | 
					 | 
				
			||||||
local util = require "nixio.util"
 | 
					 | 
				
			||||||
local f, s
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local wizard = {}
 | 
					 | 
				
			||||||
local files = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if fs.access(wizard_dir) then
 | 
					 | 
				
			||||||
  files = util.consume(fs.dir(wizard_dir))
 | 
					 | 
				
			||||||
  table.sort(files)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for _, entry in ipairs(files) do
 | 
					 | 
				
			||||||
  if entry:sub(1, 1) ~= '.' then
 | 
					 | 
				
			||||||
    table.insert(wizard, dofile(wizard_dir .. '/' .. entry))
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
f = SimpleForm("wizard")
 | 
					 | 
				
			||||||
f.reset = false
 | 
					 | 
				
			||||||
f.template = "gluon/cbi/config-mode"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for _, s in ipairs(wizard) do
 | 
					 | 
				
			||||||
  s.section(f)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
  if state == FORM_VALID then
 | 
					 | 
				
			||||||
    for _, s in ipairs(wizard) do
 | 
					 | 
				
			||||||
      s.handle(data)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    luci.http.redirect(luci.dispatcher.build_url("gluon-config-mode", "reboot"))
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return true
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -1,75 +1,64 @@
 | 
				
			|||||||
local cbi = require "luci.cbi"
 | 
					return function(form, uci)
 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
						local site = require 'gluon.site_config'
 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local site = require 'gluon.site_config'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
local M = {}
 | 
						local location = uci:get_first("gluon-node-info", "location")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function show_altitude()
 | 
						local function show_altitude()
 | 
				
			||||||
		if ((site.config_mode or {}).geo_location or {}).show_altitude ~= false then
 | 
							if ((site.config_mode or {}).geo_location or {}).show_altitude ~= false then
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
  if uci:get_first("gluon-node-info", "location", "altitude") then
 | 
					 | 
				
			||||||
    return true
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  return false
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function M.section(form)
 | 
							return uci:get_bool("gluon-node-info", location, "altitude")
 | 
				
			||||||
  local text = i18n.translate('If you want the location of your node to '
 | 
						end
 | 
				
			||||||
    .. 'be displayed on the map, you can enter its coordinates here.')
 | 
					
 | 
				
			||||||
 | 
						local text = translate(
 | 
				
			||||||
 | 
							'If you want the location of your node to ' ..
 | 
				
			||||||
 | 
							'be displayed on the map, you can enter its coordinates here.'
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
	if show_altitude() then
 | 
						if show_altitude() then
 | 
				
			||||||
    text = text .. ' ' .. i18n.translate("gluon-config-mode:altitude-help")
 | 
							text = text .. ' ' .. translate("gluon-config-mode:altitude-help")
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
  local s = form:section(cbi.SimpleSection, nil, text)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local s = form:section(Section, nil, text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local o
 | 
						local o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  o = s:option(cbi.Flag, "_location", i18n.translate("Show node on the map"))
 | 
						local share_location = s:option(Flag, "location", translate("Show node on the map"))
 | 
				
			||||||
  o.default = uci:get_first("gluon-node-info", "location", "share_location", o.disabled)
 | 
						share_location.default = uci:get_bool("gluon-node-info", location, "share_location")
 | 
				
			||||||
  o.rmempty = false
 | 
						function share_location:write(data)
 | 
				
			||||||
 | 
							uci:set("gluon-node-info", location, "share_location", data)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  o = s:option(cbi.Value, "_latitude", i18n.translate("Latitude"))
 | 
						o = s:option(Value, "latitude", translate("Latitude"), translatef("e.g. %s", "53.873621"))
 | 
				
			||||||
  o.default = uci:get_first("gluon-node-info", "location", "latitude")
 | 
						o.default = uci:get("gluon-node-info", location, "latitude")
 | 
				
			||||||
  o:depends("_location", "1")
 | 
						o:depends(share_location, true)
 | 
				
			||||||
  o.rmempty = false
 | 
					 | 
				
			||||||
	o.datatype = "float"
 | 
						o.datatype = "float"
 | 
				
			||||||
  o.description = i18n.translatef("e.g. %s", "53.873621")
 | 
						function o:write(data)
 | 
				
			||||||
 | 
							uci:set("gluon-node-info", location, "latitude", data)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  o = s:option(cbi.Value, "_longitude", i18n.translate("Longitude"))
 | 
						o = s:option(Value, "longitude", translate("Longitude"), translatef("e.g. %s", "10.689901"))
 | 
				
			||||||
  o.default = uci:get_first("gluon-node-info", "location", "longitude")
 | 
						o.default = uci:get("gluon-node-info", location, "longitude")
 | 
				
			||||||
  o:depends("_location", "1")
 | 
						o:depends(share_location, true)
 | 
				
			||||||
  o.rmempty = false
 | 
					 | 
				
			||||||
	o.datatype = "float"
 | 
						o.datatype = "float"
 | 
				
			||||||
  o.description = i18n.translatef("e.g. %s", "10.689901")
 | 
						function o:write(data)
 | 
				
			||||||
 | 
							uci:set("gluon-node-info", location, "longitude", data)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if show_altitude() then
 | 
						if show_altitude() then
 | 
				
			||||||
    o = s:option(cbi.Value, "_altitude", i18n.translate("gluon-config-mode:altitude-label"))
 | 
							o = s:option(Value, "altitude", translate("gluon-config-mode:altitude-label"), translatef("e.g. %s", "11.51"))
 | 
				
			||||||
    o.default = uci:get_first("gluon-node-info", "location", "altitude")
 | 
							o.default = uci:get("gluon-node-info", location, "altitude")
 | 
				
			||||||
    o:depends("_location", "1")
 | 
							o:depends(share_location, true)
 | 
				
			||||||
    o.rmempty = true
 | 
					 | 
				
			||||||
		o.datatype = "float"
 | 
							o.datatype = "float"
 | 
				
			||||||
    o.description = i18n.translatef("e.g. %s", "11.51")
 | 
							o.optional = true
 | 
				
			||||||
  end
 | 
							function o:write(data)
 | 
				
			||||||
 | 
								if data then
 | 
				
			||||||
end
 | 
									uci:set("gluon-node-info", location, "altitude", data)
 | 
				
			||||||
 | 
					 | 
				
			||||||
function M.handle(data)
 | 
					 | 
				
			||||||
  local sname = uci:get_first("gluon-node-info", "location")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uci:set("gluon-node-info", sname, "share_location", data._location)
 | 
					 | 
				
			||||||
  if data._location and data._latitude ~= nil and data._longitude ~= nil then
 | 
					 | 
				
			||||||
    uci:set("gluon-node-info", sname, "latitude", data._latitude:trim())
 | 
					 | 
				
			||||||
    uci:set("gluon-node-info", sname, "longitude", data._longitude:trim())
 | 
					 | 
				
			||||||
    if data._altitude ~= nil then
 | 
					 | 
				
			||||||
      uci:set("gluon-node-info", sname, "altitude", data._altitude:trim())
 | 
					 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
      uci:delete("gluon-node-info", sname, "altitude")
 | 
									uci:delete("gluon-node-info", location, "altitude")
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
  uci:save("gluon-node-info")
 | 
					 | 
				
			||||||
  uci:commit("gluon-node-info")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
return M
 | 
						return {'gluon-node-info'}
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,13 @@
 | 
				
			|||||||
local cbi = require "luci.cbi"
 | 
					return function(form, uci)
 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
						local pretty_hostname = require "pretty_hostname"
 | 
				
			||||||
local pretty_hostname = require "pretty_hostname"
 | 
					 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
local M = {}
 | 
						local s = form:section(Section)
 | 
				
			||||||
 | 
						local o = s:option(Value, "hostname", translate("Node name"))
 | 
				
			||||||
 | 
						o.default = pretty_hostname.get(uci)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function M.section(form)
 | 
						function o:write(data)
 | 
				
			||||||
  local s = form:section(cbi.SimpleSection, nil, nil)
 | 
							pretty_hostname.set(uci, data)
 | 
				
			||||||
  local o = s:option(cbi.Value, "_hostname", i18n.translate("Node name"))
 | 
						end
 | 
				
			||||||
  o.value = pretty_hostname.get(uci)
 | 
					
 | 
				
			||||||
  o.rmempty = false
 | 
						return {'system'}
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					 | 
				
			||||||
function M.handle(data)
 | 
					 | 
				
			||||||
  pretty_hostname.set(uci, data._hostname)
 | 
					 | 
				
			||||||
  uci:commit("system")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return M
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -2,32 +2,27 @@ local uci = require("simple-uci").cursor()
 | 
				
			|||||||
local meshvpn_enabled = uci:get_bool("fastd", "mesh_vpn", "enabled")
 | 
					local meshvpn_enabled = uci:get_bool("fastd", "mesh_vpn", "enabled")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if not meshvpn_enabled then
 | 
					if not meshvpn_enabled then
 | 
				
			||||||
  return nil
 | 
						return
 | 
				
			||||||
else
 | 
					end
 | 
				
			||||||
  local i18n = require "luci.i18n"
 | 
					 | 
				
			||||||
  local util = require "luci.util"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local gluon_luci = require 'gluon.luci'
 | 
					local lutil = require "gluon.web.util"
 | 
				
			||||||
  local site = require 'gluon.site_config'
 | 
					 | 
				
			||||||
  local sysconfig = require 'gluon.sysconfig'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local pretty_hostname = require 'pretty_hostname'
 | 
					local site = require 'gluon.site_config'
 | 
				
			||||||
 | 
					local sysconfig = require 'gluon.sysconfig'
 | 
				
			||||||
 | 
					local util = require "gluon.util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local pubkey = util.trim(util.exec("/etc/init.d/fastd show_key " .. "mesh_vpn"))
 | 
					local pretty_hostname = require 'pretty_hostname'
 | 
				
			||||||
  local hostname = pretty_hostname.get(uci)
 | 
					 | 
				
			||||||
  local contact = uci:get_first("gluon-node-info", "owner", "contact")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local msg = i18n.translate('gluon-config-mode:pubkey')
 | 
					local pubkey = util.trim(lutil.exec("/etc/init.d/fastd show_key mesh_vpn"))
 | 
				
			||||||
 | 
					local hostname = pretty_hostname.get(uci)
 | 
				
			||||||
 | 
					local contact = uci:get_first("gluon-node-info", "owner", "contact")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return function ()
 | 
					local msg = translate('gluon-config-mode:pubkey')
 | 
				
			||||||
    luci.template.render_string(msg, {
 | 
					
 | 
				
			||||||
 | 
					renderer.render_string(msg, {
 | 
				
			||||||
	pubkey = pubkey,
 | 
						pubkey = pubkey,
 | 
				
			||||||
	hostname = hostname,
 | 
						hostname = hostname,
 | 
				
			||||||
	site = site,
 | 
						site = site,
 | 
				
			||||||
	sysconfig = sysconfig,
 | 
						sysconfig = sysconfig,
 | 
				
			||||||
	contact = contact,
 | 
						contact = contact,
 | 
				
			||||||
      escape = gluon_luci.escape,
 | 
					})
 | 
				
			||||||
      urlescape = gluon_luci.urlescape,
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,64 +1,47 @@
 | 
				
			|||||||
local cbi = require "luci.cbi"
 | 
					return function(form, uci)
 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
						local msg = translate(
 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
							'Your internet connection can be used to establish an ' ..
 | 
				
			||||||
 | 
					 | 
				
			||||||
local M = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function M.section(form)
 | 
					 | 
				
			||||||
  local msg = i18n.translate('Your internet connection can be used to establish an ' ..
 | 
					 | 
				
			||||||
	        'encrypted connection with other nodes. ' ..
 | 
						        'encrypted connection with other nodes. ' ..
 | 
				
			||||||
	        'Enable this option if there are no other nodes reachable ' ..
 | 
						        'Enable this option if there are no other nodes reachable ' ..
 | 
				
			||||||
	        'over WLAN in your vicinity or you want to make a part of ' ..
 | 
						        'over WLAN in your vicinity or you want to make a part of ' ..
 | 
				
			||||||
	        'your connection\'s bandwidth available for the network. You can limit how ' ..
 | 
						        'your connection\'s bandwidth available for the network. You can limit how ' ..
 | 
				
			||||||
                             'much bandwidth the node will use at most.')
 | 
						        'much bandwidth the node will use at most.'
 | 
				
			||||||
  local s = form:section(cbi.SimpleSection, nil, msg)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local s = form:section(Section, nil, msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local o
 | 
						local o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  o = s:option(cbi.Flag, "_meshvpn", i18n.translate("Use internet connection (mesh VPN)"))
 | 
						local meshvpn = s:option(Flag, "meshvpn", translate("Use internet connection (mesh VPN)"))
 | 
				
			||||||
  o.default = uci:get_bool("fastd", "mesh_vpn", "enabled") and o.enabled or o.disabled
 | 
						meshvpn.default = uci:get_bool("fastd", "mesh_vpn", "enabled")
 | 
				
			||||||
  o.rmempty = false
 | 
						function meshvpn:write(data)
 | 
				
			||||||
 | 
							uci:set("fastd", "mesh_vpn", "enabled", data)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  o = s:option(cbi.Flag, "_limit_enabled", i18n.translate("Limit bandwidth"))
 | 
						local limit = s:option(Flag, "limit_enabled", translate("Limit bandwidth"))
 | 
				
			||||||
  o:depends("_meshvpn", "1")
 | 
						limit:depends(meshvpn, true)
 | 
				
			||||||
  o.default = uci:get_bool("simple-tc", "mesh_vpn", "enabled") and o.enabled or o.disabled
 | 
						limit.default = uci:get_bool("simple-tc", "mesh_vpn", "enabled")
 | 
				
			||||||
  o.rmempty = false
 | 
						function limit:write(data)
 | 
				
			||||||
 | 
					 | 
				
			||||||
  o = s:option(cbi.Value, "_limit_ingress", i18n.translate("Downstream (kbit/s)"))
 | 
					 | 
				
			||||||
  o:depends("_limit_enabled", "1")
 | 
					 | 
				
			||||||
  o.value = uci:get("simple-tc", "mesh_vpn", "limit_ingress")
 | 
					 | 
				
			||||||
  o.rmempty = false
 | 
					 | 
				
			||||||
  o.datatype = "uinteger"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  o = s:option(cbi.Value, "_limit_egress", i18n.translate("Upstream (kbit/s)"))
 | 
					 | 
				
			||||||
  o:depends("_limit_enabled", "1")
 | 
					 | 
				
			||||||
  o.value = uci:get("simple-tc", "mesh_vpn", "limit_egress")
 | 
					 | 
				
			||||||
  o.rmempty = false
 | 
					 | 
				
			||||||
  o.datatype = "uinteger"
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function M.handle(data)
 | 
					 | 
				
			||||||
  uci:set("fastd", "mesh_vpn", "enabled", data._meshvpn)
 | 
					 | 
				
			||||||
  uci:save("fastd")
 | 
					 | 
				
			||||||
  uci:commit("fastd")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  -- checks for nil needed due to o:depends(...)
 | 
					 | 
				
			||||||
  if data._limit_enabled ~= nil then
 | 
					 | 
				
			||||||
		uci:set("simple-tc", "mesh_vpn", "interface")
 | 
							uci:set("simple-tc", "mesh_vpn", "interface")
 | 
				
			||||||
    uci:set("simple-tc", "mesh_vpn", "enabled", data._limit_enabled)
 | 
							uci:set("simple-tc", "mesh_vpn", "enabled", data)
 | 
				
			||||||
		uci:set("simple-tc", "mesh_vpn", "ifname", "mesh-vpn")
 | 
							uci:set("simple-tc", "mesh_vpn", "ifname", "mesh-vpn")
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if data._limit_ingress ~= nil then
 | 
					 | 
				
			||||||
      uci:set("simple-tc", "mesh_vpn", "limit_ingress", data._limit_ingress:trim())
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if data._limit_egress ~= nil then
 | 
						o = s:option(Value, "limit_ingress", translate("Downstream (kbit/s)"))
 | 
				
			||||||
      uci:set("simple-tc", "mesh_vpn", "limit_egress", data._limit_egress:trim())
 | 
						o:depends(limit, true)
 | 
				
			||||||
 | 
						o.default = uci:get("simple-tc", "mesh_vpn", "limit_ingress")
 | 
				
			||||||
 | 
						o.datatype = "uinteger"
 | 
				
			||||||
 | 
						function o:write(data)
 | 
				
			||||||
 | 
							uci:set("simple-tc", "mesh_vpn", "limit_ingress", data)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uci:save("simple-tc")
 | 
						o = s:option(Value, "limit_egress", translate("Upstream (kbit/s)"))
 | 
				
			||||||
    uci:commit("simple-tc")
 | 
						o:depends(limit, true)
 | 
				
			||||||
 | 
						o.default = uci:get("simple-tc", "mesh_vpn", "limit_egress")
 | 
				
			||||||
 | 
						o.datatype = "uinteger"
 | 
				
			||||||
 | 
						function o:write(data)
 | 
				
			||||||
 | 
							uci:set("simple-tc", "mesh_vpn", "limit_egress", data)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return {'fastd', 'simple-tc'}
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					 | 
				
			||||||
return M
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
 | 
					 | 
				
			||||||
  <head>
 | 
					 | 
				
			||||||
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
					 | 
				
			||||||
    <title><%:Upgrading firmware%></title>
 | 
					 | 
				
			||||||
    <link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
 | 
					 | 
				
			||||||
  </head>
 | 
					 | 
				
			||||||
  <body>
 | 
					 | 
				
			||||||
    <div id="maincontainer">
 | 
					 | 
				
			||||||
      <div id="maincontent">
 | 
					 | 
				
			||||||
        <p>
 | 
					 | 
				
			||||||
          <%:The firmware is currently being upgraded.%>
 | 
					 | 
				
			||||||
          <strong><%:Don't switch off the device in any circumstance!%></strong>
 | 
					 | 
				
			||||||
          <%:The upgrade will take a few minutes. When it is finished, your node will reboot automatically.%>
 | 
					 | 
				
			||||||
        </p>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
@ -1,39 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					 | 
				
			||||||
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module("luci.controller.admin.index", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
	local uci_state = luci.model.uci.cursor_state()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- Disable gluon-luci-admin when setup mode is not enabled
 | 
					 | 
				
			||||||
	if uci_state:get_first('gluon-setup-mode', 'setup_mode', 'running', '0') ~= '1' then
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local root = node()
 | 
					 | 
				
			||||||
	if not root.lock then
 | 
					 | 
				
			||||||
		root.target = alias("admin")
 | 
					 | 
				
			||||||
		root.index = true
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local page = entry({"admin"}, alias("admin", "index"), _("Advanced settings"), 10)
 | 
					 | 
				
			||||||
	page.sysauth = "root"
 | 
					 | 
				
			||||||
	page.sysauth_authenticator = function() return "root" end
 | 
					 | 
				
			||||||
	page.index = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	entry({"admin", "index"}, template("admin/info"), _("Information"), 1)
 | 
					 | 
				
			||||||
	entry({"admin", "remote"}, cbi("admin/remote"), _("Remote access"), 10)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,139 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					 | 
				
			||||||
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module("luci.controller.admin.upgrade", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
	local has_platform = nixio.fs.access("/lib/upgrade/platform.sh")
 | 
					 | 
				
			||||||
	if has_platform then
 | 
					 | 
				
			||||||
		entry({"admin", "upgrade"}, call("action_upgrade"), _("Upgrade firmware"), 90)
 | 
					 | 
				
			||||||
		entry({"admin", "upgrade", "reboot"}, template("admin/upgrade_reboot"), nil, nil)
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function action_upgrade()
 | 
					 | 
				
			||||||
	local tmpfile = "/tmp/firmware.img"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- Install upload handler
 | 
					 | 
				
			||||||
	local file
 | 
					 | 
				
			||||||
	luci.http.setfilehandler(
 | 
					 | 
				
			||||||
		function(meta, chunk, eof)
 | 
					 | 
				
			||||||
			if not nixio.fs.access(tmpfile) and not file and chunk and #chunk > 0 then
 | 
					 | 
				
			||||||
				file = io.open(tmpfile, "w")
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			if file and chunk then
 | 
					 | 
				
			||||||
				file:write(chunk)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			if file and eof then
 | 
					 | 
				
			||||||
				file:close()
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- Determine state
 | 
					 | 
				
			||||||
	local step         = tonumber(luci.http.formvalue("step") or 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if step ~= 1 and not luci.dispatcher.test_post_security() then
 | 
					 | 
				
			||||||
		nixio.fs.unlink(tmpfile)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local has_image    = nixio.fs.access(tmpfile)
 | 
					 | 
				
			||||||
	local has_support  = image_supported(tmpfile)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- Step 1: file upload, error on unsupported image format
 | 
					 | 
				
			||||||
	if not has_image or not has_support or step == 1 then
 | 
					 | 
				
			||||||
		-- If there is an image but user has requested step 1
 | 
					 | 
				
			||||||
		-- or type is not supported, then remove it.
 | 
					 | 
				
			||||||
		if has_image then
 | 
					 | 
				
			||||||
			nixio.fs.unlink(tmpfile)
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		luci.template.render("admin/upgrade", {
 | 
					 | 
				
			||||||
			bad_image=(has_image and not has_support or false)
 | 
					 | 
				
			||||||
		} )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- Step 2: present uploaded file, show checksum, confirmation
 | 
					 | 
				
			||||||
	elseif step == 2 then
 | 
					 | 
				
			||||||
		luci.template.render("admin/upgrade_confirm", {
 | 
					 | 
				
			||||||
			checksum=image_checksum(tmpfile),
 | 
					 | 
				
			||||||
			filesize=nixio.fs.stat(tmpfile).size,
 | 
					 | 
				
			||||||
			flashsize=storage_size(),
 | 
					 | 
				
			||||||
			keepconfig=luci.http.formvalue("keepcfg") == "1"
 | 
					 | 
				
			||||||
		} )
 | 
					 | 
				
			||||||
	elseif step == 3 then
 | 
					 | 
				
			||||||
		local keepcfg = luci.http.formvalue("keepcfg") == "1"
 | 
					 | 
				
			||||||
		fork_exec("/sbin/sysupgrade %s %q" % { keepcfg and "" or "-n", tmpfile })
 | 
					 | 
				
			||||||
		luci.http.redirect(luci.dispatcher.build_url("admin", "upgrade", "reboot"))
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function fork_exec(command)
 | 
					 | 
				
			||||||
	local pid = nixio.fork()
 | 
					 | 
				
			||||||
	if pid > 0 then
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	elseif pid == 0 then
 | 
					 | 
				
			||||||
		-- change to root dir
 | 
					 | 
				
			||||||
		nixio.chdir("/")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- patch stdin, out, err to /dev/null
 | 
					 | 
				
			||||||
		local null = nixio.open("/dev/null", "w+")
 | 
					 | 
				
			||||||
		if null then
 | 
					 | 
				
			||||||
			nixio.dup(null, nixio.stderr)
 | 
					 | 
				
			||||||
			nixio.dup(null, nixio.stdout)
 | 
					 | 
				
			||||||
			nixio.dup(null, nixio.stdin)
 | 
					 | 
				
			||||||
			if null:fileno() > 2 then
 | 
					 | 
				
			||||||
				null:close()
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		-- replace with target command
 | 
					 | 
				
			||||||
		nixio.exec("/bin/sh", "-c", command)
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function image_supported(tmpfile)
 | 
					 | 
				
			||||||
	-- XXX: yay...
 | 
					 | 
				
			||||||
	return ( 0 == os.execute(
 | 
					 | 
				
			||||||
		"/sbin/sysupgrade -T %q >/dev/null"
 | 
					 | 
				
			||||||
			% tmpfile
 | 
					 | 
				
			||||||
	) )
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function storage_size()
 | 
					 | 
				
			||||||
	local size = 0
 | 
					 | 
				
			||||||
	if nixio.fs.access("/proc/mtd") then
 | 
					 | 
				
			||||||
		for l in io.lines("/proc/mtd") do
 | 
					 | 
				
			||||||
			local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
 | 
					 | 
				
			||||||
			if n == "linux" then
 | 
					 | 
				
			||||||
				size = tonumber(s, 16)
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	elseif nixio.fs.access("/proc/partitions") then
 | 
					 | 
				
			||||||
		for l in io.lines("/proc/partitions") do
 | 
					 | 
				
			||||||
			local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
 | 
					 | 
				
			||||||
			if b and n and not n:match('[0-9]') then
 | 
					 | 
				
			||||||
				size = tonumber(b) * 1024
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	return size
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function image_checksum(tmpfile)
 | 
					 | 
				
			||||||
	return (luci.sys.exec("md5sum %q" % tmpfile):match("^([^%s]+)"))
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,87 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					 | 
				
			||||||
Copyright 2011 Jo-Philipp Wich <xm@subsignal.org>
 | 
					 | 
				
			||||||
Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local fs = require "nixio.fs"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f_keys = SimpleForm('keys', translate("SSH keys"), translate("You can provide your SSH keys here (one per line):"))
 | 
					 | 
				
			||||||
f_keys.hidden = { submit_keys = '1' }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local keys
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
keys = f_keys:field(TextValue, "keys", "")
 | 
					 | 
				
			||||||
keys.wrap    = "off"
 | 
					 | 
				
			||||||
keys.rows    = 5
 | 
					 | 
				
			||||||
keys.rmempty = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function keys.cfgvalue()
 | 
					 | 
				
			||||||
	return fs.readfile("/etc/dropbear/authorized_keys") or ""
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function keys.write(self, section, value)
 | 
					 | 
				
			||||||
	if not f_keys:formvalue('submit_keys') then return end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n"):trim() .. "\n")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function keys.remove(self, section)
 | 
					 | 
				
			||||||
	if not f_keys:formvalue('submit_keys') then return end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fs.remove("/etc/dropbear/authorized_keys")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f_password = SimpleForm('password', translate("Password"),
 | 
					 | 
				
			||||||
	translate(
 | 
					 | 
				
			||||||
                "Alternatively, you can set a password to access you node. Please choose a secure password you don't use anywhere else.<br /><br />"
 | 
					 | 
				
			||||||
                .. "If you set an empty password, login via password will be disabled. This is the default."
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
f_password.hidden = { submit_password = '1' }
 | 
					 | 
				
			||||||
f_password.reset = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local pw1 = f_password:field(Value, "pw1", translate("Password"))
 | 
					 | 
				
			||||||
pw1.password = true
 | 
					 | 
				
			||||||
function pw1.cfgvalue()
 | 
					 | 
				
			||||||
	return ''
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local pw2 = f_password:field(Value, "pw2", translate("Confirmation"))
 | 
					 | 
				
			||||||
pw2.password = true
 | 
					 | 
				
			||||||
function pw2.cfgvalue()
 | 
					 | 
				
			||||||
	return ''
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f_password:handle(state, data)
 | 
					 | 
				
			||||||
	if not f_password:formvalue('submit_password') then return end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if data.pw1 ~= data.pw2 then
 | 
					 | 
				
			||||||
		f_password.errmessage = translate("The password and the confirmation differ.")
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if data.pw1 and #data.pw1 > 0 then
 | 
					 | 
				
			||||||
		if luci.sys.user.setpasswd('root', data.pw1) == 0 then
 | 
					 | 
				
			||||||
			f_password.message = translate("Password changed.")
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
			f_password.errmessage = translate("Unable to change the password.")
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		-- We don't check the return code here as the error 'password for root is already locked' is normal...
 | 
					 | 
				
			||||||
		os.execute('passwd -l root >/dev/null')
 | 
					 | 
				
			||||||
		f_password.message = translate("Password removed.")
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f_keys, f_password
 | 
					 | 
				
			||||||
@ -1,19 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module("luci.controller.admin.autoupdater", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
        entry({"admin", "autoupdater"}, cbi("admin/autoupdater"), _("Automatic updates"), 80)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,32 +0,0 @@
 | 
				
			|||||||
<div class="cbi-value">
 | 
					 | 
				
			||||||
  <div class="cbi-value-title">
 | 
					 | 
				
			||||||
    <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio" value="security"<%= attr("id", cbid..'1') .. attr("name", cbid) .. ifattr((self:cfgvalue(section) or self.default) == "security", "checked", "checked") %> />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="cbi-value-field-long">
 | 
					 | 
				
			||||||
    <label<%= attr("for", cbid..'1') %> class="cbi-value-title"><%:Security mode%></label>
 | 
					 | 
				
			||||||
    <br />
 | 
					 | 
				
			||||||
    <%= translate(
 | 
					 | 
				
			||||||
        'In security mode, the mesh VPN uses an encrypted tunnel to connect to the VPN servers. ' ..
 | 
					 | 
				
			||||||
        'The encryption ensures that it is impossible for your internet access provider to see what ' ..
 | 
					 | 
				
			||||||
        'data is exchanged over your node.'
 | 
					 | 
				
			||||||
    ) %>
 | 
					 | 
				
			||||||
    <br />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="cbi-value-field-long-after"></div>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div class="cbi-value cbi-value-last">
 | 
					 | 
				
			||||||
  <div class="cbi-value-title">
 | 
					 | 
				
			||||||
    <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio" value="performance"<%= attr("id", cbid..'2') .. attr("name", cbid) .. ifattr((self:cfgvalue(section) or self.default) == "performance", "checked", "checked") %> />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="cbi-value-field-long">
 | 
					 | 
				
			||||||
    <label<%= attr("for", cbid..'2') %> class="cbi-value-title"><%:Performance mode%></label>
 | 
					 | 
				
			||||||
    <br />
 | 
					 | 
				
			||||||
    <%= translate(
 | 
					 | 
				
			||||||
        'In performance mode, no encryption is used. This usually allows for higher throughput, but the data exchanged over your node is not ' ..
 | 
					 | 
				
			||||||
        'protected against eavesdropping.'
 | 
					 | 
				
			||||||
    ) %>
 | 
					 | 
				
			||||||
    <br />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="cbi-value-field-long-after"></div>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
module("luci.controller.admin.mesh_vpn_fastd", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
  entry({"admin", "mesh_vpn_fastd"}, cbi("admin/mesh_vpn_fastd"), _("Mesh VPN"), 20)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,40 +0,0 @@
 | 
				
			|||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local util = luci.util
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f = SimpleForm('mesh_vpn', translate('Mesh VPN'))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local s = f:section(SimpleSection)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local o = s:option(Value, 'mode')
 | 
					 | 
				
			||||||
o.template = "gluon/cbi/mesh-vpn-fastd-mode"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local methods = uci:get('fastd', 'mesh_vpn', 'method')
 | 
					 | 
				
			||||||
if util.contains(methods, 'null') then
 | 
					 | 
				
			||||||
  o.default = 'performance'
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  o.default = 'security'
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
  if state == FORM_VALID then
 | 
					 | 
				
			||||||
    local site = require 'gluon.site_config'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    local methods = {}
 | 
					 | 
				
			||||||
    if data.mode == 'performance' then
 | 
					 | 
				
			||||||
      table.insert(methods, 'null')
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for _, method in ipairs(site.fastd_mesh_vpn.methods) do
 | 
					 | 
				
			||||||
      if method ~= 'null' then
 | 
					 | 
				
			||||||
	table.insert(methods, method)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uci:set('fastd', 'mesh_vpn', 'method', methods)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uci:save('fastd')
 | 
					 | 
				
			||||||
    uci:commit('fastd')
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
module("luci.controller.admin.noderole", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
	entry({"admin", "noderole"}, cbi("admin/noderole"), "Node role", 20)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,33 +0,0 @@
 | 
				
			|||||||
local f, s, o
 | 
					 | 
				
			||||||
local site = require 'gluon.site_config'
 | 
					 | 
				
			||||||
local i18n = require "luci.i18n"
 | 
					 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local config = 'gluon-node-info'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- where to read the configuration from
 | 
					 | 
				
			||||||
local role = uci:get(config, uci:get_first(config, "system"), "role")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
f = SimpleForm("role", i18n.translate("Node role"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s = f:section(SimpleSection, nil, i18n.translate(
 | 
					 | 
				
			||||||
  "If this node has a special role within the freifunk network you can specify this role here. "
 | 
					 | 
				
			||||||
    .. "Please find out about the available roles and their impact first. "
 | 
					 | 
				
			||||||
    .. "Only change the role if you know what you are doing."))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(ListValue, "role", i18n.translate("Role"))
 | 
					 | 
				
			||||||
o.default = role
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
for _, role in ipairs(site.roles.list) do
 | 
					 | 
				
			||||||
  o:value(role, i18n.translate('gluon-luci-node-role:role:' .. role))
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
  if state == FORM_VALID then
 | 
					 | 
				
			||||||
    uci:set(config, uci:get_first(config, "system"), "role", data.role)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uci:save(config)
 | 
					 | 
				
			||||||
    uci:commit(config)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -1,19 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module("luci.controller.admin.portconfig", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
        entry({"admin", "portconfig"}, cbi("admin/portconfig"), _("Network"), 20)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,167 +0,0 @@
 | 
				
			|||||||
--[[
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2014 Nils Schneider <nils@nilsschneider.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local sysconfig = require 'gluon.sysconfig'
 | 
					 | 
				
			||||||
local util = require 'gluon.util'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local wan = uci:get_all("network", "wan")
 | 
					 | 
				
			||||||
local wan6 = uci:get_all("network", "wan6")
 | 
					 | 
				
			||||||
local dns = uci:get_first("gluon-wan-dnsmasq", "static")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f = SimpleForm("portconfig", translate("WAN connection"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local s
 | 
					 | 
				
			||||||
local o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s = f:section(SimpleSection, nil, nil)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(ListValue, "ipv4", translate("IPv4"))
 | 
					 | 
				
			||||||
o:value("dhcp", translate("Automatic (DHCP)"))
 | 
					 | 
				
			||||||
o:value("static", translate("Static"))
 | 
					 | 
				
			||||||
o:value("none", translate("Disabled"))
 | 
					 | 
				
			||||||
o.default = wan.proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ipv4_addr", translate("IP address"))
 | 
					 | 
				
			||||||
o:depends("ipv4", "static")
 | 
					 | 
				
			||||||
o.value = wan.ipaddr
 | 
					 | 
				
			||||||
o.datatype = "ip4addr"
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ipv4_netmask", translate("Netmask"))
 | 
					 | 
				
			||||||
o:depends("ipv4", "static")
 | 
					 | 
				
			||||||
o.value = wan.netmask or "255.255.255.0"
 | 
					 | 
				
			||||||
o.datatype = "ip4addr"
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ipv4_gateway", translate("Gateway"))
 | 
					 | 
				
			||||||
o:depends("ipv4", "static")
 | 
					 | 
				
			||||||
o.value = wan.gateway
 | 
					 | 
				
			||||||
o.datatype = "ip4addr"
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s = f:section(SimpleSection, nil, nil)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(ListValue, "ipv6", translate("IPv6"))
 | 
					 | 
				
			||||||
o:value("dhcpv6", translate("Automatic (RA/DHCPv6)"))
 | 
					 | 
				
			||||||
o:value("static", translate("Static"))
 | 
					 | 
				
			||||||
o:value("none", translate("Disabled"))
 | 
					 | 
				
			||||||
o.default = wan6.proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ipv6_addr", translate("IP address"))
 | 
					 | 
				
			||||||
o:depends("ipv6", "static")
 | 
					 | 
				
			||||||
o.value = wan6.ip6addr
 | 
					 | 
				
			||||||
o.datatype = "ip6addr"
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ipv6_gateway", translate("Gateway"))
 | 
					 | 
				
			||||||
o:depends("ipv6", "static")
 | 
					 | 
				
			||||||
o.value = wan6.ip6gw
 | 
					 | 
				
			||||||
o.datatype = "ip6addr"
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if dns then
 | 
					 | 
				
			||||||
	s = f:section(SimpleSection, nil, nil)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	o = s:option(DynamicList, "dns", translate("Static DNS servers"))
 | 
					 | 
				
			||||||
	o:write(nil, uci:get("gluon-wan-dnsmasq", dns, "server"))
 | 
					 | 
				
			||||||
	o.datatype = "ipaddr"
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s = f:section(SimpleSection, nil, nil)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Flag, "mesh_wan", translate("Enable meshing on the WAN interface"))
 | 
					 | 
				
			||||||
o.default = uci:get_bool("network", "mesh_wan", "auto") and o.enabled or o.disabled
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if sysconfig.lan_ifname then
 | 
					 | 
				
			||||||
	o = s:option(Flag, "mesh_lan", translate("Enable meshing on the LAN interface"))
 | 
					 | 
				
			||||||
	o.default = uci:get_bool("network", "mesh_lan", "auto") and o.enabled or o.disabled
 | 
					 | 
				
			||||||
	o.rmempty = false
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if uci:get('system', 'gpio_switch_poe_passthrough') then
 | 
					 | 
				
			||||||
	s = f:section(SimpleSection, nil, nil)
 | 
					 | 
				
			||||||
	o = s:option(Flag, "poe_passthrough", translate("Enable PoE passthrough"))
 | 
					 | 
				
			||||||
	o.default = uci:get_bool("system", "gpio_switch_poe_passthrough", "value") and o.enabled or o.disabled
 | 
					 | 
				
			||||||
	o.rmempty = false
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
	if state == FORM_VALID then
 | 
					 | 
				
			||||||
	uci:set("network", "wan", "proto", data.ipv4)
 | 
					 | 
				
			||||||
	if data.ipv4 == "static" then
 | 
					 | 
				
			||||||
		uci:set("network", "wan", "ipaddr", data.ipv4_addr:trim())
 | 
					 | 
				
			||||||
		uci:set("network", "wan", "netmask", data.ipv4_netmask:trim())
 | 
					 | 
				
			||||||
		uci:set("network", "wan", "gateway", data.ipv4_gateway:trim())
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		uci:delete("network", "wan", "ipaddr")
 | 
					 | 
				
			||||||
		uci:delete("network", "wan", "netmask")
 | 
					 | 
				
			||||||
		uci:delete("network", "wan", "gateway")
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uci:set("network", "wan6", "proto", data.ipv6)
 | 
					 | 
				
			||||||
	if data.ipv6 == "static" then
 | 
					 | 
				
			||||||
		uci:set("network", "wan6", "ip6addr", data.ipv6_addr:trim())
 | 
					 | 
				
			||||||
		uci:set("network", "wan6", "ip6gw", data.ipv6_gateway:trim())
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		uci:delete("network", "wan6", "ip6addr")
 | 
					 | 
				
			||||||
		uci:delete("network", "wan6", "ip6gw")
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uci:set("network", "mesh_wan", "auto", data.mesh_wan)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if sysconfig.lan_ifname then
 | 
					 | 
				
			||||||
		uci:set("network", "mesh_lan", "auto", data.mesh_lan)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local interfaces = uci:get_list("network", "client", "ifname")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for lanif in sysconfig.lan_ifname:gmatch('%S+') do
 | 
					 | 
				
			||||||
			if data.mesh_lan == '1' then
 | 
					 | 
				
			||||||
				util.remove_from_set(interfaces, lanif)
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				util.add_to_set(interfaces, lanif)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		uci:set_list("network", "client", "ifname", interfaces)
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uci:save("network")
 | 
					 | 
				
			||||||
	uci:commit("network")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if uci:get('system', 'gpio_switch_poe_passthrough') then
 | 
					 | 
				
			||||||
	uci:set('system', 'gpio_switch_poe_passthrough', 'value', data.poe_passthrough)
 | 
					 | 
				
			||||||
	uci:save('system')
 | 
					 | 
				
			||||||
	uci:commit('system')
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if dns then
 | 
					 | 
				
			||||||
		if #data.dns > 0 then
 | 
					 | 
				
			||||||
		uci:set("gluon-wan-dnsmasq", dns, "server", data.dns)
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		uci:delete("gluon-wan-dnsmasq", dns, "server")
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		uci:save("gluon-wan-dnsmasq")
 | 
					 | 
				
			||||||
		uci:commit("gluon-wan-dnsmasq")
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return true
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
module("luci.controller.admin.privatewifi", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
	entry({"admin", "privatewifi"}, cbi("admin/privatewifi"), _("Private WLAN"), 10)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,67 +0,0 @@
 | 
				
			|||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local util = require 'gluon.util'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f, s, o, ssid
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- where to read the configuration from
 | 
					 | 
				
			||||||
local primary_iface = 'wan_radio0'
 | 
					 | 
				
			||||||
local ssid = uci:get('wireless', primary_iface, "ssid")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
f = SimpleForm("wifi", translate("Private WLAN"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s = f:section(SimpleSection, nil, translate(
 | 
					 | 
				
			||||||
                'Your node can additionally extend your private network by bridging the WAN interface '
 | 
					 | 
				
			||||||
                  .. 'with a separate WLAN. This feature is completely independent of the mesh functionality. '
 | 
					 | 
				
			||||||
                  .. 'Please note that the private WLAN and meshing on the WAN interface should not be enabled '
 | 
					 | 
				
			||||||
                  .. 'at the same time.'
 | 
					 | 
				
			||||||
))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Flag, "enabled", translate("Enabled"))
 | 
					 | 
				
			||||||
o.default = (ssid and not uci:get_bool('wireless', primary_iface, "disabled")) and o.enabled or o.disabled
 | 
					 | 
				
			||||||
o.rmempty = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "ssid", translate("Name (SSID)"))
 | 
					 | 
				
			||||||
o:depends("enabled", '1')
 | 
					 | 
				
			||||||
o.datatype = "maxlength(32)"
 | 
					 | 
				
			||||||
o.default = ssid
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
o = s:option(Value, "key", translate("Key"), translate("8-63 characters"))
 | 
					 | 
				
			||||||
o:depends("enabled", '1')
 | 
					 | 
				
			||||||
o.datatype = "wpakey"
 | 
					 | 
				
			||||||
o.default = uci:get('wireless', primary_iface, "key")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
  if state == FORM_VALID then
 | 
					 | 
				
			||||||
    util.iterate_radios(
 | 
					 | 
				
			||||||
      function(radio, index)
 | 
					 | 
				
			||||||
        local name   = "wan_" .. radio
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if data.enabled == '1' then
 | 
					 | 
				
			||||||
          local macaddr = util.get_wlan_mac(radio, index, 4)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          -- set up WAN wifi-iface
 | 
					 | 
				
			||||||
          uci:section('wireless', "wifi-iface", name,
 | 
					 | 
				
			||||||
                      {
 | 
					 | 
				
			||||||
                        device     = radio,
 | 
					 | 
				
			||||||
                        network    = "wan",
 | 
					 | 
				
			||||||
                        mode       = 'ap',
 | 
					 | 
				
			||||||
                        encryption = 'psk2',
 | 
					 | 
				
			||||||
                        ssid       = data.ssid,
 | 
					 | 
				
			||||||
                        key        = data.key,
 | 
					 | 
				
			||||||
                        macaddr    = macaddr,
 | 
					 | 
				
			||||||
                        disabled   = false,
 | 
					 | 
				
			||||||
                      }
 | 
					 | 
				
			||||||
          )
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          -- disable WAN wifi-iface
 | 
					 | 
				
			||||||
          uci:set('wireless', name, "disabled", true)
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uci:save('wireless')
 | 
					 | 
				
			||||||
    uci:commit('wireless')
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -1,6 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
uci batch <<-EOF
 | 
					 | 
				
			||||||
	set luci.themes.Gluon=/luci-static/gluon
 | 
					 | 
				
			||||||
        commit luci
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
@ -1,19 +0,0 @@
 | 
				
			|||||||
<%#
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					 | 
				
			||||||
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
@ -1,171 +0,0 @@
 | 
				
			|||||||
<%#
 | 
					 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					 | 
				
			||||||
Copyright 2008-2010 Jo-Philipp Wich <xm@subsignal.org>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
<%
 | 
					 | 
				
			||||||
	local sys  = require "luci.sys"
 | 
					 | 
				
			||||||
	local http = require "luci.http"
 | 
					 | 
				
			||||||
	local disp = require "luci.dispatcher"
 | 
					 | 
				
			||||||
	local uci  = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
	local fs   = require "nixio.fs"
 | 
					 | 
				
			||||||
	local gluon_luci = require "gluon.luci"
 | 
					 | 
				
			||||||
	local pretty_hostname = require "pretty_hostname"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local hostname = pretty_hostname.get(uci)
 | 
					 | 
				
			||||||
	local release = fs.readfile("/lib/gluon/release")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local request  = disp.context.path
 | 
					 | 
				
			||||||
	local request2 = disp.context.request
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local category = request[1]
 | 
					 | 
				
			||||||
	local cattree  = category and disp.node(category)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local leaf = request2[#request2]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local tree = disp.node()
 | 
					 | 
				
			||||||
	local node = disp.context.dispatched
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local categories = disp.node_childs(tree)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local c = tree
 | 
					 | 
				
			||||||
	local i, r
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	-- tag all nodes leading to this page
 | 
					 | 
				
			||||||
	for i, r in ipairs(request) do
 | 
					 | 
				
			||||||
		if c.nodes and c.nodes[r] then
 | 
					 | 
				
			||||||
			c = c.nodes[r]
 | 
					 | 
				
			||||||
			c._menu_selected = true
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	http.prepare_content("application/xhtml+xml")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local function nodeurl(prefix, name, query)
 | 
					 | 
				
			||||||
		local url = controller .. prefix .. name .. "/"
 | 
					 | 
				
			||||||
		if query then
 | 
					 | 
				
			||||||
			url = url .. http.build_querystring(query)
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		return pcdata(url)
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local function subtree(prefix, node, level)
 | 
					 | 
				
			||||||
		if not level then
 | 
					 | 
				
			||||||
			level = 1
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local childs = disp.node_childs(node)
 | 
					 | 
				
			||||||
		if #childs > 0 then
 | 
					 | 
				
			||||||
%>
 | 
					 | 
				
			||||||
	<div class="tabmenu<%=level%>">
 | 
					 | 
				
			||||||
	<ul class="tabmenu l<%=level%>">
 | 
					 | 
				
			||||||
		<%
 | 
					 | 
				
			||||||
			local selected_node
 | 
					 | 
				
			||||||
			local selected_name
 | 
					 | 
				
			||||||
			local i, v
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for i, v in ipairs(childs) do
 | 
					 | 
				
			||||||
				local nnode = node.nodes[v]
 | 
					 | 
				
			||||||
				if nnode._menu_selected then
 | 
					 | 
				
			||||||
					selected_node = nnode
 | 
					 | 
				
			||||||
					selected_name = v
 | 
					 | 
				
			||||||
				end
 | 
					 | 
				
			||||||
		%>
 | 
					 | 
				
			||||||
			<li class="tabmenu-item-<%=v%><% if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
 | 
					 | 
				
			||||||
				<a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
 | 
					 | 
				
			||||||
			</li>
 | 
					 | 
				
			||||||
		<%
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		%>
 | 
					 | 
				
			||||||
	</ul>
 | 
					 | 
				
			||||||
	<br style="clear:both" />
 | 
					 | 
				
			||||||
<%
 | 
					 | 
				
			||||||
			if selected_node then
 | 
					 | 
				
			||||||
				subtree(prefix .. selected_name .. "/", selected_node, level + 1)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
%>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
<%
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
 | 
					 | 
				
			||||||
<head>
 | 
					 | 
				
			||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
					 | 
				
			||||||
<meta http-equiv="Content-Script-Type" content="text/javascript" />
 | 
					 | 
				
			||||||
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
 | 
					 | 
				
			||||||
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
 | 
					 | 
				
			||||||
<% end -%>
 | 
					 | 
				
			||||||
<% if css then %><style title="text/css">
 | 
					 | 
				
			||||||
<%= css %>
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<% end -%>
 | 
					 | 
				
			||||||
<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
 | 
					 | 
				
			||||||
<title><%=gluon_luci.escape( hostname .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
 | 
					 | 
				
			||||||
</head>
 | 
					 | 
				
			||||||
<body class="lang_<%=luci.i18n.context.lang%>">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div id="menubar">
 | 
					 | 
				
			||||||
<div class="hostinfo">
 | 
					 | 
				
			||||||
	<%=gluon_luci.escape(hostname)%>
 | 
					 | 
				
			||||||
	<% if release then %>
 | 
					 | 
				
			||||||
	/ <%=gluon_luci.escape(release)%>
 | 
					 | 
				
			||||||
	<% end %>
 | 
					 | 
				
			||||||
	<span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
 | 
					 | 
				
			||||||
		| <%:Auto Refresh%>:
 | 
					 | 
				
			||||||
		<span id="xhr_poll_status_on"><%:on%></span>
 | 
					 | 
				
			||||||
		<span id="xhr_poll_status_off" style="display:none"><%:off%></span>
 | 
					 | 
				
			||||||
	</span>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<% if #categories > 1 then %>
 | 
					 | 
				
			||||||
	<ul id="modemenu">
 | 
					 | 
				
			||||||
		<% for i, r in ipairs(categories) do %>
 | 
					 | 
				
			||||||
			<li><a<% if request[1] == r then %> class="active"<%end%> href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a></li>
 | 
					 | 
				
			||||||
		<% end %>
 | 
					 | 
				
			||||||
	</ul>
 | 
					 | 
				
			||||||
<% end %>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<%
 | 
					 | 
				
			||||||
if tree.nodes[category] and tree.nodes[category].ucidata then
 | 
					 | 
				
			||||||
	local ucic = 0
 | 
					 | 
				
			||||||
	for i, j in pairs(require("simple-uci").cursor():changes()) do
 | 
					 | 
				
			||||||
		for k, l in pairs(j) do
 | 
					 | 
				
			||||||
			for m, n in pairs(l) do
 | 
					 | 
				
			||||||
				ucic = ucic + 1;
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
-%>
 | 
					 | 
				
			||||||
<div id="savemenu">
 | 
					 | 
				
			||||||
	<% if ucic > 0 then %>
 | 
					 | 
				
			||||||
		<a class="warning" href="<%=controller%>/<%=category%>/uci/changes/?redir=<%=luci.http.urlencode(luci.http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucic%></a>
 | 
					 | 
				
			||||||
	<%- else -%>
 | 
					 | 
				
			||||||
		<a href="#"><%:Changes%>: 0</a>
 | 
					 | 
				
			||||||
	<% end -%>
 | 
					 | 
				
			||||||
</div><% end %>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div id="maincontainer">
 | 
					 | 
				
			||||||
  <% if category then subtree("/" .. category .. "/", cattree) end %>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	<div id="maincontent">
 | 
					 | 
				
			||||||
		<noscript>
 | 
					 | 
				
			||||||
			<div class="errorbox">
 | 
					 | 
				
			||||||
				<strong><%:Java Script required!%></strong><br />
 | 
					 | 
				
			||||||
				<%:You must enable Java Script in your browser or LuCI will not work properly.%>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</noscript>
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -1,28 +0,0 @@
 | 
				
			|||||||
-- Config mode utility functions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local string = string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module 'gluon.luci'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function escape(s)
 | 
					 | 
				
			||||||
	return (string.gsub(s, '[<>&"]', {
 | 
					 | 
				
			||||||
		['<'] = '<',
 | 
					 | 
				
			||||||
		['>'] = '>',
 | 
					 | 
				
			||||||
		['&'] = '&',
 | 
					 | 
				
			||||||
		['"'] = '"',
 | 
					 | 
				
			||||||
	}))
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function urlescape(s)
 | 
					 | 
				
			||||||
	return (string.gsub(s, '[^a-zA-Z0-9%-_%.~]',
 | 
					 | 
				
			||||||
		function(c)
 | 
					 | 
				
			||||||
			local ret = ''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for i = 1, string.len(c) do
 | 
					 | 
				
			||||||
				ret = ret .. string.format('%%%02X', string.byte(c, i, i))
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return ret
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	))
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,5 +0,0 @@
 | 
				
			|||||||
module("luci.controller.admin.wifi-config", package.seeall)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function index()
 | 
					 | 
				
			||||||
  entry({"admin", "wifi-config"}, cbi("admin/wifi-config"), _("WLAN"), 20)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,169 +0,0 @@
 | 
				
			|||||||
local uci = require("simple-uci").cursor()
 | 
					 | 
				
			||||||
local fs = require 'nixio.fs'
 | 
					 | 
				
			||||||
local iwinfo = require 'iwinfo'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local function find_phy_by_path(path)
 | 
					 | 
				
			||||||
  for phy in fs.glob("/sys/devices/" .. path .. "/ieee80211/phy*") do
 | 
					 | 
				
			||||||
    return phy:match("([^/]+)$")
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local function find_phy_by_macaddr(macaddr)
 | 
					 | 
				
			||||||
  local addr = macaddr:lower()
 | 
					 | 
				
			||||||
  for file in fs.glob("/sys/class/ieee80211/*/macaddress") do
 | 
					 | 
				
			||||||
    if luci.util.trim(fs.readfile(file)) == addr then
 | 
					 | 
				
			||||||
      return file:match("([^/]+)/macaddress$")
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local function txpower_list(phy)
 | 
					 | 
				
			||||||
  local list = iwinfo.nl80211.txpwrlist(phy) or { }
 | 
					 | 
				
			||||||
  local off  = tonumber(iwinfo.nl80211.txpower_offset(phy)) or 0
 | 
					 | 
				
			||||||
  local new  = { }
 | 
					 | 
				
			||||||
  local prev = -1
 | 
					 | 
				
			||||||
  local _, val
 | 
					 | 
				
			||||||
  for _, val in ipairs(list) do
 | 
					 | 
				
			||||||
    local dbm = val.dbm + off
 | 
					 | 
				
			||||||
    local mw  = math.floor(10 ^ (dbm / 10))
 | 
					 | 
				
			||||||
    if mw ~= prev then
 | 
					 | 
				
			||||||
      prev = mw
 | 
					 | 
				
			||||||
      table.insert(new, {
 | 
					 | 
				
			||||||
                     display_dbm = dbm,
 | 
					 | 
				
			||||||
                     display_mw  = mw,
 | 
					 | 
				
			||||||
                     driver_dbm  = val.dbm,
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  return new
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local f = SimpleForm("wifi", translate("WLAN"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local s = f:section(SimpleSection, nil, translate(
 | 
					 | 
				
			||||||
                "You can enable or disable your node's client and mesh network "
 | 
					 | 
				
			||||||
                  .. "SSIDs here. Please don't disable the mesh network without "
 | 
					 | 
				
			||||||
                  .. "a good reason, so other nodes can mesh with yours.<br /><br />"
 | 
					 | 
				
			||||||
                  .. "It is also possible to configure the WLAN adapters transmission power "
 | 
					 | 
				
			||||||
                  .. "here. Please note that the transmission power values include the antenna gain "
 | 
					 | 
				
			||||||
                  .. "where available, but there are many devices for which the gain is unavailable or inaccurate."
 | 
					 | 
				
			||||||
))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local radios = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- look for wifi interfaces and add them to the array
 | 
					 | 
				
			||||||
uci:foreach('wireless', 'wifi-device',
 | 
					 | 
				
			||||||
  function(s)
 | 
					 | 
				
			||||||
    table.insert(radios, s['.name'])
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- add a client and mesh checkbox for each interface
 | 
					 | 
				
			||||||
for _, radio in ipairs(radios) do
 | 
					 | 
				
			||||||
  local config = uci:get_all('wireless', radio)
 | 
					 | 
				
			||||||
  local p
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if config.hwmode == '11g' or config.hwmode == '11ng' then
 | 
					 | 
				
			||||||
    p = f:section(SimpleSection, translate("2.4GHz WLAN"))
 | 
					 | 
				
			||||||
  elseif config.hwmode == '11a' or config.hwmode == '11na' then
 | 
					 | 
				
			||||||
    p = f:section(SimpleSection, translate("5GHz WLAN"))
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if p then
 | 
					 | 
				
			||||||
    local o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if uci:get('wireless', 'client_' .. radio) then
 | 
					 | 
				
			||||||
      o = p:option(Flag, radio .. '_client_enabled', translate("Enable client network (access point)"))
 | 
					 | 
				
			||||||
      o.default = uci:get_bool('wireless', 'client_' .. radio, "disabled") and o.disabled or o.enabled
 | 
					 | 
				
			||||||
      o.rmempty = false
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if uci:get('wireless', 'mesh_' .. radio) then
 | 
					 | 
				
			||||||
      o = p:option(Flag, radio .. '_mesh_enabled', translate("Enable mesh network (802.11s)"))
 | 
					 | 
				
			||||||
      o.default = uci:get_bool('wireless', 'mesh_' .. radio, "disabled") and o.disabled or o.enabled
 | 
					 | 
				
			||||||
      o.rmempty = false
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if uci:get('wireless', 'ibss_' .. radio) then
 | 
					 | 
				
			||||||
      o = p:option(Flag, radio .. '_ibss_enabled', translate("Enable mesh network (IBSS)"))
 | 
					 | 
				
			||||||
      o.default = uci:get_bool('wireless', 'ibss_' .. radio, "disabled") and o.disabled or o.enabled
 | 
					 | 
				
			||||||
      o.rmempty = false
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    local phy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if config.path then
 | 
					 | 
				
			||||||
      phy = find_phy_by_path(config.path)
 | 
					 | 
				
			||||||
    elseif config.macaddr then
 | 
					 | 
				
			||||||
      phy = find_phy_by_macaddr(config.macaddr)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if phy then
 | 
					 | 
				
			||||||
      local txpowers = txpower_list(phy)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if #txpowers > 1 then
 | 
					 | 
				
			||||||
        local tp = p:option(ListValue, radio .. '_txpower', translate("Transmission power"))
 | 
					 | 
				
			||||||
        tp.rmempty = true
 | 
					 | 
				
			||||||
        tp.default = uci:get('wireless', radio, 'txpower') or 'default'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tp:value('default', translate("(default)"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        table.sort(txpowers, function(a, b) return a.driver_dbm > b.driver_dbm end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for _, entry in ipairs(txpowers) do
 | 
					 | 
				
			||||||
          tp:value(entry.driver_dbm, "%i dBm (%i mW)" % {entry.display_dbm, entry.display_mw})
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--when the save-button is pushed
 | 
					 | 
				
			||||||
function f.handle(self, state, data)
 | 
					 | 
				
			||||||
  if state == FORM_VALID then
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for _, radio in ipairs(radios) do
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if uci:get('wireless', 'client_' .. radio) then
 | 
					 | 
				
			||||||
	local disabled = 0
 | 
					 | 
				
			||||||
	if data[radio .. '_client_enabled'] == '0' then
 | 
					 | 
				
			||||||
	  disabled = 1
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	uci:set('wireless', 'client_' .. radio, "disabled", disabled)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if uci:get('wireless', 'mesh_' .. radio) then
 | 
					 | 
				
			||||||
	local disabled = 0
 | 
					 | 
				
			||||||
	if data[radio .. '_mesh_enabled'] == '0' then
 | 
					 | 
				
			||||||
	  disabled = 1
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	uci:set('wireless', 'mesh_' .. radio, "disabled", disabled)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if uci:get('wireless', 'ibss_' .. radio) then
 | 
					 | 
				
			||||||
	local disabled = 0
 | 
					 | 
				
			||||||
	if data[radio .. '_ibss_enabled'] == '0' then
 | 
					 | 
				
			||||||
	  disabled = 1
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	uci:set('wireless', 'ibss_' .. radio, "disabled", disabled)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if data[radio .. '_txpower'] then
 | 
					 | 
				
			||||||
        if data[radio .. '_txpower'] == 'default' then
 | 
					 | 
				
			||||||
          uci:delete('wireless', radio, 'txpower')
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          uci:set('wireless', radio, 'txpower', data[radio .. '_txpower'])
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uci:save('wireless')
 | 
					 | 
				
			||||||
    uci:commit('wireless')
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return f
 | 
					 | 
				
			||||||
@ -15,7 +15,7 @@ define Package/gluon-setup-mode
 | 
				
			|||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Setup mode
 | 
					  TITLE:=Setup mode
 | 
				
			||||||
  DEPENDS:=+gluon-core +luci-base +uhttpd +dnsmasq
 | 
					  DEPENDS:=+gluon-core +gluon-web +ubus +uhttpd +dnsmasq
 | 
				
			||||||
  PROVIDES:=gluon-setup-mode-virtual
 | 
					  PROVIDES:=gluon-setup-mode-virtual
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -10,9 +10,7 @@ boot() {
 | 
				
			|||||||
	uci set 'gluon-setup-mode.@setup_mode[0].enabled=0'
 | 
						uci set 'gluon-setup-mode.@setup_mode[0].enabled=0'
 | 
				
			||||||
	uci commit gluon-setup-mode
 | 
						uci commit gluon-setup-mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ "$enabled" = 1 -o "$configured" != 1 ]; then
 | 
						if [ "$enabled" != 1 -a "$configured" = 1 ]; then
 | 
				
			||||||
		lua -e 'uci_state=require("luci.model.uci").cursor_state(); uci_state:section("gluon-setup-mode", "setup_mode", nil, { running = "1" }); uci_state:save("gluon-setup-mode")'
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		# This can happen after an upgrade from a version before the config file was called gluon-setup-mode
 | 
							# This can happen after an upgrade from a version before the config file was called gluon-setup-mode
 | 
				
			||||||
		# We'll just reboot to return to the normal mode...
 | 
							# We'll just reboot to return to the normal mode...
 | 
				
			||||||
		/etc/init.d/done boot
 | 
							/etc/init.d/done boot
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,6 @@ UHTTPD_BIN="/usr/sbin/uhttpd"
 | 
				
			|||||||
start_service() {
 | 
					start_service() {
 | 
				
			||||||
	procd_open_instance
 | 
						procd_open_instance
 | 
				
			||||||
	procd_set_param respawn
 | 
						procd_set_param respawn
 | 
				
			||||||
	procd_set_param command "$UHTTPD_BIN" -f -h /lib/gluon/setup-mode/www -x /cgi-bin -A 1 -R -p 0.0.0.0:80
 | 
						procd_set_param command "$UHTTPD_BIN" -f -h /lib/gluon/web/www -x /cgi-bin -A 1 -R -p 0.0.0.0:80
 | 
				
			||||||
	procd_close_instance
 | 
						procd_close_instance
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml">
 | 
					 | 
				
			||||||
<head>
 | 
					 | 
				
			||||||
<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" />
 | 
					 | 
				
			||||||
</head>
 | 
					 | 
				
			||||||
<body style="background-color: black">
 | 
					 | 
				
			||||||
<a style="color: white; text-decoration: none" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
 | 
					 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
@ -1 +0,0 @@
 | 
				
			|||||||
/www/luci-static
 | 
					 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/lua
 | 
					 | 
				
			||||||
require "luci.cacheloader"
 | 
					 | 
				
			||||||
require "luci.sgi.cgi"
 | 
					 | 
				
			||||||
luci.dispatcher.indexcache = "/tmp/luci-indexcache"
 | 
					 | 
				
			||||||
luci.sgi.cgi.run()
 | 
					 | 
				
			||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-admin
 | 
					PKG_NAME:=gluon-web-admin
 | 
				
			||||||
PKG_VERSION:=1
 | 
					PKG_VERSION:=1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -14,10 +14,10 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-admin
 | 
					define Package/gluon-web-admin
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci based simple administration interface for mesh nodes
 | 
					  TITLE:=Web-based simple administration interface for mesh nodes
 | 
				
			||||||
  DEPENDS:=gluon-config-mode-core-virtual +pretty-hostname
 | 
					  DEPENDS:=gluon-config-mode-core-virtual +pretty-hostname
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -29,14 +29,14 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonBuildI18N,gluon-luci-admin,i18n)
 | 
						$(call GluonBuildI18N,gluon-web-admin,i18n)
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-admin/install
 | 
					define Package/gluon-web-admin/install
 | 
				
			||||||
	$(CP) ./files/* $(1)/
 | 
						$(CP) ./files/* $(1)/
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-luci-admin,$(1))
 | 
						$(call GluonInstallI18N,gluon-web-admin,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-admin))
 | 
					$(eval $(call BuildPackage,gluon-web-admin))
 | 
				
			||||||
@ -1,24 +1,23 @@
 | 
				
			|||||||
<%-
 | 
					<%-
 | 
				
			||||||
  local fs = require 'nixio.fs'
 | 
					  local fs = require 'nixio.fs'
 | 
				
			||||||
  local uci = require('simple-uci').cursor()
 | 
					  local uci = require('simple-uci').cursor()
 | 
				
			||||||
  local util = require 'luci.util'
 | 
					  local lutil = require 'gluon.web.util'
 | 
				
			||||||
  local i18n = require 'luci.i18n'
 | 
					 | 
				
			||||||
  local pretty_hostname = require 'pretty_hostname'
 | 
					  local pretty_hostname = require 'pretty_hostname'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local gluon_luci = require "gluon.luci"
 | 
					 | 
				
			||||||
  local site = require 'gluon.site_config'
 | 
					  local site = require 'gluon.site_config'
 | 
				
			||||||
  local sysconfig = require 'gluon.sysconfig'
 | 
					  local sysconfig = require 'gluon.sysconfig'
 | 
				
			||||||
  local platform = require 'gluon.platform'
 | 
					  local platform = require 'gluon.platform'
 | 
				
			||||||
 | 
					  local util = require "gluon.util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local keys = {
 | 
					  local keys = {
 | 
				
			||||||
    hostname = i18n.translate('Hostname'),
 | 
					    hostname = translate('Hostname'),
 | 
				
			||||||
    primary_mac = i18n.translate('MAC address'),
 | 
					    primary_mac = translate('MAC address'),
 | 
				
			||||||
    model = i18n.translate('Hardware model'),
 | 
					    model = translate('Hardware model'),
 | 
				
			||||||
    version = i18n.translate('Gluon version'),
 | 
					    version = translate('Gluon version'),
 | 
				
			||||||
    release = i18n.translate('Firmware release'),
 | 
					    release = translate('Firmware release'),
 | 
				
			||||||
    site = i18n.translate('Site'),
 | 
					    site = translate('Site'),
 | 
				
			||||||
    pubkey = i18n.translate('Public VPN key'),
 | 
					    pubkey = translate('Public VPN key'),
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local values = {
 | 
					  local values = {
 | 
				
			||||||
@ -33,7 +32,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  local meshvpn_enabled = uci:get_bool("fastd", "mesh_vpn", "enabled")
 | 
					  local meshvpn_enabled = uci:get_bool("fastd", "mesh_vpn", "enabled")
 | 
				
			||||||
  if meshvpn_enabled then
 | 
					  if meshvpn_enabled then
 | 
				
			||||||
    local pubkey = util.trim(util.exec('/etc/init.d/fastd show_key mesh_vpn'))
 | 
					    local pubkey = util.trim(lutil.exec('/etc/init.d/fastd show_key mesh_vpn'))
 | 
				
			||||||
    if pubkey ~= '' then
 | 
					    if pubkey ~= '' then
 | 
				
			||||||
      values.pubkey = pubkey
 | 
					      values.pubkey = pubkey
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
@ -41,7 +40,7 @@
 | 
				
			|||||||
-%>
 | 
					-%>
 | 
				
			||||||
<h2><%:Information%></h2>
 | 
					<h2><%:Information%></h2>
 | 
				
			||||||
<% for _, key in ipairs({'hostname', 'primary_mac', 'model', 'version', 'release', 'site', 'pubkey'}) do %>
 | 
					<% for _, key in ipairs({'hostname', 'primary_mac', 'model', 'version', 'release', 'site', 'pubkey'}) do %>
 | 
				
			||||||
<div class="cbi-value">
 | 
					<div class="gluon-value">
 | 
				
			||||||
  <div class="cbi-value-title"><%=keys[key]%></div><div class="cbi-value-field"><%=gluon_luci.escape(values[key] or 'n/a')%></div>
 | 
					  <div class="gluon-value-title"><%=keys[key]%></div><div class="gluon-value-field"><%=pcdata(values[key] or 'n/a')%></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<% end %>
 | 
					<% end %>
 | 
				
			||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
<%#
 | 
					<%#
 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					Copyright 2008 Steven Barth <steven@midlink.org>
 | 
				
			||||||
Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
 | 
					Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,44 +11,40 @@ You may obtain a copy of the License at
 | 
				
			|||||||
$Id$
 | 
					$Id$
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-%>
 | 
					-%>
 | 
				
			||||||
 | 
					 | 
				
			||||||
<%+header%>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<h2><%:Upgrade firmware%></h2>
 | 
					<h2><%:Upgrade firmware%></h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
 | 
					<form method="post" enctype="multipart/form-data" action="<%=url(request)%>">
 | 
				
			||||||
  <p>
 | 
					  <p>
 | 
				
			||||||
    <%:You can manually upgrade your firmware here.%>
 | 
					    <%:You can manually upgrade your firmware here.%>
 | 
				
			||||||
  </p>
 | 
					  </p>
 | 
				
			||||||
  <% if bad_image then %>
 | 
					  <% if bad_image then %>
 | 
				
			||||||
  <p class="error"><%:The provided firmware image is not valid for this device.%></p>
 | 
					  <p class="error"><%:The provided firmware image is not valid for this device.%></p>
 | 
				
			||||||
  <% end %>
 | 
					  <% end %>
 | 
				
			||||||
  <div class="cbi-section-node">
 | 
					  <div class="gluon-section-node">
 | 
				
			||||||
    <div class="cbi-value">
 | 
					    <div class="gluon-value">
 | 
				
			||||||
      <label class="cbi-value-title">
 | 
					      <label class="gluon-value-title">
 | 
				
			||||||
	<%:Firmware image%>
 | 
						<%:Firmware image%>
 | 
				
			||||||
      </label>
 | 
					      </label>
 | 
				
			||||||
      <div class="cbi-value-field">
 | 
					      <div class="gluon-value-field">
 | 
				
			||||||
	<input class="cbi-input-file" type="file" name="image" />
 | 
						<input class="gluon-input-file" type="file" name="image" />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="cbi-value cbi-value-last">
 | 
					    <div class="gluon-value gluon-value-last">
 | 
				
			||||||
      <label class="cbi-value-title">
 | 
					      <label class="gluon-value-title">
 | 
				
			||||||
	<%:Keep settings%>
 | 
						<%:Keep settings%>
 | 
				
			||||||
      </label>
 | 
					      </label>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <div class="cbi-value-field">
 | 
					      <div class="gluon-value-field">
 | 
				
			||||||
	<input id="keepcfg" class="cbi-input-checkbox" type="checkbox" name="keepcfg" value="1" checked="checked" />
 | 
						<input id="keepcfg" class="gluon-input-checkbox" type="checkbox" name="keepcfg" value="1" checked="checked" />
 | 
				
			||||||
	<label for="keepcfg"></label>
 | 
						<label for="keepcfg"></label>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <div class="cbi-page-actions right">
 | 
					  <div class="gluon-page-actions right">
 | 
				
			||||||
    <input type="hidden" name="step" value="2" />
 | 
					    <input type="hidden" name="step" value="2" />
 | 
				
			||||||
    <input type="hidden" name="token" value="<%=token%>" />
 | 
					    <input type="hidden" name="token" value="<%=token%>" />
 | 
				
			||||||
    <input class="cbi-button cbi-button-apply" type="submit" value="<%:Upload image%>" />
 | 
					    <input class="gluon-button gluon-button-submit" type="submit" value="<%:Upload image%>" />
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</form>
 | 
					</form>
 | 
				
			||||||
<%+footer%>
 | 
					 | 
				
			||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
<%#
 | 
					<%#
 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
Copyright 2008 Steven Barth <steven@midlink.org>
 | 
					Copyright 2008 Steven Barth <steven@midlink.org>
 | 
				
			||||||
Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
 | 
					Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -8,13 +7,8 @@ you may not use this file except in compliance with the License.
 | 
				
			|||||||
You may obtain a copy of the License at
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	http://www.apache.org/licenses/LICENSE-2.0
 | 
						http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-%>
 | 
					-%>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<%+header%>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<h2><%:Upgrade firmware%></h2>
 | 
					<h2><%:Upgrade firmware%></h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<p>
 | 
					<p>
 | 
				
			||||||
@ -43,7 +37,7 @@ $Id$
 | 
				
			|||||||
      write(byte_format(filesize))
 | 
					      write(byte_format(filesize))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if flashsize > 0 then
 | 
					      if flashsize > 0 then
 | 
				
			||||||
        write(luci.i18n.translatef(
 | 
					        write(translatef(
 | 
				
			||||||
          " (%s available)",
 | 
					          " (%s available)",
 | 
				
			||||||
          byte_format(flashsize)
 | 
					          byte_format(flashsize)
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
@ -51,18 +45,17 @@ $Id$
 | 
				
			|||||||
    %></li>
 | 
					    %></li>
 | 
				
			||||||
  </ul>
 | 
					  </ul>
 | 
				
			||||||
</p>
 | 
					</p>
 | 
				
			||||||
<div class="cbi-page-actions">
 | 
					<div class="gluon-page-actions">
 | 
				
			||||||
  <form method="post" action="<%=REQUEST_URI%>" style="display:inline">
 | 
					  <form method="post" enctype="multipart/form-data" action="<%=url(request)%>" style="display:inline">
 | 
				
			||||||
    <input type="hidden" name="step" value="3" />
 | 
					    <input type="hidden" name="step" value="3" />
 | 
				
			||||||
    <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
 | 
					    <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
 | 
				
			||||||
    <input type="hidden" name="token" value="<%=token%>" />
 | 
					    <input type="hidden" name="token" value="<%=token%>" />
 | 
				
			||||||
    <input class="cbi-button cbi-button-apply" type="submit" value="<%:Continue%>" />
 | 
					    <input class="gluon-button gluon-button-submit" type="submit" value="<%:Continue%>" />
 | 
				
			||||||
  </form>
 | 
					  </form>
 | 
				
			||||||
  <form method="post" action="<%=REQUEST_URI%>" style="display:inline">
 | 
					  <form method="post" enctype="multipart/form-data" action="<%=url(request)%>" style="display:inline">
 | 
				
			||||||
    <input type="hidden" name="step" value="1" />
 | 
					    <input type="hidden" name="step" value="1" />
 | 
				
			||||||
    <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
 | 
					    <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
 | 
				
			||||||
    <input type="hidden" name="token" value="<%=token%>" />
 | 
					    <input type="hidden" name="token" value="<%=token%>" />
 | 
				
			||||||
    <input class="cbi-button cbi-button-reset" type="submit" value="<%:Cancel%>" />
 | 
					    <input class="gluon-button gluon-button-reset" type="submit" value="<%:Cancel%>" />
 | 
				
			||||||
  </form>
 | 
					  </form>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<%+footer%>
 | 
					 | 
				
			||||||
@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					<p>
 | 
				
			||||||
 | 
						<%:The firmware is currently being upgraded.%>
 | 
				
			||||||
 | 
						<strong><%:Don't switch off the device in any circumstance!%></strong>
 | 
				
			||||||
 | 
						<%:The upgrade will take a few minutes. When it is finished, your node will reboot automatically.%>
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
@ -10,6 +10,12 @@ msgstr ""
 | 
				
			|||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
					"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "(%s available)"
 | 
				
			||||||
 | 
					msgstr "(%s verfügbar)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Advanced settings"
 | 
				
			||||||
 | 
					msgstr "Erweiterte Einstellungen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"Alternatively, you can set a password to access you node. Please choose a "
 | 
					"Alternatively, you can set a password to access you node. Please choose a "
 | 
				
			||||||
"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
					"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
				
			||||||
@ -20,15 +26,18 @@ msgstr ""
 | 
				
			|||||||
"leeren Passworts wird der Login per Passwort gesperrt (dies ist die Standard-"
 | 
					"leeren Passworts wird der Login per Passwort gesperrt (dies ist die Standard-"
 | 
				
			||||||
"Einstellung)."
 | 
					"Einstellung)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Cancel"
 | 
				
			||||||
 | 
					msgstr "Abbrechen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Confirmation"
 | 
				
			||||||
 | 
					msgstr "Bestätigung"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Continue"
 | 
					msgid "Continue"
 | 
				
			||||||
msgstr "Fortfahren"
 | 
					msgstr "Fortfahren"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Don't switch off the device in any circumstance!"
 | 
					msgid "Don't switch off the device in any circumstance!"
 | 
				
			||||||
msgstr "Unterbrich auf keinen Fall die Stromversorgung!"
 | 
					msgstr "Unterbrich auf keinen Fall die Stromversorgung!"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Advanced settings"
 | 
					 | 
				
			||||||
msgstr "Erweiterte Einstellungen"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Firmware image"
 | 
					msgid "Firmware image"
 | 
				
			||||||
msgstr "Firmware-Datei"
 | 
					msgstr "Firmware-Datei"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -41,12 +50,21 @@ msgstr "Gluon-Version"
 | 
				
			|||||||
msgid "Hardware model"
 | 
					msgid "Hardware model"
 | 
				
			||||||
msgstr "Hardware-Modell"
 | 
					msgstr "Hardware-Modell"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Hostname"
 | 
				
			||||||
 | 
					msgstr "Hostname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Information"
 | 
					msgid "Information"
 | 
				
			||||||
msgstr "Info"
 | 
					msgstr "Info"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Keep settings"
 | 
				
			||||||
 | 
					msgstr "Konfiguration behalten"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "MAC address"
 | 
					msgid "MAC address"
 | 
				
			||||||
msgstr "MAC-Adresse"
 | 
					msgstr "MAC-Adresse"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Password"
 | 
				
			||||||
 | 
					msgstr "Passwort"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Password changed."
 | 
					msgid "Password changed."
 | 
				
			||||||
msgstr "Passwort geändert."
 | 
					msgstr "Passwort geändert."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -65,6 +83,9 @@ msgstr "SSH-Schlüssel"
 | 
				
			|||||||
msgid "Site"
 | 
					msgid "Site"
 | 
				
			||||||
msgstr "Site"
 | 
					msgstr "Site"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Size"
 | 
				
			||||||
 | 
					msgstr "Größe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
					"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
				
			||||||
"image size are correct and click \"continue\"."
 | 
					"image size are correct and click \"continue\"."
 | 
				
			||||||
@ -97,9 +118,6 @@ msgstr "Das Passwort konnte nicht geändert werden."
 | 
				
			|||||||
msgid "Upgrade firmware"
 | 
					msgid "Upgrade firmware"
 | 
				
			||||||
msgstr "Firmware aktualisieren"
 | 
					msgstr "Firmware aktualisieren"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Upgrading firmware"
 | 
					 | 
				
			||||||
msgstr "Firmware wird aktualisiert"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Upload image"
 | 
					msgid "Upload image"
 | 
				
			||||||
msgstr "Datei hochladen"
 | 
					msgstr "Datei hochladen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -10,6 +10,12 @@ msgstr ""
 | 
				
			|||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
					"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "(%s available)"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Advanced settings"
 | 
				
			||||||
 | 
					msgstr "Paramètres avancés"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"Alternatively, you can set a password to access you node. Please choose a "
 | 
					"Alternatively, you can set a password to access you node. Please choose a "
 | 
				
			||||||
"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
					"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
				
			||||||
@ -21,15 +27,18 @@ msgstr ""
 | 
				
			|||||||
"par mot de passe sera désactivée. La connexion par mot de passe est "
 | 
					"par mot de passe sera désactivée. La connexion par mot de passe est "
 | 
				
			||||||
"désactivée par défaut."
 | 
					"désactivée par défaut."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Cancel"
 | 
				
			||||||
 | 
					msgstr "Annuler"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Confirmation"
 | 
				
			||||||
 | 
					msgstr "Confirmation"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Continue"
 | 
					msgid "Continue"
 | 
				
			||||||
msgstr "Continuer"
 | 
					msgstr "Continuer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Don't switch off the device in any circumstance!"
 | 
					msgid "Don't switch off the device in any circumstance!"
 | 
				
			||||||
msgstr "N'interrompez en aucun cas l'alimentation!"
 | 
					msgstr "N'interrompez en aucun cas l'alimentation!"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Advanced settings"
 | 
					 | 
				
			||||||
msgstr "Paramètres avancés"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Firmware image"
 | 
					msgid "Firmware image"
 | 
				
			||||||
msgstr "Fichier image"
 | 
					msgstr "Fichier image"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -42,12 +51,21 @@ msgstr "Version de Gluon"
 | 
				
			|||||||
msgid "Hardware model"
 | 
					msgid "Hardware model"
 | 
				
			||||||
msgstr "Modèle du Matériel"
 | 
					msgstr "Modèle du Matériel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Hostname"
 | 
				
			||||||
 | 
					msgstr "Nom d'hôte"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Information"
 | 
					msgid "Information"
 | 
				
			||||||
msgstr "Informations"
 | 
					msgstr "Informations"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Keep settings"
 | 
				
			||||||
 | 
					msgstr "Garder le paramètrage"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "MAC address"
 | 
					msgid "MAC address"
 | 
				
			||||||
msgstr "Adresse MAC"
 | 
					msgstr "Adresse MAC"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Password"
 | 
				
			||||||
 | 
					msgstr "Mot de passe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Password changed."
 | 
					msgid "Password changed."
 | 
				
			||||||
msgstr "Mot de passe changé."
 | 
					msgstr "Mot de passe changé."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -66,6 +84,9 @@ msgstr "Clé SSH"
 | 
				
			|||||||
msgid "Site"
 | 
					msgid "Site"
 | 
				
			||||||
msgstr "Site"
 | 
					msgstr "Site"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Size"
 | 
				
			||||||
 | 
					msgstr "Taille"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
					"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
				
			||||||
"image size are correct and click \"continue\"."
 | 
					"image size are correct and click \"continue\"."
 | 
				
			||||||
@ -98,9 +119,6 @@ msgstr "Le mot de passe n'a pas pu être changé."
 | 
				
			|||||||
msgid "Upgrade firmware"
 | 
					msgid "Upgrade firmware"
 | 
				
			||||||
msgstr "Mettre à jour la firmware"
 | 
					msgstr "Mettre à jour la firmware"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Upgrading firmware"
 | 
					 | 
				
			||||||
msgstr "Mise à jour de la firmware"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Upload image"
 | 
					msgid "Upload image"
 | 
				
			||||||
msgstr "Transférer l'image"
 | 
					msgstr "Transférer l'image"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1,21 +1,30 @@
 | 
				
			|||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
					msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "(%s available)"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Advanced settings"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"Alternatively, you can set a password to access you node. Please choose a "
 | 
					"Alternatively, you can set a password to access you node. Please choose a "
 | 
				
			||||||
"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
					"secure password you don't use anywhere else.<br /><br />If you set an empty "
 | 
				
			||||||
"password, login via password will be disabled. This is the default."
 | 
					"password, login via password will be disabled. This is the default."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Cancel"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Confirmation"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Continue"
 | 
					msgid "Continue"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Don't switch off the device in any circumstance!"
 | 
					msgid "Don't switch off the device in any circumstance!"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Advanced settings"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Firmware image"
 | 
					msgid "Firmware image"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -28,12 +37,21 @@ msgstr ""
 | 
				
			|||||||
msgid "Hardware model"
 | 
					msgid "Hardware model"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Hostname"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Information"
 | 
					msgid "Information"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Keep settings"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "MAC address"
 | 
					msgid "MAC address"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Password"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Password changed."
 | 
					msgid "Password changed."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,6 +70,9 @@ msgstr ""
 | 
				
			|||||||
msgid "Site"
 | 
					msgid "Site"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Size"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
					"The firmware image has been transmitted. Please ensure the MD5 checksum and "
 | 
				
			||||||
"image size are correct and click \"continue\"."
 | 
					"image size are correct and click \"continue\"."
 | 
				
			||||||
@ -80,9 +101,6 @@ msgstr ""
 | 
				
			|||||||
msgid "Upgrade firmware"
 | 
					msgid "Upgrade firmware"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Upgrading firmware"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "Upload image"
 | 
					msgid "Upload image"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					local root = node()
 | 
				
			||||||
 | 
					if not root.target then
 | 
				
			||||||
 | 
						root.target = alias("admin")
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					entry({"admin"}, alias("admin", "info"), _("Advanced settings"), 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					entry({"admin", "info"}, template("admin/info"), _("Information"), 1)
 | 
				
			||||||
 | 
					entry({"admin", "remote"}, model("admin/remote"), _("Remote access"), 10)
 | 
				
			||||||
@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					--[[
 | 
				
			||||||
 | 
					Copyright 2008 Steven Barth <steven@midlink.org>
 | 
				
			||||||
 | 
					Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					]]--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local fs = require 'nixio.fs'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local tmpfile = "/tmp/firmware.img"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function filehandler(meta, chunk, eof)
 | 
				
			||||||
 | 
						if not fs.access(tmpfile) and not file and chunk and #chunk > 0 then
 | 
				
			||||||
 | 
							file = io.open(tmpfile, "w")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if file and chunk then
 | 
				
			||||||
 | 
							file:write(chunk)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if file and eof then
 | 
				
			||||||
 | 
							file:close()
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function action_upgrade(http, renderer)
 | 
				
			||||||
 | 
						local disp = require 'gluon.web.dispatcher'
 | 
				
			||||||
 | 
						local nixio = require 'nixio'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function fork_exec(...)
 | 
				
			||||||
 | 
							local pid = nixio.fork()
 | 
				
			||||||
 | 
							if pid > 0 then
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							elseif pid == 0 then
 | 
				
			||||||
 | 
								-- change to root dir
 | 
				
			||||||
 | 
								nixio.chdir("/")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								-- patch stdin, out, err to /dev/null
 | 
				
			||||||
 | 
								local null = nixio.open("/dev/null", "w+")
 | 
				
			||||||
 | 
								if null then
 | 
				
			||||||
 | 
									nixio.dup(null, nixio.stderr)
 | 
				
			||||||
 | 
									nixio.dup(null, nixio.stdout)
 | 
				
			||||||
 | 
									nixio.dup(null, nixio.stdin)
 | 
				
			||||||
 | 
									if null:fileno() > 2 then
 | 
				
			||||||
 | 
										null:close()
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								-- Sleep a little so the browser can fetch everything required to
 | 
				
			||||||
 | 
								-- display the reboot page, then reboot the device.
 | 
				
			||||||
 | 
								nixio.nanosleep(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								-- replace with target command
 | 
				
			||||||
 | 
								nixio.exec(...)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function image_supported(tmpfile)
 | 
				
			||||||
 | 
							-- XXX: yay...
 | 
				
			||||||
 | 
							return (os.execute(string.format("/sbin/sysupgrade -T %q >/dev/null", tmpfile)) == 0)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function storage_size()
 | 
				
			||||||
 | 
							local size = 0
 | 
				
			||||||
 | 
							if fs.access("/proc/mtd") then
 | 
				
			||||||
 | 
								for l in io.lines("/proc/mtd") do
 | 
				
			||||||
 | 
									local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
 | 
				
			||||||
 | 
									if n == "linux" then
 | 
				
			||||||
 | 
										size = tonumber(s, 16)
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							elseif fs.access("/proc/partitions") then
 | 
				
			||||||
 | 
								for l in io.lines("/proc/partitions") do
 | 
				
			||||||
 | 
									local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
 | 
				
			||||||
 | 
									if b and n and not n:match('[0-9]') then
 | 
				
			||||||
 | 
										size = tonumber(b) * 1024
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							return size
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function image_checksum(tmpfile)
 | 
				
			||||||
 | 
							return (gluon.web.util.exec(string.format("md5sum %q", tmpfile)):match("^([^%s]+)"))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Determine state
 | 
				
			||||||
 | 
						local step = tonumber(http:getenv("REQUEST_METHOD") == "POST" and http:formvalue("step")) or 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local has_image   = fs.access(tmpfile)
 | 
				
			||||||
 | 
						local has_support = has_image and image_supported(tmpfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Step 1: file upload, error on unsupported image format
 | 
				
			||||||
 | 
						if step == 1 or not has_support then
 | 
				
			||||||
 | 
							-- If there is an image but user has requested step 1
 | 
				
			||||||
 | 
							-- or type is not supported, then remove it.
 | 
				
			||||||
 | 
							if has_image then
 | 
				
			||||||
 | 
								fs.unlink(tmpfile)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							renderer.render("layout", {
 | 
				
			||||||
 | 
								content = "admin/upgrade",
 | 
				
			||||||
 | 
								bad_image = has_image and not has_support,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Step 2: present uploaded file, show checksum, confirmation
 | 
				
			||||||
 | 
						elseif step == 2 then
 | 
				
			||||||
 | 
							renderer.render("layout", {
 | 
				
			||||||
 | 
								content = "admin/upgrade_confirm",
 | 
				
			||||||
 | 
								checksum   = image_checksum(tmpfile),
 | 
				
			||||||
 | 
								filesize   = fs.stat(tmpfile).size,
 | 
				
			||||||
 | 
								flashsize  = storage_size(),
 | 
				
			||||||
 | 
								keepconfig = (http:formvalue("keepcfg") == "1"),
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						elseif step == 3 then
 | 
				
			||||||
 | 
							if http:formvalue("keepcfg") == "1" then
 | 
				
			||||||
 | 
								fork_exec("/sbin/sysupgrade", tmpfile)
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								fork_exec("/sbin/sysupgrade", "-n", tmpfile)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							renderer.render("layout", {
 | 
				
			||||||
 | 
								content = "admin/upgrade_reboot",
 | 
				
			||||||
 | 
								hidenav = true,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local has_platform = fs.access("/lib/upgrade/platform.sh")
 | 
				
			||||||
 | 
					if has_platform then
 | 
				
			||||||
 | 
						local upgrade = entry({"admin", "upgrade"}, call(action_upgrade), _("Upgrade firmware"), 90)
 | 
				
			||||||
 | 
						upgrade.filehandler = filehandler
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -0,0 +1,109 @@
 | 
				
			|||||||
 | 
					--[[
 | 
				
			||||||
 | 
					Copyright 2008 Steven Barth <steven@midlink.org>
 | 
				
			||||||
 | 
					Copyright 2011 Jo-Philipp Wich <xm@subsignal.org>
 | 
				
			||||||
 | 
					Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					]]--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local nixio = require "nixio"
 | 
				
			||||||
 | 
					local fs = require "nixio.fs"
 | 
				
			||||||
 | 
					local util = require "gluon.util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f_keys = Form(translate("SSH keys"), translate("You can provide your SSH keys here (one per line):"), 'keys')
 | 
				
			||||||
 | 
					local s = f_keys:section(Section)
 | 
				
			||||||
 | 
					local keys = s:option(TextValue, "keys")
 | 
				
			||||||
 | 
					keys.wrap    = "off"
 | 
				
			||||||
 | 
					keys.rows    = 5
 | 
				
			||||||
 | 
					keys.default = fs.readfile("/etc/dropbear/authorized_keys") or ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function keys:write(value)
 | 
				
			||||||
 | 
						value = util.trim(value:gsub("\r", ""))
 | 
				
			||||||
 | 
						if value ~= "" then
 | 
				
			||||||
 | 
							fs.writefile("/etc/dropbear/authorized_keys", value .. "\n")
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							fs.remove("/etc/dropbear/authorized_keys")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f_password = Form(translate("Password"),
 | 
				
			||||||
 | 
						translate(
 | 
				
			||||||
 | 
					                "Alternatively, you can set a password to access you node. Please choose a secure password you don't use anywhere else.<br /><br />"
 | 
				
			||||||
 | 
					                .. "If you set an empty password, login via password will be disabled. This is the default."
 | 
				
			||||||
 | 
						), 'password'
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					f_password.reset = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f_password:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local pw1 = s:option(Value, "pw1", translate("Password"))
 | 
				
			||||||
 | 
					pw1.password = true
 | 
				
			||||||
 | 
					function pw1.cfgvalue()
 | 
				
			||||||
 | 
						return ''
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local pw2 = s:option(Value, "pw2", translate("Confirmation"))
 | 
				
			||||||
 | 
					pw2.password = true
 | 
				
			||||||
 | 
					function pw2.cfgvalue()
 | 
				
			||||||
 | 
						return ''
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function set_password(password)
 | 
				
			||||||
 | 
						local inr, inw = nixio.pipe()
 | 
				
			||||||
 | 
						local pid = nixio.fork()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if pid < 0 then
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						elseif pid == 0 then
 | 
				
			||||||
 | 
							inw:close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local null = nixio.open('/dev/null', 'w')
 | 
				
			||||||
 | 
							nixio.dup(null, nixio.stderr)
 | 
				
			||||||
 | 
							nixio.dup(null, nixio.stdout)
 | 
				
			||||||
 | 
							if null:fileno() > 2 then
 | 
				
			||||||
 | 
								null:close()
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nixio.dup(inr, nixio.stdin)
 | 
				
			||||||
 | 
							inr:close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nixio.execp('passwd')
 | 
				
			||||||
 | 
							os.exit(127)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inr:close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inw:write(string.format('%s\n%s\n', password, password))
 | 
				
			||||||
 | 
						inw:close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local wpid, status, code = nixio.waitpid(pid)
 | 
				
			||||||
 | 
						return wpid and status == 'exited' and code == 0
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function f_password:write()
 | 
				
			||||||
 | 
						if pw1.data ~= pw2.data then
 | 
				
			||||||
 | 
							f_password.errmessage = translate("The password and the confirmation differ.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local pw = pw1.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if #pw > 0 then
 | 
				
			||||||
 | 
							if set_password(pw) then
 | 
				
			||||||
 | 
								f_password.message = translate("Password changed.")
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								f_password.errmessage = translate("Unable to change the password.")
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							-- We don't check the return code here as the error 'password for root is already locked' is normal...
 | 
				
			||||||
 | 
							os.execute('passwd -l root >/dev/null')
 | 
				
			||||||
 | 
							f_password.message = translate("Password removed.")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f_keys, f_password
 | 
				
			||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-autoupdater
 | 
					PKG_NAME:=gluon-web-autoupdater
 | 
				
			||||||
PKG_VERSION:=1
 | 
					PKG_VERSION:=1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -14,11 +14,11 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-autoupdater
 | 
					define Package/gluon-web-autoupdater
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci module for gluon-autoupdater
 | 
					  TITLE:=gluon-web module for gluon-autoupdater
 | 
				
			||||||
  DEPENDS:=+gluon-luci-admin +gluon-autoupdater
 | 
					  DEPENDS:=+gluon-web-admin +gluon-autoupdater
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Prepare
 | 
					define Build/Prepare
 | 
				
			||||||
@ -29,13 +29,13 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonBuildI18N,gluon-luci-autoupdater,i18n)
 | 
						$(call GluonBuildI18N,gluon-web-autoupdater,i18n)
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-autoupdater/install
 | 
					define Package/gluon-web-autoupdater/install
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-luci-autoupdater,$(1))
 | 
						$(call GluonInstallI18N,gluon-web-autoupdater,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-autoupdater))
 | 
					$(eval $(call BuildPackage,gluon-web-autoupdater))
 | 
				
			||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"PO-Revision-Date: 2015-05-04 01:55+0200\n"
 | 
					"PO-Revision-Date: 2015-05-04 01:55+0200\n"
 | 
				
			||||||
"Last-Translator:  <mschiffer@universe-factory.net>\n"
 | 
					"Last-Translator:  <mschiffer@universe-factory.net>\n"
 | 
				
			||||||
"Language-Team: German\n"
 | 
					"Language-Team: German\n"
 | 
				
			||||||
"Language: de\n"
 | 
					"Language: de\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
					"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -15,3 +15,6 @@ msgstr "Automatische Updates"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msgid "Branch"
 | 
					msgid "Branch"
 | 
				
			||||||
msgstr "Branch"
 | 
					msgstr "Branch"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enable"
 | 
				
			||||||
 | 
					msgstr "Aktivieren"
 | 
				
			||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"PO-Revision-Date: 2015-08-19 20:20+0100\n"
 | 
					"PO-Revision-Date: 2015-08-19 20:20+0100\n"
 | 
				
			||||||
"Last-Translator: Bernot Tobias <tqbs@airmail.cc>\n"
 | 
					"Last-Translator: Bernot Tobias <tqbs@airmail.cc>\n"
 | 
				
			||||||
"Language-Team: French\n"
 | 
					"Language-Team: French\n"
 | 
				
			||||||
"Language: fr\n"
 | 
					"Language: fr\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
					"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -15,3 +15,6 @@ msgstr "Mise a jour automatique"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msgid "Branch"
 | 
					msgid "Branch"
 | 
				
			||||||
msgstr "Branche"
 | 
					msgstr "Branche"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enable"
 | 
				
			||||||
 | 
					msgstr "Activer"
 | 
				
			||||||
@ -6,3 +6,6 @@ msgstr ""
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msgid "Branch"
 | 
					msgid "Branch"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enable"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					entry({"admin", "autoupdater"}, model("admin/autoupdater"), _("Automatic updates"), 80)
 | 
				
			||||||
@ -1,6 +1,4 @@
 | 
				
			|||||||
--[[
 | 
					--[[
 | 
				
			||||||
LuCI - Lua Configuration Interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
					Copyright 2013 Nils Schneider <nils@nilsschneider.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
@ -8,20 +6,20 @@ you may not use this file except in compliance with the License.
 | 
				
			|||||||
You may obtain a copy of the License at
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        http://www.apache.org/licenses/LICENSE-2.0
 | 
					        http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 | 
				
			||||||
$Id$
 | 
					 | 
				
			||||||
]]--
 | 
					]]--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local uci = require("simple-uci").cursor()
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
local autoupdater = uci:get_first("autoupdater", "autoupdater")
 | 
					local autoupdater = uci:get_first("autoupdater", "autoupdater")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local f = SimpleForm("autoupdater", translate("Automatic updates"))
 | 
					local f = Form(translate("Automatic updates"))
 | 
				
			||||||
local s = f:section(SimpleSection, nil, nil)
 | 
					local s = f:section(Section)
 | 
				
			||||||
local o
 | 
					local o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
o = s:option(Flag, "enabled", translate("Enable"))
 | 
					o = s:option(Flag, "enabled", translate("Enable"))
 | 
				
			||||||
o.default = uci:get_bool("autoupdater", autoupdater, "enabled") and o.enabled or o.disabled
 | 
					o.default = uci:get_bool("autoupdater", autoupdater, "enabled")
 | 
				
			||||||
o.rmempty = false
 | 
					function o:write(data)
 | 
				
			||||||
 | 
						uci:set("autoupdater", autoupdater, "enabled", data)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
o = s:option(ListValue, "branch", translate("Branch"))
 | 
					o = s:option(ListValue, "branch", translate("Branch"))
 | 
				
			||||||
uci:foreach("autoupdater", "branch",
 | 
					uci:foreach("autoupdater", "branch",
 | 
				
			||||||
@ -30,16 +28,11 @@ uci:foreach("autoupdater", "branch",
 | 
				
			|||||||
	end
 | 
						end
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
o.default = uci:get("autoupdater", autoupdater, "branch")
 | 
					o.default = uci:get("autoupdater", autoupdater, "branch")
 | 
				
			||||||
 | 
					function o:write(data)
 | 
				
			||||||
 | 
						uci:set("autoupdater", autoupdater, "branch", data)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function f.handle(self, state, data)
 | 
					function f:write()
 | 
				
			||||||
	if state ~= FORM_VALID then
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uci:set("autoupdater", autoupdater, "enabled", data.enabled)
 | 
					 | 
				
			||||||
	uci:set("autoupdater", autoupdater, "branch", data.branch)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uci:save("autoupdater")
 | 
					 | 
				
			||||||
	uci:commit("autoupdater")
 | 
						uci:commit("autoupdater")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-mesh-vpn-fastd
 | 
					PKG_NAME:=gluon-web-mesh-vpn-fastd
 | 
				
			||||||
PKG_VERSION:=1
 | 
					PKG_VERSION:=1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,11 +11,11 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-mesh-vpn-fastd
 | 
					define Package/gluon-web-mesh-vpn-fastd
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci module to enable and disable encryption for the mesh VPN
 | 
					  TITLE:=gluon-web module to enable and disable encryption for the mesh VPN
 | 
				
			||||||
  DEPENDS:=+gluon-luci-admin +gluon-mesh-vpn-fastd
 | 
					  DEPENDS:=+gluon-web-admin +gluon-mesh-vpn-fastd
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Prepare
 | 
					define Build/Prepare
 | 
				
			||||||
@ -30,15 +30,15 @@ define Build/Compile
 | 
				
			|||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-mesh-vpn-fastd/install
 | 
					define Package/gluon-web-mesh-vpn-fastd/install
 | 
				
			||||||
	$(CP) ./files/* $(1)/
 | 
						$(CP) ./files/* $(1)/
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-mesh-vpn-fastd,$(1))
 | 
						$(call GluonInstallI18N,gluon-mesh-vpn-fastd,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-mesh-vpn-fastd/postinst
 | 
					define Package/gluon-web-mesh-vpn-fastd/postinst
 | 
				
			||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
$(call GluonCheckSite,check_site.lua)
 | 
					$(call GluonCheckSite,check_site.lua)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-mesh-vpn-fastd))
 | 
					$(eval $(call BuildPackage,gluon-web-mesh-vpn-fastd))
 | 
				
			||||||
@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					<div class="gluon-value">
 | 
				
			||||||
 | 
					  <div class="gluon-value-title">
 | 
				
			||||||
 | 
					    <input class="gluon-input-radio" data-update="change" type="radio" value="security"<%= attr("id", id..'1') .. attr("name", id) .. attr("checked", ((self:cfgvalue() or self.default) == "security") and "checked") %> />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="gluon-value-field-long">
 | 
				
			||||||
 | 
					    <label<%= attr("for", id..'1') %> class="gluon-value-title"><%:Security mode%></label>
 | 
				
			||||||
 | 
					    <br />
 | 
				
			||||||
 | 
					    <%= translate(
 | 
				
			||||||
 | 
					        'In security mode, the mesh VPN uses an encrypted tunnel to connect to the VPN servers. ' ..
 | 
				
			||||||
 | 
					        'The encryption ensures that it is impossible for your internet access provider to see what ' ..
 | 
				
			||||||
 | 
					        'data is exchanged over your node.'
 | 
				
			||||||
 | 
					    ) %>
 | 
				
			||||||
 | 
					    <br />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="gluon-value-field-long-after"></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="gluon-value gluon-value-last">
 | 
				
			||||||
 | 
					  <div class="gluon-value-title">
 | 
				
			||||||
 | 
					    <input class="gluon-input-radio" data-update="change" type="radio" value="performance"<%= attr("id", id..'2') .. attr("name", id) .. attr("checked", ((self:cfgvalue() or self.default) == "performance") and "checked") %> />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="gluon-value-field-long">
 | 
				
			||||||
 | 
					    <label<%= attr("for", id..'2') %> class="gluon-value-title"><%:Performance mode%></label>
 | 
				
			||||||
 | 
					    <br />
 | 
				
			||||||
 | 
					    <%= translate(
 | 
				
			||||||
 | 
					        'In performance mode, no encryption is used. This usually allows for higher throughput, but the data exchanged over your node is not ' ..
 | 
				
			||||||
 | 
					        'protected against eavesdropping.'
 | 
				
			||||||
 | 
					    ) %>
 | 
				
			||||||
 | 
					    <br />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="gluon-value-field-long-after"></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
@ -15,7 +15,7 @@ msgid ""
 | 
				
			|||||||
"throughput, but the data exchanged over your node is not protected against "
 | 
					"throughput, but the data exchanged over your node is not protected against "
 | 
				
			||||||
"eavesdropping."
 | 
					"eavesdropping."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Im Modus „Hohe Geschwindigkeit“ wird auf Verschlüsselung "
 | 
					"Im Modus „Hohe Geschwindigkeit“ wird auf Verschlüsselung "
 | 
				
			||||||
"verzichtet. Dies erlaubt häufig eine höhere Bandbreite als mit "
 | 
					"verzichtet. Dies erlaubt häufig eine höhere Bandbreite als mit "
 | 
				
			||||||
"Verschlüsselung, aber die Verbindung ist nicht gegen Abhören geschützt."
 | 
					"Verschlüsselung, aber die Verbindung ist nicht gegen Abhören geschützt."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,7 +24,7 @@ msgid ""
 | 
				
			|||||||
"VPN servers. The encryption ensures that it is impossible for your internet "
 | 
					"VPN servers. The encryption ensures that it is impossible for your internet "
 | 
				
			||||||
"access provider to see what data is exchanged over your node."
 | 
					"access provider to see what data is exchanged over your node."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Im Modus „Hohe Sicherheit“ wird ein verschlüsselter Tunnel "
 | 
					"Im Modus „Hohe Sicherheit“ wird ein verschlüsselter Tunnel "
 | 
				
			||||||
"verwendet. Dies schließt aus, dass dein Internetzugangsprovider herausfinden "
 | 
					"verwendet. Dies schließt aus, dass dein Internetzugangsprovider herausfinden "
 | 
				
			||||||
"kann, was für Daten über deinen Knoten übertragen werden."
 | 
					"kann, was für Daten über deinen Knoten übertragen werden."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					entry({"admin", "mesh_vpn_fastd"}, model("admin/mesh_vpn_fastd"), _("Mesh VPN"), 20)
 | 
				
			||||||
@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
 | 
					local util = gluon.web.util
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f = Form(translate('Mesh VPN'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local mode = s:option(Value, 'mode')
 | 
				
			||||||
 | 
					mode.template = "gluon/model/mesh-vpn-fastd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local methods = uci:get('fastd', 'mesh_vpn', 'method')
 | 
				
			||||||
 | 
					if util.contains(methods, 'null') then
 | 
				
			||||||
 | 
						mode.default = 'performance'
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						mode.default = 'security'
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mode:write(data)
 | 
				
			||||||
 | 
						local site = require 'gluon.site_config'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local methods = {}
 | 
				
			||||||
 | 
						if data == 'performance' then
 | 
				
			||||||
 | 
							table.insert(methods, 'null')
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, method in ipairs(site.fastd_mesh_vpn.methods) do
 | 
				
			||||||
 | 
							if method ~= 'null' then
 | 
				
			||||||
 | 
								table.insert(methods, method)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:set('fastd', 'mesh_vpn', 'method', methods)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:save('fastd')
 | 
				
			||||||
 | 
						uci:commit('fastd')
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f
 | 
				
			||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-portconfig
 | 
					PKG_NAME:=gluon-web-network
 | 
				
			||||||
PKG_VERSION:=1
 | 
					PKG_VERSION:=1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -14,11 +14,11 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-portconfig
 | 
					define Package/gluon-web-network
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci module for advanced ethernet port configuration
 | 
					  TITLE:=gluon-web module for network port configuration
 | 
				
			||||||
  DEPENDS:=+gluon-luci-admin +gluon-client-bridge
 | 
					  DEPENDS:=+gluon-web-admin +gluon-client-bridge
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Prepare
 | 
					define Build/Prepare
 | 
				
			||||||
@ -29,13 +29,13 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonBuildI18N,gluon-luci-portconfig,i18n)
 | 
						$(call GluonBuildI18N,gluon-web-network,i18n)
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-portconfig/install
 | 
					define Package/gluon-web-network/install
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-luci-portconfig,$(1))
 | 
						$(call GluonInstallI18N,gluon-web-network,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-portconfig))
 | 
					$(eval $(call BuildPackage,gluon-web-network))
 | 
				
			||||||
@ -16,6 +16,9 @@ msgstr "Automatisch (DHCP)"
 | 
				
			|||||||
msgid "Automatic (RA/DHCPv6)"
 | 
					msgid "Automatic (RA/DHCPv6)"
 | 
				
			||||||
msgstr "Automatisch (RA/DHCPv6)"
 | 
					msgstr "Automatisch (RA/DHCPv6)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Disabled"
 | 
				
			||||||
 | 
					msgstr "Deaktiviert"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Enable PoE passthrough"
 | 
					msgid "Enable PoE passthrough"
 | 
				
			||||||
msgstr "PoE-Passthrough aktivieren"
 | 
					msgstr "PoE-Passthrough aktivieren"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,6 +28,24 @@ msgstr "Mesh auf dem LAN-Port aktivieren"
 | 
				
			|||||||
msgid "Enable meshing on the WAN interface"
 | 
					msgid "Enable meshing on the WAN interface"
 | 
				
			||||||
msgstr "Mesh auf dem WAN-Port aktivieren"
 | 
					msgstr "Mesh auf dem WAN-Port aktivieren"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Gateway"
 | 
				
			||||||
 | 
					msgstr "Gateway"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IP address"
 | 
				
			||||||
 | 
					msgstr "IP-Adresse"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv4"
 | 
				
			||||||
 | 
					msgstr "IPv4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv6"
 | 
				
			||||||
 | 
					msgstr "IPv6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Netmask"
 | 
				
			||||||
 | 
					msgstr "Netzmaske"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Network"
 | 
				
			||||||
 | 
					msgstr "Netzwerk"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Static"
 | 
					msgid "Static"
 | 
				
			||||||
msgstr "Statisch"
 | 
					msgstr "Statisch"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,6 +16,9 @@ msgstr "Automatique (DHCP)"
 | 
				
			|||||||
msgid "Automatic (RA/DHCPv6)"
 | 
					msgid "Automatic (RA/DHCPv6)"
 | 
				
			||||||
msgstr "Automatique (RA/DHCPv6)"
 | 
					msgstr "Automatique (RA/DHCPv6)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Disabled"
 | 
				
			||||||
 | 
					msgstr "Désactivé"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Enable PoE passthrough"
 | 
					msgid "Enable PoE passthrough"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,6 +28,24 @@ msgstr "Activer le réseau MESH sur le port LAN"
 | 
				
			|||||||
msgid "Enable meshing on the WAN interface"
 | 
					msgid "Enable meshing on the WAN interface"
 | 
				
			||||||
msgstr "Activer le réseau MESH sur les ports WAN"
 | 
					msgstr "Activer le réseau MESH sur les ports WAN"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Gateway"
 | 
				
			||||||
 | 
					msgstr "Passerelle"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IP address"
 | 
				
			||||||
 | 
					msgstr "Adresse IP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv4"
 | 
				
			||||||
 | 
					msgstr "IPv4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv6"
 | 
				
			||||||
 | 
					msgstr "IPv6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Netmask"
 | 
				
			||||||
 | 
					msgstr "Masque de réseau"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Network"
 | 
				
			||||||
 | 
					msgstr "Réseau"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Static"
 | 
					msgid "Static"
 | 
				
			||||||
msgstr "Statique"
 | 
					msgstr "Statique"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -7,6 +7,9 @@ msgstr ""
 | 
				
			|||||||
msgid "Automatic (RA/DHCPv6)"
 | 
					msgid "Automatic (RA/DHCPv6)"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Disabled"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Enable PoE passthrough"
 | 
					msgid "Enable PoE passthrough"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,6 +19,24 @@ msgstr ""
 | 
				
			|||||||
msgid "Enable meshing on the WAN interface"
 | 
					msgid "Enable meshing on the WAN interface"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Gateway"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IP address"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv4"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "IPv6"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Netmask"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Network"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Static"
 | 
					msgid "Static"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					entry({"admin", "network"}, model("admin/network"), _("Network"), 20)
 | 
				
			||||||
@ -0,0 +1,143 @@
 | 
				
			|||||||
 | 
					--[[
 | 
				
			||||||
 | 
					Copyright 2014 Nils Schneider <nils@nilsschneider.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					]]--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
 | 
					local sysconfig = require 'gluon.sysconfig'
 | 
				
			||||||
 | 
					local util = require 'gluon.util'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local wan = uci:get_all("network", "wan")
 | 
				
			||||||
 | 
					local wan6 = uci:get_all("network", "wan6")
 | 
				
			||||||
 | 
					local dns_static = uci:get_first("gluon-wan-dnsmasq", "static")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f = Form(translate("WAN connection"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv4 = s:option(ListValue, "ipv4", translate("IPv4"))
 | 
				
			||||||
 | 
					ipv4:value("dhcp", translate("Automatic (DHCP)"))
 | 
				
			||||||
 | 
					ipv4:value("static", translate("Static"))
 | 
				
			||||||
 | 
					ipv4:value("none", translate("Disabled"))
 | 
				
			||||||
 | 
					ipv4.default = wan.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv4_addr = s:option(Value, "ipv4_addr", translate("IP address"))
 | 
				
			||||||
 | 
					ipv4_addr:depends(ipv4, "static")
 | 
				
			||||||
 | 
					ipv4_addr.default = wan.ipaddr
 | 
				
			||||||
 | 
					ipv4_addr.datatype = "ip4addr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv4_netmask = s:option(Value, "ipv4_netmask", translate("Netmask"))
 | 
				
			||||||
 | 
					ipv4_netmask:depends(ipv4, "static")
 | 
				
			||||||
 | 
					ipv4_netmask.default = wan.netmask or "255.255.255.0"
 | 
				
			||||||
 | 
					ipv4_netmask.datatype = "ip4addr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv4_gateway = s:option(Value, "ipv4_gateway", translate("Gateway"))
 | 
				
			||||||
 | 
					ipv4_gateway:depends(ipv4, "static")
 | 
				
			||||||
 | 
					ipv4_gateway.default = wan.gateway
 | 
				
			||||||
 | 
					ipv4_gateway.datatype = "ip4addr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv6 = s:option(ListValue, "ipv6", translate("IPv6"))
 | 
				
			||||||
 | 
					ipv6:value("dhcpv6", translate("Automatic (RA/DHCPv6)"))
 | 
				
			||||||
 | 
					ipv6:value("static", translate("Static"))
 | 
				
			||||||
 | 
					ipv6:value("none", translate("Disabled"))
 | 
				
			||||||
 | 
					ipv6.default = wan6.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv6_addr = s:option(Value, "ipv6_addr", translate("IP address"))
 | 
				
			||||||
 | 
					ipv6_addr:depends(ipv6, "static")
 | 
				
			||||||
 | 
					ipv6_addr.default = wan6.ip6addr
 | 
				
			||||||
 | 
					ipv6_addr.datatype = "ip6addr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ipv6_gateway = s:option(Value, "ipv6_gateway", translate("Gateway"))
 | 
				
			||||||
 | 
					ipv6_gateway:depends(ipv6, "static")
 | 
				
			||||||
 | 
					ipv6_gateway.default = wan6.ip6gw
 | 
				
			||||||
 | 
					ipv6_gateway.datatype = "ip6addr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if dns_static then
 | 
				
			||||||
 | 
						local s = f:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local dns = s:option(DynamicList, "dns", translate("Static DNS servers"))
 | 
				
			||||||
 | 
						dns.default = uci:get_list("gluon-wan-dnsmasq", dns_static, "server")
 | 
				
			||||||
 | 
						dns.datatype = "ipaddr"
 | 
				
			||||||
 | 
						dns.optional = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function dns:write(data)
 | 
				
			||||||
 | 
							uci:set_list("gluon-wan-dnsmasq", dns_static, "server", data)
 | 
				
			||||||
 | 
							uci:commit("gluon-wan-dnsmasq")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local mesh_wan = s:option(Flag, "mesh_wan", translate("Enable meshing on the WAN interface"))
 | 
				
			||||||
 | 
					mesh_wan.default = uci:get_bool("network", "mesh_wan", "auto")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mesh_wan:write(data)
 | 
				
			||||||
 | 
						uci:set("network", "mesh_wan", "auto", data)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if sysconfig.lan_ifname then
 | 
				
			||||||
 | 
						local mesh_lan = s:option(Flag, "mesh_lan", translate("Enable meshing on the LAN interface"))
 | 
				
			||||||
 | 
						mesh_lan.default = uci:get_bool("network", "mesh_lan", "auto")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function mesh_lan:write(data)
 | 
				
			||||||
 | 
							uci:set("network", "mesh_lan", "auto", data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local interfaces = uci:get_list("network", "client", "ifname")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for lanif in sysconfig.lan_ifname:gmatch('%S+') do
 | 
				
			||||||
 | 
								if data then
 | 
				
			||||||
 | 
									util.remove_from_set(interfaces, lanif)
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									util.add_to_set(interfaces, lanif)
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							uci:set_list("network", "client", "ifname", interfaces)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if uci:get('system', 'gpio_switch_poe_passthrough') then
 | 
				
			||||||
 | 
						local s = f:section(Section)
 | 
				
			||||||
 | 
						local poe_passthrough = s:option(Flag, "poe_passthrough", translate("Enable PoE passthrough"))
 | 
				
			||||||
 | 
						poe_passthrough.default = uci:get_bool("system", "gpio_switch_poe_passthrough", "value")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function poe_passthrough:write(data)
 | 
				
			||||||
 | 
							uci:set('system', 'gpio_switch_poe_passthrough', 'value', data)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function f:write()
 | 
				
			||||||
 | 
						uci:set("network", "wan", "proto", ipv4.data)
 | 
				
			||||||
 | 
						if ipv4.data == "static" then
 | 
				
			||||||
 | 
							uci:set("network", "wan", "ipaddr", ipv4_addr.data)
 | 
				
			||||||
 | 
							uci:set("network", "wan", "netmask", ipv4_netmask.data)
 | 
				
			||||||
 | 
							uci:set("network", "wan", "gateway", ipv4_gateway.data)
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							uci:delete("network", "wan", "ipaddr")
 | 
				
			||||||
 | 
							uci:delete("network", "wan", "netmask")
 | 
				
			||||||
 | 
							uci:delete("network", "wan", "gateway")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:set("network", "wan6", "proto", ipv6.data)
 | 
				
			||||||
 | 
						if ipv6.data == "static" then
 | 
				
			||||||
 | 
							uci:set("network", "wan6", "ip6addr", ipv6_addr.data)
 | 
				
			||||||
 | 
							uci:set("network", "wan6", "ip6gw", ipv6_gateway.data)
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							uci:delete("network", "wan6", "ip6addr")
 | 
				
			||||||
 | 
							uci:delete("network", "wan6", "ip6gw")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:commit("network")
 | 
				
			||||||
 | 
						uci:commit('system')
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-node-role
 | 
					PKG_NAME:=gluon-web-node-role
 | 
				
			||||||
PKG_VERSION:=0.1
 | 
					PKG_VERSION:=0.1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,10 +11,10 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-node-role
 | 
					define Package/gluon-web-node-role
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  DEPENDS:=+gluon-luci-admin +gluon-node-info
 | 
					  DEPENDS:=+gluon-web-admin +gluon-node-info
 | 
				
			||||||
  TITLE:=UI for specifying node role
 | 
					  TITLE:=UI for specifying node role
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,18 +26,18 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonBuildI18N,gluon-luci-node-role,i18n)
 | 
						$(call GluonBuildI18N,gluon-web-node-role,i18n)
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-node-role/install
 | 
					define Package/gluon-web-node-role/install
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-luci-node-role,$(1))
 | 
						$(call GluonInstallI18N,gluon-web-node-role,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-node-role/postinst
 | 
					define Package/gluon-web-node-role/postinst
 | 
				
			||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
$(call GluonCheckSite,check_site.lua)
 | 
					$(call GluonCheckSite,check_site.lua)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-node-role))
 | 
					$(eval $(call BuildPackage,gluon-web-node-role))
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					entry({"admin", "noderole"}, model("admin/noderole"), "Node role", 20)
 | 
				
			||||||
@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					local f, s, o
 | 
				
			||||||
 | 
					local site = require 'gluon.site_config'
 | 
				
			||||||
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
 | 
					local config = 'gluon-node-info'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- where to read the configuration from
 | 
				
			||||||
 | 
					local role = uci:get(config, uci:get_first(config, "system"), "role")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					f = Form(translate("Node role"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					s = f:section(Section, nil, translate(
 | 
				
			||||||
 | 
						"If this node has a special role within the freifunk network you can specify this role here. "
 | 
				
			||||||
 | 
						.. "Please find out about the available roles and their impact first. "
 | 
				
			||||||
 | 
						.. "Only change the role if you know what you are doing."
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					o = s:option(ListValue, "role", translate("Role"))
 | 
				
			||||||
 | 
					o.default = role
 | 
				
			||||||
 | 
					for _, role in ipairs(site.roles.list) do
 | 
				
			||||||
 | 
						o:value(role, translate('gluon-web-node-role:role:' .. role))
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function o:write(data)
 | 
				
			||||||
 | 
						uci:set(config, uci:get_first(config, "system"), "role", data)
 | 
				
			||||||
 | 
						uci:commit(config)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-private-wifi
 | 
					PKG_NAME:=gluon-web-private-wifi
 | 
				
			||||||
PKG_VERSION:=1
 | 
					PKG_VERSION:=1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,10 +11,10 @@ include ../gluon.mk
 | 
				
			|||||||
PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
					PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-private-wifi
 | 
					define Package/gluon-web-private-wifi
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  DEPENDS:=+gluon-luci-admin
 | 
					  DEPENDS:=+gluon-web-admin
 | 
				
			||||||
  TITLE:=UI for activating a private WLAN
 | 
					  TITLE:=UI for activating a private WLAN
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,13 +26,13 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonBuildI18N,gluon-luci-private-wifi,i18n)
 | 
						$(call GluonBuildI18N,gluon-web-private-wifi,i18n)
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
						$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-private-wifi/install
 | 
					define Package/gluon-web-private-wifi/install
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
						$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
				
			||||||
	$(call GluonInstallI18N,gluon-luci-private-wifi,$(1))
 | 
						$(call GluonInstallI18N,gluon-web-private-wifi,$(1))
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-private-wifi))
 | 
					$(eval $(call BuildPackage,gluon-web-private-wifi))
 | 
				
			||||||
@ -13,6 +13,12 @@ msgstr ""
 | 
				
			|||||||
msgid "8-63 characters"
 | 
					msgid "8-63 characters"
 | 
				
			||||||
msgstr "8-63 Zeichen"
 | 
					msgstr "8-63 Zeichen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enabled"
 | 
				
			||||||
 | 
					msgstr "Aktiviert"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Key"
 | 
				
			||||||
 | 
					msgstr "Schlüssel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Name (SSID)"
 | 
					msgid "Name (SSID)"
 | 
				
			||||||
msgstr "Name (SSID)"
 | 
					msgstr "Name (SSID)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -13,6 +13,12 @@ msgstr ""
 | 
				
			|||||||
msgid "8-63 characters"
 | 
					msgid "8-63 characters"
 | 
				
			||||||
msgstr "8-63 charactères"
 | 
					msgstr "8-63 charactères"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enabled"
 | 
				
			||||||
 | 
					msgstr "Activé"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Key"
 | 
				
			||||||
 | 
					msgstr "Clé"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Name (SSID)"
 | 
					msgid "Name (SSID)"
 | 
				
			||||||
msgstr "Nom (SSID)"
 | 
					msgstr "Nom (SSID)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -4,6 +4,12 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
				
			|||||||
msgid "8-63 characters"
 | 
					msgid "8-63 characters"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Enabled"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid "Key"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "Name (SSID)"
 | 
					msgid "Name (SSID)"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					entry({"admin", "privatewifi"}, model("admin/privatewifi"), _("Private WLAN"), 10)
 | 
				
			||||||
@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					local uci = require("simple-uci").cursor()
 | 
				
			||||||
 | 
					local util = require 'gluon.util'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- where to read the configuration from
 | 
				
			||||||
 | 
					local primary_iface = 'wan_radio0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local f = Form(translate("Private WLAN"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local s = f:section(Section, nil, translate(
 | 
				
			||||||
 | 
						'Your node can additionally extend your private network by bridging the WAN interface '
 | 
				
			||||||
 | 
						.. 'with a separate WLAN. This feature is completely independent of the mesh functionality. '
 | 
				
			||||||
 | 
						.. 'Please note that the private WLAN and meshing on the WAN interface should not be enabled '
 | 
				
			||||||
 | 
						.. 'at the same time.'
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local enabled = s:option(Flag, "enabled", translate("Enabled"))
 | 
				
			||||||
 | 
					enabled.default = (ssid and not uci:get_bool('wireless', primary_iface, "disabled"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ssid = s:option(Value, "ssid", translate("Name (SSID)"))
 | 
				
			||||||
 | 
					ssid:depends(enabled, true)
 | 
				
			||||||
 | 
					ssid.datatype = "maxlength(32)"
 | 
				
			||||||
 | 
					ssid.default = uci:get('wireless', primary_iface, "ssid")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local key = s:option(Value, "key", translate("Key"), translate("8-63 characters"))
 | 
				
			||||||
 | 
					key:depends(enabled, true)
 | 
				
			||||||
 | 
					key.datatype = "wpakey"
 | 
				
			||||||
 | 
					key.default = uci:get('wireless', primary_iface, "key")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function f:write()
 | 
				
			||||||
 | 
						util.iterate_radios(function(radio, index)
 | 
				
			||||||
 | 
							local name   = "wan_" .. radio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if enabled.data then
 | 
				
			||||||
 | 
								local macaddr = util.get_wlan_mac(radio, index, 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								uci:section('wireless', "wifi-iface", name, {
 | 
				
			||||||
 | 
									device     = radio,
 | 
				
			||||||
 | 
									network    = "wan",
 | 
				
			||||||
 | 
									mode       = 'ap',
 | 
				
			||||||
 | 
									encryption = 'psk2',
 | 
				
			||||||
 | 
									ssid       = ssid.data,
 | 
				
			||||||
 | 
									key        = key.data,
 | 
				
			||||||
 | 
									macaddr    = macaddr,
 | 
				
			||||||
 | 
									disabled   = false,
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								uci:set('wireless', name, "disabled", true)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uci:commit('wireless')
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return f
 | 
				
			||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=gluon-luci-theme
 | 
					PKG_NAME:=gluon-web-theme
 | 
				
			||||||
PKG_VERSION:=0.1
 | 
					PKG_VERSION:=0.1
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,17 +12,13 @@ PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 | 
				
			|||||||
include ../gluon.mk
 | 
					include ../gluon.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-theme
 | 
					define Package/gluon-web-theme
 | 
				
			||||||
  SECTION:=gluon
 | 
					  SECTION:=gluon
 | 
				
			||||||
  CATEGORY:=Gluon
 | 
					  CATEGORY:=Gluon
 | 
				
			||||||
  TITLE:=Luci theme for Gluon
 | 
					  TITLE:=gluon-web theme
 | 
				
			||||||
  DEPENDS:=+pretty-hostname
 | 
					  DEPENDS:=+pretty-hostname
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-theme/description
 | 
					 | 
				
			||||||
	Luci based config mode
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define Build/Prepare
 | 
					define Build/Prepare
 | 
				
			||||||
	mkdir -p $(PKG_BUILD_DIR)
 | 
						mkdir -p $(PKG_BUILD_DIR)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
@ -31,12 +27,10 @@ define Build/Configure
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/gluon-luci-theme/install
 | 
					define Package/gluon-web-theme/install
 | 
				
			||||||
	$(CP) ./files/* $(1)/
 | 
						$(CP) ./files/* $(1)/
 | 
				
			||||||
	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,gluon-luci-theme))
 | 
					$(eval $(call BuildPackage,gluon-web-theme))
 | 
				
			||||||
@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					<%#
 | 
				
			||||||
 | 
					Copyright 2008 Steven Barth <steven@midlink.org>
 | 
				
			||||||
 | 
					Copyright 2008-2010 Jo-Philipp Wich <xm@subsignal.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					-%>
 | 
				
			||||||
 | 
					<%
 | 
				
			||||||
 | 
						local uci  = require("simple-uci").cursor()
 | 
				
			||||||
 | 
						local disp = require "gluon.web.dispatcher"
 | 
				
			||||||
 | 
						local fs   = require "nixio.fs"
 | 
				
			||||||
 | 
						local pretty_hostname = require "pretty_hostname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local hostname = pretty_hostname.get(uci)
 | 
				
			||||||
 | 
						local release = fs.readfile("/lib/gluon/release")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local root = node()
 | 
				
			||||||
 | 
						local rnode = node(unpack(request))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local category = request[1]
 | 
				
			||||||
 | 
						local cattree  = category and node(category)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local categories = disp.node_children(root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						http:prepare_content("application/xhtml+xml")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function append(xs, x)
 | 
				
			||||||
 | 
							local r = {unpack(xs)}
 | 
				
			||||||
 | 
							r[#r+1] = x
 | 
				
			||||||
 | 
							return r
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function subtree(prefix, node, name, ...)
 | 
				
			||||||
 | 
							if not node then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local children = disp.node_children(node)
 | 
				
			||||||
 | 
							if #children == 0 then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						%>
 | 
				
			||||||
 | 
						<div class="tabmenu<%=#prefix%>">
 | 
				
			||||||
 | 
							<ul class="tabmenu l<%=#prefix%>">
 | 
				
			||||||
 | 
								<%
 | 
				
			||||||
 | 
									for i, v in ipairs(children) do
 | 
				
			||||||
 | 
										local child = node.nodes[v]
 | 
				
			||||||
 | 
										local active = (v == name)
 | 
				
			||||||
 | 
								%>
 | 
				
			||||||
 | 
								<li class="tabmenu-item-<%=v%><% if active then %> active<% end %>">
 | 
				
			||||||
 | 
									<a href="<%=url(append(prefix, v))%>"><%=pcdata(translate(child.title))%></a>
 | 
				
			||||||
 | 
								</li>
 | 
				
			||||||
 | 
								<%
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								%>
 | 
				
			||||||
 | 
							</ul>
 | 
				
			||||||
 | 
							<br style="clear:both" />
 | 
				
			||||||
 | 
							<%
 | 
				
			||||||
 | 
								subtree(append(prefix, name), node.nodes[name], ...)
 | 
				
			||||||
 | 
							%>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<%
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local function menutree(path, ...)
 | 
				
			||||||
 | 
							subtree({path}, root.nodes[category], ...)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					-%>
 | 
				
			||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
 | 
				
			||||||
 | 
						<head>
 | 
				
			||||||
 | 
							<meta charset="UTF-8" />
 | 
				
			||||||
 | 
							<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
 | 
				
			||||||
 | 
							<title><%=pcdata( hostname .. ( (rnode and rnode.title) and ' - ' .. translate(rnode.title) or '')) %></title>
 | 
				
			||||||
 | 
						</head>
 | 
				
			||||||
 | 
						<body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<div id="menubar">
 | 
				
			||||||
 | 
							<div class="hostinfo">
 | 
				
			||||||
 | 
								<a href="<%=url({})%>">
 | 
				
			||||||
 | 
									<%=pcdata(hostname)%>
 | 
				
			||||||
 | 
									<% if release then %>
 | 
				
			||||||
 | 
									/ <%=pcdata(release)%>
 | 
				
			||||||
 | 
									<% end %>
 | 
				
			||||||
 | 
								</a>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<% if #categories > 1 and not hidenav then %>
 | 
				
			||||||
 | 
								<ul id="topmenu">
 | 
				
			||||||
 | 
									<% for i, r in ipairs(categories) do %>
 | 
				
			||||||
 | 
										<li><a class="topcat<% if request[1] == r then %> active<%end%>" href="<%=url({r})%>"><%=pcdata(translate(root.nodes[r].title))%></a></li>
 | 
				
			||||||
 | 
									<% end %>
 | 
				
			||||||
 | 
								</ul>
 | 
				
			||||||
 | 
							<% end %>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<div id="maincontainer">
 | 
				
			||||||
 | 
						  <%
 | 
				
			||||||
 | 
								if not hidenav then
 | 
				
			||||||
 | 
									menutree(unpack(request))
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							%>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<div id="maincontent">
 | 
				
			||||||
 | 
								<noscript>
 | 
				
			||||||
 | 
									<div class="errorbox">
 | 
				
			||||||
 | 
										<strong><%:JavaScript required!%></strong><br />
 | 
				
			||||||
 | 
										<%:You must enable JavaScript in your browser or the web interface will not work properly.%>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</noscript>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<%
 | 
				
			||||||
 | 
									ok, err = pcall(include, content)
 | 
				
			||||||
 | 
									if not ok then
 | 
				
			||||||
 | 
										renderer.render('error500', {message = err})
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								%>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user