Skip to content
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'

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('<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'

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