summaryrefslogtreecommitdiff
path: root/_www/hosts.d/index.html
diff options
context:
space:
mode:
Diffstat (limited to '_www/hosts.d/index.html')
-rw-r--r--_www/hosts.d/index.html415
1 files changed, 213 insertions, 202 deletions
diff --git a/_www/hosts.d/index.html b/_www/hosts.d/index.html
index 6709801..c8f4b41 100644
--- a/_www/hosts.d/index.html
+++ b/_www/hosts.d/index.html
@@ -2,195 +2,205 @@
<!-- SPDX-FileCopyrightText: 2021 M. Shulhan <ms@kilabit.info -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<html lang="en">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
- <link rel="icon" type="image/png" href="/favicon.png" />
- <link rel="stylesheet" href="/index.css" />
- <title>rescached | hosts.d</title>
- <style>
- .nav-left {
- padding: 0px;
- width: 16em;
- float: left;
- }
- .nav-left .item {
- margin: 4px 0px;
- }
- #activeHostsFile {
- float: left;
- width: calc(100% - 17em);
- }
- .host {
- font-family: monospace;
- width: 100%;
- }
- .host.header {
- margin: 1em 0px;
- font-weight: bold;
- border-bottom: 1px solid silver;
- }
- .host_name {
- display: inline-block;
- width: 18em;
- word-wrap: break-word;
- }
- .host_value {
- display: inline-block;
- width: 10em;
- }
- </style>
- </head>
- <body onload="onLoad()">
- <nav class="menu">
- <a href="/"> rescached </a>
- /
- <a href="/environment/"> Environment </a>
- /
- <a href="/block.d/"> block.d </a>
- /
- <a href="/hosts.d/" class="active"> hosts.d </a>
- /
- <a href="/zone.d/"> zone.d </a>
- </nav>
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+ <link rel="icon" type="image/png" href="/favicon.png" />
+ <link rel="stylesheet" href="/index.css" />
+ <title>rescached | hosts.d</title>
- <div id="notif"></div>
+ <style>
+ .nav-left {
+ padding: 0px;
+ width: 16em;
+ float: left;
+ }
- <div class="hosts_d">
- <div class="nav-left">
- <h3>Hosts files</h3>
- <div id="HostsFiles"></div>
+ .nav-left .item {
+ margin: 4px 0px;
+ }
- <br />
+ #activeHostsFile {
+ float: left;
+ width: calc(100% - 17em);
+ }
- <label>
- <span>New hosts file:</span>
- <br />
- <input id="newHostsFile" oninput="onInputNewHostsFile(this.value)" />
- </label>
- <button onclick="onCreateHostsFile()">Create</button>
- </div>
+ .host {
+ font-family: monospace;
+ width: 100%;
+ }
- <div id="activeHostsFile">
- <p>Select one of the hosts file to manage.</p>
- </div>
- </div>
+ .host.header {
+ margin: 1em 0px;
+ font-weight: bold;
+ border-bottom: 1px solid silver;
+ }
- <script src="/index.js"></script>
- <script src="/rescached.js"></script>
- <script>
- let resc = null
- let activeHostsFile = null
- let newHostsFile = ""
- let newRecord = {
- Name: "",
- Value: "",
- }
+ .host_name {
+ display: inline-block;
+ width: 18em;
+ word-wrap: break-word;
+ }
- async function getHostsFile(name) {
- activeHostsFile = resc.env.HostsFiles[name]
- if (typeof activeHostsFile.Records === "undefined") {
- activeHostsFile.Records = []
- }
- if (activeHostsFile.Records === null) {
- activeHostsFile.Records = []
- }
- if (activeHostsFile.Records.length === 0) {
- const res = await resc.HostsFileGet(name)
- activeHostsFile.Records = res.data
- }
- renderHostsFile(activeHostsFile)
- newRecord.Name = ""
- newRecord.Value = ""
- }
+ .host_value {
+ display: inline-block;
+ width: 10em;
+ }
+ </style>
+</head>
- async function onCreateHostsFile() {
- if (newHostsFile === "") {
- notifError("Please fill the hosts file name first")
- return
- }
+<body onload="onLoad()">
+ <nav class="menu">
+ <a href="/"> rescached </a>
+ /
+ <a href="/environment/"> Environment </a>
+ /
+ <a href="/block.d/"> block.d </a>
+ /
+ <a href="/hosts.d/" class="active"> hosts.d </a>
+ /
+ <a href="/zone.d/"> zone.d </a>
+ /
+ <a href="/doc/"> Documentation </a>
+ </nav>
- let res = await resc.HostsFileCreate(newHostsFile)
+ <div id="notif"></div>
- if (res.code >= 400) {
- notifError("ERROR: HostsFileCreate: " + res.message)
- return
- }
- renderHostsFiles(resc.env.HostsFiles)
- notifInfo(res.message)
- resetInputs()
- }
+ <div class="hosts_d">
+ <div class="nav-left">
+ <h3>Hosts files</h3>
+ <div id="HostsFiles"></div>
- async function onDeleteActiveHostsFile() {
- const res = await resc.HostsFileDelete(activeHostsFile.Name)
- if (res.code != 200) {
- notifError(res.message)
- return
- }
- renderHostsFiles(resc.env.HostsFiles)
- document.getElementById(
- "activeHostsFile",
- ).innerHTML = `<p>Select one of the hosts file to manage.</p>`
- notifInfo(`Hosts file "${activeHostsFile.Name}" has been deleted`)
- activeHostsFile = null
- }
+ <br />
- async function onCreateRecord(hostsFile) {
- if (hostsFile === "") {
- notifError("invalid or empty hosts file name: " + hostsFile)
- return
- }
- if (newRecord.Name === "") {
- notifError("invalid or empty domain name")
- return
- }
- if (newRecord.Value === "") {
- notifError("invalid or empty IP address")
- return
- }
- let res = await resc.HostsdRecordAdd(hostsFile, newRecord.Name, newRecord.Value)
- if (res.code >= 400) {
- notifError("failed to add record for " + hostsFile + ": " + res.message)
- return
- }
- renderNewRecord(res.data)
- }
+ <label>
+ <span>New hosts file:</span>
+ <br />
+ <input id="newHostsFile" oninput="onInputNewHostsFile(this.value)" />
+ </label>
+ <button onclick="onCreateHostsFile()">Create</button>
+ </div>
- async function onDeleteRecord(domain) {
- let res = await resc.HostsdRecordDelete(activeHostsFile.Name, domain)
- if (res.code !== 200) {
- notifError("Failed to delete record " + domain)
- return
- }
- activeHostsFile = resc.env.HostsFiles[activeHostsFile.Name]
- renderHostsFile(activeHostsFile)
- }
+ <div id="activeHostsFile">
+ <p>Select one of the hosts file to manage.</p>
+ </div>
+ </div>
- function onInputNewHostsFile(v) {
- newHostsFile = v
- }
+ <script src="/index.js"></script>
+ <script src="/rescached.js"></script>
+ <script>
+ let resc = null
+ let activeHostsFile = null
+ let newHostsFile = ""
+ let newRecord = {
+ Name: "",
+ Value: "",
+ }
- function onInputNewRecord(k, v) {
- newRecord[k] = v
- }
+ async function getHostsFile(name) {
+ activeHostsFile = resc.env.HostsFiles[name]
+ if (typeof activeHostsFile.Records === "undefined") {
+ activeHostsFile.Records = []
+ }
+ if (activeHostsFile.Records === null) {
+ activeHostsFile.Records = []
+ }
+ if (activeHostsFile.Records.length === 0) {
+ const res = await resc.HostsFileGet(name)
+ activeHostsFile.Records = res.data
+ }
+ renderHostsFile(activeHostsFile)
+ newRecord.Name = ""
+ newRecord.Value = ""
+ }
- async function onLoad() {
- resc = new Rescached("")
+ async function onCreateHostsFile() {
+ if (newHostsFile === "") {
+ notifError("Please fill the hosts file name first")
+ return
+ }
- let res = await resc.getEnvironment()
- if (res.code != 200) {
- notifError(res.message)
- return
- }
+ let res = await resc.HostsFileCreate(newHostsFile)
- renderHostsFiles(res.data.HostsFiles)
- resetInputs()
- }
+ if (res.code >= 400) {
+ notifError("ERROR: HostsFileCreate: " + res.message)
+ return
+ }
+ renderHostsFiles(resc.env.HostsFiles)
+ notifInfo(res.message)
+ resetInputs()
+ }
- function renderHostsFile(hf) {
- let content = document.getElementById("activeHostsFile")
- let innerHTML = `
+ async function onDeleteActiveHostsFile() {
+ const res = await resc.HostsFileDelete(activeHostsFile.Name)
+ if (res.code != 200) {
+ notifError(res.message)
+ return
+ }
+ renderHostsFiles(resc.env.HostsFiles)
+ document.getElementById(
+ "activeHostsFile",
+ ).innerHTML = `<p>Select one of the hosts file to manage.</p>`
+ notifInfo(`Hosts file "${activeHostsFile.Name}" has been deleted`)
+ activeHostsFile = null
+ }
+
+ async function onCreateRecord(hostsFile) {
+ if (hostsFile === "") {
+ notifError("invalid or empty hosts file name: " + hostsFile)
+ return
+ }
+ if (newRecord.Name === "") {
+ notifError("invalid or empty domain name")
+ return
+ }
+ if (newRecord.Value === "") {
+ notifError("invalid or empty IP address")
+ return
+ }
+ let res = await resc.HostsdRecordAdd(hostsFile, newRecord.Name, newRecord.Value)
+ if (res.code >= 400) {
+ notifError("failed to add record for " + hostsFile + ": " + res.message)
+ return
+ }
+ renderNewRecord(res.data)
+ }
+
+ async function onDeleteRecord(domain) {
+ let res = await resc.HostsdRecordDelete(activeHostsFile.Name, domain)
+ if (res.code !== 200) {
+ notifError("Failed to delete record " + domain)
+ return
+ }
+ activeHostsFile = resc.env.HostsFiles[activeHostsFile.Name]
+ renderHostsFile(activeHostsFile)
+ }
+
+ function onInputNewHostsFile(v) {
+ newHostsFile = v
+ }
+
+ function onInputNewRecord(k, v) {
+ newRecord[k] = v
+ }
+
+ async function onLoad() {
+ resc = new Rescached("")
+
+ let res = await resc.getEnvironment()
+ if (res.code != 200) {
+ notifError(res.message)
+ return
+ }
+
+ renderHostsFiles(res.data.HostsFiles)
+ resetInputs()
+ }
+
+ function renderHostsFile(hf) {
+ let content = document.getElementById("activeHostsFile")
+ let innerHTML = `
<p>
${hf.Name} (${hf.Records.length} records)
<button onclick="onDeleteActiveHostsFile()">Delete</button>
@@ -210,51 +220,52 @@
</div>
<div id="records">
`
- for (let x = 0; x < hf.Records.length; x++) {
- let rr = hf.Records[x]
- innerHTML += `
+ for (let x = 0; x < hf.Records.length; x++) {
+ let rr = hf.Records[x]
+ innerHTML += `
<div class="host">
<span class="host_name"> ${rr.Name} </span>
<span class="host_value"> ${rr.Value} </span>
<button onclick="onDeleteRecord('${rr.Name}')">X</button>
</div>`
- }
- innerHTML += "</div>"
- content.innerHTML = innerHTML
- }
+ }
+ innerHTML += "</div>"
+ content.innerHTML = innerHTML
+ }
- function renderHostsFiles(hostsFiles) {
- let parent = document.getElementById("HostsFiles")
- parent.innerHTML = ""
+ function renderHostsFiles(hostsFiles) {
+ let parent = document.getElementById("HostsFiles")
+ parent.innerHTML = ""
- for (let k in hostsFiles) {
- if (!hostsFiles.hasOwnProperty(k)) {
- continue
- }
- let hf = hostsFiles[k]
- let item = document.createElement("div")
- item.classList.add("item")
- item.innerHTML = `<a href="#" onclick="getHostsFile('${k}')"> ${hf.Name} </a>`
- parent.appendChild(item)
- }
- }
+ for (let k in hostsFiles) {
+ if (!hostsFiles.hasOwnProperty(k)) {
+ continue
+ }
+ let hf = hostsFiles[k]
+ let item = document.createElement("div")
+ item.classList.add("item")
+ item.innerHTML = `<a href="#" onclick="getHostsFile('${k}')"> ${hf.Name} </a>`
+ parent.appendChild(item)
+ }
+ }
- // renderNewRecord prepend the new record on top of the list.
- function renderNewRecord(rr) {
- let div = document.getElementById("records")
- innerHTML = `
+ // renderNewRecord prepend the new record on top of the list.
+ function renderNewRecord(rr) {
+ let div = document.getElementById("records")
+ innerHTML = `
<div class="host">
<span class="host_name"> ${rr.Name} </span>
<span class="host_value"> ${rr.Value} </span>
<button onclick="onDeleteRecord('${rr.Name}')">X</button>
</div>`
- div.innerHTML = innerHTML + div.innerHTML
- }
+ div.innerHTML = innerHTML + div.innerHTML
+ }
+
+ function resetInputs() {
+ document.getElementById("newHostsFile").value = ""
+ newHostsFile = ""
+ }
+ </script>
+</body>
- function resetInputs() {
- document.getElementById("newHostsFile").value = ""
- newHostsFile = ""
- }
- </script>
- </body>
</html>