| // Copyright 2023 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <cstdlib> | |
| #include <optional> | |
| #include <ostream> | |
| #include <string_view> | |
| #include <base/command_line.h> | |
| #include <base/containers/fixed_flat_map.h> | |
| #include <base/logging.h> | |
| #include <patchpanel/dbus/client.h> | |
| namespace { | |
| namespace switches { | |
| constexpr char kFeature[] = "feature"; | |
| constexpr char kEnable[] = "enable"; | |
| constexpr char kDisable[] = "disable"; | |
| constexpr char kHelp[] = "help"; | |
| constexpr char kHelpMessage[] = | |
| "\n" | |
| "Available Switches: \n" | |
| " --feature=wifi-qos,clat\n" | |
| " The keyword to identify the feature you want to enable or disable.\n" | |
| " --enable\n" | |
| " Enable a feature you specify. You can't use this with --disable.\n" | |
| " --disable\n" | |
| " Disable a feature you specify You can't use this with --enable.\n"; | |
| } // namespace switches | |
| std::optional<patchpanel::Client::FeatureFlag> GetFeatureFlag( | |
| const std::string_view feature_name) { | |
| static constexpr auto str2enum = | |
| base::MakeFixedFlatMap<std::string_view, patchpanel::Client::FeatureFlag>( | |
| { | |
| {"wifi-qos", patchpanel::Client::FeatureFlag::kWiFiQoS}, | |
| {"clat", patchpanel::Client::FeatureFlag::kClat}, | |
| }); | |
| const auto it = str2enum.find(feature_name); | |
| if (it != str2enum.end()) { | |
| return it->second; | |
| } | |
| return std::nullopt; | |
| } | |
| struct RequestBody { | |
| patchpanel::Client::FeatureFlag flag; | |
| bool enable; | |
| }; | |
| } // namespace | |
| int main(int argc, char* argv[]) { | |
| base::CommandLine::Init(argc, argv); | |
| base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); | |
| if (cl->HasSwitch(switches::kHelp)) { | |
| LOG(INFO) << switches::kHelpMessage; | |
| return EXIT_SUCCESS; | |
| } | |
| if (cl->GetSwitches().size() != 2) { | |
| LOG(ERROR) << "Invalid switches; exiting"; | |
| return EXIT_FAILURE; | |
| } | |
| if (!cl->HasSwitch(switches::kFeature)) { | |
| LOG(ERROR) << "You need to specify feature; exiting"; | |
| return EXIT_FAILURE; | |
| } | |
| RequestBody request; | |
| auto flag = GetFeatureFlag(cl->GetSwitchValueASCII(switches::kFeature)); | |
| if (!flag) { | |
| LOG(ERROR) << "Invalid feature name; exiting"; | |
| return EXIT_FAILURE; | |
| } | |
| request.flag = flag.value(); | |
| if (cl->HasSwitch(switches::kEnable)) { | |
| request.enable = true; | |
| } else if (cl->HasSwitch(switches::kDisable)) { | |
| request.enable = false; | |
| } else { | |
| LOG(ERROR) << "You need to enter either --enable or --disable; exiting"; | |
| return EXIT_FAILURE; | |
| } | |
| auto client = patchpanel::Client::New(); | |
| if (!client) { | |
| LOG(ERROR) << "Failed to connect to patchpanel client"; | |
| return EXIT_FAILURE; | |
| } | |
| bool result = client->SendSetFeatureFlagRequest(request.flag, request.enable); | |
| if (result) { | |
| LOG(INFO) << "SUCCESS"; | |
| return EXIT_SUCCESS; | |
| } else { | |
| LOG(ERROR) << "FAILED"; | |
| return EXIT_FAILURE; | |
| } | |
| } |