Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

luci-app-upnp: Complete plugin wording/UI revision #7217

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion applications/luci-app-upnp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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([
Expand 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' }, '')
])
Expand All @@ -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',
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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;
},
Expand All @@ -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('<a href="https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol" target="_blank" rel="noreferrer"><abbr title="UPnP Internet Gateway Device (Control Protocol)">UPnP IGD</abbr></a>', '<a href="https://en.wikipedia.org/wiki/Port_Control_Protocol" target="_blank" rel="noreferrer"><abbr title="Port Control Protocol">PCP</abbr></a>', '<a href="https://en.wikipedia.org/wiki/NAT_Port_Mapping_Protocol" target="_blank" rel="noreferrer"><abbr title="NAT Port Mapping Protocol">NAT-PMP</abbr></a>'));

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' }, '')
])
Expand All @@ -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',
Expand All @@ -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'
Self-Hosting-Group marked this conversation as resolved.
Show resolved Hide resolved

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'))
Self-Hosting-Group marked this conversation as resolved.
Show resolved Hide resolved
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'),
Self-Hosting-Group marked this conversation as resolved.
Show resolved Hide resolved
_('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'),
Self-Hosting-Group marked this conversation as resolved.
Show resolved Hide resolved
_('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('<abbr title="Simple Service Discovery Protocol">SSDP</abbr>'))
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'
Copy link
Contributor

@systemcrash systemcrash Sep 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use default here. Use placeholder. Edit: in fact, remove this altogether. Let the underlying scripts drive the defaults.


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('<a href="https://en.wikipedia.org/wiki/STUN" target="_blank" rel="noreferrer"><abbr title="Session Traversal Utilities for NAT">STUN</abbr></a>'), _('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');
Expand All @@ -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
Expand All @@ -189,15 +195,15 @@ 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'
o.placeholder = '0.0.0.0/0'

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'));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"admin/services/upnp": {
"title": "UPnP IGD & PCP/NAT-PMP",
"title": "UPnP IGD & PCP",
"action": {
"type": "view",
"path": "upnp/upnp"
Expand Down