summaryrefslogtreecommitdiffstats
path: root/aclk/aclk_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'aclk/aclk_util.c')
-rw-r--r--aclk/aclk_util.c256
1 files changed, 59 insertions, 197 deletions
diff --git a/aclk/aclk_util.c b/aclk/aclk_util.c
index b8ac66756..ee8fcaf94 100644
--- a/aclk/aclk_util.c
+++ b/aclk/aclk_util.c
@@ -2,15 +2,14 @@
#include "aclk_util.h"
-#include <stdio.h>
+#include "daemon/common.h"
-#include "../daemon/common.h"
+int aclk_use_new_cloud_arch = 0;
+usec_t aclk_session_newarch = 0;
-// CentOS 7 has older version that doesn't define this
-// same goes for MacOS
-#ifndef UUID_STR_LEN
-#define UUID_STR_LEN 37
-#endif
+aclk_env_t *aclk_env = NULL;
+
+int chart_batch_id;
aclk_encoding_type_t aclk_encoding_type_t_from_str(const char *str) {
if (!strcmp(str, "json")) {
@@ -54,6 +53,15 @@ void aclk_env_t_destroy(aclk_env_t *env) {
}
}
+int aclk_env_has_capa(const char *capa)
+{
+ for (int i = 0; i < (int) aclk_env->capability_count; i++) {
+ if (!strcasecmp(capa, aclk_env->capabilities[i]))
+ return 1;
+ }
+ return 0;
+}
+
#ifdef ACLK_LOG_CONVERSATION_DIR
volatile int aclk_conversation_log_counter = 0;
#if !defined(HAVE_C___ATOMIC) || defined(NETDATA_NO_ATOMIC_INSTRUCTIONS)
@@ -109,18 +117,53 @@ struct topic_name {
// in answer to /password endpoint
const char *name;
} topic_names[] = {
- { .id = ACLK_TOPICID_CHART, .name = "chart" },
- { .id = ACLK_TOPICID_ALARMS, .name = "alarms" },
- { .id = ACLK_TOPICID_METADATA, .name = "meta" },
- { .id = ACLK_TOPICID_COMMAND, .name = "inbox-cmd" },
- { .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
+ { .id = ACLK_TOPICID_CHART, .name = "chart" },
+ { .id = ACLK_TOPICID_ALARMS, .name = "alarms" },
+ { .id = ACLK_TOPICID_METADATA, .name = "meta" },
+ { .id = ACLK_TOPICID_COMMAND, .name = "inbox-cmd" },
+ { .id = ACLK_TOPICID_AGENT_CONN, .name = "agent-connection" },
+ { .id = ACLK_TOPICID_CMD_NG_V1, .name = "inbox-cmd-v1" },
+ { .id = ACLK_TOPICID_CREATE_NODE, .name = "create-node-instance" },
+ { .id = ACLK_TOPICID_NODE_CONN, .name = "node-instance-connection" },
+ { .id = ACLK_TOPICID_CHART_DIMS, .name = "chart-and-dims-updated" },
+ { .id = ACLK_TOPICID_CHART_CONFIGS_UPDATED, .name = "chart-configs-updated" },
+ { .id = ACLK_TOPICID_CHART_RESET, .name = "reset-charts" },
+ { .id = ACLK_TOPICID_RETENTION_UPDATED, .name = "chart-retention-updated" },
+ { .id = ACLK_TOPICID_NODE_INFO, .name = "node-instance-info" },
+ { .id = ACLK_TOPICID_ALARM_LOG, .name = "alarm-log" },
+ { .id = ACLK_TOPICID_ALARM_HEALTH, .name = "alarm-health" },
+ { .id = ACLK_TOPICID_ALARM_CONFIG, .name = "alarm-config" },
+ { .id = ACLK_TOPICID_ALARM_SNAPSHOT, .name = "alarm-snapshot" },
+ { .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
+};
+
+enum aclk_topics compulsory_topics_legacy[] = {
+ ACLK_TOPICID_CHART,
+ ACLK_TOPICID_ALARMS,
+ ACLK_TOPICID_METADATA,
+ ACLK_TOPICID_COMMAND,
+ ACLK_TOPICID_UNKNOWN
};
-enum aclk_topics compulsory_topics[] = {
+enum aclk_topics compulsory_topics_new_cloud_arch[] = {
+// TODO remove old topics once not needed anymore
ACLK_TOPICID_CHART,
ACLK_TOPICID_ALARMS,
ACLK_TOPICID_METADATA,
ACLK_TOPICID_COMMAND,
+ ACLK_TOPICID_AGENT_CONN,
+ ACLK_TOPICID_CMD_NG_V1,
+ ACLK_TOPICID_CREATE_NODE,
+ ACLK_TOPICID_NODE_CONN,
+ ACLK_TOPICID_CHART_DIMS,
+ ACLK_TOPICID_CHART_CONFIGS_UPDATED,
+ ACLK_TOPICID_CHART_RESET,
+ ACLK_TOPICID_RETENTION_UPDATED,
+ ACLK_TOPICID_NODE_INFO,
+ ACLK_TOPICID_ALARM_LOG,
+ ACLK_TOPICID_ALARM_HEALTH,
+ ACLK_TOPICID_ALARM_CONFIG,
+ ACLK_TOPICID_ALARM_SNAPSHOT,
ACLK_TOPICID_UNKNOWN
};
@@ -188,7 +231,7 @@ static int topic_cache_add_topic(struct json_object *json, struct aclk_topic *to
}
topic->topic_id = topic_name_to_id(json_object_get_string(json_object_iter_peek_value(&it)));
if (topic->topic_id == ACLK_TOPICID_UNKNOWN) {
- info("topic dictionary has unknown topic name \"%s\"", json_object_get_string(json_object_iter_peek_value(&it)));
+ debug(D_ACLK, "topic dictionary has unknown topic name \"%s\"", json_object_get_string(json_object_iter_peek_value(&it)));
}
json_object_iter_next(&it);
continue;
@@ -246,6 +289,8 @@ int aclk_generate_topic_cache(struct json_object *json)
}
}
+ enum aclk_topics *compulsory_topics = aclk_use_new_cloud_arch ? compulsory_topics_new_cloud_arch : compulsory_topics_legacy;
+
for (int i = 0; compulsory_topics[i] != ACLK_TOPICID_UNKNOWN; i++) {
if (!aclk_get_topic(compulsory_topics[i])) {
error("missing compulsory topic \"%s\" in password response from cloud", topic_id_to_name(compulsory_topics[i]));
@@ -315,189 +360,6 @@ unsigned long int aclk_tbeb_delay(int reset, int base, unsigned long int min, un
return delay;
}
-#define ACLK_PROXY_PROTO_ADDR_SEPARATOR "://"
-#define ACLK_PROXY_ENV "env"
-#define ACLK_PROXY_CONFIG_VAR "proxy"
-
-struct {
- ACLK_PROXY_TYPE type;
- const char *url_str;
-} supported_proxy_types[] = {
- { .type = PROXY_TYPE_SOCKS5, .url_str = "socks5" ACLK_PROXY_PROTO_ADDR_SEPARATOR },
- { .type = PROXY_TYPE_SOCKS5, .url_str = "socks5h" ACLK_PROXY_PROTO_ADDR_SEPARATOR },
- { .type = PROXY_TYPE_HTTP, .url_str = "http" ACLK_PROXY_PROTO_ADDR_SEPARATOR },
- { .type = PROXY_TYPE_UNKNOWN, .url_str = NULL },
-};
-
-const char *aclk_proxy_type_to_s(ACLK_PROXY_TYPE *type)
-{
- switch (*type) {
- case PROXY_DISABLED:
- return "disabled";
- case PROXY_TYPE_HTTP:
- return "HTTP";
- case PROXY_TYPE_SOCKS5:
- return "SOCKS";
- default:
- return "Unknown";
- }
-}
-
-static inline ACLK_PROXY_TYPE aclk_find_proxy(const char *string)
-{
- int i = 0;
- while (supported_proxy_types[i].url_str) {
- if (!strncmp(supported_proxy_types[i].url_str, string, strlen(supported_proxy_types[i].url_str)))
- return supported_proxy_types[i].type;
- i++;
- }
- return PROXY_TYPE_UNKNOWN;
-}
-
-ACLK_PROXY_TYPE aclk_verify_proxy(const char *string)
-{
- if (!string)
- return PROXY_TYPE_UNKNOWN;
-
- while (*string == 0x20 && *string!=0) // Help coverity (compiler will remove)
- string++;
-
- if (!*string)
- return PROXY_TYPE_UNKNOWN;
-
- return aclk_find_proxy(string);
-}
-
-// helper function to censor user&password
-// for logging purposes
-void safe_log_proxy_censor(char *proxy)
-{
- size_t length = strlen(proxy);
- char *auth = proxy + length - 1;
- char *cur;
-
- while ((auth >= proxy) && (*auth != '@'))
- auth--;
-
- //if not found or @ is first char do nothing
- if (auth <= proxy)
- return;
-
- cur = strstr(proxy, ACLK_PROXY_PROTO_ADDR_SEPARATOR);
- if (!cur)
- cur = proxy;
- else
- cur += strlen(ACLK_PROXY_PROTO_ADDR_SEPARATOR);
-
- while (cur < auth) {
- *cur = 'X';
- cur++;
- }
-}
-
-static inline void safe_log_proxy_error(char *str, const char *proxy)
-{
- char *log = strdupz(proxy);
- safe_log_proxy_censor(log);
- error("%s Provided Value:\"%s\"", str, log);
- freez(log);
-}
-
-static inline int check_socks_enviroment(const char **proxy)
-{
- char *tmp = getenv("socks_proxy");
-
- if (!tmp)
- return 1;
-
- if (aclk_verify_proxy(tmp) == PROXY_TYPE_SOCKS5) {
- *proxy = tmp;
- return 0;
- }
-
- safe_log_proxy_error(
- "Environment var \"socks_proxy\" defined but of unknown format. Supported syntax: \"socks5[h]://[user:pass@]host:ip\".",
- tmp);
- return 1;
-}
-
-static inline int check_http_enviroment(const char **proxy)
-{
- char *tmp = getenv("http_proxy");
-
- if (!tmp)
- return 1;
-
- if (aclk_verify_proxy(tmp) == PROXY_TYPE_HTTP) {
- *proxy = tmp;
- return 0;
- }
-
- safe_log_proxy_error(
- "Environment var \"http_proxy\" defined but of unknown format. Supported syntax: \"http[s]://[user:pass@]host:ip\".",
- tmp);
- return 1;
-}
-
-const char *aclk_lws_wss_get_proxy_setting(ACLK_PROXY_TYPE *type)
-{
- const char *proxy = config_get(CONFIG_SECTION_CLOUD, ACLK_PROXY_CONFIG_VAR, ACLK_PROXY_ENV);
- *type = PROXY_DISABLED;
-
- if (strcmp(proxy, "none") == 0)
- return proxy;
-
- if (strcmp(proxy, ACLK_PROXY_ENV) == 0) {
- if (check_socks_enviroment(&proxy) == 0) {
-#ifdef LWS_WITH_SOCKS5
- *type = PROXY_TYPE_SOCKS5;
- return proxy;
-#else
- safe_log_proxy_error("socks_proxy environment variable set to use SOCKS5 proxy "
- "but Libwebsockets used doesn't have SOCKS5 support built in. "
- "Ignoring and checking for other options.",
- proxy);
-#endif
- }
- if (check_http_enviroment(&proxy) == 0)
- *type = PROXY_TYPE_HTTP;
- return proxy;
- }
-
- *type = aclk_verify_proxy(proxy);
-#ifndef LWS_WITH_SOCKS5
- if (*type == PROXY_TYPE_SOCKS5) {
- safe_log_proxy_error(
- "Config var \"" ACLK_PROXY_CONFIG_VAR
- "\" set to use SOCKS5 proxy but Libwebsockets used is built without support for SOCKS proxy. ACLK will be disabled.",
- proxy);
- }
-#endif
- if (*type == PROXY_TYPE_UNKNOWN) {
- *type = PROXY_DISABLED;
- safe_log_proxy_error(
- "Config var \"" ACLK_PROXY_CONFIG_VAR
- "\" defined but of unknown format. Supported syntax: \"socks5[h]://[user:pass@]host:ip\".",
- proxy);
- }
-
- return proxy;
-}
-
-// helper function to read settings only once (static)
-// as claiming, challenge/response and ACLK
-// read the same thing, no need to parse again
-const char *aclk_get_proxy(ACLK_PROXY_TYPE *type)
-{
- static const char *proxy = NULL;
- static ACLK_PROXY_TYPE proxy_type = PROXY_NOT_SET;
-
- if (proxy_type == PROXY_NOT_SET)
- proxy = aclk_lws_wss_get_proxy_setting(&proxy_type);
-
- *type = proxy_type;
- return proxy;
-}
#define HTTP_PROXY_PREFIX "http://"
void aclk_set_proxy(char **ohost, int *port, enum mqtt_wss_proxy_type *type)