diff --git a/src/cmd/isulad/arguments.c b/src/cmd/isulad/arguments.c index d4cab30144c7343877b5ac9011a0daca76177198..7381a87f89bc389503f6ddf5df71669871dc97bf 100644 --- a/src/cmd/isulad/arguments.c +++ b/src/cmd/isulad/arguments.c @@ -156,6 +156,7 @@ int service_arguments_init(struct service_arguments *args) args->default_ulimit = NULL; args->default_ulimit_len = 0; + args->json_confs->websocket_server_listening_port = DEFAULT_WEBSOCKET_SERVER_LISTENING_PORT; ret = 0; diff --git a/src/cmd/isulad/arguments.h b/src/cmd/isulad/arguments.h index 9df04e7484990d32318ca2cdd942f3c4bc7c12a2..0833457dfed44bcffa7ccd4cfc6784423cd7f463 100644 --- a/src/cmd/isulad/arguments.h +++ b/src/cmd/isulad/arguments.h @@ -57,6 +57,7 @@ struct service_arguments { /* default configs */ host_config_ulimits_element **default_ulimit; size_t default_ulimit_len; + unsigned int websocket_server_listening_port; // remaining arguments char * const *argv; diff --git a/src/cmd/isulad/commands.c b/src/cmd/isulad/commands.c index 6f729485b870bd3c8d67851edde4da50a9ae6a9a..7873027b7bc2499c4e0a9208cf51010795d1f0a6 100644 --- a/src/cmd/isulad/commands.c +++ b/src/cmd/isulad/commands.c @@ -228,6 +228,27 @@ out: return ret; } +static int check_websocket_server_listening_port(const struct service_arguments *args) +{ +#define MIN_REGISTER_PORT 1024 +#define MAX_REGISTER_PORT 49151 + int ret = 0; + + if (args->json_confs->websocket_server_listening_port < MIN_REGISTER_PORT || + args->json_confs->websocket_server_listening_port > MAX_REGISTER_PORT) { + COMMAND_ERROR("Invalid websocket server listening port: '%d' (range: %d-%d)", + args->json_confs->websocket_server_listening_port, + MIN_REGISTER_PORT, MAX_REGISTER_PORT); + ERROR("Invalid websocket server listening port: '%d' (range: %d-%d)", + args->json_confs->websocket_server_listening_port, + MIN_REGISTER_PORT, MAX_REGISTER_PORT); + ret = -1; + goto out; + } +out: + return ret; +} + int check_args(struct service_arguments *args) { int ret = 0; @@ -291,6 +312,11 @@ int check_args(struct service_arguments *args) goto out; } + if (check_websocket_server_listening_port(args) != 0) { + ret = -1; + goto out; + } + out: return ret; } diff --git a/src/cmd/isulad/commands.h b/src/cmd/isulad/commands.h index ce1d2033157f86f9b47551b18a190f71731917e2..d09037ee6c8f8cfa8e3663214474b50b77c2a2d7 100644 --- a/src/cmd/isulad/commands.h +++ b/src/cmd/isulad/commands.h @@ -99,7 +99,10 @@ int update_default_ulimit(struct service_arguments *args); { CMD_OPT_TYPE_STRING_DUP, false, "tlskey", 0, &(cmdargs)->json_confs->tls_config->key_file, \ "Path to TLS key file (default \"/root/.iSulad/key.pem\")", NULL }, \ { CMD_OPT_TYPE_CALLBACK, false, "default-ulimit", 0, &(cmdargs)->default_ulimit, \ - "Default ulimits for containers (default [])", command_default_ulimit_append } + "Default ulimits for containers (default [])", command_default_ulimit_append }, \ + { CMD_OPT_TYPE_CALLBACK, false, "websocket-server-listening-port", 0, \ + &(cmdargs)->json_confs->websocket_server_listening_port, \ + "CRI websocket streaming service listening port (default 10350)", command_convert_uint } #endif /* __COMMAND_H */ diff --git a/src/config/isulad_config.c b/src/config/isulad_config.c index 47cf0936c6730512f11131c7b24e69f0ffe11366..fbd00804341cd9394f89802fa2a10b604d247e00 100644 --- a/src/config/isulad_config.c +++ b/src/config/isulad_config.c @@ -1256,6 +1256,28 @@ out: return plugins; } +/* conf get websocket server listening port */ +int32_t conf_get_websocket_server_listening_port() +{ + int32_t port = 0; + struct service_arguments *conf = NULL; + + if (isulad_server_conf_rdlock() != 0) { + return port; + } + + conf = conf_get_server_conf(); + if (conf == NULL) { + goto out; + } + + port = conf->json_confs->websocket_server_listening_port; + +out: + (void)isulad_server_conf_unlock(); + return port; +} + /* save args to conf */ int save_args_to_conf(struct service_arguments *args) { @@ -1794,6 +1816,10 @@ int merge_json_confs_into_global(struct service_arguments *args) args->json_confs->image_layer_check = tmp_json_confs->image_layer_check; } + if (tmp_json_confs->websocket_server_listening_port) { + args->json_confs->websocket_server_listening_port = tmp_json_confs->websocket_server_listening_port; + } + override_bool_pointer_value(&args->json_confs->use_decrypted_key, &tmp_json_confs->use_decrypted_key); if (tmp_json_confs->insecure_skip_verify_enforce) { diff --git a/src/config/isulad_config.h b/src/config/isulad_config.h index 492e730dd8223537c28d2c5fddd8480fb371793c..58ce0687eaa9b4f564b7f0fe71cdfcf281c1ce23 100644 --- a/src/config/isulad_config.h +++ b/src/config/isulad_config.h @@ -47,6 +47,7 @@ char *conf_get_isulad_log_gather_fifo_path(); char *conf_get_isulad_log_file(); char *conf_get_engine_log_file(); char *conf_get_enable_plugins(); +int32_t conf_get_websocket_server_listening_port(); int save_args_to_conf(struct service_arguments *args); diff --git a/src/constants.h b/src/constants.h index 624c1f9d1290ba618749d373fc3157876c2dd64a..bbc033d5421a628d350fd92b84543c62ab5e3dca 100644 --- a/src/constants.h +++ b/src/constants.h @@ -59,5 +59,7 @@ #define MAX_MSG_BUFFER_SIZE (32 * 1024) +#define DEFAULT_WEBSOCKET_SERVER_LISTENING_PORT 10350 + #endif diff --git a/src/json/schema/schema/isulad-daemon-configs.json b/src/json/schema/schema/isulad-daemon-configs.json index ca04ffa11c377624565e300a61e460547e8ce1b3..eb289c0412c8e8e1a4c472d6d13b5e88c6e49c3f 100644 --- a/src/json/schema/schema/isulad-daemon-configs.json +++ b/src/json/schema/schema/isulad-daemon-configs.json @@ -118,6 +118,9 @@ "cgroup-parent": { "type": "string" }, + "websocket-server-listening-port": { + "type": "int32" + }, "default-ulimits": { "type": "object", "patternProperties": { diff --git a/src/websocket/service/ws_server.cc b/src/websocket/service/ws_server.cc index 8c42aa8debdb63090b15dd51e9585ba4c10f9959..8a3624ff87cb3eecd9a4c92ea049ac5afbf13763 100644 --- a/src/websocket/service/ws_server.cc +++ b/src/websocket/service/ws_server.cc @@ -24,6 +24,7 @@ #include "utils.h" #include "request_cache.h" #include "constants.h" +#include "isulad_config.h" struct lws_context *WebsocketServer::m_context = nullptr; std::atomic WebsocketServer::m_instance; @@ -385,6 +386,12 @@ void WebsocketServer::ServiceWorkThread(int threadid) void WebsocketServer::Start(Errors &err) { + m_listenPort = conf_get_websocket_server_listening_port(); + if (m_listenPort == 0) { + err.SetError("Failed to get websocket server listening port from daemon config"); + return; + } + if (CreateContext() < 0) { err.SetError("Websocket server start failed!, please check your network status" "(eg: port " + std::to_string(m_listenPort) + "is occupied)"); diff --git a/src/websocket/service/ws_server.h b/src/websocket/service/ws_server.h index 3b164cdd3c864ffc0189584d2d5944e36d4988fd..5a8d26984ba866a93ba764326dabb45473a69acc 100644 --- a/src/websocket/service/ws_server.h +++ b/src/websocket/service/ws_server.h @@ -116,7 +116,7 @@ private: RouteCallbackRegister m_handler; static std::map m_wsis; url::URLDatum m_url; - int m_listenPort = 10251; + int m_listenPort; }; ssize_t WsWriteToClient(void *context, const void *data, size_t len);