Skip to content

Commit ae77b19

Browse files
committed
feat: detect lan & wan subnet
1 parent 0f6cc25 commit ae77b19

File tree

5 files changed

+227
-173
lines changed

5 files changed

+227
-173
lines changed

htdocs/luci-static/resources/view/tailscale/setting.js

+53-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,51 @@ var callServiceList = rpc.declare({
1818
expect: { '': {} }
1919
});
2020

21+
function callInterfaceStatus(interfaceName) {
22+
return rpc.declare({
23+
object: `network.interface.${interfaceName}`,
24+
method: 'status',
25+
params: ['name'],
26+
expect: { '': {} }
27+
});
28+
}
29+
30+
function getInterfaceSubnets(interfaces = ['lan', 'wan']) {
31+
const calculateSubnetAndCIDR = (ip, cidr) => {
32+
const cidrInt = parseInt(cidr, 10);
33+
const maskBinary = '1'.repeat(cidrInt).padEnd(32, '0');
34+
const ipBinary = (ip) =>
35+
ip.split('.').map(octet => parseInt(octet, 10).toString(2).padStart(8, '0'))
36+
.join('');
37+
const subnetBinary = ipBinary(ip).split('').map((bit, index) =>
38+
(bit === '1' && maskBinary[index] === '1') ? '1' : '0'
39+
).join('');
40+
const subnet = [
41+
parseInt(subnetBinary.slice(0, 8), 2),
42+
parseInt(subnetBinary.slice(8, 16), 2),
43+
parseInt(subnetBinary.slice(16, 24), 2),
44+
parseInt(subnetBinary.slice(24, 32), 2)
45+
].join('.');
46+
return `${subnet}/${cidrInt}`;
47+
};
48+
49+
const rpcCalls = interfaces.map(interfaceName => {
50+
const callStatus = callInterfaceStatus(interfaceName);
51+
return callStatus('ipv4-address').catch(() => ({ 'ipv4-address': [] }));
52+
});
53+
54+
return Promise.all(rpcCalls)
55+
.then(res => {
56+
const interfaceSubnets = res.flatMap(status =>
57+
(status['ipv4-address'] || []).map(addr => {
58+
return calculateSubnetAndCIDR(addr.address, addr.mask)
59+
})
60+
);
61+
return [...new Set(interfaceSubnets)];
62+
})
63+
.catch(() => []);
64+
}
65+
2166
function getStatus() {
2267
var status = {
2368
isRunning: false,
@@ -81,13 +126,15 @@ return view.extend({
81126
load: function() {
82127
return Promise.all([
83128
uci.load('tailscale'),
84-
getStatus()
129+
getStatus(),
130+
getInterfaceSubnets()
85131
]);
86132
},
87133

88134
render: function(data) {
89135
var m, s, o;
90136
var statusData = data[1];
137+
var interfaceSubnets = data[2];
91138
var onlineExitNodes = statusData.onlineExitNodes;
92139
var subnetRoutes = statusData.subnetRoutes;
93140

@@ -187,6 +234,11 @@ return view.extend({
187234
o.rmempty = true;
188235

189236
o = s.taboption('advance', form.DynamicList, 'advertiseRoutes', _('Expose Subnets'), _('Expose physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>.'));
237+
if (interfaceSubnets.length > 0) {
238+
interfaceSubnets.forEach(function(subnet) {
239+
o.value(subnet, subnet);
240+
});
241+
}
190242
o.default = '';
191243
o.rmempty = true;
192244

po/templates/tailscale.pot

+57-57
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,88 @@
11
msgid ""
22
msgstr "Content-Type: text/plain; charset=UTF-8"
33

4-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:177
4+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224
55
msgid "-- Please choose --"
66
msgstr ""
77

8-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167
8+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
99
msgid "Accept DNS"
1010
msgstr ""
1111

12-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167
12+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
1313
msgid "Accept DNS configuration from the Tailscale admin console."
1414
msgstr ""
1515

16-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:159
16+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206
1717
msgid "Accept Routes"
1818
msgstr ""
1919

20-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:159
20+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206
2121
msgid "Accept subnet routes that other nodes advertise."
2222
msgstr ""
2323

24-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:211
24+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:263
2525
msgid "Access Control"
2626
msgstr ""
2727

28-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:221
28+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273
2929
msgid "Additional Flags"
3030
msgstr ""
3131

32-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:157
32+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:204
3333
msgid "Advanced Settings"
3434
msgstr ""
3535

36-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:108
36+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155
3737
msgid "Are you sure you want to logout and unbind the current device?"
3838
msgstr ""
3939

40-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:233
40+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:285
4141
msgid "Auth Key"
4242
msgstr ""
4343

44-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:221
44+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273
4545
msgid "Available flags"
4646
msgstr ""
4747

48-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:122
48+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:169
4949
msgid "Basic Settings"
5050
msgstr ""
5151

52-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:117
53-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:131
52+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164
53+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178
5454
msgid "Collecting data ..."
5555
msgstr ""
5656

57-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:226
57+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:278
5858
msgid "Custom Server Settings"
5959
msgstr ""
6060

61-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:163
61+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210
6262
msgid "Device Name"
6363
msgstr ""
6464

65-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:124
65+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171
6666
msgid "Enable"
6767
msgstr ""
6868

69-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171
69+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218
7070
msgid "Exit Node"
7171
msgstr ""
7272

73-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:189
73+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236
7474
msgid "Expose Subnets"
7575
msgstr ""
7676

77-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:189
77+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236
7878
msgid "Expose physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>."
7979
msgstr ""
8080

81-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219
81+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:271
8282
msgid "Extra Settings"
8383
msgstr ""
8484

85-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:143
85+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:190
8686
msgid "Firewall Mode"
8787
msgstr ""
8888

@@ -110,31 +110,31 @@ msgstr ""
110110
msgid "Interface Name"
111111
msgstr ""
112112

113-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
113+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:266
114114
msgid "LAN access Tailscale"
115115
msgstr ""
116116

117-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:163
117+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210
118118
msgid "Leave blank to use the device's hostname."
119119
msgstr ""
120120

121-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:221
121+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273
122122
msgid "List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</code>. <br> %s for enabling settings upon the initiation of Tailscale."
123123
msgstr ""
124124

125-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:149
125+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196
126126
msgid "Logging program activities."
127127
msgstr ""
128128

129-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:153
129+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200
130130
msgid "Logging program errors and exceptions."
131131
msgstr ""
132132

133-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:128
133+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175
134134
msgid "Login Status"
135135
msgstr ""
136136

137-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:72
137+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:117
138138
msgid "Logout and Unbind"
139139
msgstr ""
140140

@@ -146,44 +146,44 @@ msgstr ""
146146
msgid "MTU"
147147
msgstr ""
148148

149-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:59
150-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:74
149+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104
150+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119
151151
msgid "NOT RUNNING"
152152
msgstr ""
153153

154-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:69
154+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114
155155
msgid "Needs Login"
156156
msgstr ""
157157

158158
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87
159159
msgid "Network Interface Information"
160160
msgstr ""
161161

162-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:182
162+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:229
163163
msgid "No Available Exit Nodes"
164164
msgstr ""
165165

166-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:204
166+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:256
167167
msgid "No Available Subnet Routes"
168168
msgstr ""
169169

170170
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83
171171
msgid "No interface online."
172172
msgstr ""
173173

174-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171
174+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218
175175
msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network."
176176
msgstr ""
177177

178-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175
178+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222
179179
msgid "Online Exit Nodes"
180180
msgstr ""
181181

182-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:134
182+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181
183183
msgid "Port"
184184
msgstr ""
185185

186-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:57
186+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102
187187
msgid "RUNNING"
188188
msgstr ""
189189

@@ -197,60 +197,60 @@ msgctxt "scroll to bottom (the tail) of the log file"
197197
msgid "Scroll to tail"
198198
msgstr ""
199199

200-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175
200+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222
201201
msgid "Select an online machine name to use as an exit node."
202202
msgstr ""
203203

204-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:198
204+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250
205205
msgid "Select subnet routes advertised by other nodes in Tailscale network."
206206
msgstr ""
207207

208-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:229
208+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:281
209209
msgid "Server Address"
210210
msgstr ""
211211

212-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:134
212+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181
213213
msgid "Set the Tailscale port number."
214214
msgstr ""
215215

216-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:193
216+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245
217217
msgid "Site To Site"
218218
msgstr ""
219219

220-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:153
220+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200
221221
msgid "StdErr Log"
222222
msgstr ""
223223

224-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:149
224+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196
225225
msgid "StdOut Log"
226226
msgstr ""
227227

228-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:198
228+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250
229229
msgid "Subnet Routes"
230230
msgstr ""
231231

232232
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120
233-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:57
234-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:59
235-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:94
233+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102
234+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104
235+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141
236236
#: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3
237237
msgid "Tailscale"
238238
msgstr ""
239239

240-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:212
240+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:264
241241
msgid "Tailscale access LAN"
242242
msgstr ""
243243

244-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:213
244+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:265
245245
msgid "Tailscale access WAN"
246246
msgstr ""
247247

248248
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121
249-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:94
249+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141
250250
msgid "Tailscale is a cross-platform and easy to use virtual LAN."
251251
msgstr ""
252252

253-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:139
253+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186
254254
msgid "The working directory contains config files, audit logs, and runtime info."
255255
msgstr ""
256256

@@ -274,18 +274,18 @@ msgstr ""
274274
msgid "Unable to load log data:"
275275
msgstr ""
276276

277-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:227
277+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:279
278278
msgid "Use %s to deploy a private server."
279279
msgstr ""
280280

281-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:193
281+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245
282282
msgid "Use site-to-site layer 3 networking to connect subnets on the Tailscale network."
283283
msgstr ""
284284

285-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:215
285+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:267
286286
msgid "WAN access Tailscale"
287287
msgstr ""
288288

289-
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:139
289+
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186
290290
msgid "Workdir"
291291
msgstr ""

0 commit comments

Comments
 (0)