diff options
Diffstat (limited to 'src/buildtool/main/main.cpp')
-rw-r--r-- | src/buildtool/main/main.cpp | 127 |
1 files changed, 110 insertions, 17 deletions
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index 60653651..146ec221 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -40,6 +40,7 @@ #include "src/buildtool/main/install_cas.hpp" #ifndef BOOTSTRAP_BUILD_TOOL #include "src/buildtool/auth/authentication.hpp" +#include "src/buildtool/execution_api/execution_service/server_implementation.hpp" #include "src/buildtool/execution_api/local/garbage_collector.hpp" #include "src/buildtool/graph_traverser/graph_traverser.hpp" #include "src/buildtool/progress_reporting/base_progress_reporter.hpp" @@ -68,7 +69,8 @@ enum class SubCommand { kRebuild, kInstallCas, kTraverse, - kGc + kGc, + kExecute }; struct CommandLineArguments { @@ -84,7 +86,10 @@ struct CommandLineArguments { RebuildArguments rebuild; FetchArguments fetch; GraphArguments graph; - AuthArguments auth; + CommonAuthArguments auth; + ClientAuthArguments cauth; + ServerAuthArguments sauth; + ExecutionServiceArguments es; }; /// \brief Setup arguments for sub command "just describe". @@ -119,7 +124,9 @@ auto SetupBuildCommandArguments( SetupAnalysisArguments(app, &clargs->analysis); SetupCacheArguments(app, &clargs->endpoint); SetupEndpointArguments(app, &clargs->endpoint); - SetupAuthArguments(app, &clargs->auth); + SetupCommonAuthArguments(app, &clargs->auth); + SetupClientAuthArguments(app, &clargs->cauth); + SetupCommonBuildArguments(app, &clargs->build); SetupBuildArguments(app, &clargs->build); SetupCompatibilityArguments(app); } @@ -147,7 +154,8 @@ auto SetupInstallCasCommandArguments( SetupCompatibilityArguments(app); SetupCacheArguments(app, &clargs->endpoint); SetupEndpointArguments(app, &clargs->endpoint); - SetupAuthArguments(app, &clargs->auth); + SetupCommonAuthArguments(app, &clargs->auth); + SetupClientAuthArguments(app, &clargs->cauth); SetupFetchArguments(app, &clargs->fetch); SetupLogArguments(app, &clargs->log); } @@ -160,8 +168,10 @@ auto SetupTraverseCommandArguments( SetupLogArguments(app, &clargs->log); SetupCacheArguments(app, &clargs->endpoint); SetupEndpointArguments(app, &clargs->endpoint); - SetupAuthArguments(app, &clargs->auth); + SetupCommonAuthArguments(app, &clargs->auth); + SetupClientAuthArguments(app, &clargs->cauth); SetupGraphArguments(app, &clargs->graph); // instead of analysis + SetupCommonBuildArguments(app, &clargs->build); SetupBuildArguments(app, &clargs->build); SetupStageArguments(app, &clargs->stage); SetupCompatibilityArguments(app); @@ -174,6 +184,19 @@ auto SetupGcCommandArguments( SetupCacheArguments(app, &clargs->endpoint); } +/// \brief Setup arguments for sub command "just execute". +auto SetupExecutionServiceCommandArguments( + gsl::not_null<CLI::App*> const& app, + gsl::not_null<CommandLineArguments*> const& clargs) { + SetupCompatibilityArguments(app); + SetupCommonBuildArguments(app, &clargs->build); + SetupCacheArguments(app, &clargs->endpoint); + SetupExecutionServiceArguments(app, &clargs->es); + SetupLogArguments(app, &clargs->log); + SetupCommonAuthArguments(app, &clargs->auth); + SetupServerAuthArguments(app, &clargs->sauth); +} + auto ParseCommandLineArguments(int argc, char const* const* argv) -> CommandLineArguments { CLI::App app("just, a generic build tool"); @@ -194,6 +217,8 @@ auto ParseCommandLineArguments(int argc, char const* const* argv) app.add_subcommand("install-cas", "Fetch and stage artifact from CAS."); auto* cmd_gc = app.add_subcommand("gc", "Trigger garbage collection of local cache."); + auto* cmd_execution = app.add_subcommand( + "execute", "Start single node execution service on this machine."); auto* cmd_traverse = app.group("") // group for creating hidden options ->add_subcommand("traverse", @@ -209,7 +234,7 @@ auto ParseCommandLineArguments(int argc, char const* const* argv) SetupInstallCasCommandArguments(cmd_install_cas, &clargs); SetupTraverseCommandArguments(cmd_traverse, &clargs); SetupGcCommandArguments(cmd_gc, &clargs); - + SetupExecutionServiceCommandArguments(cmd_execution, &clargs); try { app.parse(argc, argv); } catch (CLI::Error& e) { @@ -246,6 +271,9 @@ auto ParseCommandLineArguments(int argc, char const* const* argv) else if (*cmd_gc) { clargs.cmd = SubCommand::kGc; } + else if (*cmd_execution) { + clargs.cmd = SubCommand::kExecute; + } return clargs; } @@ -266,7 +294,6 @@ void SetupLogging(LogArguments const& clargs) { #ifndef BOOTSTRAP_BUILD_TOOL void SetupExecutionConfig(EndpointArguments const& eargs, - AuthArguments const& authargs, BuildArguments const& bargs, RebuildArguments const& rargs) { using LocalConfig = LocalExecutionConfig; @@ -304,6 +331,11 @@ void SetupExecutionConfig(EndpointArguments const& eargs, std::exit(kExitFailure); } } +} + +void SetupAuthConfig(CommonAuthArguments const& authargs, + ClientAuthArguments const& client_authargs, + ServerAuthArguments const& server_authargs) { auto use_tls = false; if (authargs.tls_ca_cert) { use_tls = true; @@ -314,24 +346,46 @@ void SetupExecutionConfig(EndpointArguments const& eargs, std::exit(kExitFailure); } } - if (authargs.tls_client_cert) { + if (client_authargs.tls_client_cert) { use_tls = true; - if (not Auth::TLS::SetClientCertificate(*authargs.tls_client_cert)) { + if (not Auth::TLS::SetClientCertificate( + *client_authargs.tls_client_cert)) { Logger::Log(LogLevel::Error, "Could not read '{}' certificate.", - authargs.tls_client_cert->string()); + client_authargs.tls_client_cert->string()); std::exit(kExitFailure); } } - if (authargs.tls_client_key) { + if (client_authargs.tls_client_key) { use_tls = true; - if (not Auth::TLS::SetClientKey(*authargs.tls_client_key)) { + if (not Auth::TLS::SetClientKey(*client_authargs.tls_client_key)) { Logger::Log(LogLevel::Error, "Could not read '{}' key.", - authargs.tls_client_key->string()); + client_authargs.tls_client_key->string()); std::exit(kExitFailure); } } + + if (server_authargs.tls_server_cert) { + use_tls = true; + if (not Auth::TLS::SetServerCertificate( + *server_authargs.tls_server_cert)) { + Logger::Log(LogLevel::Error, + "Could not read '{}' certificate.", + server_authargs.tls_server_cert->string()); + std::exit(kExitFailure); + } + } + if (server_authargs.tls_server_key) { + use_tls = true; + if (not Auth::TLS::SetServerKey(*server_authargs.tls_server_key)) { + Logger::Log(LogLevel::Error, + "Could not read '{}' key.", + server_authargs.tls_server_key->string()); + std::exit(kExitFailure); + } + } + if (use_tls) { if (not Auth::TLS::Validate()) { std::exit(kExitFailure); @@ -339,6 +393,39 @@ void SetupExecutionConfig(EndpointArguments const& eargs, } } +void SetupExecutionServiceConfig(ExecutionServiceArguments const& args) { + if (args.port) { + if (!ServerImpl::SetPort(*args.port)) { + Logger::Log(LogLevel::Error, "Invalid port '{}'", *args.port); + std::exit(kExitFailure); + } + } + if (args.info_file) { + if (!ServerImpl::SetInfoFile(*args.info_file)) { + Logger::Log(LogLevel::Error, + "Invalid info-file '{}'", + args.info_file->string()); + std::exit(kExitFailure); + } + } + if (args.interface) { + if (!ServerImpl::SetInterface(*args.interface)) { + Logger::Log(LogLevel::Error, + "Invalid interface '{}'", + args.info_file->string()); + std::exit(kExitFailure); + } + } + if (args.pid_file) { + if (!ServerImpl::SetPidFile(*args.pid_file)) { + Logger::Log(LogLevel::Error, + "Invalid pid-file '{}'", + args.info_file->string()); + std::exit(kExitFailure); + } + } +} + void SetupHashFunction() { HashFunction::SetHashType(Compatibility::IsCompatible() ? HashFunction::JustHash::Compatible @@ -1157,10 +1244,9 @@ auto main(int argc, char* argv[]) -> int { } #ifndef BOOTSTRAP_BUILD_TOOL SetupHashFunction(); - SetupExecutionConfig(arguments.endpoint, - arguments.auth, - arguments.build, - arguments.rebuild); + SetupExecutionConfig( + arguments.endpoint, arguments.build, arguments.rebuild); + SetupAuthConfig(arguments.auth, arguments.cauth, arguments.sauth); if (arguments.cmd == SubCommand::kGc) { if (GarbageCollector::TriggerGarbageCollection()) { @@ -1169,6 +1255,13 @@ auto main(int argc, char* argv[]) -> int { return kExitFailure; } + if (arguments.cmd == SubCommand::kExecute) { + SetupExecutionServiceConfig(arguments.es); + if (!ServerImpl::Instance().Run()) { + return kExitFailure; + } + return kExitSuccess; + } #endif auto jobs = arguments.build.build_jobs > 0 ? arguments.build.build_jobs |