Adjust app introduce port changinf logic and process file processing fuctnions + adjust drawio file diagramm

This commit is contained in:
Hepatica
2024-08-17 00:09:51 +02:00
parent 9215ad7a8f
commit 2356358163
8 changed files with 267 additions and 350 deletions

View File

@@ -21,29 +21,6 @@ public:
{
std::string auth_code_processed = extract_code(auth_code);
//std::string body = "client_id=1273414933874479185&"//Todo delete comments if not needed
// "client_secret=S_vG4frjlxWoi8mic_GlcxUO0aWxXwRJ&"
// "grant_type=authorization_code&"
// "code=" + auth_code_processed + "&"
// "redirect_uri=https://www.sp-donate.ru/pay/Hepatir";
//httplib::Headers headers = {
// {"Content-Type", "application/x-www-form-urlencoded"}
//};
//httplib::Client client("discord.com/api");
////// Выполняем простой GET-запрос на http://httpbin.org/get
////auto res = client.Get("/get");
//auto res = client.Post("/oauth2/token", headers, body, "application/x-www-form-urlencoded");
////auto res = client_.Post("/oauth2/token", headers, body, "application/x-www-form-urlencoded");
//if (res && res->status == 200) {
// return res->body;
//}
//else {
// return "Error: ";//Todo write handling this
//}
std::string command = "curl --location https://discord.com/api/oauth2/token "
"--header \"Content-Type: application/x-www-form-urlencoded\" "
"--data-urlencode \"client_id=1273414933874479185\" "
@@ -62,19 +39,6 @@ public:
auto me_request = std::async(std::launch::async, &DiscordService::execute_command, this, command);
//httplib::Headers headers = {
// {"Authorization", "Bearer " + access_token}
//};
//auto res = client_.Get("/users/@me", headers);
//if (res && res->status == 200) {
// return res->body;
//}
//else {
// return "Error: ";//Todo write handling this
//}
std::string user_id = extract_user_id(me_request.get());
return user_id;
@@ -107,35 +71,16 @@ public:
return result;
}
//std::string extract_user_id(const std::string& input) {
// std::string search_pattern = "\"discord_id\":\"";
// std::size_t start_pos = input.find(search_pattern);
// if (start_pos == std::string::npos) {
// throw std::runtime_error("discord_id not found");
// }
// start_pos += search_pattern.length(); // move to the start of the user_id
// std::size_t end_pos = input.find("\"", start_pos);
// if (end_pos == std::string::npos) {
// throw std::runtime_error("End of discord_id not found");
// }
// return input.substr(start_pos, end_pos - start_pos);
//}
std::string extract_code(const std::string& json_str) {
std::string key = "\"code\":";
size_t start = json_str.find(key);
if (start != std::string::npos) {
start += key.length();
// Пропускаем любые пробелы или символы ':'
while (start < json_str.length() && (json_str[start] == ' ' || json_str[start] == '\"' || json_str[start] == ':')) {
start++;
}
// Найти конец строки
size_t end = json_str.find('\"', start);
if (end != std::string::npos) {
return json_str.substr(start, end - start);
@@ -154,6 +99,6 @@ public:
return response.substr(start_pos, end_pos - start_pos);
}
}
return ""; // Вернуть пустую строку, если токен не найден
return "";
}
};

View File

@@ -7,6 +7,7 @@
#include <sys/stat.h>
#include "CommandService.cpp"
#include "Logger.cpp"
#include <string.h>
class FileProcessingService
{
Logger& logger_;
@@ -18,6 +19,79 @@ public:
}
void adjust_nginx_configuration_and_reloud(const std::string& filename, std::string port)
{
std::string file_path = "/etc/nginx/nginx.conf";
std::string new_text =
"server {\n"
" listen 443 ssl;\n"
" server_name " + filename + ".almavid.ru;\n\n"
" ssl_certificate /etc/letsencrypt/live/almavid.ru/fullchain.pem;\n"
" ssl_certificate_key /etc/letsencrypt/live/almavid.ru/privkey.pem;\n"
" ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n"
" ssl_ciphers HIGH:!aNULL:!MD5;\n\n"
" client_max_body_size 2G; // Allow file uploads up to 2GB\n\n"
" location / {\n"
" proxy_pass http://localhost:" + port + ";\n"
" proxy_set_header Host $host;\n"
" proxy_set_header X-Real-IP $remote_addr;\n"
" proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n"
" proxy_set_header X-Forwarded-Proto $scheme;\n\n"
" # Support for WebSocket\n"
" proxy_http_version 1.1;\n"
" proxy_set_header Upgrade $http_upgrade;\n"
" proxy_set_header Connection \"upgrade\";\n"
" }\n\n"
"}\n";
std::ofstream file(file_path, std::ios::app);
if (!file.is_open()) {
logger_.log(INFO, "Error: Could not open file " + file_path + strerror(errno) + '\n');
return;
}
file << new_text << '\n';
file.close();
// Reload Nginx to apply the changes
/*int result = std::system("sudo systemctl reload nginx");
if (result != 0) {
std::cerr << "Error: Failed to reload Nginx" << std::endl;
return 1;
}*/
std::string command = "sudo systemctl reload nginx";
std::thread commandThread(&CommandService::execute_command, command);
commandThread.join();
logger_.log(INFO, "Nginx reloaded successfully.");
}
void delete_file(const std::string& file_path) const
{
try {
// Delete the original file
if (std::filesystem::exists(file_path)) {
std::filesystem::remove(file_path);
logger_.log(INFO, "Deleted file: " + file_path);
}
// Delete the directory recursively//Todo test if method will not work
/*if (std::filesystem::exists(final_files_directory)) {
std::filesystem::remove_all(final_files_directory);
logger_.log(INFO, "Deleted directory: " + final_files_directory);
}*/
}
catch (const std::filesystem::filesystem_error& e) {
logger_.log(ERROR, "Error during deletion: " + std::string(e.what()));
}
}
bool save_file(const std::string& filename, const std::string& content) {
logger_.log(INFO, "Start saving file method");
@@ -35,6 +109,48 @@ public:
return ofs.good();
}
void create_service_file(std::string name)
{
logger_.log(INFO, "Start create_service_file");
std::string filename = "/etc/systemd/system/" + name + ".service";
std::ofstream serviceFile(filename);
if (serviceFile.is_open()) {
serviceFile << "[Unit]\n";
serviceFile << "Description=" << name << " Service\n";
serviceFile << "After=network.target\n\n";
serviceFile << "[Service]\n";
serviceFile << "ExecStart=/home/danilt2000/SpCloud/" + name + "/build/ " + name + "\n";
//serviceFile << "ExecStart=/home/danilt2000/SpCloud/SpCloudMain/build/SpCloudMain\n";
serviceFile << "WorkingDirectory=/home/danilt2000/SpCloud/" + name + "/build\n";
//serviceFile << "WorkingDirectory=/home/danilt2000/SpCloud/SpCloudMain/build\n";
serviceFile << "Restart=always\n";
serviceFile << "User=danilt2000\n";
serviceFile << "Environment=PATH=/usr/bin\n";
serviceFile << "Environment=NODE_ENV=production\n\n";
serviceFile << "[Install]\n";
serviceFile << "WantedBy=multi-user.target\n";
std::string command = "sudo systemctl daemon-reload";
std::thread commandThread(&CommandService::execute_command, command);
commandThread.join();
//Todo check service ->sudo systemctl status <service-name>.service
serviceFile.close();
logger_.log(INFO, "Service file " + filename + " created successfully.\n");
}
else {
logger_.log(INFO, "Unable to open file " + filename + " for writing: " + strerror(errno) + "\n");
}
}
void create_directory(const std::string& path) {
std::filesystem::create_directories(path);
}
@@ -60,8 +176,4 @@ public:
}
return ""; //todo add throwing exception
}
/*private:
std::mutex file_mutex; */// Мьютекс для синхронизации доступа к файлу
};

View File

@@ -86,6 +86,34 @@ public:
return "Success";
}
std::string is_app_name_free(std::string name)
{
std::string json_data = R"({
"dataSource": "SpCloudCluster",
"database": "SpCloud",
"collection": "Apps",
"filter": {
"name": ")" + name + R"("
}
})";
std::string command = "curl --location 'https://eu-central-1.aws.data.mongodb-api.com/app/data-zvcqvrr/endpoint/data/v1/action/findOne' "
"--header 'Content-Type: application/json' "
"--header 'api-key: Q1NfSCrruUAzsxdrjhZd3sjSwiqbdSFmCLeaCatZiuohUXsvEq9RtEAeG0JL2Jd7' "
"--data-raw '" + json_data + "'";
auto request = std::async(std::launch::async, &MongoDbService::execute_command, this, command);
std::string response = request.get();
if (response == "{\"document\":null}")
{
return "Success";
}
return "App name isn't free please select another one";
}
std::string add_app(std::string name, std::string user_id, std::string url, std::string url_on_local_mahcine, std::string target)
{
std::string json_data = R"({