🤞 Sync 2026-03-15 21:44:24

This commit is contained in:
github-actions[bot] committed 2026-03-15 21:44:24 +08:00
1 parent a5cbeb474b
commit ceeb3a33dc
11 files changed
+414 -1065

No files matched your search

@@ -308,9 +308,6 @@ if singbox_tags:find("with_quic") then
o = s:option(Flag, _n("hysteria_disable_mtu_discovery"), translate("Disable MTU detection")) o = s:option(Flag, _n("hysteria_disable_mtu_discovery"), translate("Disable MTU detection"))
o:depends({ [_n("protocol")] = "hysteria" }) o:depends({ [_n("protocol")] = "hysteria" })
o = s:option(Value, _n("hysteria_alpn"), translate("QUIC TLS ALPN"))
o:depends({ [_n("protocol")] = "hysteria" })
end end
if singbox_tags:find("with_quic") then if singbox_tags:find("with_quic") then
@@ -342,8 +339,8 @@ if singbox_tags:find("with_quic") then
o:depends({ [_n("protocol")] = "tuic" }) o:depends({ [_n("protocol")] = "tuic" })
o = s:option(ListValue, _n("tuic_alpn"), translate("QUIC TLS ALPN")) o = s:option(ListValue, _n("tuic_alpn"), translate("QUIC TLS ALPN"))
o.default = "" o.default = "default"
o:value("", translate("Default")) o:value("default", translate("Default"))
o:value("h3") o:value("h3")
o:value("h2") o:value("h2")
o:value("h3,h2") o:value("h3,h2")
@@ -411,7 +408,7 @@ o:depends({ [_n("protocol")] = "trojan" })
o:depends({ [_n("protocol")] = "shadowsocks" }) o:depends({ [_n("protocol")] = "shadowsocks" })
o:depends({ [_n("protocol")] = "anytls" }) o:depends({ [_n("protocol")] = "anytls" })
o = s:option(ListValue, _n("alpn"), translate("alpn")) o = s:option(ListValue, _n("alpn"), translate("ALPN"))
o.default = "default" o.default = "default"
o:value("default", translate("Default")) o:value("default", translate("Default"))
o:value("h3") o:value("h3")
@@ -421,6 +418,7 @@ o:value("http/1.1")
o:value("h2,http/1.1") o:value("h2,http/1.1")
o:value("h3,h2,http/1.1") o:value("h3,h2,http/1.1")
o:depends({ [_n("tls")] = true }) o:depends({ [_n("tls")] = true })
o:depends({ [_n("protocol")] = "hysteria" })
o = s:option(Flag, _n("tls_disable_sni"), translate("Disable SNI"), translate("Do not send server name in ClientHello.")) o = s:option(Flag, _n("tls_disable_sni"), translate("Disable SNI"), translate("Do not send server name in ClientHello."))
o.default = "0" o.default = "0"
@@ -428,14 +426,12 @@ o:depends({ [_n("tls")] = true })
o:depends({ [_n("protocol")] = "hysteria"}) o:depends({ [_n("protocol")] = "hysteria"})
o:depends({ [_n("protocol")] = "tuic" }) o:depends({ [_n("protocol")] = "tuic" })
o:depends({ [_n("protocol")] = "hysteria2" }) o:depends({ [_n("protocol")] = "hysteria2" })
o:depends({ [_n("protocol")] = "shadowsocks" })
o = s:option(Value, _n("tls_serverName"), translate("Domain")) o = s:option(Value, _n("tls_serverName"), translate("Domain"))
o:depends({ [_n("tls")] = true }) o:depends({ [_n("tls")] = true })
o:depends({ [_n("protocol")] = "hysteria"}) o:depends({ [_n("protocol")] = "hysteria"})
o:depends({ [_n("protocol")] = "tuic" }) o:depends({ [_n("protocol")] = "tuic" })
o:depends({ [_n("protocol")] = "hysteria2" }) o:depends({ [_n("protocol")] = "hysteria2" })
o:depends({ [_n("protocol")] = "shadowsocks" })
o = s:option(Flag, _n("tls_allowInsecure"), translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) o = s:option(Flag, _n("tls_allowInsecure"), translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped."))
o.default = "0" o.default = "0"
@@ -443,7 +439,6 @@ o:depends({ [_n("tls")] = true })
o:depends({ [_n("protocol")] = "hysteria"}) o:depends({ [_n("protocol")] = "hysteria"})
o:depends({ [_n("protocol")] = "tuic" }) o:depends({ [_n("protocol")] = "tuic" })
o:depends({ [_n("protocol")] = "hysteria2" }) o:depends({ [_n("protocol")] = "hysteria2" })
o:depends({ [_n("protocol")] = "shadowsocks" })
o = s:option(Flag, _n("ech"), translate("ECH")) o = s:option(Flag, _n("ech"), translate("ECH"))
o.default = "0" o.default = "0"
@@ -120,9 +120,6 @@ if singbox_tags:find("with_quic") then
o = s:option(Flag, _n("hysteria_disable_mtu_discovery"), translate("Disable MTU detection")) o = s:option(Flag, _n("hysteria_disable_mtu_discovery"), translate("Disable MTU detection"))
o:depends({ [_n("protocol")] = "hysteria" }) o:depends({ [_n("protocol")] = "hysteria" })
o = s:option(Value, _n("hysteria_alpn"), translate("QUIC TLS ALPN"))
o:depends({ [_n("protocol")] = "hysteria" })
end end
if singbox_tags:find("with_quic") then if singbox_tags:find("with_quic") then
@@ -143,8 +140,8 @@ if singbox_tags:find("with_quic") then
o:depends({ [_n("protocol")] = "tuic" }) o:depends({ [_n("protocol")] = "tuic" })
o = s:option(ListValue, _n("tuic_alpn"), translate("QUIC TLS ALPN")) o = s:option(ListValue, _n("tuic_alpn"), translate("QUIC TLS ALPN"))
o.default = "" o.default = "default"
o:value("", translate("Default")) o:value("default", translate("Default"))
o:value("h3") o:value("h3")
o:value("h2") o:value("h2")
o:value("h3,h2") o:value("h3,h2")
@@ -266,6 +263,18 @@ if singbox_tags:find("with_utls") then
o:depends({ [_n("reality")] = true }) o:depends({ [_n("reality")] = true })
end end
o = s:option(ListValue, _n("alpn"), translate("ALPN"))
o.default = "default"
o:value("default", translate("Default"))
o:value("h3")
o:value("h2")
o:value("h3,h2")
o:value("http/1.1")
o:value("h2,http/1.1")
o:value("h3,h2,http/1.1")
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
o:depends({ [_n("protocol")] = "hysteria" })
-- [[ TLS部分 ]] -- -- [[ TLS部分 ]] --
o = s:option(FileUpload, _n("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") o = s:option(FileUpload, _n("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
@@ -154,6 +154,9 @@ function gen_outbound(flag, node, tag, proxy_table)
} }
local tls = nil local tls = nil
if node.protocol == "hysteria" or node.protocol == "hysteria2" or node.protocol == "tuic" then
node.tls = "1"
end
if node.tls == "1" then if node.tls == "1" then
local alpn = nil local alpn = nil
if node.alpn and node.alpn ~= "default" then if node.alpn and node.alpn ~= "default" then
@@ -403,20 +406,7 @@ function gen_outbound(flag, node, tag, proxy_table)
recv_window_conn = tonumber(node.hysteria_recv_window_conn), recv_window_conn = tonumber(node.hysteria_recv_window_conn),
recv_window = tonumber(node.hysteria_recv_window), recv_window = tonumber(node.hysteria_recv_window),
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false, disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false,
tls = { tls = tls
enabled = true,
server_name = node.tls_serverName,
insecure = (node.tls_allowInsecure == "1") and true or false,
fragment = fragment,
record_fragment = record_fragment,
alpn = (node.hysteria_alpn and node.hysteria_alpn ~= "") and {
node.hysteria_alpn
} or nil,
ech = (node.ech == "1") and {
enabled = true,
config = node.ech_config and split(node.ech_config:gsub("\\n", "\n"), "\n") or {}
} or nil
}
} }
end end
@@ -437,27 +427,15 @@ function gen_outbound(flag, node, tag, proxy_table)
udp_over_stream = false, udp_over_stream = false,
zero_rtt_handshake = (node.tuic_zero_rtt_handshake == "1") and true or false, zero_rtt_handshake = (node.tuic_zero_rtt_handshake == "1") and true or false,
heartbeat = (tonumber(node.tuic_heartbeat) or 3) .. "s", heartbeat = (tonumber(node.tuic_heartbeat) or 3) .. "s",
tls = { tls = tls
enabled = true,
disable_sni = (node.tls_disable_sni == "1") and true or false,
server_name = node.tls_serverName,
insecure = (node.tls_allowInsecure == "1") and true or false,
fragment = fragment,
record_fragment = record_fragment,
alpn = (node.tuic_alpn and node.tuic_alpn ~= "") and (function()
local alpn = {}
string.gsub(node.tuic_alpn, '[^,]+', function(w)
table.insert(alpn, w)
end)
if #alpn > 0 then return alpn end
return nil
end)() or nil,
ech = (node.ech == "1") and {
enabled = true,
config = node.ech_config and split(node.ech_config:gsub("\\n", "\n"), "\n") or {}
} or nil
}
} }
if node.tuic_alpn and node.tuic_alpn ~= "default" then
local alpn = {}
string.gsub(node.tuic_alpn, '[^,]+', function(w)
table.insert(alpn, w)
end)
if #alpn > 0 then protocol_table.tls.alpn = alpn end
end
end end
if node.protocol == "hysteria2" then if node.protocol == "hysteria2" then
@@ -484,17 +462,7 @@ function gen_outbound(flag, node, tag, proxy_table)
password = node.hysteria2_obfs_password password = node.hysteria2_obfs_password
} or nil, } or nil,
password = node.hysteria2_auth_password or nil, password = node.hysteria2_auth_password or nil,
tls = { tls = tls
enabled = true,
server_name = node.tls_serverName,
insecure = (node.tls_allowInsecure == "1") and true or false,
fragment = fragment,
record_fragment = record_fragment,
ech = (node.ech == "1") and {
enabled = true,
config = node.ech_config and split(node.ech_config:gsub("\\n", "\n"), "\n") or {}
} or nil
}
} }
end end
@@ -538,6 +506,14 @@ function gen_config_server(node)
enabled = true, enabled = true,
certificate_path = node.tls_certificateFile, certificate_path = node.tls_certificateFile,
key_path = node.tls_keyFile, key_path = node.tls_keyFile,
alpn = (node.alpn and node.alpn ~= "default") and (function()
local alpn = {}
string.gsub(node.alpn, '[^,]+', function(w)
table.insert(alpn, w)
end)
if #alpn > 0 then return alpn end
return nil
end)() or nil
} }
if node.tls == "1" and node.reality == "1" then if node.tls == "1" and node.reality == "1" then
@@ -741,9 +717,6 @@ function gen_config_server(node)
end end
if node.protocol == "hysteria" then if node.protocol == "hysteria" then
tls.alpn = (node.hysteria_alpn and node.hysteria_alpn ~= "") and {
node.hysteria_alpn
} or nil
protocol_table = { protocol_table = {
up = node.hysteria_up_mbps .. " Mbps", up = node.hysteria_up_mbps .. " Mbps",
down = node.hysteria_down_mbps .. " Mbps", down = node.hysteria_down_mbps .. " Mbps",
@@ -775,7 +748,7 @@ function gen_config_server(node)
password = node.password password = node.password
} }
end end
tls.alpn = (node.tuic_alpn and node.tuic_alpn ~= "") and (function() tls.alpn = (node.tuic_alpn and node.tuic_alpn ~= "default") and (function()
local alpn = {} local alpn = {}
string.gsub(node.tuic_alpn, '[^,]+', function(w) string.gsub(node.tuic_alpn, '[^,]+', function(w)
table.insert(alpn, w) table.insert(alpn, w)
@@ -1348,7 +1348,7 @@ local function processData(szType, content, add_mode, group)
else else
result.tls_allowInsecure = allowInsecure_default and "1" or "0" result.tls_allowInsecure = allowInsecure_default and "1" or "0"
end end
result.hysteria_alpn = params.alpn result.alpn = params.alpn
result.hysteria_up_mbps = params.upmbps result.hysteria_up_mbps = params.upmbps
result.hysteria_down_mbps = params.downmbps result.hysteria_down_mbps = params.downmbps
result.hysteria_hop = params.mport result.hysteria_hop = params.mport
@@ -8,6 +8,7 @@
const callGetStatus = rpc.declare({ object: 'tailscale', method: 'get_status' }); const callGetStatus = rpc.declare({ object: 'tailscale', method: 'get_status' });
const callGetSettings = rpc.declare({ object: 'tailscale', method: 'get_settings' }); const callGetSettings = rpc.declare({ object: 'tailscale', method: 'get_settings' });
const callSetSettings = rpc.declare({ object: 'tailscale', method: 'set_settings', params: ['form_data'] });
const callDoLogin = rpc.declare({ object: 'tailscale', method: 'do_login', params: ['form_data'] }); const callDoLogin = rpc.declare({ object: 'tailscale', method: 'do_login', params: ['form_data'] });
const callDoLogout = rpc.declare({ object: 'tailscale', method: 'do_logout' }); const callDoLogout = rpc.declare({ object: 'tailscale', method: 'do_logout' });
const callGetSubroutes = rpc.declare({ object: 'tailscale', method: 'get_subroutes' }); const callGetSubroutes = rpc.declare({ object: 'tailscale', method: 'get_subroutes' });
@@ -23,8 +24,7 @@ const tailscaleSettingsConf = [
[form.Flag, 'nosnat', _('Disable SNAT'), _('Disable Source NAT (SNAT) for traffic to advertised routes. Most users should leave this unchecked.'), { rmempty: false }], [form.Flag, 'nosnat', _('Disable SNAT'), _('Disable Source NAT (SNAT) for traffic to advertised routes. Most users should leave this unchecked.'), { rmempty: false }],
[form.Flag, 'shields_up', _('Shields Up'), _('When enabled, blocks all inbound connections from the Tailscale network.'), { rmempty: false }], [form.Flag, 'shields_up', _('Shields Up'), _('When enabled, blocks all inbound connections from the Tailscale network.'), { rmempty: false }],
[form.Flag, 'ssh', _('Enable Tailscale SSH'), _('Allow connecting to this device through the SSH function of Tailscale.'), { rmempty: false }], [form.Flag, 'ssh', _('Enable Tailscale SSH'), _('Allow connecting to this device through the SSH function of Tailscale.'), { rmempty: false }],
[form.Flag, 'disable_magic_dns', _('Disable MagicDNS'), _('Use system DNS instead of MagicDNS.'), { rmempty: false }], [form.Flag, 'disable_magic_dns', _('Disable MagicDNS'), _('Use system DNS instead of MagicDNS.'), { rmempty: false }]
[form.Flag, 'enable_relay', _('Enable Peer Relay'), _('Enable this device as a Peer Relay server. Requires a public IP and an UDP port open on the router.'), { rmempty: false }]
]; ];
const accountConf = []; // dynamic created in render function const accountConf = []; // dynamic created in render function
@@ -235,66 +235,69 @@ function renderStatus(status) {
E('tr', {}, statusData.map(item => E('td', { 'style': 'padding-right: 20px;' }, item.value))) E('tr', {}, statusData.map(item => E('td', { 'style': 'padding-right: 20px;' }, item.value)))
]); ]);
return statusTable; // --- Part 3: Render the Peers/Network Devices table ---
}
function renderDevices(status) {
if (!status || !status.hasOwnProperty('status')) {
return E('em', {}, _('Collecting data ...'));
}
if (status.status != 'running') {
return E('em', {}, _('Tailscale status error'));
}
if (Object.keys(regionCodeMap).length === 0) {
initializeRegionMap();
}
const peers = status.peers; const peers = status.peers;
let peersContent;
if (!peers || Object.keys(peers).length === 0) { if (!peers || Object.keys(peers).length === 0) {
return E('p', {}, _('No peer devices found.')); // Display a message if no peers are found.
peersContent = E('p', {}, _('No peer devices found.'));
} else {
// Define headers for the peers table.
const peerTableHeaders = [
{ text: _('Status'), style: 'width: 80px;' },
{ text: _('Hostname') },
{ text: _('Tailscale IP') },
{ text: _('OS') },
{ text: _('Connection Info') },
{ text: _('RX') },
{ text: _('TX') },
{ text: _('Last Seen') }
];
// Build the peers table.
peersContent = E('table', { 'class': 'cbi-table' }, [
// Table Header Row
E('tr', { 'class': 'cbi-table-header' }, peerTableHeaders.map(header => {
let th_style = 'padding-right: 20px; text-align: left;';
if (header.style) {
th_style += header.style;
}
return E('th', { 'class': 'cbi-table-cell', 'style': th_style }, header.text);
})),
// Table Body Rows (one for each peer)
...Object.entries(peers).map(([peerid, peer]) => {
const td_style = 'padding-right: 20px;';
return E('tr', { 'class': 'cbi-rowstyle-1' }, [
E('td', { 'class': 'cbi-value-field', 'style': td_style },
E('span', {
'style': `color:${peer.exit_node ? 'blue' : (peer.online ? 'green' : 'gray')};`,
'title': (peer.exit_node ? _('Exit Node') + ' ' : '') + (peer.online ? _('Online') : _('Offline'))
}, peer.online ? '●' : '○')
),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, E('strong', {}, peer.hostname + (peer.exit_node_option ? ' (ExNode)' : ''))),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, peer.ip || 'N/A'),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, peer.ostype || 'N/A'),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatConnectionInfo(peer.linkadress || '-')),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatBytes(peer.rx)),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatBytes(peer.tx)),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatLastSeen(peer.lastseen))
]);
})
]);
} }
const peerTableHeaders = [ // Combine all parts into a single DocumentFragment.
{ text: _('Status'), style: 'width: 80px;' }, // Using E() without a tag name creates a fragment, which is perfect for grouping elements.
{ text: _('Hostname') }, return E([
{ text: _('Tailscale IP') }, statusTable,
{ text: _('OS') }, E('div', { 'style': 'margin-top: 25px;' }, [
{ text: _('Connection Info') }, E('h4', {}, _('Network Devices')),
{ text: _('RX') }, peersContent
{ text: _('TX') }, ])
{ text: _('Last Seen') }
];
return E('table', { 'class': 'cbi-table' }, [
E('tr', { 'class': 'cbi-table-header' }, peerTableHeaders.map(header => {
let th_style = 'padding-right: 20px; text-align: left;';
if (header.style) {
th_style += header.style;
}
return E('th', { 'class': 'cbi-table-cell', 'style': th_style }, header.text);
})),
...Object.entries(peers).map(([peerid, peer]) => {
const td_style = 'padding-right: 20px;';
return E('tr', { 'class': 'cbi-rowstyle-1' }, [
E('td', { 'class': 'cbi-value-field', 'style': td_style },
E('span', {
'style': `color:${peer.exit_node ? 'blue' : (peer.online ? 'green' : 'gray')};`,
'title': (peer.exit_node ? _('Exit Node') + ' ' : '') + (peer.online ? _('Online') : _('Offline'))
}, peer.online ? '●' : '○')
),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, E('strong', {}, peer.hostname + (peer.exit_node_option ? ' (ExNode)' : ''))),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, peer.ip || 'N/A'),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, peer.ostype || 'N/A'),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatConnectionInfo(peer.linkadress || '-')),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatBytes(peer.rx)),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatBytes(peer.tx)),
E('td', { 'class': 'cbi-value-field', 'style': td_style }, formatLastSeen(peer.lastseen))
]);
})
]); ]);
} }
@@ -350,11 +353,6 @@ return view.extend({
view.replaceChildren(content); view.replaceChildren(content);
} }
const devicesView = document.getElementById("tailscale_devices_display");
if (devicesView) {
devicesView.replaceChildren(renderDevices(res));
}
// login button only available when logged out // login button only available when logged out
const login_btn=document.getElementsByClassName('cbi-button cbi-button-apply')[0]; const login_btn=document.getElementsByClassName('cbi-button cbi-button-apply')[0];
if(login_btn) { login_btn.disabled=(res.status != 'logout'); } if(login_btn) { login_btn.disabled=(res.status != 'logout'); }
@@ -367,7 +365,7 @@ return view.extend({
} }
// Bind settings to the 'settings' section of uci // Bind settings to the 'settings' section of uci
s = map.section(form.NamedSection, 'settings', 'settings', null); s = map.section(form.NamedSection, 'settings', 'settings', _('Settings'));
s.dynamic = true; s.dynamic = true;
// Create the "General Settings" tab and apply tailscaleSettingsConf // Create the "General Settings" tab and apply tailscaleSettingsConf
@@ -375,14 +373,6 @@ return view.extend({
defTabOpts(s, 'general', tailscaleSettingsConf, { optional: false }); defTabOpts(s, 'general', tailscaleSettingsConf, { optional: false });
const relayPort = s.taboption('general', form.Value, 'relay_server_port', _('Peer Relay Port'),
_('UDP port for the Peer Relay service. Open this port on your router firewall/NAT.')
);
relayPort.datatype = 'port';
relayPort.placeholder = '40000';
relayPort.rmempty = false;
relayPort.depends('enable_relay', '1');
const en = s.taboption('general', form.ListValue, 'exit_node', _('Exit Node'), _('Select an exit node from the list. If enabled, Allow LAN Access is enabled implicitly.')); const en = s.taboption('general', form.ListValue, 'exit_node', _('Exit Node'), _('Select an exit node from the list. If enabled, Allow LAN Access is enabled implicitly.'));
en.value('', _('None')); en.value('', _('None'));
if (status.peers) { if (status.peers) {
@@ -458,7 +448,7 @@ return view.extend({
const customLoginUrl = s.taboption('account', form.Value, 'custom_login_url', const customLoginUrl = s.taboption('account', form.Value, 'custom_login_url',
_('Custom Login Server'), _('Custom Login Server'),
_('Optional: Specify a custom control server URL (e.g., a Headscale instance, https://example.com).') _('Optional: Specify a custom control server URL (e.g., a Headscale instance, %s).'.format('https://example.com'))
+'<br>'+_('Leave blank for default Tailscale control plane.') +'<br>'+_('Leave blank for default Tailscale control plane.')
); );
customLoginUrl.placeholder = ''; customLoginUrl.placeholder = '';
@@ -551,12 +541,6 @@ return view.extend({
ui.showModal(_('Confirm Logout'), confirmationContent); ui.showModal(_('Confirm Logout'), confirmationContent);
}; };
s.tab('devices', _('Devices List'));
const devicesSection = s.taboption('devices', form.DummyValue, '_devices');
devicesSection.render = function () {
return E('div', { 'id': 'tailscale_devices_display', 'class': 'cbi-value' }, renderDevices(status));
};
// Create the "Daemon Settings" tab and apply daemonConf // Create the "Daemon Settings" tab and apply daemonConf
//s.tab('daemon', _('Daemon Settings')); //s.tab('daemon', _('Daemon Settings'));
//defTabOpts(s, 'daemon', daemonConf, { optional: false }); //defTabOpts(s, 'daemon', daemonConf, { optional: false });
@@ -564,12 +548,40 @@ return view.extend({
return map.render(); return map.render();
}, },
// The handleSaveApply function saves UCI changes then applies them via the // The handleSaveApply function is executed after clicking "Save & Apply"
// standard OpenWrt apply mechanism, which triggers /etc/init.d/tailscale-settings handleSaveApply(ev) {
// and provides automatic rollback protection if the device becomes unreachable.
handleSaveApply(ev, mode) {
return map.save().then(function () { return map.save().then(function () {
return ui.changes.apply(mode == '0'); const data = map.data.get('tailscale', 'settings');
// fix empty value issue
if(!data.advertise_exit_node) data.advertise_exit_node = '';
if(!data.advertise_routes) data.advertise_routes = '';
if(!data.exit_node) data.exit_node = '';
if(!data.custom_login_url) data.custom_login_url = '';
if(!data.custom_login_AuthKey) data.custom_login_AuthKey = '';
ui.showModal(_('Applying changes...'), E('em', {}, _('Please wait.')));
return callSetSettings(data).then(function (response) {
if (response.success) {
ui.hideModal();
setTimeout(function() {
ui.addTimeLimitedNotification(null, [ E('p', _('Tailscale settings applied successfully.')) ], 5000, 'info');
}, 1000);
try {
L.ui.changes.revert();
} catch (error) {
ui.addTimeLimitedNotification(null, [ E('p', _('Error saving settings: %s').format(error || _('Unknown error'))) ], 7000, 'error');
}
} else {
ui.hideModal();
ui.addTimeLimitedNotification(null, [ E('p', _('Error applying settings: %s').format(response.error || _('Unknown error'))) ], 7000, 'error');
}
});
}).catch(function(err) {
ui.hideModal();
//console.error('Save failed:', err);
ui.addTimeLimitedNotification(null, [ E('p', _('Failed to save settings: %s').format(err.message)) ], 7000, 'error');
}); });
}, },
@@ -1,511 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.8\n"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:34
msgid "(Experimental) Reduce Memory Usage"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:442
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:444
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "Accept Routes"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
msgid "Account Settings"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Advertise Exit Node"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Advertise Routes"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid ""
"Advertise subnet routes behind this device. Select from the detected subnets "
"below or enter custom routes (comma-separated)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "Allow LAN Access"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "Allow accepting routes announced by other nodes."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr ""
#: applications/luci-app-tailscale-community/root/usr/share/rpcd/acl.d/luci-app-tailscale-community.json:3
msgid "Allow user access to tailscale"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:525
msgid "Are you sure you want to log out?"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:418
msgid "Auto Configure Firewall"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:532
msgid "Cancel"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:476
msgid "Click to Log out account on this device."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
msgid "Click to get a login URL for this device."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:166
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:243
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:365
msgid "Collecting data ..."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:551
msgid "Confirm Logout"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:264
msgid "Connection Info"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488
msgid ""
"Could not open a new tab. Please check if your browser or an extension "
"blocked the pop-up."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "Custom Login Server"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:468
msgid "Custom Login Server Auth Key"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Declare this device as an Exit Node."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:554
msgid "Devices List"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Disable MagicDNS"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid "Disable SNAT"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most users "
"should leave this unchecked."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226
msgid "Disabled"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:477
msgid "Disconnect from Tailscale and expire current node key."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid "Enable Peer Relay"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Enable Tailscale SSH"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid "Enable Web Interface"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and an UDP "
"port open on the router."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226
msgid "Enabled"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:34
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice some "
"performance (set GOGC=10)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "Error"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
msgid "Error caching DERP region map: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150
msgid "Error fetching DERP region map: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120
msgid "Error reading cached DERP region map: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:419
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit Node "
"features."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386
msgid "Exit Node"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid ""
"Expose a web interface on port 5252 for managing this node over Tailscale."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:430
msgid "Failed to configure firewall: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "Failed to get login URL. You may close this tab."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519
msgid "Failed to get login URL: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Failed to get login URL: Invalid response from server."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18
msgid "Firewall Mode"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:427
msgid "Firewall configuration applied."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:374
msgid "General Settings"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:261
msgid "Hostname"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:437
msgid "How to enable Site-to-Site?"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:456
msgid ""
"If the timeout is displayed, you can refresh the page and click Login again."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:470
msgid ""
"If you are using custom login server but not providing an Auth Key, will "
"redirect to the login page without pre-filling the key."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:90
msgid "Invalid Date"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:420
msgid ""
"It automatically creates the tailscale interface, sets up firewall zones for "
"LAN <-> Tailscale forwarding,"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Just now"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:205
msgid "LOGGED OUT"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:267
msgid "Last Seen"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:462
msgid "Leave blank for default Tailscale control plane."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538
msgid "Logging out..."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
msgid "Login"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:475
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:548
msgid "Logout"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545
msgid "Logout failed: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "N/A"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:216
msgid "NOT RUNNING"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:256
msgid "No peer devices found."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:387
msgid "None"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:88
msgid "Now"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:263
msgid "OS"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286
msgid "Offline"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286
msgid "Online"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:461
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale instance, "
"https://example.com)."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:469
msgid ""
"Optional: Specify an authentication key for the custom control server. Leave "
"blank if not required."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:378
msgid "Peer Relay Port"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:207
msgid "Please use the login button in the settings below to authenticate."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538
msgid "Please wait."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:224
msgid "RUNNING"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:265
msgid "RX"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
msgid "Requesting Login URL..."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:495
msgid "Requesting Tailscale login URL... Please wait."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is enabled "
"implicitly."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18
msgid ""
"Select the firewall backend for Tailscale to use. Requires service restart "
"to take effect."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:195
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:224
msgid "Service Status"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid "Shields Up"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:260
msgid "Status"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:542
msgid "Successfully logged out."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:196
msgid "TAILSCALE NOT FOUND"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226
msgid "TUN Mode"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:266
msgid "TX"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:229
msgid "Tailnet Name"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339
#: applications/luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:3
msgid "Tailscale"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:172
msgid "Tailscale Health Check: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:262
msgid "Tailscale IP"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:227
msgid "Tailscale IPv4"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:228
msgid "Tailscale IPv6"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494
msgid "Tailscale Login"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your devices "
"securely. This configuration page allows you to manage Tailscale settings on "
"your OpenWrt device."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:247
msgid "Tailscale status error"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:496
msgid "This can take up to 30 seconds."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:526
msgid ""
"This will disconnect this device from your Tailnet and require you to re-"
"authenticate."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:379
msgid ""
"UDP port for the Peer Relay service. Open this port on your router firewall/"
"NAT."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545
msgid "Unknown error"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Use system DNS instead of MagicDNS."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Version"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid ""
"When enabled, blocks all inbound connections from the Tailscale network."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "When using the exit node, access to the local LAN is allowed."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:445
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:96
msgid "ago"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:421
msgid ""
"and enables Masquerading and MSS Clamping (MTU fix) to ensure stable "
"connections."
msgstr ""
@@ -5,51 +5,51 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "(Experimental) Reduce Memory Usage" msgid "(Experimental) Reduce Memory Usage"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:442 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:432
msgid "1. Select \"Accept Routes\" (to access remote devices)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:433
msgid "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:444 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:434
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Accept Routes" msgid "Accept Routes"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:441
msgid "Account Settings" msgid "Account Settings"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "Advertise Exit Node" msgid "Advertise Exit Node"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
msgid "Advertise Routes" msgid "Advertise Routes"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
msgid "" msgid ""
"Advertise subnet routes behind this device. Select from the detected subnets " "Advertise subnet routes behind this device. Select from the detected subnets "
"below or enter custom routes (comma-separated)." "below or enter custom routes (comma-separated)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid "Allow LAN Access" msgid "Allow LAN Access"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Allow accepting routes announced by other nodes." msgid "Allow accepting routes announced by other nodes."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Allow connecting to this device through the SSH function of Tailscale." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "" msgstr ""
@@ -57,71 +57,70 @@ msgstr ""
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:525 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:563
msgid "Applying changes..."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Are you sure you want to log out?" msgid "Are you sure you want to log out?"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:418 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:408
msgid "Auto Configure Firewall" msgid "Auto Configure Firewall"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:532 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:522
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:476 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:466
msgid "Click to Log out account on this device." msgid "Click to Log out account on this device."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:445
msgid "Click to get a login URL for this device." msgid "Click to get a login URL for this device."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:166 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:166
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:243 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:363
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:365
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:551 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:541
msgid "Confirm Logout" msgid "Confirm Logout"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:264 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:253
msgid "Connection Info" msgid "Connection Info"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:478
msgid "" msgid ""
"Could not open a new tab. Please check if your browser or an extension " "Could not open a new tab. Please check if your browser or an extension "
"blocked the pop-up." "blocked the pop-up."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
msgid "Custom Login Server" msgid "Custom Login Server"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:468 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:458
msgid "Custom Login Server Auth Key" msgid "Custom Login Server Auth Key"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "Declare this device as an Exit Node." msgid "Declare this device as an Exit Node."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:554 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid "Devices List"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Disable MagicDNS" msgid "Disable MagicDNS"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid "Disable SNAT" msgid "Disable SNAT"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most users " "Disable Source NAT (SNAT) for traffic to advertised routes. Most users "
"should leave this unchecked." "should leave this unchecked."
@@ -131,28 +130,18 @@ msgstr ""
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:477 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:467
msgid "Disconnect from Tailscale and expire current node key." msgid "Disconnect from Tailscale and expire current node key."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Enable Peer Relay"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Enable Tailscale SSH" msgid "Enable Tailscale SSH"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid "Enable Web Interface" msgid "Enable Web Interface"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and an UDP "
"port open on the router."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226
msgid "Enabled" msgid "Enabled"
msgstr "" msgstr ""
@@ -163,10 +152,14 @@ msgid ""
"performance (set GOGC=10)." "performance (set GOGC=10)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:503
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:578
msgid "Error applying settings: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
msgid "Error caching DERP region map: %s" msgid "Error caching DERP region map: %s"
msgstr "" msgstr ""
@@ -179,64 +172,72 @@ msgstr ""
msgid "Error reading cached DERP region map: %s" msgid "Error reading cached DERP region map: %s"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:419 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:574
msgid "Error saving settings: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit Node " "Essential configuration for Subnet Routing (Site-to-Site) and Exit Node "
"features." "features."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:376
msgid "Exit Node" msgid "Exit Node"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid "" msgid ""
"Expose a web interface on port 5252 for managing this node over Tailscale." "Expose a web interface on port 5252 for managing this node over Tailscale."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:430 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:420
msgid "Failed to configure firewall: %s" msgid "Failed to configure firewall: %s"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
msgid "Failed to get login URL. You may close this tab." msgid "Failed to get login URL. You may close this tab."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:505
msgid "Failed to get login URL: Invalid response from server." msgid "Failed to get login URL: Invalid response from server."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:584
msgid "Failed to save settings: %s"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "Firewall Mode" msgid "Firewall Mode"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:427 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:417
msgid "Firewall configuration applied." msgid "Firewall configuration applied."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:374 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:372
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:261 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:250
msgid "Hostname" msgid "Hostname"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:437 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:427
msgid "How to enable Site-to-Site?" msgid "How to enable Site-to-Site?"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:456 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:446
msgid "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login again." "If the timeout is displayed, you can refresh the page and click Login again."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:470 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "" msgid ""
"If you are using custom login server but not providing an Auth Key, will " "If you are using custom login server but not providing an Auth Key, will "
"redirect to the login page without pre-filling the key." "redirect to the login page without pre-filling the key."
@@ -246,7 +247,7 @@ msgstr ""
msgid "Invalid Date" msgid "Invalid Date"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:420 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "" msgid ""
"It automatically creates the tailscale interface, sets up firewall zones for " "It automatically creates the tailscale interface, sets up firewall zones for "
"LAN <-> Tailscale forwarding," "LAN <-> Tailscale forwarding,"
@@ -260,28 +261,28 @@ msgstr ""
msgid "LOGGED OUT" msgid "LOGGED OUT"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:267 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:256
msgid "Last Seen" msgid "Last Seen"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:462 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
msgid "Leave blank for default Tailscale control plane." msgid "Leave blank for default Tailscale control plane."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:528
msgid "Logging out..." msgid "Logging out..."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:444
msgid "Login" msgid "Login"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:475 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:465
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:548 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:535
msgid "Logout failed: %s" msgid "Logout failed: %s"
msgstr "" msgstr ""
@@ -293,11 +294,15 @@ msgstr ""
msgid "NOT RUNNING" msgid "NOT RUNNING"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:256 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:298
msgid "Network Devices"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
msgid "No peer devices found." msgid "No peer devices found."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:387 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:377
msgid "None" msgid "None"
msgstr "" msgstr ""
@@ -305,41 +310,38 @@ msgstr ""
msgid "Now" msgid "Now"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:263 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:252
msgid "OS" msgid "OS"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Online" msgid "Online"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:461 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
msgid "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale instance, " "Optional: Specify a custom control server URL (e.g., a Headscale instance, "
"https://example.com)." "%s)."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:469 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:459
msgid "" msgid ""
"Optional: Specify an authentication key for the custom control server. Leave " "Optional: Specify an authentication key for the custom control server. Leave "
"blank if not required." "blank if not required."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:378
msgid "Peer Relay Port"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:207 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:207
msgid "Please use the login button in the settings below to authenticate." msgid "Please use the login button in the settings below to authenticate."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:528
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:563
msgid "Please wait." msgid "Please wait."
msgstr "" msgstr ""
@@ -347,26 +349,26 @@ msgstr ""
msgid "RUNNING" msgid "RUNNING"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:265 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "RX" msgid "RX"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:495 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:485
msgid "Requesting Tailscale login URL... Please wait." msgid "Requesting Tailscale login URL... Please wait."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:376
msgid "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is enabled " "Select an exit node from the list. If enabled, Allow LAN Access is enabled "
"implicitly." "implicitly."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service restart " "Select the firewall backend for Tailscale to use. Requires service restart "
"to take effect." "to take effect."
@@ -379,15 +381,19 @@ msgstr ""
msgid "Service Status" msgid "Service Status"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
msgid "Settings"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Shields Up" msgid "Shields Up"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:260 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:249
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:542 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:532
msgid "Successfully logged out." msgid "Successfully logged out."
msgstr "" msgstr ""
@@ -399,7 +405,7 @@ msgstr ""
msgid "TUN Mode" msgid "TUN Mode"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:266 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:255
msgid "TX" msgid "TX"
msgstr "" msgstr ""
@@ -407,7 +413,7 @@ msgstr ""
msgid "Tailnet Name" msgid "Tailnet Name"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:342
#: applications/luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:3 #: applications/luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:3
msgid "Tailscale" msgid "Tailscale"
msgstr "" msgstr ""
@@ -416,7 +422,7 @@ msgstr ""
msgid "Tailscale Health Check: %s" msgid "Tailscale Health Check: %s"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:262 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:251
msgid "Tailscale IP" msgid "Tailscale IP"
msgstr "" msgstr ""
@@ -428,46 +434,42 @@ msgstr ""
msgid "Tailscale IPv6" msgid "Tailscale IPv6"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Tailscale Login" msgid "Tailscale Login"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:342
msgid "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your devices " "Tailscale is a mesh VPN solution that makes it easy to connect your devices "
"securely. This configuration page allows you to manage Tailscale settings on " "securely. This configuration page allows you to manage Tailscale settings on "
"your OpenWrt device." "your OpenWrt device."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:247 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:569
msgid "Tailscale status error" msgid "Tailscale settings applied successfully."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:496 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:486
msgid "This can take up to 30 seconds." msgid "This can take up to 30 seconds."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:526 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:516
msgid "" msgid ""
"This will disconnect this device from your Tailnet and require you to re-" "This will disconnect this device from your Tailnet and require you to re-"
"authenticate." "authenticate."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:379
msgid ""
"UDP port for the Peer Relay service. Open this port on your router firewall/"
"NAT."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:535
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:574
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:578
msgid "Unknown error" msgid "Unknown error"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid "Use system DNS instead of MagicDNS." msgid "Use system DNS instead of MagicDNS."
msgstr "" msgstr ""
@@ -475,16 +477,16 @@ msgstr ""
msgid "Version" msgid "Version"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale network." "When enabled, blocks all inbound connections from the Tailscale network."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid "When using the exit node, access to the local LAN is allowed." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:445 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:435
msgid "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
@@ -494,7 +496,7 @@ msgstr ""
msgid "ago" msgid "ago"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:421 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "" msgid ""
"and enables Masquerading and MSS Clamping (MTU fix) to ensure stable " "and enables Masquerading and MSS Clamping (MTU fix) to ensure stable "
"connections." "connections."
@@ -5,52 +5,52 @@ msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "(Experimental) Reduce Memory Usage" msgid "(Experimental) Reduce Memory Usage"
msgstr "(实验性) 减少内存使用" msgstr "(实验性) 减少内存使用"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:442 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:432
msgid "1. Select \"Accept Routes\" (to access remote devices)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. 勾选 接受路由 (接受远程设备访问)。" msgstr "1. 勾选 接受路由 (接受远程设备访问)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:433
msgid "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
msgstr "2. 在 通告路由 选择本设备的局域网段 (让远程设备能访问你)。" msgstr "2. 在 通告路由 选择本设备的局域网段 (让远程设备能访问你)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:444 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:434
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "3. 点击 自动配置防火墙 (打通防火墙转发)。" msgstr "3. 点击 自动配置防火墙 (打通防火墙转发)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Accept Routes" msgid "Accept Routes"
msgstr "接受路由" msgstr "接受路由"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:441
msgid "Account Settings" msgid "Account Settings"
msgstr "账户设置" msgstr "账户设置"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "Advertise Exit Node" msgid "Advertise Exit Node"
msgstr "通告出口节点" msgstr "通告出口节点"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
msgid "Advertise Routes" msgid "Advertise Routes"
msgstr "通告路由" msgstr "通告路由"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
msgid "" msgid ""
"Advertise subnet routes behind this device. Select from the detected subnets " "Advertise subnet routes behind this device. Select from the detected subnets "
"below or enter custom routes (comma-separated)." "below or enter custom routes (comma-separated)."
msgstr "" msgstr ""
"通告此设备后的子网路由。从下面的子网中选择,或输入自定义路由 (逗号分隔)。" "通告此设备后的子网路由。从下面的子网中选择,或输入自定义路由 (逗号分隔)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid "Allow LAN Access" msgid "Allow LAN Access"
msgstr "允许局域网访问" msgstr "允许局域网访问"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20
msgid "Allow accepting routes announced by other nodes." msgid "Allow accepting routes announced by other nodes."
msgstr "允许接受由其他节点通告的路由。" msgstr "允许接受由其他节点通告的路由。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Allow connecting to this device through the SSH function of Tailscale." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。" msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
@@ -58,71 +58,70 @@ msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "允许用户访问 Tailscale" msgstr "允许用户访问 Tailscale"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:525 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:563
msgid "Applying changes..."
msgstr "正在应用更改..."
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Are you sure you want to log out?" msgid "Are you sure you want to log out?"
msgstr "您确定要登出吗?" msgstr "您确定要登出吗?"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:418 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:408
msgid "Auto Configure Firewall" msgid "Auto Configure Firewall"
msgstr "自动配置防火墙" msgstr "自动配置防火墙"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:532 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:522
msgid "Cancel" msgid "Cancel"
msgstr "取消" msgstr "取消"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:476 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:466
msgid "Click to Log out account on this device." msgid "Click to Log out account on this device."
msgstr "点击以登出此设备上的账户。" msgstr "点击以登出此设备上的账户。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:445
msgid "Click to get a login URL for this device." msgid "Click to get a login URL for this device."
msgstr "点击获取此设备的登录 URL。" msgstr "点击获取此设备的登录 URL。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:166 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:166
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:243 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:363
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:365
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "正在收集数据..." msgstr "正在收集数据..."
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:551 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:541
msgid "Confirm Logout" msgid "Confirm Logout"
msgstr "确认登出" msgstr "确认登出"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:264 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:253
msgid "Connection Info" msgid "Connection Info"
msgstr "连接信息" msgstr "连接信息"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:478
msgid "" msgid ""
"Could not open a new tab. Please check if your browser or an extension " "Could not open a new tab. Please check if your browser or an extension "
"blocked the pop-up." "blocked the pop-up."
msgstr "无法打开新标签页。请检查您的浏览器或扩展程序是否阻止了弹出窗口。" msgstr "无法打开新标签页。请检查您的浏览器或扩展程序是否阻止了弹出窗口。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
msgid "Custom Login Server" msgid "Custom Login Server"
msgstr "自定义登录服务器" msgstr "自定义登录服务器"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:468 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:458
msgid "Custom Login Server Auth Key" msgid "Custom Login Server Auth Key"
msgstr "自定义登录服务器认证密钥" msgstr "自定义登录服务器认证密钥"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:20 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21
msgid "Declare this device as an Exit Node." msgid "Declare this device as an Exit Node."
msgstr "将此设备声明为出口节点。" msgstr "将此设备声明为出口节点。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:554 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid "Devices List"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Disable MagicDNS" msgid "Disable MagicDNS"
msgstr "禁用 MagicDNS" msgstr "禁用 MagicDNS"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid "Disable SNAT" msgid "Disable SNAT"
msgstr "禁用 SNAT" msgstr "禁用 SNAT"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24
msgid "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most users " "Disable Source NAT (SNAT) for traffic to advertised routes. Most users "
"should leave this unchecked." "should leave this unchecked."
@@ -132,28 +131,18 @@ msgstr "为通告路由的流量禁用源地址转换 (SNAT)。大多数用户
msgid "Disabled" msgid "Disabled"
msgstr "已禁用" msgstr "已禁用"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:477 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:467
msgid "Disconnect from Tailscale and expire current node key." msgid "Disconnect from Tailscale and expire current node key."
msgstr "从 Tailscale 断开连接并使当前节点密钥过期。" msgstr "从 Tailscale 断开连接并使当前节点密钥过期。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26
msgid "Enable Peer Relay"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Enable Tailscale SSH" msgid "Enable Tailscale SSH"
msgstr "启用 Tailscale SSH" msgstr "启用 Tailscale SSH"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid "Enable Web Interface" msgid "Enable Web Interface"
msgstr "启用 Web 界面" msgstr "启用 Web 界面"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and an UDP "
"port open on the router."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:226
msgid "Enabled" msgid "Enabled"
msgstr "已启用" msgstr "已启用"
@@ -164,10 +153,14 @@ msgid ""
"performance (set GOGC=10)." "performance (set GOGC=10)."
msgstr "启用此选项可以减少内存使用,但可能会牺牲一些性能 (设置 GOGC=10)。" msgstr "启用此选项可以减少内存使用,但可能会牺牲一些性能 (设置 GOGC=10)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:503
msgid "Error" msgid "Error"
msgstr "错误" msgstr "错误"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:578
msgid "Error applying settings: %s"
msgstr "应用设置时出错: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
msgid "Error caching DERP region map: %s" msgid "Error caching DERP region map: %s"
msgstr "缓存 DERP 区域地图时出错: %s" msgstr "缓存 DERP 区域地图时出错: %s"
@@ -180,64 +173,72 @@ msgstr "获取 DERP 区域地图时出错: %s"
msgid "Error reading cached DERP region map: %s" msgid "Error reading cached DERP region map: %s"
msgstr "读取缓存的 DERP 区域地图时出错: %s" msgstr "读取缓存的 DERP 区域地图时出错: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:419 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:574
msgid "Error saving settings: %s"
msgstr "保存设置时出错: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit Node " "Essential configuration for Subnet Routing (Site-to-Site) and Exit Node "
"features." "features."
msgstr "子网路由和出口节点的基本配置。" msgstr "子网路由和出口节点的基本配置。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:376
msgid "Exit Node" msgid "Exit Node"
msgstr "出口节点" msgstr "出口节点"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:23
msgid "" msgid ""
"Expose a web interface on port 5252 for managing this node over Tailscale." "Expose a web interface on port 5252 for managing this node over Tailscale."
msgstr "在端口 5252 上暴露一个 Web 界面,用于通过 Tailscale 管理此节点。" msgstr "在端口 5252 上暴露一个 Web 界面,用于通过 Tailscale 管理此节点。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:430 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:420
msgid "Failed to configure firewall: %s" msgid "Failed to configure firewall: %s"
msgstr "获取防火墙设置失败: %s" msgstr "获取防火墙设置失败: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
msgid "Failed to get login URL. You may close this tab." msgid "Failed to get login URL. You may close this tab."
msgstr "获取登录 URL 失败。您可以关闭此标签页。" msgstr "获取登录 URL 失败。您可以关闭此标签页。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "获取登录 URL 失败: %s" msgstr "获取登录 URL 失败: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:505
msgid "Failed to get login URL: Invalid response from server." msgid "Failed to get login URL: Invalid response from server."
msgstr "获取登录 URL 失败: 服务器响应无效。" msgstr "获取登录 URL 失败: 服务器响应无效。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:584
msgid "Failed to save settings: %s"
msgstr "保存设置失败: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "Firewall Mode" msgid "Firewall Mode"
msgstr "防火墙模式" msgstr "防火墙模式"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:427 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:417
msgid "Firewall configuration applied." msgid "Firewall configuration applied."
msgstr "已应用防火墙配置" msgstr "已应用防火墙配置"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:374 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:372
msgid "General Settings" msgid "General Settings"
msgstr "常规设置" msgstr "常规设置"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:261 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:250
msgid "Hostname" msgid "Hostname"
msgstr "主机名" msgstr "主机名"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:437 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:427
msgid "How to enable Site-to-Site?" msgid "How to enable Site-to-Site?"
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:456 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:446
msgid "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login again." "If the timeout is displayed, you can refresh the page and click Login again."
msgstr "如果显示超时,您可以刷新页面并再次点击登录。" msgstr "如果显示超时,您可以刷新页面并再次点击登录。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:470 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "" msgid ""
"If you are using custom login server but not providing an Auth Key, will " "If you are using custom login server but not providing an Auth Key, will "
"redirect to the login page without pre-filling the key." "redirect to the login page without pre-filling the key."
@@ -249,7 +250,7 @@ msgstr ""
msgid "Invalid Date" msgid "Invalid Date"
msgstr "无效日期" msgstr "无效日期"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:420 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "" msgid ""
"It automatically creates the tailscale interface, sets up firewall zones for " "It automatically creates the tailscale interface, sets up firewall zones for "
"LAN <-> Tailscale forwarding," "LAN <-> Tailscale forwarding,"
@@ -265,28 +266,28 @@ msgstr "刚才"
msgid "LOGGED OUT" msgid "LOGGED OUT"
msgstr "已登出" msgstr "已登出"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:267 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:256
msgid "Last Seen" msgid "Last Seen"
msgstr "上次在线" msgstr "上次在线"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:462 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
msgid "Leave blank for default Tailscale control plane." msgid "Leave blank for default Tailscale control plane."
msgstr "留空以使用默认的 Tailscale 控制平面。" msgstr "留空以使用默认的 Tailscale 控制平面。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:528
msgid "Logging out..." msgid "Logging out..."
msgstr "正在登出..." msgstr "正在登出..."
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:444
msgid "Login" msgid "Login"
msgstr "登录" msgstr "登录"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:475 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:465
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:548 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538
msgid "Logout" msgid "Logout"
msgstr "登出" msgstr "登出"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:535
msgid "Logout failed: %s" msgid "Logout failed: %s"
msgstr "登出失败: %s" msgstr "登出失败: %s"
@@ -298,11 +299,15 @@ msgstr "N/A"
msgid "NOT RUNNING" msgid "NOT RUNNING"
msgstr "未运行" msgstr "未运行"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:256 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:298
msgid "Network Devices"
msgstr "网络设备"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
msgid "No peer devices found." msgid "No peer devices found."
msgstr "未找到对等设备。" msgstr "未找到对等设备。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:387 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:377
msgid "None" msgid "None"
msgstr "" msgstr ""
@@ -310,43 +315,38 @@ msgstr ""
msgid "Now" msgid "Now"
msgstr "现在" msgstr "现在"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:263 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:252
msgid "OS" msgid "OS"
msgstr "操作系统" msgstr "操作系统"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Offline" msgid "Offline"
msgstr "离线" msgstr "离线"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:286 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Online" msgid "Online"
msgstr "在线" msgstr "在线"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:461 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
msgid "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale instance, " "Optional: Specify a custom control server URL (e.g., a Headscale instance, "
"https://example.com)." "%s)."
msgstr "" msgstr ""
"可选:指定一个自定义控制服务器 URL (例如,一个 Headscale 实例,https://"
"example.com)。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:469 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:459
msgid "" msgid ""
"Optional: Specify an authentication key for the custom control server. Leave " "Optional: Specify an authentication key for the custom control server. Leave "
"blank if not required." "blank if not required."
msgstr "可选:为自定义控制服务器指定一个认证密钥。如果不需要,请留空。" msgstr "可选:为自定义控制服务器指定一个认证密钥。如果不需要,请留空。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:378
msgid "Peer Relay Port"
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:207 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:207
msgid "Please use the login button in the settings below to authenticate." msgid "Please use the login button in the settings below to authenticate."
msgstr "请使用下方设置中的登录按钮进行认证。" msgstr "请使用下方设置中的登录按钮进行认证。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:538 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:528
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:563
msgid "Please wait." msgid "Please wait."
msgstr "请稍候。" msgstr "请稍候。"
@@ -354,26 +354,26 @@ msgstr "请稍候。"
msgid "RUNNING" msgid "RUNNING"
msgstr "正在运行" msgstr "正在运行"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:265 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "RX" msgid "RX"
msgstr "接收" msgstr "接收"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:498 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:488
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "正在请求登录 URL..." msgstr "正在请求登录 URL..."
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:495 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:485
msgid "Requesting Tailscale login URL... Please wait." msgid "Requesting Tailscale login URL... Please wait."
msgstr "正在请求 Tailscale 登录 URL... 请稍候。" msgstr "正在请求 Tailscale 登录 URL... 请稍候。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:386 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:376
msgid "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is enabled " "Select an exit node from the list. If enabled, Allow LAN Access is enabled "
"implicitly." "implicitly."
msgstr "" msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:18 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:19
msgid "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service restart " "Select the firewall backend for Tailscale to use. Requires service restart "
"to take effect." "to take effect."
@@ -386,15 +386,19 @@ msgstr "选择 Tailscale 使用的防火墙后端。需要重启服务才能生
msgid "Service Status" msgid "Service Status"
msgstr "服务状态" msgstr "服务状态"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
msgid "Settings"
msgstr "设置"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "Shields Up" msgid "Shields Up"
msgstr "开启防护 (Shields Up)" msgstr "开启防护 (Shields Up)"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:260 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:249
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:542 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:532
msgid "Successfully logged out." msgid "Successfully logged out."
msgstr "登出成功。" msgstr "登出成功。"
@@ -406,7 +410,7 @@ msgstr "未找到 TAILSCALE"
msgid "TUN Mode" msgid "TUN Mode"
msgstr "TUN 模式" msgstr "TUN 模式"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:266 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:255
msgid "TX" msgid "TX"
msgstr "发送" msgstr "发送"
@@ -414,7 +418,7 @@ msgstr "发送"
msgid "Tailnet Name" msgid "Tailnet Name"
msgstr "Tailnet 名称" msgstr "Tailnet 名称"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:342
#: applications/luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:3 #: applications/luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:3
msgid "Tailscale" msgid "Tailscale"
msgstr "Tailscale" msgstr "Tailscale"
@@ -423,7 +427,7 @@ msgstr "Tailscale"
msgid "Tailscale Health Check: %s" msgid "Tailscale Health Check: %s"
msgstr "Tailscale 健康检查: %s" msgstr "Tailscale 健康检查: %s"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:262 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:251
msgid "Tailscale IP" msgid "Tailscale IP"
msgstr "Tailscale IP" msgstr "Tailscale IP"
@@ -435,11 +439,11 @@ msgstr "Tailscale IPv4"
msgid "Tailscale IPv6" msgid "Tailscale IPv6"
msgstr "Tailscale IPv6" msgstr "Tailscale IPv6"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:494 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Tailscale Login" msgid "Tailscale Login"
msgstr "Tailscale 登录" msgstr "Tailscale 登录"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:339 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:342
msgid "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your devices " "Tailscale is a mesh VPN solution that makes it easy to connect your devices "
"securely. This configuration page allows you to manage Tailscale settings on " "securely. This configuration page allows you to manage Tailscale settings on "
@@ -448,35 +452,31 @@ msgstr ""
"Tailscale 是一个网状 VPN 解决方案,可以轻松地安全连接您的设备。此配置页面允许" "Tailscale 是一个网状 VPN 解决方案,可以轻松地安全连接您的设备。此配置页面允许"
"您在 OpenWrt 设备上管理 Tailscale 设置。" "您在 OpenWrt 设备上管理 Tailscale 设置。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:247 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:569
msgid "Tailscale status error" msgid "Tailscale settings applied successfully."
msgstr "" msgstr "Tailscale 设置已成功应用。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:496 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:486
msgid "This can take up to 30 seconds." msgid "This can take up to 30 seconds."
msgstr "此过程最多可能需要 30 秒。" msgstr "此过程最多可能需要 30 秒。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:526 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:516
msgid "" msgid ""
"This will disconnect this device from your Tailnet and require you to re-" "This will disconnect this device from your Tailnet and require you to re-"
"authenticate." "authenticate."
msgstr "这将使此设备从您的 Tailnet 断开连接,并需要您重新进行身份验证。" msgstr "这将使此设备从您的 Tailnet 断开连接,并需要您重新进行身份验证。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:379
msgid ""
"UDP port for the Peer Relay service. Open this port on your router firewall/"
"NAT."
msgstr ""
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:120
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:147
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:150
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:519 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:545 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:535
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:574
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:578
msgid "Unknown error" msgid "Unknown error"
msgstr "未知错误" msgstr "未知错误"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:26 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:27
msgid "Use system DNS instead of MagicDNS." msgid "Use system DNS instead of MagicDNS."
msgstr "使用系统 DNS 而不是 MagicDNS。" msgstr "使用系统 DNS 而不是 MagicDNS。"
@@ -484,16 +484,16 @@ msgstr "使用系统 DNS 而不是 MagicDNS。"
msgid "Version" msgid "Version"
msgstr "版本" msgstr "版本"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:24 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:25
msgid "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale network." "When enabled, blocks all inbound connections from the Tailscale network."
msgstr "启用后,将阻止来自 Tailscale 网络的所有入站连接。" msgstr "启用后,将阻止来自 Tailscale 网络的所有入站连接。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:21 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:22
msgid "When using the exit node, access to the local LAN is allowed." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "使用出口节点时,允许访问本地局域网。" msgstr "使用出口节点时,允许访问本地局域网。"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:445 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:435
msgid "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
@@ -503,29 +503,8 @@ msgstr "【重要】 登录 Tailscale 控制平面,在设备设置中手动授
msgid "ago" msgid "ago"
msgstr "前" msgstr "前"
#: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:421 #: applications/luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "" msgid ""
"and enables Masquerading and MSS Clamping (MTU fix) to ensure stable " "and enables Masquerading and MSS Clamping (MTU fix) to ensure stable "
"connections." "connections."
msgstr "并启用地址伪装和 MSS钳制确保连接稳定。" msgstr "并启用地址伪装和 MSS钳制确保连接稳定。"
#~ msgid "Applying changes..."
#~ msgstr "正在应用更改..."
#~ msgid "Error applying settings: %s"
#~ msgstr "应用设置时出错: %s"
#~ msgid "Error saving settings: %s"
#~ msgstr "保存设置时出错: %s"
#~ msgid "Failed to save settings: %s"
#~ msgstr "保存设置失败: %s"
#~ msgid "Network Devices"
#~ msgstr "网络设备"
#~ msgid "Settings"
#~ msgstr "设置"
#~ msgid "Tailscale settings applied successfully."
#~ msgstr "Tailscale 设置已成功应用。"
@@ -1,154 +0,0 @@
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
STOP=10
NAME=tailscale-settings
# Compare version strings: return 0 (true) if $1 >= $2
version_gte() {
awk -v a="${1%%-*}" -v b="${2%%-*}" 'BEGIN {
split(a, av, ".")
split(b, bv, ".")
for (i=1; i<=3; i++) {
ai = int(av[i]+0); bi = int(bv[i]+0)
if (ai > bi) { exit 0 }
if (ai < bi) { exit 1 }
}
exit 0
}'
return $?
}
apply_settings() {
local ts_bin
if [ -x /usr/sbin/tailscale ]; then
ts_bin=/usr/sbin/tailscale
elif [ -x /usr/bin/tailscale ]; then
ts_bin=/usr/bin/tailscale
else
logger -t "$NAME" "tailscale binary not found, skipping settings apply"
return 0
fi
config_load tailscale
local accept_routes advertise_exit_node exit_node exit_node_allow_lan_access
local ssh disable_magic_dns shields_up runwebclient nosnat hostname
local enable_relay relay_server_port
config_get accept_routes settings accept_routes '0'
config_get advertise_exit_node settings advertise_exit_node '0'
config_get exit_node settings exit_node ''
config_get exit_node_allow_lan_access settings exit_node_allow_lan_access '0'
config_get ssh settings ssh '0'
config_get disable_magic_dns settings disable_magic_dns '0'
config_get shields_up settings shields_up '0'
config_get runwebclient settings runwebclient '0'
config_get nosnat settings nosnat '0'
config_get hostname settings hostname ''
config_get enable_relay settings enable_relay '0'
config_get relay_server_port settings relay_server_port '40000'
# Collect advertise_routes UCI list into comma-separated string
local routes=""
append_route() {
if [ -z "$routes" ]; then
routes="$1"
else
routes="$routes,$1"
fi
}
config_list_foreach settings advertise_routes append_route
# Build argument list for 'tailscale set'
set -- set
# --accept-routes
[ "$accept_routes" = "1" ] \
&& set -- "$@" --accept-routes=true \
|| set -- "$@" --accept-routes=false
# --advertise-exit-node (only when no exit node is selected)
if [ "$advertise_exit_node" = "1" ] && [ -z "$exit_node" ]; then
set -- "$@" --advertise-exit-node=true
else
set -- "$@" --advertise-exit-node=false
fi
# --exit-node-allow-lan-access (only when no exit node is selected)
if [ -z "$exit_node" ]; then
[ "$exit_node_allow_lan_access" = "1" ] \
&& set -- "$@" --exit-node-allow-lan-access=true \
|| set -- "$@" --exit-node-allow-lan-access=false
fi
# --ssh
[ "$ssh" = "1" ] \
&& set -- "$@" --ssh=true \
|| set -- "$@" --ssh=false
# --accept-dns (inverse of disable_magic_dns)
[ "$disable_magic_dns" = "1" ] \
&& set -- "$@" --accept-dns=false \
|| set -- "$@" --accept-dns=true
# --shields-up
[ "$shields_up" = "1" ] \
&& set -- "$@" --shields-up=true \
|| set -- "$@" --shields-up=false
# --webclient
[ "$runwebclient" = "1" ] \
&& set -- "$@" --webclient=true \
|| set -- "$@" --webclient=false
# --snat-subnet-routes (inverse of nosnat)
[ "$nosnat" = "1" ] \
&& set -- "$@" --snat-subnet-routes=false \
|| set -- "$@" --snat-subnet-routes=true
# --advertise-routes (comma-separated, empty clears routes)
set -- "$@" "--advertise-routes=$routes"
# --exit-node (empty clears the exit node)
set -- "$@" "--exit-node=$exit_node"
# when an exit node is configured, always allow LAN access
[ -n "$exit_node" ] && set -- "$@" --exit-node-allow-lan-access=true
# --hostname (only set if non-empty)
[ -n "$hostname" ] && set -- "$@" "--hostname=$hostname"
# --relay-server-port (requires tailscale >= 1.90.5)
local ts_ver
ts_ver=$("$ts_bin" version 2>/dev/null | head -n1)
if version_gte "$ts_ver" "1.90.5"; then
if [ "$enable_relay" = "1" ]; then
set -- "$@" "--relay-server-port=${relay_server_port:-40000}"
else
set -- "$@" "--relay-server-port="
fi
fi
logger -t "$NAME" "Applying settings"
"$ts_bin" "$@"
local ret=$?
[ $ret -eq 0 ] \
&& logger -t "$NAME" "Settings applied successfully" \
|| logger -t "$NAME" "Failed to apply settings (exit code: $ret)"
return $ret
}
start_service() {
apply_settings
}
service_triggers() {
procd_add_reload_trigger "tailscale"
}
reload_service() {
apply_settings
}
@@ -16,7 +16,8 @@
"tailscale": [ "tailscale": [
"do_login", "do_login",
"do_logout", "do_logout",
"setup_firewall" "setup_firewall",
"set_settings"
] ]
}, },
"uci": [ "tailscale" ] "uci": [ "tailscale" ]
@@ -133,6 +133,49 @@ methods.get_settings = {
} }
}; };
methods.set_settings = {
args: { form_data: {} },
call: function(request) {
const form_data = request.args.form_data;
if (form_data == null || length(form_data) == 0) {
return { error: 'Missing or invalid form_data parameter. Please provide settings data.' };
}
let args = ['set'];
push(args,'--accept-routes=' + (form_data.accept_routes == '1'));
push(args,'--advertise-exit-node=' + ((form_data.advertise_exit_node == '1')&&(form_data.exit_node == "")));
if (form_data.exit_node == "") push(args,'--exit-node-allow-lan-access=' + (form_data.exit_node_allow_lan_access == '1'));
push(args,'--ssh=' + (form_data.ssh == '1'));
push(args,'--accept-dns=' + (form_data.disable_magic_dns != '1'));
push(args,'--shields-up=' + (form_data.shields_up == '1'));
push(args,'--webclient=' + (form_data.runwebclient == '1'));
push(args,'--snat-subnet-routes=' + (form_data.nosnat != '1'));
push(args,'--advertise-routes ' + (shell_quote(join(',',form_data.advertise_routes)) || '\"\"'));
push(args,'--exit-node=' + (shell_quote(form_data.exit_node) || '\"\"'));
if (form_data.exit_node != "") push(args,' --exit-node-allow-lan-access=true');
push(args,'--hostname ' + (shell_quote(form_data.hostname) || '\"\"'));
let cmd_array = 'tailscale '+join(' ', args);
let set_result = exec(cmd_array);
if (set_result.code != 0) {
return { error: 'Failed to apply node settings: ' + set_result.stderr };
}
uci.load('tailscale');
for (let key in form_data) {
uci.set('tailscale', 'settings', key, form_data[key]);
}
uci.save('tailscale');
uci.commit('tailscale');
// process reduce memory https://github.com/GuNanOvO/openwrt-tailscale
// some new versions of Tailscale may not work well with this method
//if (form_data.daemon_mtu != "" || form_data.daemon_reduce_memory != "") {
// popen('/bin/sh -c ". ' + env_script_path + ' && /etc/init.d/tailscale restart" &');
//}
return { success: true };
}
};
methods.do_login = { methods.do_login = {
args: { form_data: {} }, args: { form_data: {} },