diff --git a/applications/luci-app-upnp/Makefile b/applications/luci-app-upnp/Makefile index e569f29eaa2f..80e668764d96 100644 --- a/applications/luci-app-upnp/Makefile +++ b/applications/luci-app-upnp/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk -LUCI_TITLE:=Universal Plug and Play (UPnP IGD) & PCP/NAT-PMP configuration module +LUCI_TITLE:=UPnP IGD & PCP/NAT-PMP configuration module | Universal Plug and Play LUCI_DEPENDS:=+luci-base +miniupnpd +rpcd-mod-ucode PKG_LICENSE:=Apache-2.0 diff --git a/applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js b/applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js index 1fbb440b4cca..a317d57fc152 100644 --- a/applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js +++ b/applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js @@ -28,7 +28,7 @@ handleDelRule = function(num, ev) { }; return baseclass.extend({ - title: _('Active Port Forwards'), + title: _('Active UPnP IGD & PCP/NAT-PMP Port Maps'), load: function() { return Promise.all([ @@ -40,11 +40,11 @@ return baseclass.extend({ var table = E('table', { 'class': 'table', 'id': 'upnp_status_table' }, [ E('tr', { 'class': 'tr table-titles' }, [ - E('th', { 'class': 'th' }, _('Protocol')), E('th', { 'class': 'th' }, _('External Port')), E('th', { 'class': 'th' }, _('Client Address')), E('th', { 'class': 'th' }, _('Host')), E('th', { 'class': 'th' }, _('Client Port')), + E('th', { 'class': 'th' }, _('Protocol')), E('th', { 'class': 'th' }, _('Description')), E('th', { 'class': 'th cbi-section-actions' }, '') ]) @@ -54,11 +54,11 @@ return baseclass.extend({ var rows = rules.map(function(rule) { return [ - rule.proto, rule.extport, rule.intaddr, rule.host_hint || _('Unknown'), rule.intport, + rule.proto, rule.descr, E('button', { 'class': 'btn cbi-button-remove', @@ -67,7 +67,7 @@ return baseclass.extend({ ]; }); - cbi_update_table(table, rows, E('em', _('There are no active port forwards.'))); + cbi_update_table(table, rows, E('em', _('There are no active port maps.'))); return table; } diff --git a/applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js b/applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js index b45795128676..49dffd97cb10 100644 --- a/applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js +++ b/applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js @@ -50,11 +50,11 @@ return view.extend({ var rows = rules.map(function(rule) { return [ - rule.proto, rule.extport, rule.intaddr, rule.host_hint || _('Unknown'), rule.intport, + rule.proto, rule.descr, E('button', { 'class': 'btn cbi-button-remove', @@ -63,7 +63,7 @@ return view.extend({ ]; }); - cbi_update_table(nodes.querySelector('#upnp_status_table'), rows, E('em', _('There are no active port forwards.'))); + cbi_update_table(nodes.querySelector('#upnp_status_table'), rows, E('em', _('There are no active port maps.'))); return; }, @@ -73,18 +73,18 @@ return view.extend({ var m, s, o; m = new form.Map('upnpd', [_('UPnP IGD & PCP/NAT-PMP Service')], - _('UPnP IGD & PCP/NAT-PMP allows clients on the local network to automatically configure port forwards on the router. Also called Universal Plug and Play.')); + _('The %s & %s/%s protocols allow clients on the local network to configure port maps/forwards on the router autonomously.', 'The %s (%s = UPnP IGD) & %s (%s = PCP)/%s (%s = NAT-PMP) protocols allow clients on the local network to configure port maps/forwards on the router autonomously.').format('UPnP IGD', 'PCP', 'NAT-PMP')); s = m.section(form.GridSection, '_active_rules'); s.render = L.bind(function(view, section_id) { var table = E('table', { 'class': 'table cbi-section-table', 'id': 'upnp_status_table' }, [ E('tr', { 'class': 'tr table-titles' }, [ - E('th', { 'class': 'th' }, _('Protocol')), E('th', { 'class': 'th' }, _('External Port')), E('th', { 'class': 'th' }, _('Client Address')), E('th', { 'class': 'th' }, _('Host')), E('th', { 'class': 'th' }, _('Client Port')), + E('th', { 'class': 'th' }, _('Protocol')), E('th', { 'class': 'th' }, _('Description')), E('th', { 'class': 'th cbi-section-actions' }, '') ]) @@ -94,11 +94,11 @@ return view.extend({ var rows = rules.map(function(rule) { return [ - rule.proto, rule.extport, rule.intaddr, rule.host_hint || _('Unknown'), rule.intport, + rule.proto, rule.descr, E('button', { 'class': 'btn cbi-button-remove', @@ -107,67 +107,73 @@ return view.extend({ ]; }); - cbi_update_table(table, rows, E('em', _('There are no active port forwards.'))); + cbi_update_table(table, rows, E('em', _('There are no active port maps.'))); return E('div', { 'class': 'cbi-section cbi-tblsection' }, [ - E('h3', _('Active Port Forwards')), table ]); + E('h3', _('Active Service Port Maps')), table ]); }, o, this); s = m.section(form.NamedSection, 'config', 'upnpd', _('Service Settings')); s.addremove = false; - s.tab('general', _('General Settings')); + s.tab('general', _('General Setup')); s.tab('advanced', _('Advanced Settings')); - o = s.taboption('general', form.Flag, 'enabled', _('Start service')); + o = s.taboption('general', form.Flag, 'enabled', _('Start service'), _('Start autonomous port mapping service')); o.rmempty = false; s.taboption('general', form.Flag, 'enable_upnp', _('Enable UPnP IGD protocol')).default = '1' - s.taboption('general', form.Flag, 'enable_natpmp', _('Enable PCP/NAT-PMP protocol')).default = '1' + s.taboption('general', form.Flag, 'enable_pcp_pmp', _('Enable PCP/NAT-PMP protocols')).default = '1' - s.taboption('general', form.Flag, 'secure_mode', _('Enable secure mode'), - _('Allow adding port forwards only to requesting IP addresses')).default = '1' + o = s.taboption('general', form.ListValue, 'upnp_igd_compat', _('UPnP IGD compatiblity mode')) + o.depends('enable_upnp', '1') + o.value('igdv1',_('IGDv1 (IPv4 only)')) + o.value('igdv2',_('IGDv2')) - s.taboption('general', form.Flag, 'igdv1', _('Enable UPnP IGDv1 mode'), - _('Advertise as UPnP IGDv1 device (no IPv6) instead of IGDv2')).default = '0' + o = s.taboption('general', form.Value, 'download_kbps', _('Download speed'), + _('Value in kbit/s, informational only')) + o.depends('enable_upnp', '1') + o.rmempty = true - s.taboption('general', form.Flag, 'log_output', _('Enable additional logging'), - _('Puts extra debugging information into the system log')) + o = s.taboption('general', form.Value, 'upload_kbps', _('Upload speed'), + _('Value in kbit/s, informational only')) + o.depends('enable_upnp', '1') + o.rmempty = true - s.taboption('general', form.Value, 'download', _('Download speed'), - _('Value in KByte/s, informational only')).rmempty = true + s.taboption('advanced', form.Flag, 'secure_mode', _('Enable secure mode'), + _('Allow adding port maps only to requesting IP addresses and deny third-party PCP option')).default = '1' - s.taboption('general', form.Value, 'upload', _('Upload speed'), - _('Value in KByte/s, informational only')).rmempty = true + o = s.taboption('advanced', form.Value, 'notify_interval', _('Notify interval'), _('A 900s interval will result in %s notifications with the minimum max-age of 1800s', 'A 900s interval will result in %s (%s = SSDP) notifications with the minimum max-age of 1800s').format('SSDP')) + o.depends('enable_upnp', '1') + o.datatype = 'uinteger' + o.placeholder = 900 - o = s.taboption('general', form.Value, 'port', _('Port')) + o = s.taboption('advanced', form.Value, 'port', _('SOAP/HTTP port')) + o.depends('enable_upnp', '1') o.datatype = 'port' - o.default = 5000 + o.placeholder = 5000 - s.taboption('advanced', form.Flag, 'system_uptime', _('Report system instead of service uptime')).default = '1' - - s.taboption('advanced', form.Value, 'uuid', _('Device UUID')) - s.taboption('advanced', form.Value, 'serial_number', _('Announced serial number')) - s.taboption('advanced', form.Value, 'model_number', _('Announced model number')) - - o = s.taboption('advanced', form.Value, 'notify_interval', _('Notify interval')) - o.datatype = 'uinteger' - o.placeholder = 30 + o = s.taboption('advanced', form.Value, 'presentation_url', _('Presentation URL'), _('Set custom router web interface (presentation) URL')) + o.depends('enable_upnp', '1') + o.placeholder = 'http://192.168.1.1/' - o = s.taboption('advanced', form.Value, 'clean_ruleset_threshold', _('Clean rules threshold')) - o.datatype = 'uinteger' - o.placeholder = 20 + o = s.taboption('advanced', form.Value, 'uuid', _('Device UUID')) + o.depends('enable_upnp', '1') + o = s.taboption('advanced', form.Value, 'model_number', _('Announced model number')) + o.depends('enable_upnp', '1') + o = s.taboption('advanced', form.Value, 'serial_number', _('Announced serial number')) + o.depends('enable_upnp', '1') - o = s.taboption('advanced', form.Value, 'clean_ruleset_interval', _('Clean rules interval')) - o.datatype = 'uinteger' - o.placeholder = 600 + o = s.taboption('advanced', form.Flag, 'system_uptime', _('Report system instead of service uptime')) + o.depends('enable_upnp', '1') + o.default = '1' - o = s.taboption('advanced', form.Value, 'presentation_url', _('Presentation URL')) - o.placeholder = 'http://192.168.1.1/' + s.taboption('advanced', form.Flag, 'log_output', _('Enable additional logging'), + _('Puts extra debugging information into the system log')) o = s.taboption('advanced', form.Value, 'upnp_lease_file', _('Service lease file')) o.placeholder = '/var/run/miniupnpd.leases' - s.taboption('advanced', form.Flag, 'use_stun', _('Use STUN')) + s.taboption('advanced', form.Flag, 'use_stun', _('Use %s', 'Use %s (%s = STUN)').format('STUN'), _('Useful to detect the public IPv4 address for unrestricted full-cone, aka one-to-one, NATs')) o = s.taboption('advanced', form.Value, 'stun_host', _('STUN Host')) o.depends('use_stun', '1'); @@ -176,10 +182,10 @@ return view.extend({ o = s.taboption('advanced', form.Value, 'stun_port', _('STUN Port')) o.depends('use_stun', '1'); o.datatype = 'port' - o.placeholder = '0-65535' + o.placeholder = '3478' - s = m.section(form.GridSection, 'perm_rule', _('Service ACLs'), - _('ACLs specify which external ports can be forwarded to which client addresses and ports, IPv6 always allowed.')) + s = m.section(form.GridSection, 'perm_rule', _('Service Access Control List'), + _('ACL specify which client addresses and ports can be mapped, IPv6 always allowed.')) s.sortable = true s.anonymous = true @@ -189,7 +195,7 @@ return view.extend({ o = s.option(form.Value, 'ext_ports', _('External Port')) o.datatype = 'portrange' - o.placeholder = '0-65535' + o.placeholder = '1-65535' o = s.option(form.Value, 'int_addr', _('Client Address')) o.datatype = 'ip4addr' @@ -197,7 +203,7 @@ return view.extend({ o = s.option(form.Value, 'int_ports', _('Client Port')) o.datatype = 'portrange' - o.placeholder = '0-65535' + o.placeholder = '1-65535' o = s.option(form.ListValue, 'action', _('Action')) o.value('allow', _('Allow')); diff --git a/applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json b/applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json index aca856a215ea..80250be50cd2 100644 --- a/applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json +++ b/applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json @@ -1,6 +1,6 @@ { "admin/services/upnp": { - "title": "UPnP IGD & PCP/NAT-PMP", + "title": "UPnP IGD & PCP", "action": { "type": "view", "path": "upnp/upnp"