iSulad/src/cmd/isulad/arguments.c

249 lines
7.5 KiB
C
Raw Normal View History

2019-09-30 10:53:41 -04:00
/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2017-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: 2017-11-22
* Description: provide container server arguments functions
******************************************************************************/
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
#include <limits.h>
#include "error.h"
#include "utils.h"
#include "arguments.h"
#include "commands.h"
#include "libisulad.h"
2019-09-30 10:53:41 -04:00
#include "constants.h"
#include "isulad_config.h"
2019-09-30 10:53:41 -04:00
static int set_daemon_default_tls_options(struct service_arguments *args)
{
int ret = -1;
char *tls = NULL;
char *tmp_path = NULL;
char *tls_verify = NULL;
char *cert_path = NULL;
char *ca_file = NULL;
char *cert_file = NULL;
char *key_file = NULL;
tls = getenv("ISULAD_TLS");
args->json_confs->tls = (tls != NULL && strlen(tls) != 0 && strcmp(tls, "0") != 0);
tls = NULL;
tls_verify = getenv("ISULAD_TLS_VERIFY");
args->json_confs->tls_verify = (tls_verify != NULL && strlen(tls_verify) != 0 && strcmp(tls_verify, "0") != 0);
tls_verify = NULL;
tmp_path = getenv("ISULAD_CERT_PATH");
if (tmp_path == NULL || strlen(tmp_path) == 0) {
cert_path = util_strdup_s(ISULAD_CONFIG);
} else {
cert_path = util_strdup_s(tmp_path);
}
tmp_path = NULL;
args->json_confs->tls_config =
(isulad_daemon_configs_tls_config *)util_common_calloc_s(sizeof(isulad_daemon_configs_tls_config));
if (args->json_confs->tls_config == NULL) {
goto out;
}
ca_file = util_path_join(cert_path, DEFAULT_CA_FILE);
if (ca_file == NULL) {
goto out;
}
free(args->json_confs->tls_config->ca_file);
args->json_confs->tls_config->ca_file = ca_file;
key_file = util_path_join(cert_path, DEFAULT_KEY_FILE);
if (key_file == NULL) {
goto out;
}
free(args->json_confs->tls_config->key_file);
args->json_confs->tls_config->key_file = key_file;
cert_file = util_path_join(cert_path, DEFAULT_CERT_FILE);
if (cert_file == NULL) {
goto out;
}
free(args->json_confs->tls_config->cert_file);
args->json_confs->tls_config->cert_file = cert_file;
ret = 0;
out:
free(cert_path);
return ret;
}
int service_arguments_init(struct service_arguments *args)
{
#define DEFAULT_LOG_OPTS_LEN 3
int ret = -1;
if (args == NULL) {
return -1;
}
args->argc = 0;
args->argv = NULL;
args->progname = util_strdup_s("isulad");
2019-09-30 10:53:41 -04:00
args->quiet = true;
args->help = false;
args->version = false;
args->json_confs = (isulad_daemon_configs *)util_common_calloc_s(sizeof(isulad_daemon_configs));
if (args->json_confs == NULL) {
goto free_out;
}
args->json_confs->engine = util_strdup_s("lcr");
args->json_confs->group = util_strdup_s("isulad");
args->json_confs->graph = util_strdup_s(ISULAD_ROOT_PATH);
args->json_confs->state = util_strdup_s(ISULAD_STATE_PATH);
2019-09-30 10:53:41 -04:00
args->json_confs->log_level = util_strdup_s("INFO");
args->json_confs->log_driver = util_strdup_s("file");
args->json_confs->log_opts = (json_map_string_string *)util_common_calloc_s(sizeof(json_map_string_string));
if (args->json_confs->log_opts == NULL) {
goto free_out;
}
args->json_confs->log_opts->keys = (char **)util_common_calloc_s(sizeof(char *) * DEFAULT_LOG_OPTS_LEN);
if (args->json_confs->log_opts->keys == NULL) {
goto free_out;
}
args->json_confs->log_opts->values = (char **)util_common_calloc_s(sizeof(char *) * DEFAULT_LOG_OPTS_LEN);
if (args->json_confs->log_opts->values == NULL) {
goto free_out;
}
args->json_confs->log_opts->len = DEFAULT_LOG_OPTS_LEN;
args->json_confs->log_opts->keys[0] = util_strdup_s("log-file-mode");
args->json_confs->log_opts->values[0] = util_strdup_s("0600");
args->json_confs->log_opts->keys[1] = util_strdup_s("max-file");
args->json_confs->log_opts->values[1] = util_strdup_s("7");
args->json_confs->log_opts->keys[2] = util_strdup_s("max-size");
args->json_confs->log_opts->values[2] = util_strdup_s("1MB");
args->log_file_mode = 0600;
args->max_file = 7;
args->max_size = 1024 * 1024;
args->json_confs->pidfile = util_strdup_s("/var/run/isulad.pid");
2019-09-30 10:53:41 -04:00
args->json_confs->storage_driver = util_strdup_s("overlay2");
args->json_confs->native_umask = util_strdup_s(UMASK_SECURE);
args->json_confs->image_service = true;
args->json_confs->image_layer_check = false;
2019-12-25 15:50:34 +08:00
args->json_confs->image_server_sock_addr = util_strdup_s(DEFAULT_IM_SERVER_SOCK_ADDR);
2019-09-30 10:53:41 -04:00
args->json_confs->use_decrypted_key = (bool *)util_common_calloc_s(sizeof(bool));
if (args->json_confs->use_decrypted_key == NULL) {
goto free_out;
}
*(args->json_confs->use_decrypted_key) = true;
args->json_confs->insecure_skip_verify_enforce = false;
2019-12-25 15:50:34 +08:00
args->image_opt_timeout = 5 * 60; // default image operation timeout 300s
2019-09-30 10:53:41 -04:00
if (set_daemon_default_tls_options(args) != 0) {
goto free_out;
}
args->default_ulimit = NULL;
args->default_ulimit_len = 0;
args->json_confs->websocket_server_listening_port = DEFAULT_WEBSOCKET_SERVER_LISTENING_PORT;
args->json_confs->selinux_enabled = false;
2019-09-30 10:53:41 -04:00
ret = 0;
free_out:
if (ret != 0) {
service_arguments_free(args);
}
return ret;
}
/* service arguments free */
void service_arguments_free(struct service_arguments *args)
{
if (args == NULL) {
return;
}
free(args->progname);
args->progname = NULL;
free(args->logpath);
args->logpath = NULL;
util_free_array_by_len(args->hosts, args->hosts_len);
2019-09-30 10:53:41 -04:00
args->hosts = NULL;
args->hosts_len = 0;
free_isulad_daemon_configs(args->json_confs);
args->json_confs = NULL;
free_oci_runtime_spec_hooks(args->hooks);
args->hooks = NULL;
free_default_ulimit(args->default_ulimit);
args->default_ulimit = NULL;
args->default_ulimit_len = 0;
}
/* server log opt parser */
int server_log_opt_parser(struct service_arguments *args, const char *option)
{
int ret = -1;
char *key = NULL;
char *value = NULL;
char *tmp = NULL;
size_t len = 0;
size_t total_len = 0;
if (option == NULL || args == NULL) {
goto out;
}
// option format: key=value
total_len = strlen(option);
if (args == NULL || total_len <= 2) {
goto out;
}
tmp = util_strdup_s(option);
key = tmp;
value = strchr(tmp, '=');
// option do not contain '='
if (value == NULL) {
goto out;
}
len = (size_t)(value - key);
// if option is '=key'
if (len == 0) {
goto out;
}
// if option is 'key='
if (total_len == len + 1) {
goto out;
}
tmp[len] = '\0';
value += 1;
ret = parse_log_opts(args, key, value);
if (ret == 0 && args->json_confs != NULL && args->json_confs->log_opts != NULL) {
ret = append_json_map_string_string(args->json_confs->log_opts, key, value);
}
out:
free(tmp);
return ret;
}
2019-12-25 15:50:34 +08:00