/* * creator.cc - Implementation of the HorizonScript image creator * image, the image processing utilities for * Project Horizon * * Copyright (c) 2020 Adélie Linux and contributors. All rights reserved. * This code is licensed under the AGPL 3.0 license, as noted in the * LICENSE-code file in the root directory of this repository. * * SPDX-License-Identifier: AGPL-3.0-only */ #include #include /* EXIT_* */ #include #include "hscript/script.hh" #include "util/output.hh" bool pretty = true; #define DESCR_TEXT "Usage: hscript-image [OPTION]... [INSTALLFILE]\n"\ "Write an operating system image configured per INSTALLFILE" int main(int argc, char *argv[]) { using namespace boost::program_options; bool needs_help{}, disable_pretty{}; int exit_code = EXIT_SUCCESS; std::string if_path{"/etc/horizon/installfile"}, ir_dir{"/target"}; options_description ui{DESCR_TEXT}; options_description general{"General options"}; general.add_options() ("help,h", bool_switch(&needs_help), "Display this message.") ("no-colour,n", bool_switch(&disable_pretty), "Do not 'prettify' output") ; options_description target{"Target control options"}; target.add_options() ("output,o", value()->default_value("image.tar"), "Desired filename for the output file.") ("type,t", value()->default_value("tar"), "Type of output file to generate. Use 'list' for a list of supported types.") ("ir-dir,i", value()->default_value("/target"), "Where to store intermediate files.") ; ui.add(general).add(target); options_description all; all.add(ui).add_options()("installfile", value()->default_value(if_path), "The HorizonScript to use for configuring the image."); positional_options_description positional; positional.add("installfile", 1); command_line_parser parser{argc, argv}; parser.options(all); parser.positional(positional); variables_map vm; try { auto result = parser.run(); store(result, vm); notify(vm); } catch(const std::exception &ex) { std::cerr << ex.what() << std::endl; exit_code = EXIT_FAILURE; needs_help = true; } /* --help, or usage failure */ if(needs_help) { std::cout << ui << std::endl; return exit_code; } /* -n/--no-colour, or logging to file */ if(disable_pretty || !isatty(1)) { pretty = false; } if(!vm["installfile"].empty()) { if_path = vm["installfile"].as(); } Horizon::Script *my_script; if(if_path == "-") { my_script = Horizon::Script::load(std::cin); } else { my_script = Horizon::Script::load(if_path); } /* if an error occurred during parsing, bail out now */ if(!my_script) { return EXIT_FAILURE; } if(!vm["ir-dir"].empty()) { my_script->setTargetDirectory(vm["ir-dir"].as()); } delete my_script; return exit_code; }