@cryptotaxi247 / netdata-1 / commits / d783c4227

Adds aclk/cloud state command to netdatacli (#11462)

Adds aclk/cloud state command to netdatacli

Timotej S committed Sep 17, 2021 at 10:57 UTC d783c422752c3b9fd4c65e9dcace0f97294b0148
8 files changed +163 -2
aclk/aclk.c
+55
@@ -1019,3 +1019,58 @@ void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, con
1019 {
1020 aclk_send_bin_message_subtopic_pid(mqttwss_client, msg, msg_len, subtopic, msgname);
1021 }
1022 +
1023 +char *ng_aclk_state(void)
1024 +{
1025 + BUFFER *wb = buffer_create(1024);
1026 + char *ret;
1027 +
1028 + buffer_strcat(wb,
1029 + "ACLK Available: Yes\n"
1030 + "ACLK Implementation: Next Generation\n"
1031 + "Claimed: "
1032 + );
1033 +
1034 + char *agent_id = is_agent_claimed();
1035 + if (agent_id == NULL)
1036 + buffer_strcat(wb, "No\n");
1037 + else {
1038 + buffer_sprintf(wb, "Yes\nClaimed Id: %s\n", agent_id);
1039 + freez(agent_id);
1040 + }
1041 +
1042 + buffer_sprintf(wb, "Online: %s", aclk_connected ? "Yes" : "No");
1043 +
1044 + ret = strdupz(buffer_tostring(wb));
1045 + buffer_free(wb);
1046 + return ret;
1047 +}
1048 +
1049 +char *ng_aclk_state_json(void)
1050 +{
1051 + json_object *tmp, *msg = json_object_new_object();
1052 +
1053 + tmp = json_object_new_boolean(1);
1054 + json_object_object_add(msg, "aclk-available", tmp);
1055 +
1056 + tmp = json_object_new_string("Next Generation");
1057 + json_object_object_add(msg, "aclk-implementation", tmp);
1058 +
1059 + char *agent_id = is_agent_claimed();
1060 + tmp = json_object_new_boolean(agent_id != NULL);
1061 + json_object_object_add(msg, "agent-claimed", tmp);
1062 +
1063 + if (agent_id) {
1064 + tmp = json_object_new_string(agent_id);
1065 + freez(agent_id);
1066 + } else
1067 + tmp = NULL;
1068 + json_object_object_add(msg, "claimed-id", tmp);
1069 +
1070 + tmp = json_object_new_boolean(aclk_connected);
1071 + json_object_object_add(msg, "online", tmp);
1072 +
1073 + char *str = strdupz(json_object_to_json_string_ext(msg, JSON_C_TO_STRING_PLAIN));
1074 + json_object_put(msg);
1075 + return str;
1076 +}
aclk/aclk.h
+3
@@ -49,4 +49,7 @@ void aclk_send_node_instances(void);
49
50 void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, const char *msgname);
51
52 +char *ng_aclk_state(void);
53 +char *ng_aclk_state_json(void);
54 +
55 #endif /* ACLK_H */
aclk/aclk_api.c
+32
@@ -194,3 +194,35 @@ struct label *add_aclk_host_labels(struct label *label) {
194 #endif
195 return label;
196 }
197 +
198 +char *aclk_state(void) {
199 +#ifndef ENABLE_ACLK
200 + return strdupz("ACLK Available: No");
201 +#else
202 +#ifdef ACLK_NG
203 + if (aclk_ng)
204 + return ng_aclk_state();
205 +#endif
206 +#ifdef ACLK_LEGACY
207 + if (!aclk_ng)
208 + return legacy_aclk_state();
209 +#endif
210 +#endif /* ENABLE_ACLK */
211 + return NULL;
212 +}
213 +
214 +char *aclk_state_json(void) {
215 +#ifndef ENABLE_ACLK
216 + return strdupz("{\"aclk-available\": false}");
217 +#else
218 +#ifdef ACLK_NG
219 + if (aclk_ng)
220 + return ng_aclk_state_json();
221 +#endif
222 +#ifdef ACLK_LEGACY
223 + if (!aclk_ng)
224 + return legacy_aclk_state_json();
225 +#endif
226 +#endif /* ENABLE_ACLK */
227 + return NULL;
228 +}
aclk/aclk_api.h
+2
@@ -49,5 +49,7 @@ void aclk_host_state_update(RRDHOST *host, int connect);
49 #endif
50
51 struct label *add_aclk_host_labels(struct label *label);
52 +char *aclk_state(void);
53 +char *aclk_state_json(void);
54
55 #endif /* ACLK_API_H */
aclk/legacy/agent_cloud_link.c
+50
@@ -1450,3 +1450,53 @@ int legacy_aclk_update_alarm(RRDHOST *host, ALARM_ENTRY *ae)
1450
1451 return 0;
1452 }
1453 +
1454 +char *legacy_aclk_state(void)
1455 +{
1456 + BUFFER *wb = buffer_create(1024);
1457 + char *ret;
1458 +
1459 + buffer_strcat(wb,
1460 + "ACLK Available: Yes\n"
1461 + "ACLK Implementation: Legacy\n"
1462 + "Claimed: "
1463 + );
1464 +
1465 + char *agent_id = is_agent_claimed();
1466 + if (agent_id == NULL)
1467 + buffer_strcat(wb, "No\n");
1468 + else {
1469 + buffer_sprintf(wb, "Yes\nClaimed Id: %s\n", agent_id);
1470 + freez(agent_id);
1471 + }
1472 +
1473 + buffer_sprintf(wb, "Online: %s", aclk_connected ? "Yes" : "No");
1474 +
1475 + ret = strdupz(buffer_tostring(wb));
1476 + buffer_free(wb);
1477 + return ret;
1478 +}
1479 +
1480 +char *legacy_aclk_state_json(void)
1481 +{
1482 + BUFFER *wb = buffer_create(1024);
1483 + char *agent_id = is_agent_claimed();
1484 +
1485 + buffer_sprintf(wb,
1486 + "{\"aclk-available\":true,"
1487 + "\"aclk-implementation\":\"Legacy\","
1488 + "\"agent-claimed\":%s,"
1489 + "\"claimed-id\":",
1490 + agent_id ? "true" : "false"
1491 + );
1492 +
1493 + if (agent_id) {
1494 + buffer_sprintf(wb, "\"%s\"", agent_id);
1495 + freez(agent_id);
1496 + } else
1497 + buffer_strcat(wb, "null");
1498 +
1499 + buffer_sprintf(wb, ",\"online\":%s}", aclk_connected ? "true" : "false");
1500 +
1501 + return strdupz(buffer_tostring(wb));
1502 +}
aclk/legacy/agent_cloud_link.h
+3
@@ -77,6 +77,9 @@ extern void health_alarm_entry2json_nolock(BUFFER *wb, ALARM_ENTRY *ae, RRDHOST
77 void legacy_aclk_host_state_update(RRDHOST *host, int connect);
78 int aclk_send_info_child_connection(RRDHOST *host, ACLK_CMD cmd);
79 void aclk_update_next_child_to_popcorn(void);
80 +
81 +char *legacy_aclk_state(void);
82 +char *legacy_aclk_state_json(void);
83 #endif
84
85 #endif //NETDATA_AGENT_CLOUD_LINK_H
daemon/commands.c
+17 -2
@@ -46,6 +46,7 @@ static cmd_status_t cmd_reload_labels_execute(char *args, char **message);
46 static cmd_status_t cmd_read_config_execute(char *args, char **message);
47 static cmd_status_t cmd_write_config_execute(char *args, char **message);
48 static cmd_status_t cmd_ping_execute(char *args, char **message);
49 +static cmd_status_t cmd_aclk_state(char *args, char **message);
50
51 static command_info_t command_info_array[] = {
52 {"help", cmd_help_execute, CMD_TYPE_HIGH_PRIORITY}, // show help menu
@@ -58,7 +59,8 @@ static command_info_t command_info_array[] = {
59 {"reload-labels", cmd_reload_labels_execute, CMD_TYPE_ORTHOGONAL}, // reload the labels
60 {"read-config", cmd_read_config_execute, CMD_TYPE_CONCURRENT},
61 {"write-config", cmd_write_config_execute, CMD_TYPE_ORTHOGONAL},
61 - {"ping", cmd_ping_execute, CMD_TYPE_ORTHOGONAL}
62 + {"ping", cmd_ping_execute, CMD_TYPE_ORTHOGONAL},
63 + {"aclk-state", cmd_aclk_state, CMD_TYPE_ORTHOGONAL}
64 };
65
66 /* Mutexes for commands of type CMD_TYPE_ORTHOGONAL */
@@ -121,7 +123,9 @@ static cmd_status_t cmd_help_execute(char *args, char **message)
123 "reload-claiming-state\n"
124 " Reload agent claiming state from disk.\n"
125 "ping\n"
124 - " Return with 'pong' if agent is alive.\n",
126 + " Return with 'pong' if agent is alive.\n"
127 + "aclk-state [json]\n"
128 + " Returns current state of ACLK and Cloud connection. (optionally in json)\n",
129 MAX_COMMAND_LENGTH - 1);
130 return CMD_STATUS_SUCCESS;
131 }
@@ -310,6 +314,17 @@ static cmd_status_t cmd_ping_execute(char *args, char **message)
314 return CMD_STATUS_SUCCESS;
315 }
316
317 +static cmd_status_t cmd_aclk_state(char *args, char **message)
318 +{
319 + info("COMMAND: Reopening aclk/cloud state.");
320 + if (strstr(args, "json"))
321 + *message = aclk_state_json();
322 + else
323 + *message = aclk_state();
324 +
325 + return CMD_STATUS_SUCCESS;
326 +}
327 +
328 static void cmd_lock_exclusive(unsigned index)
329 {
330 (void)index;
daemon/commands.h
+1
@@ -24,6 +24,7 @@ typedef enum cmd {
24 CMD_READ_CONFIG,
25 CMD_WRITE_CONFIG,
26 CMD_PING,
27 + CMD_ACLK_STATE,
28 CMD_TOTAL_COMMANDS
29 } cmd_t;
30