/* * Copyright (C) 2020 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 #include #include #include #include #include "common/libs/fs/shared_fd.h" #include "host/libs/allocd/request.h" #include "host/libs/allocd/utils.h" #include "host/libs/config/logging.h" using namespace cuttlefish; DEFINE_string(socket_path, kDefaultLocation, "Socket path"); DEFINE_bool(id, false, "Request new UUID"); DEFINE_bool(ifcreate, false, "Request a new Interface"); DEFINE_bool(shutdown, false, "Shutdown Resource Allocation Server"); DEFINE_bool(stop_session, false, "Remove all resources from session"); DEFINE_string(ifdestroy, "", "Request an interface be destroyed"); DEFINE_uint32(ifid, -1, "Global Resource ID"); DEFINE_uint32(session, -1, "Session ID"); int main(int argc, char* argv[]) { cuttlefish::DefaultSubprocessLogging(argv); google::ParseCommandLineFlags(&argc, &argv, true); SharedFD monitor_socket = cuttlefish::SharedFD::SocketLocalClient( FLAGS_socket_path, false, SOCK_STREAM); if (!monitor_socket->IsOpen()) { LOG(ERROR) << "Unable to connect to launcher monitor on " << FLAGS_socket_path << ": " << monitor_socket->StrError(); return 1; } if (FLAGS_id) { Json::Value req; req["request_type"] = "allocate_id"; SendJsonMsg(monitor_socket, req); auto resp_opt = RecvJsonMsg(monitor_socket); if (!resp_opt.has_value()) { std::cout << "Bad Response from server\n"; return -1; } auto resp = resp_opt.value(); std::cout << resp << "\n"; std::cout << "New ID operation: " << resp["request_status"] << std::endl; std::cout << "New ID: " << resp["id"] << std::endl; } Json::Value config; Json::Value request_list; if (FLAGS_ifcreate) { Json::Value req; req["request_type"] = "create_interface"; req["uid"] = geteuid(); req["iface_type"] = "mtap"; request_list.append(req); req["iface_type"] = "wtap"; request_list.append(req); config["config_request"]["request_list"] = request_list; std::cout << config << "\n"; SendJsonMsg(monitor_socket, config); auto resp_opt = RecvJsonMsg(monitor_socket); if (!resp_opt.has_value()) { std::cout << "Bad Response from server\n"; return -1; } auto resp = resp_opt.value(); std::cout << resp << "\n"; std::cout << "Create Interface operation: " << resp["request_status"] << std::endl; std::cout << resp["iface_name"] << std::endl; } if (!FLAGS_ifdestroy.empty() && (FLAGS_ifid != -1) && (FLAGS_session != -1)) { Json::Value req; req["request_type"] = "destroy_interface"; req["iface_name"] = FLAGS_ifdestroy; req["resource_id"] = FLAGS_ifid; req["session_id"] = FLAGS_session; request_list.append(req); config["config_request"]["request_list"] = request_list; SendJsonMsg(monitor_socket, config); LOG(INFO) << "Request Interface : '" << FLAGS_ifdestroy << "' be removed"; auto resp_opt = RecvJsonMsg(monitor_socket); if (!resp_opt.has_value()) { std::cout << "Bad Response from server\n"; return -1; } auto resp = resp_opt.value(); std::cout << resp << "\n"; std::cout << "Destroy Interface operation: " << resp["request_status"] << std::endl; std::cout << resp["iface_name"] << std::endl; } if (FLAGS_stop_session && (FLAGS_session != -1)) { Json::Value req; req["request_type"] = "stop_session"; req["session_id"] = FLAGS_session; request_list.append(req); config["config_request"]["request_list"] = request_list; SendJsonMsg(monitor_socket, config); LOG(INFO) << "Request Session : '" << FLAGS_session << "' be stopped"; auto resp_opt = RecvJsonMsg(monitor_socket); if (!resp_opt.has_value()) { std::cout << "Bad Response from server\n"; return -1; } auto resp = resp_opt.value(); std::cout << resp << "\n"; std::cout << "Stop Session operation: " << resp["config_status"]; } if (FLAGS_shutdown) { Json::Value req; req["request_type"] = "shutdown"; request_list.append(req); config["config_request"]["request_list"] = request_list; cuttlefish::SendJsonMsg(monitor_socket, config); auto resp_opt = cuttlefish::RecvJsonMsg(monitor_socket); if (!resp_opt.has_value()) { std::cout << "Bad Response from server\n"; return -1; } auto resp = resp_opt.value(); std::cout << resp << "\n"; std::cout << "Shutdown operation: " << resp["request_status"] << std::endl; } return 0; }