/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "host/commands/cvd/server_command/acloud_translator.h" #include #include #include "common/libs/fs/shared_buf.h" #include "common/libs/utils/flag_parser.h" #include "common/libs/utils/result.h" #include "cvd_server.pb.h" #include "host/commands/cvd/server_client.h" #include "host/commands/cvd/server_command/server_handler.h" #include "host/commands/cvd/server_command/utils.h" #include "host/commands/cvd/types.h" namespace cuttlefish { static constexpr char kTranslatorHelpMessage[] = R"(Cuttlefish Virtual Device (CVD) CLI. usage: cvd acloud translator Args: --opt-out Opt-out CVD Acloud and choose to run original Python Acloud. --opt-in Opt-in and run CVD Acloud as default. Both -opt-out and --opt-in are mutually exclusive. )"; class AcloudTranslatorCommand : public CvdServerHandler { public: INJECT(AcloudTranslatorCommand(ANNOTATED(AcloudTranslatorOptOut, std::atomic&) optout)) : optout_(optout) {} ~AcloudTranslatorCommand() = default; Result CanHandle(const RequestWithStdio& request) const override { auto invocation = ParseInvocation(request.Message()); if (invocation.arguments.size() >= 2) { if (invocation.command == "acloud" && invocation.arguments[0] == "translator") { return true; } } return false; } cvd_common::Args CmdList() const override { return {}; } Result Handle(const RequestWithStdio& request) override { CF_EXPECT(CanHandle(request)); auto invocation = ParseInvocation(request.Message()); if (invocation.arguments.empty() || invocation.arguments.size() < 2) { return CF_ERR("Translator command not support"); } // cvd acloud translator --opt-out // cvd acloud translator --opt-in cvd::Response response; response.mutable_command_response(); bool help = false; bool flag_optout = false; bool flag_optin = false; std::vector translator_flags = { GflagsCompatFlag("help", help), GflagsCompatFlag("opt-out", flag_optout), GflagsCompatFlag("opt-in", flag_optin), }; CF_EXPECT(ParseFlags(translator_flags, invocation.arguments), "Failed to process translator flag."); if (help) { WriteAll(request.Out(), kTranslatorHelpMessage); return response; } CF_EXPECT(flag_optout != flag_optin, "Only one of --opt-out or --opt-in should be given."); optout_ = flag_optout; return response; } Result Interrupt() override { return CF_ERR("Can't be interrupted."); } private: std::atomic& optout_; }; fruit::Component>>> AcloudTranslatorCommandComponent() { return fruit::createComponent() .addMultibinding(); } } // namespace cuttlefish