summaryrefslogtreecommitdiffstats
path: root/applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/status/include/71_https-dns-proxy.js
blob: 9d10fa986daaaa8bd96877ecd40accd89fa4fa27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"require ui";
"require rpc";
"require uci";
"require form";
"require baseclass";
"require https-dns-proxy.status as hdp";

var pkg = hdp.pkg;

return baseclass.extend({
	title: _("HTTPS DNS Proxy Instances"),

	load: function () {
		return Promise.all([
			hdp.getInitStatus(pkg.Name),
			hdp.getProviders(pkg.Name),
			hdp.getServiceInfo(pkg.Name),
		]);
	},

	render: function (data) {
		var reply = {
			status: (data[0] && data[0][pkg.Name]) || {
				enabled: null,
				running: null,
				force_dns_active: null,
				version: null,
			},
			providers: (data[1] && data[1][pkg.Name]) || [{ title: "empty" }],
			runtime: (data[2] && data[2][pkg.Name]) || { instances: null, triggers: [] },
		};
		reply.providers.sort(function (a, b) {
			return _(a.title).localeCompare(_(b.title));
		});
		reply.providers.push({
			title: "Custom",
			template: "{option}",
			params: { option: { type: "text" } },
		});

		var forceDnsText = "";
		if (reply.status.force_dns_active) {
			reply.status.force_dns_ports.forEach((element) => {
				forceDnsText += element + " ";
			});
		} else {
			forceDnsText = "-";
		}

		var table = E(
			"table",
			{ class: "table", id: "https-dns-proxy_status_table" },
			[
				E("tr", { class: "tr table-titles" }, [
					E("th", { class: "th" }, _("Name / Type")),
					E("th", { class: "th" }, _("Listen Address")),
					E("th", { class: "th" }, _("Listen Port")),
					E("th", { class: "th" }, _("Force DNS Ports")),
				]),
			]
		);

		var rows = [];
		if (reply.runtime.instances) {
			Object.values(reply.runtime.instances).forEach((element) => {
				var resolver;
				var address;
				var port;
				var name;
				var option;
				var found;
				element.command.forEach((param, index, arr) => {
					if (param === "-r") resolver = arr[index + 1];
					if (param === "-a") address = arr[index + 1];
					if (param === "-p") port = arr[index + 1];
				});
				resolver = resolver || "Unknown";
				address = address || "127.0.0.1";
				port = port || "Unknown";
				reply.providers.forEach((prov) => {
					let regexp = pkg.templateToRegexp(prov.template);
					if (!found && regexp.test(resolver)) {
						found = true;
						name = _(prov.title);
						let match = resolver.match(regexp);
						if (match[1] != null) {
							if (
								prov.params &&
								prov.params.option &&
								prov.params.option.options
							) {
								prov.params.option.options.forEach((opt) => {
									if (opt.value === match[1]) option = _(opt.description);
								});
								name += " (" + option + ")";
							} else {
								if (match[1] !== "") name += " (" + match[1] + ")";
							}
						}
					}
				});
				rows.push([name, address, port, forceDnsText]);
			});
		}
		cbi_update_table(table, rows, E("em", _("There are no active instances.")));

		return table;
	},
});