Compare commits

...
53 Commits
Author SHA1 Message Date
fengzeroz a1e4d2c89b Merge pull request #2770 from fengzeroz/v2.12
fix(mqtt): replace strcpy with strncpy
2026-05-29 14:25:01 +08:00
fengzero e3e00a5ee4 fix(mqtt): replace strcpy with strncpy 2026-05-29 06:10:40 +00:00
fengzeroz 635aa06dc6 Merge pull request #2764 from fengzeroz/v2.12
fix(mqtt): verify the length of the data received from protobuf
2026-05-25 09:38:12 +08:00
fengzero b949f43b4a fix(mqtt): verify the length of the data received from protobuf 2026-05-22 08:48:36 +00:00
fengzeroz 9aa7b8fe04 Merge pull request #2715 from fengzeroz/v2.12
rm mqtt db cache
2026-03-17 10:02:42 +08:00
fengzero 8a54a818ae rm mqtt db cache 2026-03-17 01:53:10 +00:00
fengzeroz 394f500748 Merge pull request #2713 from fengzeroz/v2.12
version: 2.12.5
2026-03-16 14:34:39 +08:00
fengzero e75cbf854c version: 2.12.5 2026-03-16 06:32:26 +00:00
fengzeroz 06334b4820 Merge pull request #2703 from fengzeroz/v2.12
filter array in metas
2026-03-10 11:28:27 +08:00
fengzero 46989e0dee filter array in metas 2026-03-10 03:24:51 +00:00
fengzeroz 327490bfb2 Merge pull request #2698 from ZhouBox/v2.12
[v2.12]fixbug:heap use after free
2026-03-03 13:38:30 +08:00
xiang.zhou 3626877155 fixbug:heap use after free 2026-03-03 11:09:17 +08:00
fengzeroz 54c58567a2 Merge pull request #2681 from fengzeroz/v2.12
V2.12
2026-01-27 18:06:07 +08:00
fengzero b1ed9a9155 core(cache): update_im_f_m, filter dup value 2026-01-27 09:56:15 +00:00
fengzero c05b409aee modify default log config 2026-01-27 09:56:03 +00:00
fengzeroz fc7e4bc7d8 Merge pull request #2665 from fengzeroz/v2.12
write tag log
2026-01-19 15:04:04 +08:00
fengzero 096bcd3e36 write tag log 2026-01-19 06:56:59 +00:00
fengzeroz 4d7de9bdbc Merge pull request #2654 from fengzeroz/v2.12
cid name len
2026-01-06 14:27:35 +08:00
fengzero c1ef351f85 cid name len 2026-01-06 06:26:03 +00:00
fengzeroz e629b9ce35 Merge pull request #2647 from fengzeroz/v2.12
fix(group): free group context with old group
2025-12-25 10:04:58 +08:00
fengzero d05da31690 fix(group): free group context with old group 2025-12-25 02:03:14 +00:00
fengzeroz a9768b0b5c Merge pull request #2640 from fengzeroz/v2.12
fix(connection): close fd if ip invalid
2025-12-19 15:04:17 +08:00
fengzero 857c95fd11 fix(connection): close fd if ip invalid 2025-12-19 07:01:50 +00:00
fengzeroz cbe7179569 Merge pull request #2634 from fengzeroz/v2.12
cid: parse float array
2025-12-12 17:30:30 +08:00
fengzero d238c1efb3 cid: parse float array 2025-12-12 09:30:02 +00:00
fengzeroz cac3ee592e Merge pull request #2627 from fengzeroz/v2.12
Revert "cid: find first sdo"
2025-12-09 15:01:47 +08:00
fengzero 7287e4e2bf Revert "cid: find first sdo"
This reverts commit ffbd9b336a.
2025-12-09 06:57:40 +00:00
fengzeroz 41aef8d30a Merge pull request #2626 from fengzeroz/v2.12
cid: find first sdo
2025-12-08 16:11:46 +08:00
fengzero ffbd9b336a cid: find first sdo 2025-12-08 08:11:09 +00:00
fengzeroz 21656149d8 Merge pull request #2625 from fengzeroz/v2.12
version: 2.12.4
2025-12-05 16:18:28 +08:00
fengzero eb647d9692 version: 2.12.4 2025-12-05 08:12:55 +00:00
fengzeroz 71ead18756 Merge pull request #2619 from ZhouBox/v2.12
[v2.12]ekuiper:add warn log
2025-11-20 10:01:26 +08:00
xiang.zhou a127a69d10 ekuiper:add warn log 2025-11-19 16:38:17 +08:00
fengzeroz 40e637303c Merge pull request #2616 from hxy7yx/v2.12-1
[v2.12]add notice log for write tag/tags/gtags
2025-11-19 14:38:25 +08:00
hxy7yx 1060eb6508 add notice log for write tag/tags/tags 2025-11-18 22:26:25 -08:00
hxy7yx 9e5702b15b add info logging for driver write tags 2025-11-18 22:26:25 -08:00
fengzeroz 5891dc034c Merge pull request #2612 from ZhouBox/v2.12
[v2.12]ekuiper:add log
2025-11-19 11:03:41 +08:00
xiang.zhou 071e87ac4f ekuiper:add log 2025-11-19 10:49:48 +08:00
fengzeroz 0a2c6efd1b Merge pull request #2607 from fengzeroz/v2.12
rm unused node cache sql
2025-11-12 10:16:26 +08:00
fengzero 40c7115405 rm unused node cache sql 2025-11-12 02:15:26 +00:00
fengzeroz 9a10abfe3a Merge pull request #2594 from fengzeroz/v2.12
export db: skip load failed data
2025-10-21 15:33:38 +08:00
fengzero 58529e31f8 export db: skip load failed data 2025-10-21 07:32:12 +00:00
fengzeroz 99f02d2e09 Merge pull request #2585 from fengzeroz/v2.12
replace tar with zip db data
2025-10-20 11:31:02 +08:00
fengzero 6cf84fc4a6 replace tar with zip db data 2025-10-20 03:28:58 +00:00
fengzeroz a668154424 Merge pull request #2583 from fengzeroz/v2.12
version: 2.12.3
2025-10-17 15:15:48 +08:00
fengzero 4ddd7e9d01 version: 2.12.3 2025-10-17 07:05:59 +00:00
fengzeroz 79ef5127f6 Merge pull request #2578 from fengzeroz/v2.12
connect(udpto): get local port
2025-10-14 11:32:41 +08:00
fengzero 1bb74163f9 connect(udpto): get local port 2025-10-14 03:30:10 +00:00
fengzeroz cb53a6bd33 Merge pull request #2573 from fengzeroz/v2.12
V2.12
2025-10-13 15:23:19 +08:00
fengzero fe48ac8178 connect: get udp bind port 2025-10-13 07:12:44 +00:00
fengzero f564fbf4b2 api: export db 2025-10-13 07:12:30 +00:00
fengzeroz 705f618af5 Merge pull request #2570 from hxy7yx/2.12
[v2.12]fix:datalayers
2025-09-23 17:14:28 +08:00
hxy7yx 4eb1587b8e fix:datalayers 2025-09-23 02:02:22 -07:00
25 changed files with 873 additions and 105 deletions
+13 -1
View File
@@ -13,7 +13,7 @@ jobs:
steps:
# checkout
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
submodules: recursive
@@ -40,6 +40,18 @@ jobs:
cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=unusedFunction --suppress=*:src/otel/trace.pb-c.c --suppress=*:src/otel/common.pb-c.c --suppress=*:src/otel/resource.pb-c.c ./plugins ./src
cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=variableScope ./simulator
flawfinder:
name: Flawfinder Scan
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: flawfinder_scan
uses: david-a-wheeler/flawfinder@2.0.20
with:
arguments: '--minlevel=3 .'
build:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.12
+1 -1
View File
@@ -8,7 +8,7 @@ on:
- published
env:
VERSION: 2.12.2
VERSION: 2.12.5
UI_VERSION: 2.6.1
BRANCH: v2.12
+1 -2
View File
@@ -10,6 +10,5 @@ syslog = "<P>%d(%Y-%m-%dT%T%z) %H neuron[%p]: level=%v msg="[%c] %m" file="%f:%L
[rules]
*.* "./logs/%c.log", 25MB * 1 ~ "./logs/%c.#2r.log"; file_format
*.* "./logs/%c.log", 50MB * 2 ~ "./logs/%c.#2r.log"; file_format
*.* >stdout; stdout_format
*.* $remote_syslog,"%V"; syslog
+3
View File
@@ -86,6 +86,9 @@ typedef struct adapter_callbacks {
void (*update_im)(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta);
void (*update_im_f_m)(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta);
void (*scan_tags_response)(neu_adapter_t *adapter, void *r,
neu_resp_scan_tags_t *resp_scan);
void (*test_read_tag_response)(neu_adapter_t *adapter, void *r,
+2 -1
View File
@@ -303,6 +303,7 @@ int neu_conn_tcp_server_wait_msg(neu_conn_t *conn, int fd, void *context,
int is_ipv4(const char *ip);
int is_ipv6(const char *ip);
bool neu_conn_is_connected(neu_conn_t *conn);
bool neu_conn_is_connected(neu_conn_t *conn);
uint16_t neu_conn_udp_act_port(neu_conn_t *conn);
#endif
+3 -3
View File
@@ -24,7 +24,7 @@
#define NEU_VERSION_MAJOR 2
#define NEU_VERSION_MINOR 12
#define NEU_VERSION_FIX 2
#define NEU_VERSION_FIX 5
#define NEU_GET_VERSION_MAJOR(V) ((0xffff0000 & V) >> 16)
#define NEU_GET_VERSION_MINOR(V) ((0x0000ff00 & V) >> 8)
@@ -67,7 +67,7 @@
#define NEU_LOG_LEVEL_FATAL "fatal"
#define NEU_CID_LNCLASS_LEN 12
#define NEU_CID_LNTYPE_LEN 32
#define NEU_CID_LNTYPE_LEN 40
#define NEU_CID_LNPREFIX_LEN 10
#define NEU_CID_LNINST_LEN 4
#define NEU_CID_LDEVICE_LEN 32
@@ -85,7 +85,7 @@
#define NEU_CID_DATASET_NAME_LEN 32
#define NEU_CID_REPORT_NAME_LEN 32
#define NEU_CID_REPORT_ID_LEN 64
#define NEU_CID_ID_LEN 32
#define NEU_CID_ID_LEN 40
#define NEU_CID_REF_TYPE_LEN 32
#define NEU_CID_IED_NAME_LEN 32
#define NEU_CID_ACCESS_POINT_NAME_LEN 16
+5
View File
@@ -343,6 +343,11 @@ typedef struct {
uint8_t precision;
} neu_dvalue_t;
static inline bool neu_dvalue_is_array(const neu_dvalue_t *dvalue)
{
return dvalue->type >= NEU_TYPE_ARRAY_CHAR;
}
static inline void neu_free_dvalue(neu_dvalue_t *dvalue)
{
if (dvalue->type > NEU_TYPE_ARRAY_CHAR &&
+7
View File
@@ -200,6 +200,10 @@ typedef struct {
cid_basictype_e btypes[NEU_TAG_FORMAT_LENGTH]; // for do-[da]
int n_btypes;
cid_basictype_e btype;
bool is_array;
uint8_t array_size;
} cid_fcda_t;
typedef struct {
@@ -298,6 +302,9 @@ typedef struct {
cid_basictype_e btype;
cid_fc_e fc;
bool is_array;
uint8_t array_size;
} cid_tm_do_da_t;
typedef struct {
-36
View File
@@ -1,36 +0,0 @@
/**
* NEURON IIoT System for Industry 4.0
* Copyright (C) 2020-2023 EMQ Technologies Co., Ltd All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
--- fix primary key ---
BEGIN;
DROP TABLE IF EXISTS old_node_cache;
ALTER TABLE node_cache RENAME TO old_node_cache;
CREATE TABLE IF NOT EXISTS node_cache (
node_name TEXT PRIMARY KEY,
CACHE TEXT NOT NULL,
FOREIGN KEY (node_name) REFERENCES nodes (name) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT OR REPLACE INTO node_cache SELECT * FROM old_node_cache;
DROP TABLE old_node_cache;
COMMIT;
+13
View File
@@ -234,9 +234,22 @@ void recv_data_callback(void *arg)
if (req->singular) {
rv = send_write_tag_req(plugin, &req->single, json_str, trace_flag,
trace_id, span_id);
if (rv == 0) {
plog_notice(plugin, "write tag %s.%s on node %s", req->single.group,
req->single.tag, req->single.node);
}
} else {
rv = send_write_tags_req(plugin, &req->plural, json_str, trace_flag,
trace_id, span_id);
if (rv == 0) {
if (req->plural.n_tag == 0) {
plog_warn(plugin, "no tags to write on node %s",
req->plural.node);
} else {
plog_notice(plugin, "write %d tags on node %s",
req->plural.n_tag, req->plural.node);
}
}
}
if (0 != rv) {
+55 -30
View File
@@ -39,7 +39,7 @@ static void to_traceparent(uint8_t *trace_id, char *span_id, char *out)
size += sprintf(out + size, "%02x", trace_id[i]);
}
sprintf(out + size, "-%s-01", span_id);
snprintf(out + size, strlen(span_id) + 5, "-%s-01", span_id);
}
static int tag_values_to_json(UT_array *tags, mqtt_static_vt_t *s_tags,
@@ -281,7 +281,7 @@ static inline int send_driver_action(neu_plugin_t * plugin,
header.ctx = NULL;
neu_req_driver_action_t action = { 0 };
strncpy(action.driver, req->driver, NEU_NODE_NAME_LEN);
strncpy(action.driver, req->driver, NEU_NODE_NAME_LEN - 1);
action.action = strdup(req->action);
if (0 != neu_plugin_op(plugin, header, &action)) {
@@ -465,7 +465,7 @@ static int send_write_tags_req(neu_plugin_t *plugin, neu_json_mqtt_t *mqtt,
}
for (int i = 0; i < cmd.n_tag; i++) {
strcpy(cmd.tags[i].tag, req->tags[i].tag);
strncpy(cmd.tags[i].tag, req->tags[i].tag, NEU_TAG_NAME_LEN - 1);
if (0 !=
json_value_to_tag_value(&req->tags[i].value, req->tags[i].t,
&cmd.tags[i].value)) {
@@ -574,6 +574,31 @@ void handle_write_req(neu_mqtt_qos_e qos, const char *topic,
return;
}
if (strlen(wr->node) >= NEU_NODE_NAME_LEN ||
strlen(wr->group) >= NEU_GROUP_NAME_LEN) {
plog_error(plugin, "node or group name too long");
model__write_request__free_unpacked(wr, NULL);
return;
}
for (size_t i = 0; i < wr->n_tags; i++) {
if (strlen(wr->tags[i]->name) >= NEU_TAG_NAME_LEN) {
plog_error(plugin, "tag name too long");
model__write_request__free_unpacked(wr, NULL);
return;
}
if (wr->tags[i]->value->value_case ==
MODEL__DATA_ITEM_VALUE__VALUE_STRING_VALUE) {
if (strlen(wr->tags[i]->value->string_value) >=
NEU_VALUE_SIZE) {
plog_error(plugin, "string tag value too long");
model__write_request__free_unpacked(wr, NULL);
return;
}
}
}
mqtt = calloc(1, sizeof(neu_json_mqtt_t));
mqtt->uuid = strdup(wr->uuid);
mqtt->payload = NULL;
@@ -593,7 +618,7 @@ void handle_write_req(neu_mqtt_qos_e qos, const char *topic,
}
for (int i = 0; i < cmd.n_tag; i++) {
strcpy(cmd.tags[i].tag, wr->tags[i]->name);
strncpy(cmd.tags[i].tag, wr->tags[i]->name, NEU_TAG_NAME_LEN - 1);
switch (wr->tags[i]->value->value_case) {
case MODEL__DATA_ITEM_VALUE__VALUE_INT_VALUE:
cmd.tags[i].value.type = NEU_TYPE_INT64;
@@ -610,8 +635,8 @@ void handle_write_req(neu_mqtt_qos_e qos, const char *topic,
break;
case MODEL__DATA_ITEM_VALUE__VALUE_STRING_VALUE:
cmd.tags[i].value.type = NEU_TYPE_STRING;
strcpy(cmd.tags[i].value.value.str,
wr->tags[i]->value->string_value);
strncpy(cmd.tags[i].value.value.str,
wr->tags[i]->value->string_value, NEU_VALUE_SIZE - 1);
break;
default:
break;
@@ -907,7 +932,7 @@ void handle_driver_action_req(neu_mqtt_qos_e qos, const char *topic,
mqtt->tracestate = NULL;
header.ctx = mqtt;
strcpy(cmd.driver, dar->node);
strncpy(cmd.driver, dar->node, NEU_NODE_NAME_LEN - 1);
cmd.action = strdup(dar->action);
model__driver_action_request__free_unpacked(dar, NULL);
@@ -930,7 +955,7 @@ void handle_driver_action_req(neu_mqtt_qos_e qos, const char *topic,
}
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
cmd.action = strdup(req->action);
neu_json_decode_driver_action_req_free(req);
free(json_str);
@@ -1768,8 +1793,8 @@ void handle_driver_directory_req(neu_mqtt_qos_e qos, const char *topic,
mqtt->tracestate = NULL;
header.ctx = mqtt;
strcpy(cmd.driver, flr->node);
strcpy(cmd.path, flr->path);
strncpy(cmd.driver, flr->node, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, flr->path, NEU_PATH_LEN - 1);
model__file_list_request__free_unpacked(flr, NULL);
} else {
@@ -1792,8 +1817,8 @@ void handle_driver_directory_req(neu_mqtt_qos_e qos, const char *topic,
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strcpy(cmd.path, req->path);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, req->path, NEU_PATH_LEN - 1);
neu_json_decode_driver_directory_req_free(req);
free(json_str);
@@ -1957,8 +1982,8 @@ void handle_driver_fup_open_req(neu_mqtt_qos_e qos, const char *topic,
mqtt->tracestate = NULL;
header.ctx = mqtt;
strcpy(cmd.driver, fur->node);
strcpy(cmd.path, fur->path);
strncpy(cmd.driver, fur->node, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, fur->path, NEU_PATH_LEN - 1);
model__file_upload_request__free_unpacked(fur, NULL);
} else {
@@ -1979,8 +2004,8 @@ void handle_driver_fup_open_req(neu_mqtt_qos_e qos, const char *topic,
return;
}
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strcpy(cmd.path, req->path);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, req->path, NEU_PATH_LEN - 1);
neu_json_decode_driver_fup_open_req_free(req);
free(json_str);
@@ -2084,8 +2109,8 @@ void handle_driver_fup_data_req(neu_mqtt_qos_e qos, const char *topic,
header.ctx = mqtt;
strcpy(cmd.driver, fudr->node);
strcpy(cmd.path, fudr->path);
strncpy(cmd.driver, fudr->node, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, fudr->path, NEU_PATH_LEN - 1);
model__file_upload_data_request__free_unpacked(fudr, NULL);
} else {
@@ -2108,8 +2133,8 @@ void handle_driver_fup_data_req(neu_mqtt_qos_e qos, const char *topic,
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strcpy(cmd.path, req->path);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.path, req->path, NEU_PATH_LEN - 1);
neu_json_decode_driver_fup_data_req_free(req);
free(json_str);
@@ -2218,9 +2243,9 @@ void handle_driver_fdown_open_req(neu_mqtt_qos_e qos, const char *topic,
mqtt->tracestate = NULL;
header.ctx = mqtt;
strcpy(cmd.driver, fdr->node);
strcpy(cmd.src_path, fdr->src_path);
strcpy(cmd.dst_path, fdr->dst_path);
strncpy(cmd.driver, fdr->node, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.src_path, fdr->src_path, NEU_PATH_LEN - 1);
strncpy(cmd.dst_path, fdr->dst_path, NEU_PATH_LEN - 1);
cmd.size = fdr->size;
model__file_download_request__free_unpacked(fdr, NULL);
@@ -2242,9 +2267,9 @@ void handle_driver_fdown_open_req(neu_mqtt_qos_e qos, const char *topic,
return;
}
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strcpy(cmd.src_path, req->src_path);
strcpy(cmd.dst_path, req->dst_path);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.src_path, req->src_path, NEU_PATH_LEN - 1);
strncpy(cmd.dst_path, req->dst_path, NEU_PATH_LEN - 1);
cmd.size = req->size;
neu_json_decode_driver_fdown_open_req_free(req);
@@ -2346,8 +2371,8 @@ void handle_driver_fdown_data_req(neu_mqtt_qos_e qos, const char *topic,
mqtt->tracestate = NULL;
header.ctx = mqtt;
strcpy(cmd.driver, fddr->node);
strcpy(cmd.src_path, fddr->path);
strncpy(cmd.driver, fddr->node, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.src_path, fddr->path, NEU_PATH_LEN - 1);
cmd.more = fddr->more;
cmd.len = fddr->data.len;
cmd.data = calloc(fddr->data.len, sizeof(uint8_t));
@@ -2373,8 +2398,8 @@ void handle_driver_fdown_data_req(neu_mqtt_qos_e qos, const char *topic,
}
header.ctx = mqtt;
strcpy(cmd.driver, req->driver);
strcpy(cmd.src_path, req->src_path);
strncpy(cmd.driver, req->driver, NEU_NODE_NAME_LEN - 1);
strncpy(cmd.src_path, req->src_path, NEU_PATH_LEN - 1);
cmd.more = req->more;
cmd.len = req->len;
cmd.data = calloc(req->len, sizeof(uint8_t));
+2
View File
@@ -167,6 +167,7 @@ int mqtt_plugin_uninit(neu_plugin_t *plugin)
mqtt_config_fini(&plugin->config);
if (plugin->client) {
neu_mqtt_client_remove_cache_db(plugin->client);
neu_mqtt_client_close(plugin->client);
neu_mqtt_client_free(plugin->client);
plugin->client = NULL;
@@ -395,6 +396,7 @@ int mqtt_plugin_config(neu_plugin_t *plugin, const char *setting)
}
if (plugin->client != NULL) {
neu_mqtt_client_remove_cache_db(plugin->client);
neu_mqtt_client_close(plugin->client);
neu_mqtt_client_free(plugin->client);
}
+9
View File
@@ -158,6 +158,9 @@ static struct neu_http_handler cors_handler[] = {
{
.url = "/api/v2/datalayers/tag",
},
{
.url = "/api/v2/export/db",
},
};
static struct neu_http_handler rest_handlers[] = {
@@ -528,6 +531,12 @@ static struct neu_http_handler rest_handlers[] = {
.url = "/api/v2/datalayers/tag",
.value.handler = handle_datalayers_get_tag,
},
{
.method = NEU_HTTP_METHOD_GET,
.type = NEU_HTTP_HANDLER_FUNCTION,
.url = "/api/v2/export/db",
.value.handler = handle_export_db,
},
};
void neu_rest_handler(const struct neu_http_handler **handlers, uint32_t *size)
+296
View File
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
@@ -35,6 +36,7 @@
#include "argparse.h"
#include "parser/neu_json_login.h"
#include "persist/persist_impl.h"
#include "json/neu_json_fn.h"
#include "handle.h"
@@ -630,3 +632,297 @@ void handle_status(nng_aio *aio)
neu_http_response(aio, 0, result);
free(result);
}
int nodes_write_to_csv(const char *filename, UT_array *nodes)
{
FILE *f = fopen(filename, "a");
if (NULL == f) {
nlog_error("failed to open file:%s", filename);
return -1;
}
utarray_foreach(nodes, neu_persist_node_info_t *, node)
{
fprintf(f, "%s,%d,%d,%s\n", node->name, node->type, node->state,
node->plugin_name);
}
fclose(f);
return 0;
}
int settings_write_to_csv(const char *filename, const char *node_name,
const char *settings)
{
FILE *f = fopen(filename, "a");
if (NULL == f) {
nlog_error("failed to open file:%s", filename);
return -1;
}
fprintf(f, "%s,%s\n", node_name, settings);
fclose(f);
return 0;
}
int groups_write_to_csv(const char *filename, const char *driver_name,
UT_array *groups)
{
FILE *f = fopen(filename, "a");
if (NULL == f) {
nlog_error("failed to open file:%s", filename);
return -1;
}
utarray_foreach(groups, neu_persist_group_info_t *, group)
{
fprintf(f, "%s,%s,%d, NULL\n", driver_name, group->name,
group->interval);
}
fclose(f);
return 0;
}
int subscribes_write_to_csv(const char *filename, const char *app_name,
UT_array *subscribers)
{
FILE *f = fopen(filename, "a");
if (NULL == f) {
nlog_error("failed to open file:%s", filename);
return -1;
}
utarray_foreach(subscribers, neu_persist_subscription_info_t *, sub)
{
fprintf(f, "%s,%s,%s,%s,%s\n", app_name, sub->driver_name,
sub->group_name, sub->params, sub->static_tags);
}
fclose(f);
return 0;
}
int tags_write_to_csv(const char *filename, const char *node_name,
const char *group_name, UT_array *tags)
{
FILE *f = fopen(filename, "a");
if (NULL == f) {
nlog_error("failed to open file:%s", filename);
return -1;
}
utarray_foreach(tags, neu_datatag_t *, tag)
{
fprintf(f, "%s,%s,%s,%s,%d,%d,%f,%f,%d,%s,%s,NULL\n", node_name,
group_name, tag->name, tag->address, tag->attribute,
tag->precision, tag->decimal, tag->bias, tag->type,
tag->description, tag->format);
}
fclose(f);
return 0;
}
int write_csv_header()
{
FILE *f = fopen("nodes.csv", "w");
if (NULL == f) {
nlog_error("failed to open file:%s", "nodes.csv");
return -1;
}
fprintf(f, "name,type,state,plugin_name\n");
fclose(f);
f = fopen("settings.csv", "w");
if (NULL == f) {
nlog_error("failed to open file:%s", "settings.csv");
return -1;
}
fprintf(f, "node_name,setting\n");
fclose(f);
f = fopen("groups.csv", "w");
if (NULL == f) {
nlog_error("failed to open file:%s", "groups.csv");
return -1;
}
fprintf(f, "driver_name,name,interval,context\n");
fclose(f);
f = fopen("tags.csv", "w");
if (NULL == f) {
nlog_error("failed to open file:%s", "tags.csv");
return -1;
}
fprintf(f,
"driver_name,group_name,name,address,attribute,precision,"
"decimal,bias,type,description,format,value\n");
fclose(f);
f = fopen("subscribes.csv", "w");
if (NULL == f) {
nlog_error("failed to open file:%s", "subscribes.csv");
return -1;
}
fprintf(f, "app_name,driver_name,group_name,params,static_tags\n");
fclose(f);
return 0;
}
int read_file(const char *file_name, void **datap, size_t *lenp)
{
int rv = 0;
FILE * f;
struct stat st;
size_t len;
void * data;
if (stat(file_name, &st) != 0) {
return NEU_ERR_FILE_NOT_EXIST;
}
if ((f = fopen(file_name, "rb")) == NULL) {
nlog_error("open fail: %s", file_name);
return NEU_ERR_FILE_OPEN_FAILURE;
}
len = st.st_size;
if (len > 0) {
if ((data = malloc(len)) == NULL) {
rv = NEU_ERR_EINTERNAL;
goto done;
}
if (fread(data, 1, len, f) != len) {
nlog_error("file read failued, errno = %d", errno);
rv = NEU_ERR_FILE_READ_FAILURE;
free(data);
goto done;
}
} else {
data = NULL;
}
*datap = data;
*lenp = len;
done:
fclose(f);
return (rv);
}
void handle_export_db(nng_aio *aio)
{
write_csv_header();
UT_array *nodes = NULL;
int rv = neu_persister_load_nodes(&nodes);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
return;
}
rv = nodes_write_to_csv("nodes.csv", nodes);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
utarray_free(nodes);
return;
}
utarray_foreach(nodes, neu_persist_node_info_t *, node)
{
char *settings = NULL;
rv = neu_persister_load_node_setting(node->name,
(const char **) &settings);
if (rv != 0) {
continue;
}
rv = settings_write_to_csv("settings.csv", node->name, settings);
free(settings);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
utarray_free(nodes);
return;
}
}
utarray_foreach(nodes, neu_persist_node_info_t *, node)
{
if (node->type == 2) {
UT_array *subscribers = NULL;
rv = neu_persister_load_subscriptions(node->name, &subscribers);
if (rv != 0) {
continue;
}
rv = subscribes_write_to_csv("subscribes.csv", node->name,
subscribers);
utarray_free(subscribers);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
utarray_free(nodes);
return;
}
}
}
utarray_foreach(nodes, neu_persist_node_info_t *, node)
{
UT_array *groups = NULL;
rv = neu_persister_load_groups(node->name, &groups);
if (rv != 0) {
continue;
}
rv = groups_write_to_csv("groups.csv", node->name, groups);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
utarray_free(nodes);
return;
}
utarray_foreach(groups, neu_persist_group_info_t *, group)
{
UT_array *tags = NULL;
rv = neu_persister_load_tags(node->name, group->name, &tags);
if (rv != 0) {
continue;
}
rv = tags_write_to_csv("tags.csv", node->name, group->name, tags);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_WRITE_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
utarray_free(nodes);
utarray_free(groups);
return;
}
utarray_free(tags);
}
utarray_free(groups);
}
utarray_free(nodes);
system("rm -rf /tmp/neuron.zip");
system("zip /tmp/neuron.zip nodes.csv settings.csv groups.csv tags.csv "
"subscribes.csv");
void * data = NULL;
size_t len = 0;
rv = read_file("/tmp/neuron.zip", &data, &len);
if (rv != 0) {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_FILE_READ_FAILURE, {
neu_http_response(aio, error_code.error, result_error);
});
return;
}
neu_http_response_file(aio, data, len,
"attachment; filename=\"neuron.zip\"");
free(data);
}
+2
View File
@@ -36,4 +36,6 @@ void handle_add_user(nng_aio *aio);
void handle_update_user(nng_aio *aio);
void handle_delete_user(nng_aio *aio);
void handle_export_db(nng_aio *aio);
#endif
+81 -4
View File
@@ -219,14 +219,15 @@ void *neu_driver_cache_get_trace(neu_driver_cache_t *cache, const char *group)
return trace;
}
void neu_driver_cache_update_change(neu_driver_cache_t *cache,
bool neu_driver_cache_update_change(neu_driver_cache_t *cache,
const char *group, const char *tag,
int64_t timestamp, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta,
bool change)
{
struct elem *elem = NULL;
tkey_t key = to_key(group, tag);
struct elem *elem = NULL;
tkey_t key = to_key(group, tag);
bool tag_changed = false;
pthread_mutex_lock(&cache->mtx);
HASH_FIND(hh, cache->table, &key, sizeof(tkey_t), elem);
@@ -241,6 +242,7 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
(sub_filter_err && elem->value.type != value.type &&
elem->value.type != NEU_TYPE_ERROR)) {
elem->changed = true;
tag_changed = true;
} else if (sub_filter_err && elem->value.type != value.type &&
elem->value.type == NEU_TYPE_ERROR) {
switch (value.type) {
@@ -264,17 +266,20 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (memcmp(&elem->value_old.value, &value.value,
sizeof(value.value)) != 0) {
elem->changed = true;
tag_changed = true;
}
break;
case NEU_TYPE_BYTES:
if (elem->value_old.value.bytes.length !=
value.value.bytes.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcpy(elem->value_old.value.bytes.bytes,
value.value.bytes.bytes,
value.value.bytes.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -282,11 +287,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.bools.length !=
value.value.bools.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.bools.bools,
value.value.bools.bools,
value.value.bools.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -294,11 +301,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.i8s.length !=
value.value.i8s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.i8s.i8s,
value.value.i8s.i8s,
value.value.i8s.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -306,11 +315,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.u8s.length !=
value.value.u8s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.u8s.u8s,
value.value.u8s.u8s,
value.value.u8s.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -318,12 +329,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.i16s.length !=
value.value.i16s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.i16s.i16s,
value.value.i16s.i16s,
value.value.i16s.length * sizeof(int16_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -331,12 +344,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.u16s.length !=
value.value.u16s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.u16s.u16s,
value.value.u16s.u16s,
value.value.u16s.length * sizeof(uint16_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -344,12 +359,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.i32s.length !=
value.value.i32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.i32s.i32s,
value.value.i32s.i32s,
value.value.i32s.length * sizeof(int32_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -357,12 +374,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.u32s.length !=
value.value.u32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.u32s.u32s,
value.value.u32s.u32s,
value.value.u32s.length * sizeof(uint32_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -370,12 +389,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.i64s.length !=
value.value.i64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.i64s.i64s,
value.value.i64s.i64s,
value.value.i64s.length * sizeof(int64_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -383,12 +404,14 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.u64s.length !=
value.value.u64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.u64s.u64s,
value.value.u64s.u64s,
value.value.u64s.length * sizeof(uint64_t)) !=
0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -396,11 +419,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.f32s.length !=
value.value.f32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.f32s.f32s,
value.value.f32s.f32s,
value.value.f32s.length * sizeof(float)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -408,11 +433,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.f64s.length !=
value.value.f64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.f64s.f64s,
value.value.f64s.f64s,
value.value.f64s.length * sizeof(double)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -420,11 +447,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.strs.length !=
value.value.strs.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.strs.strs,
value.value.strs.strs,
value.value.strs.length * sizeof(char *)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -432,6 +461,7 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (json_equal(elem->value_old.value.json, value.value.json) !=
0) {
elem->changed = true;
tag_changed = true;
}
break;
}
@@ -439,11 +469,13 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.value.ptr.length !=
value.value.ptr.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value_old.value.ptr.ptr,
value.value.ptr.ptr,
value.value.ptr.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
@@ -453,10 +485,12 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.precision == 0) {
elem->changed =
elem->value_old.value.f32 != value.value.f32;
tag_changed = elem->changed;
} else {
if (fabs(elem->value_old.value.f32 - value.value.f32) >
pow(0.1, elem->value_old.precision)) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -464,10 +498,12 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value_old.precision == 0) {
elem->changed =
elem->value_old.value.d64 != value.value.d64;
tag_changed = elem->changed;
} else {
if (fabs(elem->value_old.value.d64 - value.value.d64) >
pow(0.1, elem->value_old.precision)) {
elem->changed = true;
tag_changed = true;
}
}
@@ -497,17 +533,20 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (memcmp(&elem->value.value, &value.value,
sizeof(value.value)) != 0) {
elem->changed = true;
tag_changed = true;
}
break;
case NEU_TYPE_BYTES:
if (elem->value.value.bytes.length !=
value.value.bytes.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcpy(elem->value.value.bytes.bytes,
value.value.bytes.bytes,
value.value.bytes.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
@@ -515,140 +554,166 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
if (elem->value.value.bools.length !=
value.value.bools.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.bools.bools,
value.value.bools.bools,
value.value.bools.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_INT8:
if (elem->value.value.i8s.length != value.value.i8s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.i8s.i8s, value.value.i8s.i8s,
value.value.i8s.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_UINT8:
if (elem->value.value.u8s.length != value.value.u8s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.u8s.u8s, value.value.u8s.u8s,
value.value.u8s.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_INT16:
if (elem->value.value.i16s.length != value.value.i16s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.i16s.i16s, value.value.i16s.i16s,
value.value.i16s.length * sizeof(int16_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_UINT16:
if (elem->value.value.u16s.length != value.value.u16s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.u16s.u16s, value.value.u16s.u16s,
value.value.u16s.length * sizeof(uint16_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_INT32:
if (elem->value.value.i32s.length != value.value.i32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.i32s.i32s, value.value.i32s.i32s,
value.value.i32s.length * sizeof(int32_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_UINT32:
if (elem->value.value.u32s.length != value.value.u32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.u32s.u32s, value.value.u32s.u32s,
value.value.u32s.length * sizeof(uint32_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_INT64:
if (elem->value.value.i64s.length != value.value.i64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.i64s.i64s, value.value.i64s.i64s,
value.value.i64s.length * sizeof(int64_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_UINT64:
if (elem->value.value.u64s.length != value.value.u64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(
elem->value.value.u64s.u64s, value.value.u64s.u64s,
value.value.u64s.length * sizeof(uint64_t)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_FLOAT:
if (elem->value.value.f32s.length != value.value.f32s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.f32s.f32s,
value.value.f32s.f32s,
value.value.f32s.length * sizeof(float)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_DOUBLE:
if (elem->value.value.f64s.length != value.value.f64s.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.f64s.f64s,
value.value.f64s.f64s,
value.value.f64s.length * sizeof(double)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ARRAY_STRING:
if (elem->value.value.strs.length != value.value.strs.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.strs.strs,
value.value.strs.strs,
value.value.strs.length * sizeof(char *)) != 0) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_PTR: {
if (elem->value.value.ptr.length != value.value.ptr.length) {
elem->changed = true;
tag_changed = true;
} else {
if (memcmp(elem->value.value.ptr.ptr, value.value.ptr.ptr,
value.value.ptr.length) != 0) {
elem->changed = true;
tag_changed = true;
}
}
@@ -657,32 +722,38 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
case NEU_TYPE_CUSTOM: {
if (json_equal(elem->value.value.json, value.value.json) != 0) {
elem->changed = true;
tag_changed = true;
}
break;
}
case NEU_TYPE_FLOAT:
if (elem->value.precision == 0) {
elem->changed = elem->value.value.f32 != value.value.f32;
tag_changed = elem->changed;
} else {
if (fabs(elem->value.value.f32 - value.value.f32) >
pow(0.1, elem->value.precision)) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_DOUBLE:
if (elem->value.precision == 0) {
elem->changed = elem->value.value.d64 != value.value.d64;
tag_changed = elem->changed;
} else {
if (fabs(elem->value.value.d64 - value.value.d64) >
pow(0.1, elem->value.precision)) {
elem->changed = true;
tag_changed = true;
}
}
break;
case NEU_TYPE_ERROR:
elem->changed = true;
tag_changed = true;
break;
}
}
@@ -778,7 +849,12 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
}
elem->metas = calloc(n_meta, sizeof(neu_tag_meta_t));
for (int i = 0; i < n_meta; i++) {
memcpy(&elem->metas[i], &metas[i], sizeof(neu_tag_meta_t));
if (!neu_dvalue_is_array(&metas[i].value)) {
memcpy(&elem->metas[i], &metas[i], sizeof(neu_tag_meta_t));
} else {
neu_free_dvalue(&metas[i].value);
elem->metas[i].value.type = NEU_TYPE_INT8;
}
}
elem->n_meta = n_meta;
@@ -786,6 +862,7 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
}
pthread_mutex_unlock(&cache->mtx);
return tag_changed;
}
void neu_driver_cache_update(neu_driver_cache_t *cache, const char *group,
+1 -1
View File
@@ -35,7 +35,7 @@ void neu_driver_cache_update(neu_driver_cache_t *cache, const char *group,
const char *tag, int64_t timestamp,
neu_dvalue_t value, neu_tag_meta_t *metas,
int n_meta);
void neu_driver_cache_update_change(neu_driver_cache_t *cache,
bool neu_driver_cache_update_change(neu_driver_cache_t *cache,
const char *group, const char *tag,
int64_t timestamp, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta,
+267 -11
View File
@@ -113,6 +113,9 @@ static void update(neu_adapter_t *adapter, const char *group, const char *tag,
static void update_im(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta);
static void update_im_f_m(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta);
static void update_with_meta(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta);
@@ -175,7 +178,8 @@ static void write_responses(neu_adapter_t *adapter, void *r,
neu_driver_write_responses_t *response,
int n_response)
{
neu_reqresp_head_t * req = (neu_reqresp_head_t *) r;
neu_reqresp_head_t *req = (neu_reqresp_head_t *) r;
const char *iface = (req->sender[0] != '\0') ? req->sender : "unknown";
neu_resp_write_tags_t nresp = { 0 };
req->type = NEU_RESP_WRITE_TAGS;
UT_icd icd = { sizeof(neu_resp_write_tags_ele_t), NULL, NULL, NULL };
@@ -190,8 +194,18 @@ static void write_responses(neu_adapter_t *adapter, void *r,
strcpy(ele.group, resp->group);
strcpy(ele.tag, resp->name);
ele.error = resp->error;
nlog_notice(
"driver multi write response detail, driver: %s, interface: "
"%s, group: %s, tag: %s, error: %d",
adapter->name, iface, resp->group, resp->name, resp->error);
utarray_push_back(array, &ele);
}
nlog_notice(
"driver multi write response summary, driver: %s, interface: %s, "
"result_count: %d",
adapter->name, iface, n_response);
nresp.tags = array;
adapter->cb_funs.response(adapter, req, &nresp);
@@ -199,8 +213,10 @@ static void write_responses(neu_adapter_t *adapter, void *r,
static void write_response(neu_adapter_t *adapter, void *r, neu_error error)
{
neu_reqresp_head_t *req = (neu_reqresp_head_t *) r;
neu_resp_error_t nerror = { .error = error };
neu_reqresp_head_t *req = (neu_reqresp_head_t *) r;
neu_reqresp_type_e req_type = req->type;
const char * iface = (req->sender[0] != '\0') ? req->sender : "unknown";
neu_resp_error_t nerror = { .error = error };
neu_otel_trace_ctx trace = NULL;
neu_otel_scope_ctx scope = NULL;
@@ -221,18 +237,55 @@ static void write_response(neu_adapter_t *adapter, void *r, neu_error error)
}
}
if (NEU_REQ_WRITE_TAG == req->type) {
neu_req_write_tag_fini((neu_req_write_tag_t *) &req[1]);
if (NEU_REQ_WRITE_TAG == req_type) {
neu_req_write_tag_t *cmd = (neu_req_write_tag_t *) &req[1];
const char * group = cmd->group ? cmd->group : "";
const char * tag = cmd->tag ? cmd->tag : "";
nlog_notice("driver single write response, driver: %s, interface: %s, "
"group: %s, tag: %s, %s, error: %d",
adapter->name, iface, group, tag,
neu_value_str(cmd->value.type, cmd->value.value), error);
neu_req_write_tag_fini(cmd);
if (neu_otel_control_is_started() && trace) {
neu_otel_scope_set_span_name(scope, "driver write tag response");
}
} else if (NEU_REQ_WRITE_TAGS == req->type) {
neu_req_write_tags_fini((neu_req_write_tags_t *) &req[1]);
} else if (NEU_REQ_WRITE_TAGS == req_type) {
neu_req_write_tags_t *cmd = (neu_req_write_tags_t *) &req[1];
const char * group = cmd->group ? cmd->group : "";
nlog_notice("driver multi write response, driver: %s, interface: %s, "
"group: %s, tag_count: %d, error: %d",
adapter->name, iface, group, cmd->n_tag, error);
for (int i = 0; i < cmd->n_tag; i++) {
const char *tag_name = cmd->tags[i].tag;
nlog_notice("driver multi write response tag detail, driver: %s, "
"group: %s, tag: %s, %s",
adapter->name, group, tag_name ? tag_name : "",
neu_value_str(cmd->tags[i].value.type,
cmd->tags[i].value.value));
}
neu_req_write_tags_fini(cmd);
if (neu_otel_control_is_started() && trace) {
neu_otel_scope_set_span_name(scope, "driver write tags response");
}
} else if (NEU_REQ_WRITE_GTAGS == req->type) {
neu_req_write_gtags_fini((neu_req_write_gtags_t *) &req[1]);
} else if (NEU_REQ_WRITE_GTAGS == req_type) {
neu_req_write_gtags_t *cmd = (neu_req_write_gtags_t *) &req[1];
nlog_notice("driver multi write response, driver: %s, interface: %s, "
"group_count: %d, error: %d",
adapter->name, iface, cmd->n_group, error);
for (int i = 0; i < cmd->n_group; i++) {
const char *group_name =
cmd->groups[i].group ? cmd->groups[i].group : "";
for (int k = 0; k < cmd->groups[i].n_tag; k++) {
const char *tag_name = cmd->groups[i].tags[k].tag;
nlog_notice(
"driver multi write response tag detail, driver: %s, "
"group: %s, tag: %s, %s",
adapter->name, group_name, tag_name ? tag_name : "",
neu_value_str(cmd->groups[i].tags[k].value.type,
cmd->groups[i].tags[k].value.value));
}
}
neu_req_write_gtags_fini(cmd);
if (neu_otel_control_is_started() && trace) {
neu_otel_scope_set_span_name(scope, "driver write gtags response");
}
@@ -389,6 +442,107 @@ static void update_with_trace(neu_adapter_t *adapter, const char *group,
}
}
static void update_im_f_m(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta)
{
neu_adapter_driver_t *driver = (neu_adapter_driver_t *) adapter;
if (tag == NULL) {
nlog_warn("update_im_f_m tag is null");
return;
}
group_t *find = NULL;
HASH_FIND_STR(driver->groups, group, find);
if (find == NULL) {
nlog_error(
"update_im_f_m group not found, driver: %s, group: %s, tag: %s",
driver->adapter.name, group, tag);
return;
}
bool changed = neu_driver_cache_update_change(driver->cache, group, tag,
global_timestamp, value,
metas, n_meta, false);
driver->adapter.cb_funs.update_metric(&driver->adapter,
NEU_METRIC_TAG_READS_TOTAL, 1, NULL);
if (value.type == NEU_TYPE_ERROR) {
return;
}
if (!changed) {
return;
}
UT_array *tags = neu_adapter_driver_get_ptag(driver, group, tag);
if (tags == NULL) {
return;
}
neu_datatag_t *first = utarray_front(tags);
if (first == NULL) {
utarray_free(tags);
nlog_debug("update immediately, driver: %s, "
"group: %s, tag: %s, type: %s, "
"timestamp: %" PRId64,
driver->adapter.name, group, tag,
neu_type_string(value.type), global_timestamp);
return;
}
nlog_debug("update and report immediately, driver: %s, "
"group: %s, tag: %s, type: %s, "
"timestamp: %" PRId64,
driver->adapter.name, group, tag, neu_type_string(value.type),
global_timestamp);
neu_reqresp_head_t header = {
.type = NEU_REQRESP_TRANS_DATA,
};
neu_reqresp_trans_data_t *data =
calloc(1, sizeof(neu_reqresp_trans_data_t));
data->driver = strdup(driver->adapter.name);
data->group = strdup(group);
utarray_new(data->tags, neu_resp_tag_value_meta_icd());
read_report_group(global_timestamp, 0,
neu_adapter_get_tag_cache_type(&driver->adapter),
driver->cache, group, tags, data->tags);
if (utarray_len(data->tags) > 0) {
data->ctx = calloc(1, sizeof(neu_reqresp_trans_data_ctx_t));
data->ctx->index = utarray_len(find->apps);
pthread_mutex_init(&data->ctx->mtx, NULL);
if (utarray_len(find->apps) > 0) {
pthread_mutex_lock(&find->apps_mtx);
utarray_foreach(find->apps, sub_app_t *, app)
{
if (driver->adapter.cb_funs.responseto(
&driver->adapter, &header, data, app->addr) != 0) {
neu_trans_data_free(data);
}
}
pthread_mutex_unlock(&find->apps_mtx);
} else {
neu_trans_data_free(data);
}
} else {
utarray_free(data->tags);
free(data->group);
free(data->driver);
}
utarray_free(tags);
free(data);
}
static void update_im(neu_adapter_t *adapter, const char *group,
const char *tag, neu_dvalue_t value,
neu_tag_meta_t *metas, int n_meta)
@@ -554,6 +708,7 @@ neu_adapter_driver_t *neu_adapter_driver_create()
driver->adapter.cb_funs.driver.fdown_open_response = fdown_open_response;
driver->adapter.cb_funs.driver.fup_data_response = fup_data_response;
driver->adapter.cb_funs.driver.update_im = update_im;
driver->adapter.cb_funs.driver.update_im_f_m = update_im_f_m;
driver->adapter.cb_funs.driver.update_with_trace = update_with_trace;
driver->adapter.cb_funs.driver.update_with_meta = update_with_meta;
driver->adapter.cb_funs.driver.scan_tags_response = scan_tags_response;
@@ -1371,6 +1526,8 @@ int neu_adapter_driver_write_tags(neu_adapter_driver_t *driver,
group_t *g = find_group(driver, cmd->group);
if (g == NULL) {
nlog_warn("driver write tags group not exist, driver: %s, group: %s",
driver->adapter.name, cmd->group);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
NEU_ERR_GROUP_NOT_EXIST);
return NEU_ERR_GROUP_NOT_EXIST;
@@ -1391,6 +1548,9 @@ int neu_adapter_driver_write_tags(neu_adapter_driver_t *driver,
cmd->tags[i].value.value.d64,
cmd->tags[i].value.type, tag->decimal);
} else {
nlog_warn("driver write tags not exist, driver: %s, group: %s, "
"tag: %s",
driver->adapter.name, cmd->group, cmd->tags[i].tag);
value_check = NEU_ERR_TAG_NOT_EXIST;
}
@@ -1424,6 +1584,8 @@ int neu_adapter_driver_write_tags(neu_adapter_driver_t *driver,
}
if (value_err != NEU_ERR_SUCCESS) {
nlog_warn("driver write tags value error(%d), driver: %s, group: %s",
value_err, driver->adapter.name, cmd->group);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
value_err);
utarray_foreach(tags, neu_plugin_tag_value_t *, tv)
@@ -1437,6 +1599,9 @@ int neu_adapter_driver_write_tags(neu_adapter_driver_t *driver,
}
if (utarray_len(tags) != (unsigned int) cmd->n_tag) {
nlog_warn("driver write tags some tag not exist, driver: %s, group: "
"%s",
driver->adapter.name, cmd->group);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
NEU_ERR_TAG_NOT_EXIST);
utarray_foreach(tags, neu_plugin_tag_value_t *, tv)
@@ -1449,6 +1614,23 @@ int neu_adapter_driver_write_tags(neu_adapter_driver_t *driver,
return NEU_ERR_TAG_NOT_EXIST;
}
const neu_reqresp_head_t *head = (const neu_reqresp_head_t *) req;
const char * iface =
(head && head->sender[0] != '\0') ? head->sender : "unknown";
nlog_notice("driver multi write request received, driver: %s, group: %s, "
"interface: %s, tag_count: %d",
driver->adapter.name, cmd->group, iface, cmd->n_tag);
for (int i = 0; i < cmd->n_tag; i++) {
const char *tag_name = cmd->tags[i].tag;
nlog_notice(
"driver multi write request tag detail, driver: %s, group: %s, "
"tag: %s, %s",
driver->adapter.name, cmd->group, tag_name ? tag_name : "",
neu_value_str(cmd->tags[i].value.type, cmd->tags[i].value.value));
}
to_be_write_tag_t wtag = { 0 };
wtag.single = false;
wtag.req = (void *) req;
@@ -1573,6 +1755,29 @@ int neu_adapter_driver_write_gtags(neu_adapter_driver_t *driver,
return NEU_ERR_TAG_NOT_EXIST;
}
const neu_reqresp_head_t *head = (const neu_reqresp_head_t *) req;
const char * iface =
(head && head->sender[0] != '\0') ? head->sender : "unknown";
nlog_notice(
"driver multi write request received, driver: %s, interface: %s, "
"group_count: %d, tag_count: %u",
driver->adapter.name, iface, cmd->n_group, n_tag);
for (int i = 0; i < cmd->n_group; i++) {
const char *group_name =
cmd->groups[i].group ? cmd->groups[i].group : "";
for (int k = 0; k < cmd->groups[i].n_tag; k++) {
const char *tag_name = cmd->groups[i].tags[k].tag;
nlog_notice("driver multi write request tag detail, driver: %s, "
"group: %s, tag: %s, %s",
driver->adapter.name, group_name,
tag_name ? tag_name : "",
neu_value_str(cmd->groups[i].tags[k].value.type,
cmd->groups[i].tags[k].value.value));
}
}
to_be_write_tag_t wtag = { 0 };
wtag.single = false;
wtag.req = (void *) req;
@@ -1596,6 +1801,8 @@ int neu_adapter_driver_write_tag(neu_adapter_driver_t *driver,
group_t * g = find_group(driver, cmd->group);
if (g == NULL) {
nlog_warn("driver write tag group not exist, driver: %s, group: %s",
driver->adapter.name, cmd->group);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
NEU_ERR_GROUP_NOT_EXIST);
return NEU_ERR_GROUP_NOT_EXIST;
@@ -1603,11 +1810,16 @@ int neu_adapter_driver_write_tag(neu_adapter_driver_t *driver,
neu_datatag_t *tag = neu_group_find_tag(g->group, cmd->tag);
if (tag == NULL) {
nlog_warn("driver write tag not exist, driver: %s, group: %s, tag: %s",
driver->adapter.name, cmd->group, cmd->tag);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
NEU_ERR_TAG_NOT_EXIST);
return NEU_ERR_TAG_NOT_EXIST;
} else {
if ((tag->attribute & NEU_ATTRIBUTE_WRITE) != NEU_ATTRIBUTE_WRITE) {
nlog_warn("driver write tag not allow write, driver: %s, group: "
"%s, tag: %s",
driver->adapter.name, cmd->group, cmd->tag);
driver->adapter.cb_funs.driver.write_response(
&driver->adapter, req, NEU_ERR_PLUGIN_TAG_NOT_ALLOW_WRITE);
neu_tag_free(tag);
@@ -1619,6 +1831,9 @@ int neu_adapter_driver_write_tag(neu_adapter_driver_t *driver,
cmd->value.type, tag->decimal);
if (value_check != NEU_ERR_SUCCESS) {
nlog_warn("driver write tag value error(%d), driver: %s, group: "
"%s, tag: %s",
value_check, driver->adapter.name, cmd->group, cmd->tag);
driver->adapter.cb_funs.driver.write_response(&driver->adapter, req,
value_check);
neu_tag_free(tag);
@@ -1638,6 +1853,17 @@ int neu_adapter_driver_write_tag(neu_adapter_driver_t *driver,
fix_value(tag, cmd->value.type, &cmd->value);
const neu_reqresp_head_t *head = (const neu_reqresp_head_t *) req;
const char * iface =
(head && head->sender[0] != '\0') ? head->sender : "unknown";
const char *group_name = cmd->group ? cmd->group : "";
const char *tag_name = cmd->tag ? cmd->tag : "";
nlog_notice("driver single write request received, driver: %s, group: "
"%s, tag: %s, interface: %s, %s",
driver->adapter.name, group_name, tag_name, iface,
neu_value_str(cmd->value.type, cmd->value.value));
to_be_write_tag_t wtag = { 0 };
wtag.single = true;
wtag.req = (void *) req;
@@ -1745,6 +1971,10 @@ int neu_adapter_driver_update_group(neu_adapter_driver_t *driver,
if (NULL != new_name && 0 != strcmp(name, new_name)) {
char *new_name_cp1 = strdup(new_name);
char *new_name_cp2 = strdup(new_name);
if (find->grp.group_free != NULL) {
find->grp.group_free(&find->grp);
find->grp.group_free = NULL;
}
if (new_name_cp1 && new_name_cp2 &&
0 == neu_group_set_name(find->group, new_name)) {
HASH_DEL(driver->groups, find);
@@ -2494,9 +2724,35 @@ static int write_callback(void *usr_data)
e_time = neu_time_ns();
neu_tag_free(wtag->tag);
} else {
group->driver->adapter.module->intf_funs->driver.write_tags(
group->driver->adapter.plugin, (void *) wtag->req, wtag->tvs);
const neu_reqresp_head_t *head =
(const neu_reqresp_head_t *) wtag->req;
const char *iface =
(head && head->sender[0] != '\0') ? head->sender : "unknown";
size_t tag_count = utarray_len(wtag->tvs);
nlog_info("driver multi write request start, driver: %s, group: "
"%s, interface: %s, tag_count: %zu",
group->driver->adapter.name, group->name, iface,
tag_count);
utarray_foreach(wtag->tvs, neu_plugin_tag_value_t *, tv)
{
const char *tag_name =
(tv && tv->tag && tv->tag->name) ? tv->tag->name : "";
nlog_info("driver multi write tag detail, driver: %s, group: "
"%s, tag: %s, %s",
group->driver->adapter.name, group->name, tag_name,
neu_value_str(tv->type, tv->value));
}
int ret =
group->driver->adapter.module->intf_funs->driver.write_tags(
group->driver->adapter.plugin, (void *) wtag->req,
wtag->tvs);
e_time = neu_time_ms();
nlog_info("driver multi write request done, driver: %s, group: %s, "
"interface: %s, ret: %d",
group->driver->adapter.name, group->name, iface, ret);
utarray_foreach(wtag->tvs, neu_plugin_tag_value_t *, tv)
{
neu_tag_free(tv->tag);
+2
View File
@@ -372,8 +372,10 @@ void neu_group_change_test(neu_group_t *group, int64_t timestamp, void *arg,
neu_group_change_fn fn)
{
if (group->timestamp != timestamp) {
pthread_mutex_lock(&group->mtx);
UT_array *tags = to_array(group->tags);
fn(arg, group->timestamp, tags, group->interval);
pthread_mutex_unlock(&group->mtx);
}
}
+25 -1
View File
@@ -69,6 +69,8 @@ struct neu_conn {
uint8_t *buf;
uint16_t buf_size;
uint16_t offset;
uint16_t udp_act_port;
};
static void conn_tcp_server_add_client(neu_conn_t *conn, int fd,
@@ -503,7 +505,8 @@ ssize_t neu_conn_recv(neu_conn_t *conn, uint8_t *buf, ssize_t len)
conn->param.log,
"tcp conn fd: %d, recv buf len %zd, ret: %zd, errno: %s(%d)",
conn->fd, len, ret, strerror(errno), errno);
if (ret == 0 || (conn->connection_ok && ret == -1 && errno != EAGAIN)) {
if (ret == 0 ||
(conn->connection_ok && ret == -1 && errno != EAGAIN)) {
conn_disconnect(conn);
}
}
@@ -868,6 +871,7 @@ static void conn_connect(neu_conn_t *conn)
} else {
zlog_error(conn->param.log, "invalid ip: %s",
conn->param.params.tcp_server.ip);
close(fd);
return;
}
@@ -938,6 +942,7 @@ static void conn_connect(neu_conn_t *conn)
} else {
zlog_error(conn->param.log, "invalid ip: %s",
conn->param.params.tcp_server.ip);
close(fd);
return;
}
@@ -950,6 +955,13 @@ static void conn_connect(neu_conn_t *conn)
return;
}
struct sockaddr_in local_addr = { 0 };
socklen_t local_addr_len = sizeof(local_addr);
if (getsockname(fd, (struct sockaddr *) &local_addr, &local_addr_len) ==
0) {
conn->udp_act_port = ntohs(local_addr.sin_port);
}
if (is_ipv4(conn->param.params.udp.dst_ip)) {
struct sockaddr_in remote = {
.sin_family = AF_INET,
@@ -1053,6 +1065,13 @@ static void conn_connect(neu_conn_t *conn)
return;
}
struct sockaddr_in local_addr = { 0 };
socklen_t local_addr_len = sizeof(local_addr);
if (getsockname(fd, (struct sockaddr *) &local_addr, &local_addr_len) ==
0) {
conn->udp_act_port = ntohs(local_addr.sin_port);
}
conn->is_connected = true;
conn->fd = fd;
@@ -1464,4 +1483,9 @@ int is_ipv6(const char *ip)
bool neu_conn_is_connected(neu_conn_t *conn)
{
return conn->is_connected;
}
uint16_t neu_conn_udp_act_port(neu_conn_t *conn)
{
return conn->udp_act_port;
}
+1 -1
View File
@@ -109,7 +109,7 @@ arrow::Status Client::InsertPrepared(const std::string & table_name,
{
flight::FlightCallOptions call_options;
call_options.headers.push_back(
std::make_pair("authorization", "Bearer " + bearer_token_));
std::make_pair("authorization", bearer_token_));
std::string sql = "INSERT INTO " + table_name +
" (time, node_name, group_name, tag, value) VALUES (?, ?, ?, ?, ?)";
+45 -10
View File
@@ -307,7 +307,8 @@ static int find_da_basic_type(cid_template_t *template, const char *datype_id,
static int find_basic_type(cid_template_t *template, const char *type_id,
const char *do_name, const char *da_name,
cid_fc_e fc, cid_basictype_e **btypes)
cid_fc_e fc, cid_basictype_e **btypes,
bool *is_array, uint8_t *array_size)
{
*btypes = NULL;
cid_tm_do_type_t *dotype = NULL;
@@ -330,6 +331,8 @@ static int find_basic_type(cid_template_t *template, const char *type_id,
(*btypes)[index - 1] = dotype->das[i].btype;
continue;
}
*is_array = dotype->das[i].is_array;
*array_size = dotype->das[i].array_size;
da_basic_type_t da_types[32] = { 0 };
int n_da_types = find_da_basic_type(template, dotype->das[i].ref_type,
@@ -362,15 +365,28 @@ static void update_dataset(cid_dataset_t *dataset, cid_ldevice_t *ldev,
find_type_id(ldev, dataset->fcdas[i].prefix,
dataset->fcdas[i].lnclass, dataset->fcdas[i].lninst);
if (type_id != NULL) {
cid_basictype_e *bs = NULL;
int ret = find_basic_type(
template, type_id, dataset->fcdas[i].do_name,
dataset->fcdas[i].da_name, dataset->fcdas[i].fc, &bs);
cid_basictype_e *bs = NULL;
bool is_array = false;
uint8_t array_size = 0;
int ret =
find_basic_type(template, type_id, dataset->fcdas[i].do_name,
dataset->fcdas[i].da_name, dataset->fcdas[i].fc,
&bs, &is_array, &array_size);
if (ret > 0) {
if (ret <= 16) {
memcpy(dataset->fcdas[i].btypes, bs,
ret * sizeof(cid_basictype_e));
dataset->fcdas[i].n_btypes = ret;
dataset->fcdas[i].btype = bs[0];
for (int j = 1; j < ret; j++) {
if ((bs[j] & 0x7f) != 15 && (bs[j] & 0x7f) != 16) {
dataset->fcdas[i].btype = bs[j];
}
}
dataset->fcdas[i].n_btypes = ret;
dataset->fcdas[i].is_array = is_array;
dataset->fcdas[i].array_size = array_size;
} else {
nlog_warn(
"Too many basic types for %s %s %s %s %s %d %s",
@@ -987,6 +1003,8 @@ static int parse_template(xmlNode *xml_template, cid_template_t *template)
(char *) xmlGetProp(da, (const xmlChar *) "name");
char *ref_type =
(char *) xmlGetProp(da, (const xmlChar *) "type");
char *count =
(char *) xmlGetProp(da, (const xmlChar *) "count");
if (btype != NULL && fc != NULL && name != NULL) {
tm_do->n_das += 1;
@@ -1014,6 +1032,14 @@ static int parse_template(xmlNode *xml_template, cid_template_t *template)
nlog_warn("Unknown fc %s, %d", fc,
(int) da->line);
}
if (count != NULL) {
tm_da->is_array = true;
tm_da->array_size = atoi(count);
} else {
tm_da->is_array = false;
tm_da->array_size = 0;
}
}
if (btype != NULL) {
@@ -1028,6 +1054,9 @@ static int parse_template(xmlNode *xml_template, cid_template_t *template)
if (ref_type != NULL) {
xmlFree(ref_type);
}
if (count != NULL) {
xmlFree(count);
}
}
da = da->next;
@@ -1475,7 +1504,7 @@ static void ln_dataset_to_group(const char *ied_name, const char *ap_name,
fc_to_str(ln->datasets[j].fcdas[k].fc),
ln->datasets[j].fcdas[k].do_name);
}
switch (ln->datasets[j].fcdas[k].btypes[0] & 0x7f) {
switch (ln->datasets[j].fcdas[k].btype & 0x7f) {
case BOOLEAN:
tag->type = NEU_TYPE_BOOL;
break;
@@ -1506,9 +1535,15 @@ static void ln_dataset_to_group(const char *ied_name, const char *ap_name,
case INT32U:
tag->type = NEU_TYPE_UINT32;
break;
case FLOAT32:
tag->type = NEU_TYPE_FLOAT;
break;
case FLOAT32: {
if (ln->datasets[j].fcdas[k].is_array) {
tag->type = NEU_TYPE_ARRAY_FLOAT;
break;
} else {
tag->type = NEU_TYPE_FLOAT;
break;
}
}
case FLOAT64:
tag->type = NEU_TYPE_DOUBLE;
break;
+37
View File
@@ -515,4 +515,41 @@ int neu_http_post_otel_trace(uint8_t *data, int len)
nng_http_conn_close(conn);
nng_aio_free(aio);
return status;
}
int neu_http_response_file(nng_aio *aio, void *data, size_t len,
const char *disposition)
{
nng_http_res *res = NULL;
int rv = 0;
if (((rv = nng_http_res_alloc(&res)) != 0) ||
((rv = nng_http_res_set_status(res, NNG_HTTP_STATUS_OK)) != 0) ||
((rv = nng_http_res_set_header(res, "Content-Type",
"application/octet-stream")) != 0) ||
((rv = nng_http_res_set_header(res, "Content-Disposition",
disposition)) != 0) ||
((rv = nng_http_res_set_header(res, "Access-Control-Allow-Origin",
"*")) != 0) ||
((rv = nng_http_res_set_header(res, "Access-Control-Allow-Methods",
"POST,GET,PUT,DELETE,OPTIONS")) != 0) ||
((rv = nng_http_res_set_header(res, "Access-Control-Allow-Headers",
"*")) != 0) ||
((rv = nng_http_res_set_header(res, "Access-Control-Expose-Headers",
"Content-Disposition")) != 0) ||
((rv = nng_http_res_copy_data(res, data, len)) != 0)) {
nng_http_res_free(res);
nng_aio_finish(aio, rv);
return -1;
}
nng_http_req *nng_req = nng_aio_get_input(aio, 0);
nlog_notice("%s %s [%d]", nng_http_req_get_method(nng_req),
nng_http_req_get_uri(nng_req), NNG_HTTP_STATUS_OK);
nng_aio_set_output(aio, 0, res);
nng_aio_finish(aio, 0);
return 0;
}
+1 -1
View File
@@ -1 +1 @@
2.12.2
2.12.5
+1 -2
View File
@@ -9,5 +9,4 @@ syslog = "<P>%d(%Y-%m-%dT%T%z) %H neuron[%p]: level=%v msg="[%c] %m" file="%f:%L
[rules]
*.* "./logs/%c.log", 25MB * 1 ~ "./logs/%c.#2r.log"; simple
*.* $remote_syslog,"%V"; syslog
*.* "./logs/%c.log", 50MB * 2 ~ "./logs/%c.#2r.log"; simple