diff --git a/.gitignore b/.gitignore index 4e45700..e881597 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,65 @@ -build/* -packs/QuasarTools/* +``` +# Compiled and build artifacts +*.o +*.obj +*.out +build/ +dist/ + +# Dependencies +node_modules/ +venv/ +.venv/ +__pycache__/ +.mypy_cache/ +.pytest_cache/ +target/ +.gradle/ -*.kate-swp -*.swap -*.iso -*.img -releases/ +# Logs and temp files *.log -*.o -*.a -*.so *.tmp -framwork/ -regions-* -region-* -region_settings -packs/var.* +*.swp + +# Environment +.env +.env.local +*.env.* + +# Editors +.vscode/ +.idea/ + +# OS specific +.DS_Store +Thumbs.db + +# Coverage +coverage/ +htmlcov/ +.coverage + +# Compressed files +*.zip +*.gz +*.tar +*.tgz +*.bz2 +*.xz +*.7z +*.rar +*.zst +*.lz4 +*.lzh +*.cab +*.arj +*.rpm +*.deb +*.Z +*.lz +*.lzo +*.tar.gz +*.tar.bz2 +*.tar.xz +*.tar.zst +``` \ No newline at end of file diff --git a/main/QuasarLinux/backend/basepack/basepack.hpp b/main/QuasarLinux/backend/basepack/basepack.hpp index 1cbaa43..4919534 100644 --- a/main/QuasarLinux/backend/basepack/basepack.hpp +++ b/main/QuasarLinux/backend/basepack/basepack.hpp @@ -26,6 +26,7 @@ #define BOLD_BRIGHT_WHITE "\033[1;97m" using namespace std; void log(std::string level, std::string message); +void save_progress(const std::string& module, const std::string& action, bool success); void prepart(); void system_settings(); diff --git a/main/QuasarLinux/backend/basepack/main.cpp b/main/QuasarLinux/backend/basepack/main.cpp index 56454a7..4869c11 100644 --- a/main/QuasarLinux/backend/basepack/main.cpp +++ b/main/QuasarLinux/backend/basepack/main.cpp @@ -1,21 +1,59 @@ #include #include +#include #include "basepack.hpp" void log(std::string level, std::string message) { if (level == "debug") { - std::cerr << BOLD_BRIGHT_WHITE << "DEBUG: " << RESET << _(message.c_str()) << std::endl; + std::cerr << BOLD_BRIGHT_WHITE << "DEBUG::basepack:: " << RESET << _(message.c_str()) << std::endl; + } + if (level == "info") { + std::cerr << BLUE << "INFO::basepack:: " << RESET << _(message.c_str()) << std::endl; } if (level == "error") { - std::cerr << RED << "ERR: " << RESET << _(message.c_str()) << std::endl; + std::cerr << RED << "ERR::basepack:: " << RESET << _(message.c_str()) << std::endl; } if (level == "warning") { - std::cerr << YELLOW << "WAR: " << RESET << _(message.c_str()) << std::endl; + std::cerr << YELLOW << "WAR::basepack:: " << RESET << _(message.c_str()) << std::endl; } if (level == "fixme") { - std::cerr << MAGENTA << "FIXME: " << RESET << _(message.c_str()) << std::endl; + std::cerr << MAGENTA << "FIXME::basepack:: " << RESET << _(message.c_str()) << std::endl; + } +} + +void save_progress(const std::string& module, const std::string& action, bool success) { + std::string save_path = "/mnt/save.json"; + std::ifstream file(save_path); + std::string content = "{"; + + if (file.is_open()) { + std::stringstream buffer; + buffer << file.rdbuf(); + content = buffer.str(); + file.close(); + } + + // Simple manual JSON update without jsoncpp + std::ofstream out(save_path); + if (out.is_open()) { + // Remove closing brace and add new entry + if (content.length() > 1 && content.back() == '}') { + content.pop_back(); + if (content.length() > 1) content += ","; + } else { + content = "{"; + } + content += "\"" + module + "\":" + (success ? "true" : "false"); + content += ",\"last_action\":\"" + action + "\""; + content += "}"; + out << content; + out.close(); + log("debug", "Saved progress: " + module + " = " + (success ? "true" : "false")); + } else { + log("error", "Failed to save progress to " + save_path); } } + void prepart() { if (mount("/dev", "/mnt/dev", NULL, MS_BIND, NULL) == -1) { @@ -48,6 +86,11 @@ int main(int argc, char *argv[]) { return 0; } + if (argc < 5) { + log("error", "Not enough arguments!"); + return 1; + } + std::string revision = argv[1]; std::string init = argv[2]; std::string kernel = argv[3]; @@ -55,6 +98,7 @@ int main(int argc, char *argv[]) { // basepack REV openrc linux zram_on log("debug", "Starting setup: init=" + init + " kernel=" + kernel + " zram=" + zram_flag); + save_progress("basepack", "started", true); if (init == "openrc") { openrc_base_system(kernel); @@ -74,9 +118,11 @@ int main(int argc, char *argv[]) { } else { log("error", "Unknown init system: " + init); + save_progress("basepack", "failed", false); return 1; } log("info", "Setup completed!"); + save_progress("basepack", "completed", true); return 0; } diff --git a/main/QuasarLinux/backend/bootloader/Setbootloader.hpp b/main/QuasarLinux/backend/bootloader/Setbootloader.hpp index 38873d6..a3b0e15 100644 --- a/main/QuasarLinux/backend/bootloader/Setbootloader.hpp +++ b/main/QuasarLinux/backend/bootloader/Setbootloader.hpp @@ -26,6 +26,7 @@ namespace fs = std::filesystem; //main void log(std::string level, std::string message); +void save_progress(const std::string& module, const std::string& action, bool success); void prepart(); //grub diff --git a/main/QuasarLinux/backend/bootloader/main.cpp b/main/QuasarLinux/backend/bootloader/main.cpp index 49d8882..81d1fd8 100644 --- a/main/QuasarLinux/backend/bootloader/main.cpp +++ b/main/QuasarLinux/backend/bootloader/main.cpp @@ -1,19 +1,57 @@ #include "Setbootloader.hpp" +#include void log(std::string level, std::string message) { if (level == "debug") { - std::cerr << BOLD_BRIGHT_WHITE << "DEBUG: " << RESET << _(message.c_str()) << std::endl; + std::cerr << BOLD_BRIGHT_WHITE << "DEBUG::bootloader:: " << RESET << _(message.c_str()) << std::endl; + } + if (level == "info") { + std::cerr << BLUE << "INFO::bootloader:: " << RESET << _(message.c_str()) << std::endl; } if (level == "error") { - std::cerr << RED << "ERR: " << RESET << _(message.c_str()) << std::endl; + std::cerr << RED << "ERR::bootloader:: " << RESET << _(message.c_str()) << std::endl; } if (level == "warning") { - std::cerr << YELLOW << "WAR: " << RESET << _(message.c_str()) << std::endl; + std::cerr << YELLOW << "WAR::bootloader:: " << RESET << _(message.c_str()) << std::endl; } if (level == "fixme") { - std::cerr << MAGENTA << "FIXME: " << RESET << _(message.c_str()) << std::endl; + std::cerr << MAGENTA << "FIXME::bootloader:: " << RESET << _(message.c_str()) << std::endl; + } +} + +void save_progress(const std::string& module, const std::string& action, bool success) { + std::string save_path = "/mnt/save.json"; + std::ifstream file(save_path); + std::string content = "{"; + + if (file.is_open()) { + std::stringstream buffer; + buffer << file.rdbuf(); + content = buffer.str(); + file.close(); + } + + // Simple manual JSON update without jsoncpp + std::ofstream out(save_path); + if (out.is_open()) { + // Remove closing brace and add new entry + if (content.length() > 1 && content.back() == '}') { + content.pop_back(); + if (content.length() > 1) content += ","; + } else { + content = "{"; + } + content += "\"" + module + "\":" + (success ? "true" : "false"); + content += ",\"last_action\":\"" + action + "\""; + content += "}"; + out << content; + out.close(); + log("debug", "Saved progress: " + module + " = " + (success ? "true" : "false")); + } else { + log("error", "Failed to save progress to " + save_path); } } + void prepart() { if (mount("/dev", "/mnt/dev", NULL, MS_BIND, NULL) == -1) { @@ -35,12 +73,11 @@ int main(int argc, char* argv[]) { setlocale(LC_ALL, ""); bindtextdomain("installer", "/usr/local/sdk/global/locale"); textdomain("installer"); - // bootinstall legacy grub /dev/sda - // legacy bootloader disk - - // 1 == grub - // 2 == syslinux/efistub - // 3 == refind + + if (argc < 6) { + log("error", "Not enough arguments!"); + return 1; + } std::string efi = argv[1]; std::string bootloader = argv[2]; @@ -49,35 +86,40 @@ int main(int argc, char* argv[]) { std::string ESPBoot = argv[5]; if (efi.empty()) { log("error", "Cannot detect firmware!"); - exit(1); + return 1; } if (bootloader.empty()) { log("error", "Cannot detect bootloader!"); - exit(1); + return 1; } if (DISK.empty()) { log("error", "Cannot detect disk!"); - exit(1); + return 1; } if (kernel.empty() || kernel == "NULL") { - log("warring", "the kernel is not selected, efistab and syslinux cannot be installed, only grub"); + log("warning", "the kernel is not selected, efistab and syslinux cannot be installed, only grub"); } if (ESPBoot.empty() || ESPBoot == "NULL") { - log("warring", "no ESP section is specified, only grub"); + log("warning", "no ESP section is specified, only grub"); } - + log("info", "Starting bootloader installation"); + save_progress("bootloader", "started", true); + if ( efi == "legacy" ) { if (bootloader == "grub") { InstallGrubLegacy(DISK); } else if ( bootloader == "syslinux") { if (kernel.empty() || kernel == "NULL") { log("error", "the kernel is not selected, efistab and syslinux cannot be installed, only grub"); - exit(1); + save_progress("bootloader", "failed", false); + return 1; } InstallSyslinux(DISK, kernel); } else { log("fixme", "unknow bootloader"); + save_progress("bootloader", "failed", false); + return 1; } } else if ( efi == "UEFI" || efi == "uefi") { if (bootloader == "grub") { @@ -85,16 +127,24 @@ int main(int argc, char* argv[]) { } else if (bootloader == "efistub") { if (kernel.empty() || kernel == "NULL") { log("error", "the kernel is not selected, efistab and syslinux cannot be installed, only grub"); - exit(1); + save_progress("bootloader", "failed", false); + return 1; } EfistubInstall(DISK, ESPBoot, kernel); } else if (bootloader == "refind") { RefindInstall(DISK, ESPBoot); } else { log("fixme", "unknow bootloader"); + save_progress("bootloader", "failed", false); + return 1; } } else { log("fixme", "unknow firmware"); + save_progress("bootloader", "failed", false); + return 1; } - + + log("info", "Bootloader installation completed"); + save_progress("bootloader", "completed", true); + return 0; } diff --git a/main/QuasarLinux/backend/partmanager/main.cpp b/main/QuasarLinux/backend/partmanager/main.cpp index 94fb02e..3c40aeb 100644 --- a/main/QuasarLinux/backend/partmanager/main.cpp +++ b/main/QuasarLinux/backend/partmanager/main.cpp @@ -1,5 +1,5 @@ #include "partmanager.hpp" - +#include void log(std::string level, std::string message) { if (level == "debug") { @@ -18,8 +18,48 @@ void log(std::string level, std::string message) { std::cerr << MAGENTA << "FIXME::partmanager:: " << RESET << _(message.c_str()) << std::endl; } } + +void save_progress(const std::string& module, const std::string& action, bool success) { + std::string save_path = "/mnt/save.json"; + std::ifstream file(save_path); + std::string content = "{"; + bool first = true; + + if (file.is_open()) { + std::stringstream buffer; + buffer << file.rdbuf(); + content = buffer.str(); + file.close(); + } + + // Simple manual JSON update without jsoncpp + std::ofstream out(save_path); + if (out.is_open()) { + // Remove closing brace and add new entry + if (content.length() > 1 && content.back() == '}') { + content.pop_back(); + if (content.length() > 1) content += ","; + } else { + content = "{"; + } + content += "\"" + module + "\":" + (success ? "true" : "false"); + content += ",\"last_action\":\"" + action + "\""; + content += "}"; + out << content; + out.close(); + log("debug", "Saved progress: " + module + " = " + (success ? "true" : "false")); + } else { + log("error", "Failed to save progress to " + save_path); + } +} + int main(int argc, char* argv[]) { // "partmgr", "custom", disk, boot, root, rootfs, swap_flag, firm, luks_flag + if (argc < 9) { + log("error", "Not enough arguments!"); + return 1; + } + std::string type = argv[1]; std::string disk = argv[2]; std::string boot = argv[3]; @@ -29,5 +69,14 @@ int main(int argc, char* argv[]) { std::string firrm = argv[7]; std::string lucks_flag = argv[8]; + log("info", "Starting partition manager"); + log("debug", "type=" + type + ", disk=" + disk + ", boot=" + boot + ", root=" + root); + + save_progress("partmanager", "started", true); + + // TODO: Add partition logic here based on type + + save_progress("partmanager", "completed", true); + log("info", "Partition manager completed successfully"); return 0; } \ No newline at end of file diff --git a/main/QuasarLinux/backend/partmanager/partmanager.hpp b/main/QuasarLinux/backend/partmanager/partmanager.hpp index e1937aa..bf3915f 100644 --- a/main/QuasarLinux/backend/partmanager/partmanager.hpp +++ b/main/QuasarLinux/backend/partmanager/partmanager.hpp @@ -14,6 +14,7 @@ #include #include #include + #define _(STRING) gettext(STRING) #define RESET "\033[0m" #define RED "\033[31m" @@ -25,4 +26,7 @@ #define BOLD_BRIGHT_WHITE "\033[1;97m" namespace fs = std::filesystem; +void log(std::string level, std::string message); +void save_progress(const std::string& module, const std::string& action, bool success); + #endif \ No newline at end of file diff --git a/main/QuasarLinux/backend/userscfg/main.cpp b/main/QuasarLinux/backend/userscfg/main.cpp index c7a42c6..f016353 100644 --- a/main/QuasarLinux/backend/userscfg/main.cpp +++ b/main/QuasarLinux/backend/userscfg/main.cpp @@ -1,21 +1,71 @@ #include "usercfg.hpp" +#include using namespace std; void log(string level, string message) { if (level == "debug") { - cerr << BOLD_BRIGHT_WHITE << "DEBUG: " << RESET << _(message.c_str()) << endl; + cerr << BOLD_BRIGHT_WHITE << "DEBUG::userscfg:: " << RESET << _(message.c_str()) << endl; + } + if (level == "info") { + cerr << BLUE << "INFO::userscfg:: " << RESET << _(message.c_str()) << endl; } if (level == "error") { - cerr << RED << "ERR: " << RESET << _(message.c_str()) << endl; + cerr << RED << "ERR::userscfg:: " << RESET << _(message.c_str()) << endl; } if (level == "warning") { - cerr << YELLOW << "WAR: " << RESET << _(message.c_str()) << endl; + cerr << YELLOW << "WAR::userscfg:: " << RESET << _(message.c_str()) << endl; } if (level == "fixme") { - cerr << MAGENTA << "FIXME: " << RESET << _(message.c_str()) << endl; + cerr << MAGENTA << "FIXME::userscfg:: " << RESET << _(message.c_str()) << endl; + } +} + +void save_progress(const std::string& module, const std::string& action, bool success) { + std::string save_path = "/mnt/save.json"; + std::ifstream file(save_path); + std::string content = "{"; + + if (file.is_open()) { + std::stringstream buffer; + buffer << file.rdbuf(); + content = buffer.str(); + file.close(); + } + + // Simple manual JSON update without jsoncpp + std::ofstream out(save_path); + if (out.is_open()) { + // Remove closing brace and add new entry + if (content.length() > 1 && content.back() == '}') { + content.pop_back(); + if (content.length() > 1) content += ","; + } else { + content = "{"; + } + content += "\"" + module + "\":" + (success ? "true" : "false"); + content += ",\"last_action\":\"" + action + "\""; + content += "}"; + out << content; + out.close(); + log("debug", "Saved progress: " + module + " = " + (success ? "true" : "false")); + } else { + log("error", "Failed to save progress to " + save_path); } } + int main(int argc, char* argv[]) { + if (argc < 2) { + log("error", "Not enough arguments!"); + return 1; + } + string username = argv[1]; + log("info", "Creating user: " + username); + save_progress("userscfg", "started", true); + create_user(username); -} \ No newline at end of file + + save_progress("userscfg", "completed", true); + log("info", "User creation completed"); + return 0; +} diff --git a/main/QuasarLinux/backend/userscfg/usercfg.hpp b/main/QuasarLinux/backend/userscfg/usercfg.hpp index 09a6a80..18ad3ad 100644 --- a/main/QuasarLinux/backend/userscfg/usercfg.hpp +++ b/main/QuasarLinux/backend/userscfg/usercfg.hpp @@ -26,6 +26,7 @@ #define BOLD_BRIGHT_WHITE "\033[1;97m" int execute(initializer_list args); void log(std::string level, std::string message); +void save_progress(const std::string& module, const std::string& action, bool success); void create_user(std::string username);