]> git.proxmox.com Git - mirror_frr.git/commitdiff
mgmtd: simplify commit id to just be a timeval string
authorChristian Hopps <chopps@labn.net>
Tue, 2 May 2023 21:17:51 +0000 (17:17 -0400)
committerChristian Hopps <chopps@labn.net>
Thu, 4 May 2023 18:47:55 +0000 (14:47 -0400)
Also fixes coverity warning

Signed-off-by: Christian Hopps <chopps@labn.net>
mgmtd/mgmt.h
mgmtd/mgmt_ds.h
mgmtd/mgmt_fe_adapter.c
mgmtd/mgmt_history.c
mgmtd/mgmt_history.h

index 83353e8171ee47d712b30d3e91300527f403fed0..603296bb38f163191982c34f15a839554aa84be3 100644 (file)
@@ -108,16 +108,4 @@ extern void mgmt_master_init(struct event_loop *master, const int buffer_size);
 extern void mgmt_init(void);
 extern void mgmt_vty_init(void);
 
-static inline char *mgmt_realtime_to_string(struct timeval *tv, char *buf,
-                                           size_t sz)
-{
-       struct tm tm;
-       size_t n;
-
-       localtime_r((const time_t *)&tv->tv_sec, &tm);
-       n = strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", &tm);
-       snprintf(&buf[n], sz - n, ",%06u000", (unsigned int)tv->tv_usec);
-       return buf;
-}
-
 #endif /* _FRR_MGMTD_H */
index 8d01f3d5b19fd6e49a327e376ce2bb13b51239c7..2a32eb641a9eefb6f7e8685ebd482da10b209f6b 100644 (file)
        for ((id) = MGMTD_DS_NONE; (id) < MGMTD_DS_MAX_ID; (id)++)
 
 #define MGMTD_MAX_COMMIT_LIST 10
-#define MGMTD_MD5_HASH_LEN 16
-#define MGMTD_MD5_HASH_STR_HEX_LEN 33
 
 #define MGMTD_COMMIT_FILE_PATH DAEMON_DB_DIR "/commit-%s.json"
 #define MGMTD_COMMIT_INDEX_FILE_NAME DAEMON_DB_DIR "/commit-index.dat"
-#define MGMTD_COMMIT_TIME_STR_LEN 100
 
 extern struct nb_config *running_config;
 
index abf1f954da9c6de588e0458045a390b0225f0fdd..262741b665e9bfe28c8f9c332772858aead1e010 100644 (file)
@@ -1714,7 +1714,7 @@ static void
 mgmt_fe_adapter_cmt_stats_write(struct vty *vty,
                                    struct mgmt_fe_client_adapter *adapter)
 {
-       char buf[100] = {0};
+       char buf[MGMT_LONG_TIME_MAX_LEN];
 
        if (!mm->perf_stats_en)
                return;
@@ -1795,7 +1795,7 @@ static void
 mgmt_fe_adapter_setcfg_stats_write(struct vty *vty,
                                       struct mgmt_fe_client_adapter *adapter)
 {
-       char buf[100] = {0};
+       char buf[MGMT_LONG_TIME_MAX_LEN];
 
        if (!mm->perf_stats_en)
                return;
index 2251c49f1c1364b3f4e4182b730cbe6dc0edcb30..a49718a490bdb47e8313ef99b96ec4c627eb07e3 100644 (file)
@@ -18,8 +18,8 @@
 struct mgmt_cmt_info_t {
        struct mgmt_cmt_infos_item cmts;
 
-       char cmtid_str[MGMTD_MD5_HASH_STR_HEX_LEN];
-       char time_str[MGMTD_COMMIT_TIME_STR_LEN];
+       char cmtid_str[MGMT_SHORT_TIME_MAX_LEN];
+       char time_str[MGMT_LONG_TIME_MAX_LEN];
        char cmt_json_file[PATH_MAX];
 };
 
@@ -54,36 +54,30 @@ static void mgmt_history_remove_file(char *name)
                zlog_err("Old commit info deletion failed");
 }
 
-static void mgmt_history_hash(const char *input_str, char *hash)
+static struct mgmt_cmt_info_t *mgmt_history_new_cmt_info(void)
 {
-       int i;
-       unsigned char digest[MGMTD_MD5_HASH_LEN];
-       MD5_CTX ctx;
-
-       memset(&ctx, 0, sizeof(ctx));
-       MD5Init(&ctx);
-       MD5Update(&ctx, input_str, strlen(input_str));
-       MD5Final(digest, &ctx);
-
-       for (i = 0; i < MGMTD_MD5_HASH_LEN; i++)
-               snprintf(&hash[i * 2], MGMTD_MD5_HASH_STR_HEX_LEN, "%02x",
-                        (unsigned int)digest[i]);
+       struct mgmt_cmt_info_t *new;
+       struct timespec tv;
+       struct tm tm;
+
+       new = XCALLOC(MTYPE_MGMTD_CMT_INFO, sizeof(struct mgmt_cmt_info_t));
+
+       clock_gettime(CLOCK_REALTIME, &tv);
+       localtime_r(&tv.tv_sec, &tm);
+
+       mgmt_time_to_string(&tv, true, new->time_str, sizeof(new->time_str));
+       mgmt_time_to_string(&tv, false, new->cmtid_str, sizeof(new->cmtid_str));
+       snprintf(new->cmt_json_file, sizeof(new->cmt_json_file),
+                MGMTD_COMMIT_FILE_PATH, new->cmtid_str);
+
+       return new;
 }
 
 static struct mgmt_cmt_info_t *mgmt_history_create_cmt_rec(void)
 {
-       struct mgmt_cmt_info_t *new;
+       struct mgmt_cmt_info_t *new = mgmt_history_new_cmt_info();
        struct mgmt_cmt_info_t *cmt_info;
        struct mgmt_cmt_info_t *last_cmt_info = NULL;
-       struct timeval cmt_recd_tv;
-
-       new = XCALLOC(MTYPE_MGMTD_CMT_INFO, sizeof(struct mgmt_cmt_info_t));
-       gettimeofday(&cmt_recd_tv, NULL);
-       mgmt_realtime_to_string(&cmt_recd_tv, new->time_str,
-                               sizeof(new->time_str));
-       mgmt_history_hash(new->time_str, new->cmtid_str);
-       snprintf(new->cmt_json_file, sizeof(new->cmt_json_file) - 1,
-                MGMTD_COMMIT_FILE_PATH, new->cmtid_str);
 
        if (mgmt_cmt_infos_count(&mm->cmts) == MGMTD_MAX_COMMIT_LIST) {
                FOREACH_CMT_REC (mm, cmt_info)
@@ -106,8 +100,7 @@ mgmt_history_find_cmt_record(const char *cmtid_str)
        struct mgmt_cmt_info_t *cmt_info;
 
        FOREACH_CMT_REC (mm, cmt_info) {
-               if (strncmp(cmt_info->cmtid_str, cmtid_str,
-                           MGMTD_MD5_HASH_STR_HEX_LEN) == 0)
+               if (strcmp(cmt_info->cmtid_str, cmtid_str) == 0)
                        return cmt_info;
        }
 
@@ -282,8 +275,7 @@ int mgmt_history_rollback_by_id(struct vty *vty, const char *cmtid_str)
        }
 
        FOREACH_CMT_REC (mm, cmt_info) {
-               if (strncmp(cmt_info->cmtid_str, cmtid_str,
-                           MGMTD_MD5_HASH_STR_HEX_LEN) == 0) {
+               if (strcmp(cmt_info->cmtid_str, cmtid_str) == 0) {
                        ret = mgmt_history_rollback_to_cmt(vty, cmt_info,
                                                           false);
                        return ret;
@@ -349,9 +341,9 @@ void show_mgmt_cmt_history(struct vty *vty)
        int slno = 0;
 
        vty_out(vty, "Last 10 commit history:\n");
-       vty_out(vty, "  Sl.No\tCommit-ID(HEX)\t\t\t  Commit-Record-Time\n");
+       vty_out(vty, "Slot Commit-ID               Commit-Record-Time\n");
        FOREACH_CMT_REC (mm, cmt_info) {
-               vty_out(vty, "  %d\t%s  %s\n", slno, cmt_info->cmtid_str,
+               vty_out(vty, "%4d %23s %s\n", slno, cmt_info->cmtid_str,
                        cmt_info->time_str);
                slno++;
        }
index 5f96cf90e1c630d686960f380da1aab71cfd8c20..d3f7958952a527f31d04924f3c48e430e2ba3115 100644 (file)
@@ -54,4 +54,42 @@ extern void mgmt_history_new_record(struct mgmt_ds_ctx *ds_ctx);
 extern void mgmt_history_destroy(void);
 extern void mgmt_history_init(void);
 
+/*
+ * 012345678901234567890123456789
+ * 2023-12-31T12:12:12,012345678
+ * 20231231121212012345678
+ */
+#define MGMT_LONG_TIME_FMT "%Y-%m-%dT%H:%M:%S"
+#define MGMT_LONG_TIME_MAX_LEN 30
+#define MGMT_SHORT_TIME_FMT "%Y%m%d%H%M%S"
+#define MGMT_SHORT_TIME_MAX_LEN 24
+
+static inline const char *
+mgmt_time_to_string(struct timespec *tv, bool long_fmt, char *buffer, size_t sz)
+{
+       struct tm tm;
+       size_t n;
+
+       localtime_r(&tv->tv_sec, &tm);
+
+       if (long_fmt) {
+               n = strftime(buffer, sz, MGMT_LONG_TIME_FMT, &tm);
+               snprintf(&buffer[n], sz - n, ",%09lu", tv->tv_nsec);
+       } else {
+               n = strftime(buffer, sz, MGMT_SHORT_TIME_FMT, &tm);
+               snprintf(&buffer[n], sz - n, "%09lu", tv->tv_nsec);
+       }
+
+       return buffer;
+}
+
+static inline const char *mgmt_realtime_to_string(struct timeval *tv, char *buf,
+                                                 size_t sz)
+{
+       struct timespec ts = {.tv_sec = tv->tv_sec,
+                             .tv_nsec = tv->tv_usec * 1000};
+
+       return mgmt_time_to_string(&ts, true, buf, sz);
+}
+
 #endif /* _FRR_MGMTD_HISTORY_H_ */