From a7ff04b7c298416746025ba4bc495eb8c82e8dbe Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Fri, 28 Jun 2024 16:19:55 +0700 Subject: [PATCH] update 2024-06-28 --- src/openrouter.cpp | 1 + src/settings/dns/dns.hpp | 1 + src/settings/dns/dns_servers.cpp | 39 ++++++++++++++++ src/web/css/notification.css | 12 ++++- src/web/css/settings.css | 28 ++++++++++-- src/web/index.html | 46 ++++++++++++------- src/web/js/loader.js | 13 ++++++ src/web/js/notification.js | 33 ++++++++++---- src/web/js/reboot.js | 5 +-- src/web/js/routes.js | 3 +- src/web/js/settings/confirm.js | 21 ++++++--- src/web/js/settings/dns.js | 77 +++++++++++++++++++++++++++++++- src/web/js/settings/telnet.js | 9 ++++ 13 files changed, 248 insertions(+), 40 deletions(-) create mode 100644 src/web/js/loader.js diff --git a/src/openrouter.cpp b/src/openrouter.cpp index 4f30b50..57c99d3 100644 --- a/src/openrouter.cpp +++ b/src/openrouter.cpp @@ -18,6 +18,7 @@ int main() { srv.Post("/api/settings/dns/get", get_dns); srv.Post("/api/settings/dns/set", set_dns); srv.Post("/api/settings/dns/servers/get", get_dns_servers); + srv.Post("/api/settings/dns/servers/set", set_dns_servers); srv.Post("/api/settings/ftp/get", get_ftp); srv.Post("/api/settings/ftp/set", set_ftp); diff --git a/src/settings/dns/dns.hpp b/src/settings/dns/dns.hpp index c46ce0a..802771b 100644 --- a/src/settings/dns/dns.hpp +++ b/src/settings/dns/dns.hpp @@ -6,5 +6,6 @@ void get_dns(const httplib::Request &request, httplib::Response &response); void set_dns(const httplib::Request &request, httplib::Response &response); void get_dns_servers(const httplib::Request &request, httplib::Response &response); +void set_dns_servers(const httplib::Request &request, httplib::Response &response); #endif // DNS_HPP \ No newline at end of file diff --git a/src/settings/dns/dns_servers.cpp b/src/settings/dns/dns_servers.cpp index 517228a..b8515ba 100644 --- a/src/settings/dns/dns_servers.cpp +++ b/src/settings/dns/dns_servers.cpp @@ -46,3 +46,42 @@ void get_dns_servers(const httplib::Request &request, httplib::Response &respons response.set_content(responsedata.str(), JSON_TYPE); } } + +void set_dns_servers(const httplib::Request &request, httplib::Response &response) { + std::cout << GREEN << request.path << RESET << " " << request.method << std::endl; + response.set_header("Access-Control-Allow-Origin", "*"); + if (request.body.empty()) { + response.set_content(ACCESS_REQUIRED_STRING, JSON_TYPE); + return; + } + + nlohmann::json json_body = nlohmann::json::parse(request.body); + if (json_body["token"] == nullptr) { + response.set_content(ACCESS_REQUIRED_STRING, JSON_TYPE); + return; + } + + httplib::Client cli(AUTH_SERVICE); + + std::stringstream body; + body << R"({"token":)" << json_body["token"] << R"(})"; + + httplib::Result res = cli.Post("/api/access", body.str().c_str(), JSON_TYPE); + if (res->status == httplib::OK_200) { + nlohmann::json resjson = nlohmann::json::parse(res->body); + if (resjson["access"] == "reject") { + response.set_content(resjson.dump().c_str(), JSON_TYPE); + return; + } + std::ofstream dnsserversfile("/etc/dnsmasq.conf.d/resolv.conf"); + nlohmann::json servers = json_body["servers"]; + for (nlohmann::json_abi_v3_11_3::json server : servers) { + std::string srv = server; + dnsserversfile << "nameserver " << srv << "\n"; + } + dnsserversfile.close(); + system("/etc/init.d/dnsmasq restart"); + std::string responsedata = R"({"success":"true"})"; + response.set_content(responsedata, JSON_TYPE); + } +} diff --git a/src/web/css/notification.css b/src/web/css/notification.css index 4b88067..d9e6707 100644 --- a/src/web/css/notification.css +++ b/src/web/css/notification.css @@ -1,3 +1,13 @@ +.notificationsection { + width: max-content; + height: 100vh; + position: fixed; + top: 0; + right: 0; + pointer-events: none; + z-index: 1; +} + .notification { width: max-content; height: 0; @@ -5,7 +15,7 @@ pointer-events: none; z-index: 10; border-radius: 10px; - position: fixed; + /* position: fixed; */ top: 0; right: 0; transition: 0.3s; diff --git a/src/web/css/settings.css b/src/web/css/settings.css index 3e58f68..5033aec 100644 --- a/src/web/css/settings.css +++ b/src/web/css/settings.css @@ -92,18 +92,20 @@ .settingrectbody { width: 100%; - height: 0; + max-height: 0; overflow: hidden; transition: 0.3s; } .settingrectbody.active { - height: max-content; + max-height: 500px; + overflow-y: auto; } .settingrectbody>table { width: 100%; text-align: left; + transition: 0.3s; } .settingrectfooter { @@ -113,10 +115,27 @@ gap: 10px; } -.settingrectfooter>button { +.settingrectfooter.onebutton { + gap: 0; +} + +.settingrectfooterbutton { width: 100%; } +.hiddenbutton { + width: 0; + overflow: hidden; + padding: 0; + margin: 0; +} + +.hiddenbutton.active { + position: relative; + width: 100%; + padding: 10px; +} + table { width: 100%; border: 2px solid ; @@ -133,6 +152,9 @@ tbody>tr>th { border: 2px solid; padding: 10px; border-radius: 10px; + display: flex; + align-items: center; + justify-content: space-between; } @media screen and (max-width: 1200px) { diff --git a/src/web/index.html b/src/web/index.html index 56717cc..2e1d4f1 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -55,34 +55,34 @@
- - + +
- +
-

Dns

+

DNS

-
+
- +
dns servers
DNS servers
- - + +
- +
@@ -93,7 +93,7 @@
- +
@@ -102,11 +102,7 @@ -
-
-

-
-
+
@@ -129,7 +125,7 @@
-

Confirm dns settings?

+

Confirm DNS settings?

@@ -137,9 +133,24 @@
+ +
+
+

Add DNS server

+
+ + +
+
+ + +
+
+
+
-

Reboting

+

Reboting

@@ -147,6 +158,7 @@ + diff --git a/src/web/js/loader.js b/src/web/js/loader.js new file mode 100644 index 0000000..22e211f --- /dev/null +++ b/src/web/js/loader.js @@ -0,0 +1,13 @@ +const loader = document.querySelector('.loader') +const loaderheader = document.querySelector('#loaderheader') + +const defaultloaderheader = "" + +const start_loader = (header = defaultloaderheader) => { + loaderheader.innerHTML = header + loader.classList.add('active') +} + +const stop_loader = () => { + loader.classList.remove('active') +} \ No newline at end of file diff --git a/src/web/js/notification.js b/src/web/js/notification.js index 52b1e91..4bb0196 100644 --- a/src/web/js/notification.js +++ b/src/web/js/notification.js @@ -1,7 +1,19 @@ -const notificationbox = document.querySelector('.notification') -const notificationtext = document.querySelector('.notificationtext') +const notificationsection = document.querySelector('.notificationsection') +// const notificationtext = document.querySelector('.notificationtext') const notification = (text, type) => { + const notificationbox = document.createElement('div') + const notificationtextbox = document.createElement('div') + const notificationtext = document.createElement('h3') + notificationtext.classList.add('notificationtext') + notificationtextbox.append(notificationtext) + notificationtextbox.classList.add('notificationtextbox') + notificationbox.append(notificationtextbox) + notificationbox.classList.add('notification') + notificationbox.addEventListener('click', () => { + notificationbox.classList.remove('active') + }) + notificationsection.append(notificationbox) if (type === "error") { notificationbox.classList.remove('success') notificationbox.classList.add('error') @@ -10,14 +22,19 @@ const notification = (text, type) => { notificationbox.classList.add('success') } notificationtext.innerHTML = text - notificationbox.classList.add('active') + setTimeout(() => { + notificationbox.classList.add('active') + }, 300) setTimeout(() => { notificationbox.classList.remove('active') - }, 2000) + setTimeout(() => { + notificationsection.removeChild(notificationbox) + }, 200) + }, 3000) } -const closenotification = () => { - notificationbox.classList.remove('active') -} +// const closenotification = () => { + // notificationbox.classList.remove('active') +// } -notificationbox.addEventListener('click', closenotification) \ No newline at end of file +// notificationbox.addEventListener('click', closenotification) \ No newline at end of file diff --git a/src/web/js/reboot.js b/src/web/js/reboot.js index 206c626..c64ec4b 100644 --- a/src/web/js/reboot.js +++ b/src/web/js/reboot.js @@ -1,5 +1,4 @@ const rebootbutton = document.querySelector('#rebootbutton') -const loader = document.querySelector('.loader') rebootbutton.addEventListener('click', () => { get_confirm_form("Confirm reboot?", reboot) @@ -13,7 +12,7 @@ const reboot = () => { }).then(data => data.json()).then(jsondata => { }).catch((error) => { - loader.classList.add('active') + start_loader("Rebooting") setTimeout(waitreboot, 2000) }) } @@ -23,7 +22,7 @@ const waitreboot = () => { method: 'POST', body: `{"token":"${localStorage.getItem("token")}"}` }).then(res => res.json()).then(jsondata => { - loader.classList.remove('active') + stop_loader() }).catch((error) => { waitreboot() }) diff --git a/src/web/js/routes.js b/src/web/js/routes.js index 08e2f6c..049ad4c 100644 --- a/src/web/js/routes.js +++ b/src/web/js/routes.js @@ -1,4 +1,4 @@ -const authhost = 'http://192.168.0.110:43243' +const authhost = 'http://172.20.10.2:43243' const host = window.location.origin const prefix = 'api' @@ -11,6 +11,7 @@ const routes = { dns_status: () => [host, prefix, 'settings', 'dns', 'get'].join('/'), dns_status_set: () => [host, prefix, 'settings', 'dns', 'set'].join('/'), dns_servers_get: () => [host, prefix, 'settings', 'dns', 'servers', 'get'].join('/'), + dns_servers_set: () => [host, prefix, 'settings', 'dns', 'servers', 'set'].join('/'), ftp_status: () => [host, prefix, 'settings', 'ftp', 'get'].join('/'), ftp_status_set: () => [host, prefix, 'settings', 'ftp', 'set'].join('/'), diff --git a/src/web/js/settings/confirm.js b/src/web/js/settings/confirm.js index c6f57ce..1f3c55a 100644 --- a/src/web/js/settings/confirm.js +++ b/src/web/js/settings/confirm.js @@ -3,12 +3,17 @@ const confirmformheader = document.querySelector('#confirmformheader') const cancelbutton = document.querySelector('#cancel') const confirmformbuttons = document.querySelector('#confirmformbuttons') -const get_confirm_form = (header, reqfunc) => { +const defaultcancelreqfunc = () => { + confirmform.classList.remove('active') +} + +const get_confirm_form = (header, reqfunc = defaultcancelreqfunc, cancelreqfunc = defaultcancelreqfunc) => { console.log("confirmform") confirmformheader.innerHTML = header console.log("confirmformheader") confirmform.classList.add('active') console.log("activeconfirmform") + var confirmbutton = document.createElement('button') confirmbutton.classList.add('formbutton') confirmbutton.id = "confirm" @@ -18,8 +23,14 @@ const get_confirm_form = (header, reqfunc) => { confirmform.classList.remove('active') }) confirmformbuttons.replaceChild(confirmbutton, document.querySelector('#confirm')) -} -cancelbutton.addEventListener('click', () => { - confirmform.classList.remove('active') -}) + var cancelbutton = document.createElement('button') + cancelbutton.classList.add('formbutton') + cancelbutton.id = "cancel" + cancelbutton.innerHTML = "Cancel" + cancelbutton.addEventListener('click', () => { + cancelreqfunc() + confirmform.classList.remove('active') + }) + confirmformbuttons.replaceChild(cancelbutton, document.querySelector('#cancel')) +} diff --git a/src/web/js/settings/dns.js b/src/web/js/settings/dns.js index 9044bc1..7278e05 100644 --- a/src/web/js/settings/dns.js +++ b/src/web/js/settings/dns.js @@ -3,6 +3,14 @@ const setdnssettingsbutton = document.querySelector('#set_dns_settings') const dnssettingbody = document.querySelector('#dnssettingsbody') const dnsserverstablebody = document.querySelector('#dnsserverstablebody') +const adddnsserverbutton = document.querySelector('#add_dns_server_button') +const adddnsserverform = document.querySelector('#adddnsserverform') +const adddnsservercancelbutton = document.querySelector('#adddnsservercancel') +const adddnsserverconfirmbutton = document.querySelector('#adddnsserverconfirm') +const adddnsserverinput = document.querySelector('#adddnsserverinput') + +let dnsservers = [] + const get_dns_enabled_status = () => { fetch(routes.dns_status(), { method: 'POST', @@ -12,7 +20,11 @@ const get_dns_enabled_status = () => { if (jsondata.enabled === '1') { dnsenabled.checked = true dnssettingbody.classList.add('active') + adddnsserverbutton.classList.add('active') + // adddnsserverbutton.parentElement.classList.remove('onebutton') return; + } else { + adddnsserverbutton.parentElement.classList.add('onebutton') } }).catch((error) => { notification(`Ошибка на сервере: ${error}`, "error") @@ -27,6 +39,7 @@ const set_dns_enabled_status = () => { if (jsondata.enabled === '1') { dnsenabled.checked = true dnssettingbody.classList.add('active') + adddnsserverbutton.classList.add('active') } notification("Настройки dns сохранены", "success") }).catch((error) => { @@ -34,16 +47,25 @@ const set_dns_enabled_status = () => { }) } +const set_dns_settings = () => { + set_dns_enabled_status() + set_dns_server() +} + setdnssettingsbutton.addEventListener('click', () =>{ - get_confirm_form("Confirm dns settings?", set_dns_enabled_status) + get_confirm_form("Confirm DNS settings?", set_dns_settings) }) dnsenabled.addEventListener('click', () => { if (dnsenabled.checked) { dnssettingbody.classList.add('active') + adddnsserverbutton.classList.add('active') + adddnsserverbutton.parentElement.classList.remove('onebutton') get_dns_server() } else { dnssettingbody.classList.remove('active') + adddnsserverbutton.classList.remove('active') + adddnsserverbutton.parentElement.classList.add('onebutton') } }) @@ -53,10 +75,61 @@ const get_dns_server = () => { body: `{"token":"${localStorage.getItem("token")}"}` }).then(res => res.json()).then(jsondata => { console.log(jsondata) + dnsservers = jsondata.servers + dnsserverstablebody.innerHTML = "" for (const server in jsondata.servers) { - dnsserverstablebody.innerHTML += `${jsondata.servers[server]}` + dnsserverstablebody.innerHTML += `${jsondata.servers[server]} ` } }).catch((error) => { notification(`Ошибка на сервере: ${error}`, "error") }) } + +const set_dns_server = () => { + start_loader("Load DNS") + console.log(`{"token":"${localStorage.getItem('token')}","servers":${JSON.stringify(dnsservers)}}`) + fetch(routes.dns_servers_set(), { + method: 'POST', + body: `{"token":"${localStorage.getItem('token')}","servers":${JSON.stringify(dnsservers)}}` + }).then(data => data.json()).then(jsondata => { + stop_loader() + jsondata.success ? get_dns_server() : notification("Неизвестная ошибка", "error") + }).catch((error) => { + notification(`Ошибка на сервере: ${error}`, "error") + }) + adddnsserverinput.value = "" +} + +const cancel_add_dns_server = () => { + adddnsserverform.classList.remove('active') + adddnsserverinput.value = "" +} + +const cancel_confirm_add_dns_server = () => { + confirmform.classList.remove('active') + adddnsserverform.classList.add('active') +} + +adddnsserverbutton.addEventListener('click', () => { + adddnsserverform.classList.add('active') +}) + +adddnsservercancelbutton.addEventListener('click', cancel_add_dns_server) + +adddnsserverconfirmbutton.addEventListener('click', () => { + adddnsserverform.classList.remove('active') + if (adddnsserverinput.value === "") { + return + } + dnsservers.push(adddnsserverinput.value) + get_confirm_form(`Confirm DNS settings? (Add DNS server: ${adddnsserverinput.value})`, set_dns_server, cancel_confirm_add_dns_server) +}) + +dnsserverstablebody.addEventListener('click', (e) => { + if (e.target.classList.contains('deldnsserverbutton')) { + dnsservers.splice(dnsservers.indexOf(e.target.id), 1) + set_dns_server() + console.log('del', e.target.id) + get_dns_server() + } +}) diff --git a/src/web/js/settings/telnet.js b/src/web/js/settings/telnet.js index 1b03cf3..98bf9e4 100644 --- a/src/web/js/settings/telnet.js +++ b/src/web/js/settings/telnet.js @@ -1,6 +1,7 @@ const telnetenabled = document.querySelector('#telnetenable') const telnetsettingbody = document.querySelector('.telnetsettingbody') const settelnetsettingsbutton = document.querySelector('#set_telnet_settings') +const addtelnetuserbutton = document.querySelector('#add_telnet_user_button') const get_telnet_enabled_status = () => { fetch(routes.telnet_status(), { @@ -10,8 +11,12 @@ const get_telnet_enabled_status = () => { console.log(jsondata) if (jsondata.enabled === '1') { telnetenabled.checked = true + addtelnetuserbutton.classList.add('active') + addtelnetuserbutton.parentElement.classList.remove('onebutton') // telnetsettingbody.classList.add('active') return; + } else { + addtelnetuserbutton.parentElement.classList.add('onebutton') } }).catch((error) => { notification(`Ошибка на сервере: ${error}`, "error") @@ -35,9 +40,13 @@ const set_telnet_enabled_status = () => { telnetenabled.addEventListener('click', () => { if (telnetenabled.checked) { + addtelnetuserbutton.classList.add('active') + addtelnetuserbutton.parentElement.classList.remove('onebutton') // telnetsettingbody.classList.add('active') } else { telnetsettingbody.classList.remove('active') + addtelnetuserbutton.classList.remove('active') + addtelnetuserbutton.parentElement.classList.add('onebutton') } })