From 0a87be4d5908f91c38e3ea4a8cb67ec04b66b393 Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Thu, 27 Jun 2024 14:50:57 +0700 Subject: [PATCH] added ftp and auto update --- CMakeLists.txt | 1 + auto_update/auto_update.sh | 14 +++++ src/openrouter.cpp | 3 ++ src/settings/ftp/ftp.cpp | 95 ++++++++++++++++++++++++++++++++++ src/settings/ftp/ftp.hpp | 9 ++++ src/web/index.html | 71 ++++++++++++++----------- src/web/js/reboot.js | 16 +----- src/web/js/routes.js | 3 ++ src/web/js/settings/confirm.js | 25 +++++++++ src/web/js/settings/dns.js | 18 ++----- src/web/js/settings/ftp.js | 39 ++++++++++++++ src/web/js/settings/telnet.js | 23 +++----- 12 files changed, 241 insertions(+), 76 deletions(-) create mode 100755 auto_update/auto_update.sh create mode 100644 src/settings/ftp/ftp.cpp create mode 100644 src/settings/ftp/ftp.hpp create mode 100644 src/web/js/settings/confirm.js create mode 100644 src/web/js/settings/ftp.js diff --git a/CMakeLists.txt b/CMakeLists.txt index b563328..6290b2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable( src/settings/telnet/telnet.cpp src/settings/dns/dns.cpp + src/settings/ftp/ftp.cpp src/reboot/reboot.cpp ) diff --git a/auto_update/auto_update.sh b/auto_update/auto_update.sh new file mode 100755 index 0000000..b2405ff --- /dev/null +++ b/auto_update/auto_update.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +Green='\033[0;32m' +Color_off='\033[0m' +Red='\033[0;31m' + +if [ ! -f IP ]; then + printf "[$Red ERR $Color_off] Cant't find IP file\n" + exit 1 +fi + + + + diff --git a/src/openrouter.cpp b/src/openrouter.cpp index 62b2404..df19deb 100644 --- a/src/openrouter.cpp +++ b/src/openrouter.cpp @@ -3,6 +3,7 @@ #include #include "settings/telnet/telnet.hpp" #include "settings/dns/dns.hpp" +#include "settings/ftp/ftp.hpp" #include "reboot/reboot.hpp" #define CORS_ENABLE @@ -15,6 +16,8 @@ int main() { srv.Post("/api/settings/telnet/set", set_telnet); srv.Post("/api/settings/dns/get", get_dns); srv.Post("/api/settings/dns/set", set_dns); + srv.Post("/api/settings/ftp/get", get_ftp); + srv.Post("/api/settings/ftp/set", set_ftp); srv.Post("/api/reboot", reboot); diff --git a/src/settings/ftp/ftp.cpp b/src/settings/ftp/ftp.cpp new file mode 100644 index 0000000..69f32c4 --- /dev/null +++ b/src/settings/ftp/ftp.cpp @@ -0,0 +1,95 @@ +#include "ftp.hpp" +#include +#include +#include "../../routes.hpp" +#include "../../types.hpp" + +#define FTP_REQUIRED_STRING R"({"required":"[token,enabled]"})" + +void get_ftp(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::ifstream ftpfile("/etc/openrouter/ftp"); + int ftp_enabled; + ftpfile >> ftp_enabled; + ftpfile.close(); + std::stringstream responsedata; + responsedata << R"({"enabled":")" << ftp_enabled << R"("})"; + response.set_content(responsedata.str(), JSON_TYPE); + } +} + +void set_ftp(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; + } + + if (json_body["enabled"] == nullptr) { + response.set_content(FTP_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 ftpfileout("/etc/openrouter/ftp"); + std::string new_ftp_enabled = json_body["enabled"]; + if (new_ftp_enabled == "0") { + system("/etc/init.d/ftp stop"); + system("rm /etc/rc.d/90ftp"); + } else { + system("/etc/init.d/ftp start"); + system("ln -sv /etc/init.d/ftp /etc/rc.d/90ftp"); + } + ftpfileout << stoi(new_ftp_enabled); + ftpfileout.close(); + std::ifstream ftpfile("/etc/openrouter/ftp"); + int ftp_enabled; + ftpfile >> ftp_enabled; + ftpfile.close(); + std::stringstream responsedata; + responsedata << R"({"enabled":")" << ftp_enabled << R"("})"; + response.set_content(responsedata.str(), JSON_TYPE); + } +} diff --git a/src/settings/ftp/ftp.hpp b/src/settings/ftp/ftp.hpp new file mode 100644 index 0000000..0139558 --- /dev/null +++ b/src/settings/ftp/ftp.hpp @@ -0,0 +1,9 @@ +#ifndef FTP_HPP +#define FTP_HPP + +#include + +void get_ftp(const httplib::Request &request, httplib::Response &response); +void set_ftp(const httplib::Request &request, httplib::Response &response); + +#endif // FTP_HPP \ No newline at end of file diff --git a/src/web/index.html b/src/web/index.html index 0e12189..deccc8a 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -14,6 +14,7 @@
+
- + +
+

Telnet

@@ -56,6 +59,8 @@
+ +

Dns

@@ -68,15 +73,33 @@
+ + +
+
+

Ftp

+
+ +
+
+
+ + +
+
+
+
+

- + +

OpenRouter Login

@@ -93,49 +116,35 @@
- -
-
-

Confirm reboot?

-
- - + + +
+
+

Confirm dns settings?

+
+ +
- -
-
-

Confirm telnet settings?

-
- - -
-
-
- -
-
-

Confirm dns settings?

-
- - -
-
-
- + +

Reboting

- + + + + + \ No newline at end of file diff --git a/src/web/js/reboot.js b/src/web/js/reboot.js index ee92682..206c626 100644 --- a/src/web/js/reboot.js +++ b/src/web/js/reboot.js @@ -1,11 +1,8 @@ const rebootbutton = document.querySelector('#rebootbutton') -const confirmrebootform = document.querySelector('.confirmrebootform') -const cancelrebootbutton = document.querySelector('#cancelreboot') -const confirmrebootbutton = document.querySelector('#confirmreboot') const loader = document.querySelector('.loader') rebootbutton.addEventListener('click', () => { - confirmrebootform.classList.add('active') + get_confirm_form("Confirm reboot?", reboot) }) const reboot = () => { @@ -16,20 +13,11 @@ const reboot = () => { }).then(data => data.json()).then(jsondata => { }).catch((error) => { - // notification(`Перезагрузка`, "success") - confirmrebootform.classList.remove('active') - // window.location.replace(window.location.origin) loader.classList.add('active') - waitreboot() + setTimeout(waitreboot, 2000) }) } -cancelrebootbutton.addEventListener('click', () => { - confirmrebootform.classList.remove('active') -}) - -confirmrebootbutton.addEventListener('click', reboot) - const waitreboot = () => { fetch(routes.telnet_status(), { method: 'POST', diff --git a/src/web/js/routes.js b/src/web/js/routes.js index 04dd8f7..bdabb99 100644 --- a/src/web/js/routes.js +++ b/src/web/js/routes.js @@ -9,6 +9,9 @@ const routes = { telnet_status_set: () => [host, prefix, 'settings', 'telnet', 'set'].join('/'), dns_status: () => [host, prefix, 'settings', 'dns', 'get'].join('/'), dns_status_set: () => [host, prefix, 'settings', 'dns', 'set'].join('/'), + ftp_status: () => [host, prefix, 'settings', 'ftp', 'get'].join('/'), + ftp_status_set: () => [host, prefix, 'settings', 'ftp', 'set'].join('/'), + reboot: () => [host, prefix, 'reboot'].join('/') // all_users: () => [host, prefix, 'users', 'all'].join('/'), // access: () => [host, prefix, 'access'].join('/'), diff --git a/src/web/js/settings/confirm.js b/src/web/js/settings/confirm.js new file mode 100644 index 0000000..c6f57ce --- /dev/null +++ b/src/web/js/settings/confirm.js @@ -0,0 +1,25 @@ +const confirmform = document.querySelector('#confirmform') +const confirmformheader = document.querySelector('#confirmformheader') +const cancelbutton = document.querySelector('#cancel') +const confirmformbuttons = document.querySelector('#confirmformbuttons') + +const get_confirm_form = (header, reqfunc) => { + 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" + confirmbutton.innerHTML = "Confirm" + confirmbutton.addEventListener('click', () => { + reqfunc() + confirmform.classList.remove('active') + }) + confirmformbuttons.replaceChild(confirmbutton, document.querySelector('#confirm')) +} + +cancelbutton.addEventListener('click', () => { + confirmform.classList.remove('active') +}) diff --git a/src/web/js/settings/dns.js b/src/web/js/settings/dns.js index 9ab34bc..1da6f6c 100644 --- a/src/web/js/settings/dns.js +++ b/src/web/js/settings/dns.js @@ -1,14 +1,12 @@ const dnsenabled = document.querySelector('#dnsenable') const setdnssettingsbutton = document.querySelector('#set_dns_settings') -const confirmdnsform = document.querySelector('.confirmdnsform') -const canceldnsbutton = document.querySelector('#canceldns') -const confirmdnsbutton = document.querySelector('#confirmdns') const get_dns_enabled_status = () => { fetch(routes.dns_status(), { method: 'POST', body: `{"token":"${localStorage.getItem("token")}"}` }).then(res => res.json()).then(jsondata => { + console.log(jsondata) if (jsondata.enabled === '1') { dnsenabled.checked = true // dnssettingbody.classList.add('active') @@ -21,10 +19,10 @@ const get_dns_enabled_status = () => { get_dns_enabled_status() -const set_dns_enabled_status = (status) => { +const set_dns_enabled_status = () => { fetch(routes.dns_status_set(), { method: 'POST', - body: `{"token":"${localStorage.getItem("token")}","enabled":"${status?1:0}"}` + body: `{"token":"${localStorage.getItem("token")}","enabled":"${dnsenabled.checked?1:0}"}` }).then(res => res.json()).then(jsondata => { if (jsondata.enabled === '1') { dnsenabled.checked = true @@ -37,13 +35,5 @@ const set_dns_enabled_status = (status) => { } setdnssettingsbutton.addEventListener('click', () =>{ - confirmdnsform.classList.add('active') -}) -canceldnsbutton.addEventListener('click', () => { - confirmdnsform.classList.remove('active') -}) - -confirmdnsbutton.addEventListener('click', () => { - set_dns_enabled_status(dnsenabled.checked) - confirmdnsform.classList.remove('active') + get_confirm_form("Confirm dns settings?", set_dns_enabled_status) }) diff --git a/src/web/js/settings/ftp.js b/src/web/js/settings/ftp.js new file mode 100644 index 0000000..cfcd7d8 --- /dev/null +++ b/src/web/js/settings/ftp.js @@ -0,0 +1,39 @@ +const ftpenabled = document.querySelector('#ftpenable') +const setftpsettingsbutton = document.querySelector('#set_ftp_settings') + +const get_ftp_enabled_status = () => { + fetch(routes.ftp_status(), { + method: 'POST', + body: `{"token":"${localStorage.getItem("token")}"}` + }).then(res => res.json()).then(jsondata => { + console.log(jsondata) + if (jsondata.enabled === '1') { + ftpenabled.checked = true + // ftpsettingbody.classList.add('active') + return; + } + }).catch((error) => { + notification(`Ошибка на сервере: ${error}`, "error") + }) +} + +get_ftp_enabled_status() + +const set_ftp_enabled_status = () => { + fetch(routes.ftp_status_set(), { + method: 'POST', + body: `{"token":"${localStorage.getItem("token")}","enabled":"${ftpenabled.checked?1:0}"}` + }).then(res => res.json()).then(jsondata => { + if (jsondata.enabled === '1') { + ftpenabled.checked = true + // ftpsettingbody.classList.add('active') + } + notification("Настройки ftp сохранены", "success") + }).catch((error) => { + notification(`Ошибка на сервере: ${error}`, "error") + }) +} + +setftpsettingsbutton.addEventListener('click', () =>{ + get_confirm_form("Confirm ftp settings?", set_ftp_enabled_status) +}) diff --git a/src/web/js/settings/telnet.js b/src/web/js/settings/telnet.js index 90547c6..51579fd 100644 --- a/src/web/js/settings/telnet.js +++ b/src/web/js/settings/telnet.js @@ -1,15 +1,13 @@ const telnetenabled = document.querySelector('#telnetenable') const telnetsettingbody = document.querySelector('.telnetsettingbody') const settelnetsettingsbutton = document.querySelector('#set_telnet_settings') -const confirmtelnetform = document.querySelector('.confirmtelnetform') -const canceltelnetbutton = document.querySelector('#canceltelnet') -const confirmtelnetbutton = document.querySelector('#confirmtelnet') const get_telnet_enabled_status = () => { fetch(routes.telnet_status(), { method: 'POST', body: `{"token":"${localStorage.getItem("token")}"}` }).then(res => res.json()).then(jsondata => { + console.log(jsondata) if (jsondata.enabled === '1') { telnetenabled.checked = true // telnetsettingbody.classList.add('active') @@ -20,10 +18,12 @@ const get_telnet_enabled_status = () => { }) } -const set_telnet_enabled_status = (status) => { +get_telnet_enabled_status() + +const set_telnet_enabled_status = () => { fetch(routes.telnet_status_set(), { method: 'POST', - body: `{"token":"${localStorage.getItem("token")}","enabled":"${status?1:0}"}` + body: `{"token":"${localStorage.getItem("token")}","enabled":"${telnetenabled.checked?1:0}"}` }).then(res => res.json()).then(jsondata => { if (jsondata.enabled === '1') { telnetenabled.checked = true @@ -35,8 +35,6 @@ const set_telnet_enabled_status = (status) => { }) } -get_telnet_enabled_status() - telnetenabled.addEventListener('click', () => { if (telnetenabled.checked) { // telnetsettingbody.classList.add('active') @@ -46,14 +44,5 @@ telnetenabled.addEventListener('click', () => { }) settelnetsettingsbutton.addEventListener('click', () => { - confirmtelnetform.classList.add('active') -}) - -canceltelnetbutton.addEventListener('click', () => { - confirmtelnetform.classList.remove('active') -}) - -confirmtelnetbutton.addEventListener('click', () => { - set_telnet_enabled_status(telnetenabled.checked) - confirmtelnetform.classList.remove('active') + get_confirm_form("Confirm telnet settings?", set_telnet_enabled_status) })