Files
ma/src/client_backend/update.cpp
2024-05-21 18:51:27 +02:00

194 lines
6.7 KiB
C++

/*
This file contains the functions to update the cyberhex system. And its components
Functions:
- update_system(): This function updates the cyberhex system.
- update_yara(): This function updates the yara databases.
- update_db2(): This function updates the sig databases.
- update_db(): This function updates the databases. Calls update_db2()
- update_settings(): This function updates the settings.
- action_update_settings(): This function updates the settings. if caled by scheduler
- action_update_db(): This function updates the databases. if called by scheduler
*/
#ifndef UPDATE_CPP
#define UPDATE_CPP
#include "update.h"
#include "log.h"
#include "connect.h"
#include "settings.h"
#include "security.h"
#include "app_ctrl.h"
#include "utils.h"
#include <string>
#include <iostream>
#include <cctype>
#include <filesystem>
#include "zip.h"
int update_system() {
thread_init();
log(LOGLEVEL::INFO, "[update_system()]: Updating system");
//update cyberhex executables
//we will download them from the jakach server, not the companys server
//download version of cyberhex. because we do not know, if a new one is available.
std::string url = JAKACH_UPDATE_SRV;
url += "version.txt";
int res = 0;
char*server_response = new char[100];
if (connect_to_srv(url, server_response, 100, 0) != 0 ) {
log(LOGLEVEL::ERR, "[update_system()]: Error downloading cyberhex version file from server. ERROR:");
}
else if (atoi(server_response) > CURRENT_VERSION) {
std::string url = JAKACH_UPDATE_SRV;
url += "cyberhex_latest.exe";
std::string output_path = APP_DIR;
output_path += "\\cyberhex_latest.exe";
res = download_file_from_srv(url, output_path, 0, 1);
if (res != 0) {
log(LOGLEVEL::ERR, "[update_system()]: Error downloading cyberhex update file from server. ERROR:", res);
return 1; // Error downloading file
}
//download the updater
url = JAKACH_UPDATE_SRV;
url += "cyberhex_update.exe";
output_path = APP_DIR;
output_path += "\\cyberhex_update.exe";
res = download_file_from_srv(url, output_path, 0, 1);
if (res != 0) {
log(LOGLEVEL::ERR, "[update_system()]: Error downloading cyberhex update file from server. ERROR:", res);
return 1; // Error downloading file
}
//start the update executable, which will install the new version of cyberhex
log(LOGLEVEL::INFO, "[update_system()]: Downloaded update files. Starting the update executable. Cyberhex will now be terminated!");
startup(output_path.c_str());
log(LOGLEVEL::INFO, "[update_system()]: Update executable started. Cyberhex will now be terminated!");
exit(0);
}
else {
log(LOGLEVEL::INFO, "[update_system()]: No new version of cyberhex available.");
}
thread_shutdown();
return 0;
}
int update_yara(const std::string& folder_path) {
//remove the old databases
std::string path = folder_path + "\\";
delete_all_files(folder_path); //remove all files in the folder
std::string url = get_setting_string("server:server_url");
if (url.empty() || url == "nan") {
return 2; // Invalid server URL
}
url += "/database_srv/yara.zip";
std::string output_path = folder_path + "\\" + "yara.zip";
int res = download_file_from_srv(url, output_path, get_setting("communication:unsafe_tls"), 1);
if (res != 0) {
return 10; // Error downloading file
}
//unzip the file
unzip(output_path, folder_path);
return 0;
}
int update_db2(const std::string&folder_path) {
//remove the old databases
std::string path = folder_path + "\\";
delete_all_files(folder_path); //remove all files in the folder
std::string url = get_setting_string("server:server_url");
if (url.empty() || url == "nan") {
return 2; // Invalid server URL
}
url += "/database_srv/sig.zip";
std::string output_path = folder_path + "\\" + "sig.zip";
int res = download_file_from_srv(url, output_path, get_setting("communication:unsafe_tls"), 1);
if (res != 0) {
return 10; // Error downloading file
}
//unzip the file
unzip(output_path, folder_path);
return 0;
}
int update_db(const std::string& folder_path) {
//check if we have connection to the server
char*buffer=new char [100];
std::string output_path = folder_path + "\\" + "test.tmp";
if (download_file_from_srv(get_setting_string("server:server_url"), output_path, get_setting("communication:unsafe_tls"), 1)!=0) {
log(LOGLEVEL::ERR, "[update_db()]: Error connecting to server.");
return 1; // Error connecting to server
}
delete buffer;
update_yara(YARA_DB_DIR); //update the yara databases
return update_db2(folder_path); //redirect to the new update funtion
return 0;
}
int update_settings(const std::string& settings_type) {
// Create the strings to download the files
std::string url = get_setting_string("server:server_url");
if (url.empty() || url == "nan") {
return 2; // Invalid server URL
}
url += "/api/php/settings/get_settings.php?";
url += settings_type + "&machine_id=" + get_machineid(SECRETS) + "&apikey=" + get_apikey(SECRETS);
int res = 1;
if (settings_type == "settings")
res = download_file_from_srv(url, SETTINGS_DB, get_setting("communication:unsafe_tls"),0);
else if (settings_type == "rtp_included")
res = download_file_from_srv(url, INCLUDED_FOLDERS, get_setting("communication:unsafe_tls"),0);
else if (settings_type == "rtp_excluded")
res = download_file_from_srv(url, EXCLUDED_FOLDERS, get_setting("communication:unsafe_tls"),0);
else if (settings_type == "sched")
res = download_file_from_srv(url, SCHED_PATH, get_setting("communication:unsafe_tls"),0);
else if (settings_type == "disallowed_start")
res = download_file_from_srv(url, DISALLOWED_START_FOLDERS, get_setting("communication:unsafe_tls"), 0);
if (res != 0) {
log(LOGLEVEL::ERR, "[update_settings()]: Error downloading settings database file from server. ERROR:", res);
return 1; // Error downloading file
}
return 0;
}
int action_update_settings() {
// Update the settings
int err = 0;
if (update_settings("settings") != 0)
err = 1;
// Update the included folders
if (update_settings("rtp_included") != 0)
err = 2;
// Update the excluded folders
if (update_settings("rtp_excluded") != 0)
err = 3;
// Update the schedule
if (update_settings("sched") != 0)
err = 4;
return err;
}
int action_update_db() {
// Update the databases
return update_db(DB_DIR);
}
#endif // UPDATE_CPP