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