You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.1 KiB
171 lines
5.1 KiB
4 months ago
|
/*
|
||
|
* 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 <android-base/logging.h>
|
||
|
#include <gflags/gflags.h>
|
||
|
#include <json/json.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
#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;
|
||
|
}
|