
All checks were successful
Build-Test-Publish / build (linux/amd64) (push) Successful in 34s
Build-Test-Publish / build (linux/arm64) (push) Successful in 44s
Build-Test-Publish / test-install-from-scratch (linux/amd64) (push) Successful in 8s
Build-Test-Publish / test-install-from-scratch (linux/arm64) (push) Successful in 8s
86 lines
2.8 KiB
C++
86 lines
2.8 KiB
C++
#include <iostream>
|
|
#include <filesystem>
|
|
#include <unistd.h>
|
|
|
|
#include "argparse.hpp"
|
|
#include "generator.hpp"
|
|
#include "version.hpp"
|
|
|
|
|
|
std::string get_arch()
|
|
{
|
|
// determine the architecture of the system
|
|
std::string arch;
|
|
#ifdef __aarch64__
|
|
arch = "arm64";
|
|
#elif __x86_64__
|
|
arch = "amd64";
|
|
#endif
|
|
return arch;
|
|
}
|
|
|
|
int update()
|
|
{
|
|
// determine path to this executable
|
|
std::filesystem::path exepath = std::filesystem::canonical("/proc/self/exe");
|
|
std::filesystem::path parent_path = exepath.parent_path();
|
|
std::string project_name = exepath.filename().string();
|
|
|
|
// determine the architecture of the system
|
|
std::string arch = get_arch();
|
|
|
|
std::string url = "https://gitea.jde.nz/public/"+project_name+"/releases/download/latest/"+project_name+"." + arch;
|
|
|
|
// download new version, preserve permissions and ownership
|
|
std::string bash_script;
|
|
bash_script += "docker run --rm -v "+parent_path.string()+":/target";
|
|
bash_script += " gitea.jde.nz/public/debian-curl:latest";
|
|
bash_script += " sh -c \"";
|
|
bash_script += " curl -fsSL " + url + " -o /target/"+project_name+"_temp &&";
|
|
bash_script += " chmod --reference=/target/"+project_name+" /target/"+project_name+"_temp &&";
|
|
bash_script += " chown --reference=/target/"+project_name+" /target/"+project_name+"_temp &&";
|
|
bash_script += " mv /target/"+project_name+"_temp /target/"+project_name;
|
|
bash_script += "\"";
|
|
|
|
std::cout << "Updating " << exepath << " to the latest " << arch << " version." << std::endl;
|
|
|
|
// std::cout << "bash_script: " << std::endl
|
|
// << bash_script << std::endl;
|
|
|
|
// run the bash script
|
|
execlp("bash", "bash", "-c", bash_script.c_str(), (char *)nullptr);
|
|
std::cerr << "Failed to execute command." << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char* argv[]) {
|
|
try {
|
|
std::cout << "Dehydrate version " << VERSION << std::endl;
|
|
Args args = parse_args(argc, argv);
|
|
|
|
// Handle update request
|
|
if (args.update) {
|
|
return update();
|
|
}
|
|
|
|
std::filesystem::path src(args.source);
|
|
if (!std::filesystem::exists(src)) {
|
|
std::cerr << "Source does not exist: " << args.source << std::endl;
|
|
return 1;
|
|
}
|
|
if (std::filesystem::is_regular_file(src)) {
|
|
generate_file_code(args.source, args.dest, args.silent);
|
|
} else if (std::filesystem::is_directory(src)) {
|
|
generate_folder_code(args.source, args.dest, args.silent);
|
|
} else {
|
|
std::cerr << "Source is neither a file nor a directory: " << args.source << std::endl;
|
|
return 1;
|
|
}
|
|
} catch (const std::exception& ex) {
|
|
std::cerr << ex.what() << std::endl;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|