71_https-dns-proxy.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. "require ui";
  2. "require rpc";
  3. "require uci";
  4. "require form";
  5. "require baseclass";
  6. var pkg = {
  7. get Name() {
  8. return "https-dns-proxy";
  9. },
  10. get URL() {
  11. return "https://docs.openwrt.melmac.net/" + pkg.Name + "/";
  12. },
  13. templateToRegexp: function (template) {
  14. return RegExp(
  15. "^" +
  16. template
  17. .split(/(\{\w+\})/g)
  18. .map((part) => {
  19. let placeholder = part.match(/^\{(\w+)\}$/);
  20. if (placeholder) return `(?<${placeholder[1]}>.*?)`;
  21. else return part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  22. })
  23. .join("") +
  24. "$"
  25. );
  26. },
  27. };
  28. var getInitStatus = rpc.declare({
  29. object: "luci." + pkg.Name,
  30. method: "getInitStatus",
  31. params: ["name"],
  32. });
  33. var getPlatformSupport = rpc.declare({
  34. object: "luci." + pkg.Name,
  35. method: "getPlatformSupport",
  36. params: ["name"],
  37. });
  38. var getProviders = rpc.declare({
  39. object: "luci." + pkg.Name,
  40. method: "getProviders",
  41. params: ["name"],
  42. });
  43. var getRuntime = rpc.declare({
  44. object: "luci." + pkg.Name,
  45. method: "getRuntime",
  46. params: ["name"],
  47. });
  48. return baseclass.extend({
  49. title: _("HTTPS DNS Proxy Instances"),
  50. load: function () {
  51. return Promise.all([
  52. getInitStatus(pkg.Name),
  53. getProviders(pkg.Name),
  54. getRuntime(pkg.Name),
  55. ]);
  56. },
  57. render: function (data) {
  58. var reply = {
  59. status: (data[0] && data[0][pkg.Name]) || {
  60. enabled: null,
  61. running: null,
  62. force_dns_active: null,
  63. version: null,
  64. },
  65. providers: (data[1] && data[1][pkg.Name]) || { providers: [] },
  66. runtime: (data[2] && data[2][pkg.Name]) || { instances: [] },
  67. };
  68. reply.providers.sort(function (a, b) {
  69. return _(a.title).localeCompare(_(b.title));
  70. });
  71. reply.providers.push({
  72. title: "Custom",
  73. template: "{option}",
  74. params: { option: { type: "text" } },
  75. });
  76. var forceDnsText = "";
  77. if (reply.status.force_dns_active) {
  78. reply.status.force_dns_ports.forEach((element) => {
  79. forceDnsText += element + " ";
  80. });
  81. } else {
  82. forceDnsText = "-";
  83. }
  84. var table = E(
  85. "table",
  86. { class: "table", id: "https-dns-proxy_status_table" },
  87. [
  88. E("tr", { class: "tr table-titles" }, [
  89. E("th", { class: "th" }, _("Name / Type")),
  90. E("th", { class: "th" }, _("Listen Address")),
  91. E("th", { class: "th" }, _("Listen Port")),
  92. E("th", { class: "th" }, _("Force DNS Ports")),
  93. ]),
  94. ]
  95. );
  96. var rows = [];
  97. if (reply.runtime.instances) {
  98. Object.values(reply.runtime.instances).forEach((element) => {
  99. var resolver;
  100. var address;
  101. var port;
  102. var name;
  103. var option;
  104. var found;
  105. element.command.forEach((param, index, arr) => {
  106. if (param === "-r") resolver = arr[index + 1];
  107. if (param === "-a") address = arr[index + 1];
  108. if (param === "-p") port = arr[index + 1];
  109. });
  110. resolver = resolver || "Unknown";
  111. address = address || "127.0.0.1";
  112. port = port || "Unknown";
  113. reply.providers.forEach((prov) => {
  114. let regexp = pkg.templateToRegexp(prov.template);
  115. if (!found && regexp.test(resolver)) {
  116. found = true;
  117. name = _(prov.title);
  118. let match = resolver.match(regexp);
  119. if (match[1] != null) {
  120. if (
  121. prov.params &&
  122. prov.params.option &&
  123. prov.params.option.options
  124. ) {
  125. prov.params.option.options.forEach((opt) => {
  126. if (opt.value === match[1]) option = _(opt.description);
  127. });
  128. name += " (" + option + ")";
  129. } else {
  130. if (match[1] !== "") name += " (" + match[1] + ")";
  131. }
  132. }
  133. }
  134. });
  135. rows.push([name, address, port, forceDnsText]);
  136. });
  137. }
  138. cbi_update_table(table, rows, E("em", _("There are no active instances.")));
  139. return table;
  140. },
  141. });