173 lines
5.1 KiB
C
173 lines
5.1 KiB
C
|
|
/******************************************************************************
|
||
|
|
* Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved.
|
||
|
|
* iSulad licensed under the Mulan PSL v1.
|
||
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v1.
|
||
|
|
* You may obtain a copy of Mulan PSL v1 at:
|
||
|
|
* http://license.coscl.org.cn/MulanPSL
|
||
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
||
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
||
|
|
* PURPOSE.
|
||
|
|
* See the Mulan PSL v1 for more details.
|
||
|
|
* Author: lifeng
|
||
|
|
* Create: 2018-11-08
|
||
|
|
* Description: provide container events functions
|
||
|
|
******************************************************************************/
|
||
|
|
#include "error.h"
|
||
|
|
#include "events.h"
|
||
|
|
#include "arguments.h"
|
||
|
|
#include "log.h"
|
||
|
|
#include "lcrc_connect.h"
|
||
|
|
#include "securec.h"
|
||
|
|
|
||
|
|
const char g_cmd_events_desc[] = "Get real time events from the server";
|
||
|
|
const char g_cmd_events_usage[] = "events [command options]";
|
||
|
|
|
||
|
|
struct client_arguments g_cmd_events_args = {
|
||
|
|
.since = NULL,
|
||
|
|
.until = NULL,
|
||
|
|
};
|
||
|
|
|
||
|
|
static const char * const g_strtype[] = {
|
||
|
|
"EXIT", "STOPPED", "STARTING", "RUNNING", "STOPPING", "ABORTING", "FREEZING",
|
||
|
|
"FROZEN", "THAWED", "OOM", "CREATE", "START", "EXEC_ADDED", "PAUSED1",
|
||
|
|
};
|
||
|
|
|
||
|
|
static const char *lcrsta2str(container_events_type_t sta)
|
||
|
|
{
|
||
|
|
if (sta > EVENTS_TYPE_PAUSED1) {
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
return g_strtype[sta];
|
||
|
|
}
|
||
|
|
|
||
|
|
static void print_events_callback(const container_events_format_t *event)
|
||
|
|
{
|
||
|
|
char timebuffer[512] = { 0 };
|
||
|
|
|
||
|
|
if (event == NULL) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("--------------------------------------------------\n");
|
||
|
|
printf("%-15s %s\n", "Name:", event->id);
|
||
|
|
|
||
|
|
if (get_time_buffer(&(event->timestamp), timebuffer, sizeof(timebuffer))) {
|
||
|
|
printf("%-15s %s\n", "Time:", timebuffer);
|
||
|
|
} else {
|
||
|
|
printf("%-15s %s\n", "Time:", "-");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (event->has_type) {
|
||
|
|
printf("%-15s %s\n", "EventType:", lcrsta2str(event->type));
|
||
|
|
} else {
|
||
|
|
printf("%-15s %s\n", "EventType:", "-");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (event->has_pid) {
|
||
|
|
printf("%-15s %u\n", "Pid:", event->pid);
|
||
|
|
} else {
|
||
|
|
printf("%-15s %s\n", "Pid:", "-");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (event->has_exit_status) {
|
||
|
|
printf("%-15s %u\n", "Exit_Status:", event->exit_status);
|
||
|
|
} else {
|
||
|
|
printf("%-15s %s\n", "Exit_Status:", "-");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Create a delete request message and call RPC
|
||
|
|
*/
|
||
|
|
static int client_event(struct client_arguments *args)
|
||
|
|
{
|
||
|
|
int ret = 0;
|
||
|
|
lcrc_connect_ops *ops = NULL;
|
||
|
|
struct lcrc_events_request request = { 0 };
|
||
|
|
struct lcrc_events_response *response = NULL;
|
||
|
|
client_connect_config_t config = { 0 };
|
||
|
|
|
||
|
|
response = util_common_calloc_s(sizeof(struct lcrc_events_response));
|
||
|
|
if (response == NULL) {
|
||
|
|
ERROR("Event: Out of memory");
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
request.cb = print_events_callback;
|
||
|
|
request.id = args->name;
|
||
|
|
|
||
|
|
ops = get_connect_client_ops();
|
||
|
|
if (ops == NULL || !ops->container.events) {
|
||
|
|
ERROR("Unimplemented event op");
|
||
|
|
ret = -1;
|
||
|
|
goto out;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (args->since && !get_timestamp(args->since, &request.since)) {
|
||
|
|
COMMAND_ERROR("Failed to get since timestamp");
|
||
|
|
ret = -1;
|
||
|
|
goto out;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (args->until && !get_timestamp(args->until, &request.until)) {
|
||
|
|
COMMAND_ERROR("Failed to get until timestamp");
|
||
|
|
ret = -1;
|
||
|
|
goto out;
|
||
|
|
}
|
||
|
|
|
||
|
|
config = get_connect_config(args);
|
||
|
|
ret = ops->container.events(&request, response, &config);
|
||
|
|
if (ret) {
|
||
|
|
COMMAND_ERROR("Failed to get container events, %s",
|
||
|
|
response->errmsg ? response->errmsg : errno_to_error_message(response->cc));
|
||
|
|
}
|
||
|
|
|
||
|
|
out:
|
||
|
|
lcrc_events_response_free(response);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
int cmd_events_main(int argc, const char **argv)
|
||
|
|
{
|
||
|
|
struct log_config lconf = { 0 };
|
||
|
|
command_t cmd;
|
||
|
|
|
||
|
|
set_default_command_log_config(argv[0], &lconf);
|
||
|
|
if (client_arguments_init(&g_cmd_events_args)) {
|
||
|
|
COMMAND_ERROR("client arguments init failed");
|
||
|
|
exit(ECOMMON);
|
||
|
|
}
|
||
|
|
g_cmd_events_args.progname = argv[0];
|
||
|
|
struct command_option options[] = {
|
||
|
|
LOG_OPTIONS(lconf),
|
||
|
|
EVENTS_OPTIONS(g_cmd_events_args),
|
||
|
|
COMMON_OPTIONS(g_cmd_events_args)
|
||
|
|
};
|
||
|
|
|
||
|
|
command_init(&cmd, options, sizeof(options) / sizeof(options[0]), argc, (const char **)argv, g_cmd_events_desc,
|
||
|
|
g_cmd_events_usage);
|
||
|
|
if (command_parse_args(&cmd, &g_cmd_events_args.argc, &g_cmd_events_args.argv)) {
|
||
|
|
exit(EINVALIDARGS);
|
||
|
|
}
|
||
|
|
if (log_init(&lconf)) {
|
||
|
|
COMMAND_ERROR("Events: log init failed");
|
||
|
|
exit(ECOMMON);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (g_cmd_events_args.socket == NULL) {
|
||
|
|
COMMAND_ERROR("Missing --host,-H option");
|
||
|
|
exit(EINVALIDARGS);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (client_event(&g_cmd_events_args)) {
|
||
|
|
if (g_cmd_events_args.name != NULL) {
|
||
|
|
ERROR("Container \"%s\" event failed", g_cmd_events_args.name);
|
||
|
|
} else {
|
||
|
|
ERROR("Container events failed");
|
||
|
|
}
|
||
|
|
exit(ECOMMON);
|
||
|
|
}
|
||
|
|
|
||
|
|
exit(EXIT_SUCCESS);
|
||
|
|
}
|