summaryrefslogtreecommitdiff
path: root/image/creator.cc
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-04-02 05:08:04 -0500
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-04-02 05:08:04 -0500
commitc6b0e5fc81d905f57688c696f80e480712f612ab (patch)
tree9b08fec4059ed05becfe85e426ff316cb7a5d381 /image/creator.cc
parent94fc4d46c3f2ebc179b768525a4aad73a655e083 (diff)
downloadhorizon-c6b0e5fc81d905f57688c696f80e480712f612ab.tar.gz
horizon-c6b0e5fc81d905f57688c696f80e480712f612ab.tar.bz2
horizon-c6b0e5fc81d905f57688c696f80e480712f612ab.tar.xz
horizon-c6b0e5fc81d905f57688c696f80e480712f612ab.zip
image: Significantly refactor how backends are registered
Diffstat (limited to 'image/creator.cc')
-rw-r--r--image/creator.cc64
1 files changed, 54 insertions, 10 deletions
diff --git a/image/creator.cc b/image/creator.cc
index ce688fa..70571fa 100644
--- a/image/creator.cc
+++ b/image/creator.cc
@@ -13,7 +13,7 @@
#include <boost/program_options.hpp>
#include <cstdlib> /* EXIT_* */
#include <string>
-#include "backends/backends.hh"
+#include "backends/basic.hh"
#include "hscript/script.hh"
#include "util/output.hh"
@@ -28,9 +28,13 @@ bool pretty = true; /*! Controls ASCII colour output */
/*! Entry-point for the image creation utility. */
int main(int argc, char *argv[]) {
using namespace boost::program_options;
+ using namespace Horizon::Image;
+
bool needs_help{}, disable_pretty{};
int exit_code = EXIT_SUCCESS;
- std::string if_path{"/etc/horizon/installfile"}, ir_dir{"/target"}, type_code{"tar"};
+ std::string if_path{"/etc/horizon/installfile"}, ir_dir{"/target"},
+ output_path{"image.tar"}, type_code{"tar"};
+ BasicBackend *backend = nullptr;
Horizon::ScriptOptions opts;
Horizon::Script *my_script;
@@ -89,9 +93,9 @@ int main(int argc, char *argv[]) {
if(type_code == "list") {
std::cout << "Type codes known by this build of Image Creation:"
<< std::endl << std::endl;
- for(auto &backend : Horizon::Image::known_backends) {
- std::cout << std::setw(10) << std::left << backend.type_code
- << backend.description << std::endl;
+ for(const auto &candidate : BasicBackend::available_backends()) {
+ std::cout << std::setw(10) << std::left << candidate.type_code
+ << candidate.description << std::endl;
}
return EXIT_SUCCESS;
}
@@ -100,6 +104,27 @@ int main(int argc, char *argv[]) {
if_path = vm["installfile"].as<std::string>();
}
+ if(!vm["ir-dir"].empty()) {
+ ir_dir = vm["ir-dir"].as<std::string>();
+ }
+
+ if(!vm["output"].empty()) {
+ output_path = vm["output"].as<std::string>();
+ }
+
+ /* Load the proper backend. */
+ for(const auto &candidate : BasicBackend::available_backends()) {
+ if(candidate.type_code == type_code) {
+ backend = candidate.creation_fn(ir_dir, output_path);
+ break;
+ }
+ }
+ if(backend == nullptr) {
+ output_error("command-line", "unsupported backend or internal error",
+ type_code);
+ return EXIT_FAILURE;
+ }
+
opts.set(Horizon::InstallEnvironment);
opts.set(Horizon::ImageOnly);
@@ -112,15 +137,34 @@ int main(int argc, char *argv[]) {
/* if an error occurred during parsing, bail out now */
if(!my_script) {
- return EXIT_FAILURE;
- }
+ exit_code = EXIT_FAILURE;
+ goto early_trouble;
+ } else {
+ int ret;
- if(!vm["ir-dir"].empty()) {
- my_script->setTargetDirectory(vm["ir-dir"].as<std::string>());
+ if(!my_script->execute()) {
+ exit_code = EXIT_FAILURE;
+ goto trouble;
+ }
+
+#define RUN_PHASE_OR_TROUBLE(_PHASE, _FRIENDLY) \
+ ret = backend->_PHASE();\
+ if(ret != 0) {\
+ output_error("internal", "error during output " _FRIENDLY,\
+ std::to_string(ret));\
+ exit_code = EXIT_FAILURE;\
+ goto trouble;\
}
- my_script->execute();
+ RUN_PHASE_OR_TROUBLE(prepare, "preparation");
+ RUN_PHASE_OR_TROUBLE(create, "creation");
+ RUN_PHASE_OR_TROUBLE(finalise, "finalisation");
+ }
+trouble: /* delete the Script and exit */
delete my_script;
+early_trouble: /* no script yet */
+ delete backend;
+
return exit_code;
}