Bladeren bron

fix:excloud扩展库添加上传文件重传机制以及按顺序读取日志文件处理

mw 1 maand geleden
bovenliggende
commit
0c7509738f
1 gewijzigde bestanden met toevoegingen van 115 en 112 verwijderingen
  1. 115 112
      script/libs/excloud.lua

+ 115 - 112
script/libs/excloud.lua

@@ -612,7 +612,7 @@ local function scan_mtn_log_files()
     for i = 1, 4 do -- exmtn管理4个日志文件
         local file_path = string.format("/hzmtn%d.trc", i)
         if io.exists(file_path) then
-            local file_size = io.fileSize(file_path) or 0
+            local file_size = io.fileSize(file_path)
             if file_size > 0 then
                 table.insert(log_files, {
                     name = string.format("hzmtn%d.trc", i),
@@ -737,12 +737,13 @@ local function send_mtn_log_status(status, file_index, file_name, file_size)
     return true
 end
 -- 上传运维日志文件
-local function upload_mtn_log_files(log_files)
-    -- 使用协程执行上传,避免阻塞主线程
+local function upload_mtn_log_files()
+
     sys.taskInit(function()
-        local total_files = #log_files
+        local total_files = 4 -- 固定为4个日志文件
         local success_count = 0
         local failed_count = 0
+        local processed_count = 0
 
         -- -- 通知开始上传
         -- if callback_func then
@@ -751,86 +752,86 @@ local function upload_mtn_log_files(log_files)
         --     })
         -- end
 
-        for i, log_file in ipairs(log_files) do
-            -- 发送开始上传状态
-            send_mtn_log_status(MTN_LOG_STATUS.START, log_file.index, log_file.name, nil)
-
-            -- 通知上传进度
-            -- if callback_func then
-            --     callback_func("mtn_log_upload_progress", {
-            --         current_file = i,
-            --         total_files = total_files,
-            --         file_name = log_file.name,
-            --         file_size = log_file.size,
-            --         status = "start"
-            --     })
-            -- end
-            log.info("[excloud]开始上传运维日志文件", "文件:", log_file.name, "大小:", log_file.size)
-            -- 上传文件
-            local success, err_msg = excloud.upload_mtnlog(log_file.path, log_file.name)
+        -- 按顺序检查并上传每个日志文件
+        for i = 1, 4 do
+            local file_path = string.format("/hzmtn%d.trc", i)
+            local file_name = string.format("/hzmtn%d.trc", i)
 
-            if success then
-                -- 发送上传成功状态
-                send_mtn_log_status(MTN_LOG_STATUS.SUCCESS, log_file.index, nil, log_file.size)
-                success_count = success_count + 1
-                log.info("运维日志文件上传成功", "文件:", log_file.name, "大小:", log_file.size)
-
-                -- 记录上传成功的运维日志
-                if config.aircloud_mtn_log_enabled then
-                    exmtn.log("info", "aircloud", "mtn_upload", "文件上传成功", "file", log_file.name, "size", log_file.size)
-                end
-            else
-                -- 发送上传失败状态
-                send_mtn_log_status(MTN_LOG_STATUS.FAILED, log_file.index, nil, nil)
-                failed_count = failed_count + 1
-                log.error("运维日志文件上传失败", "文件:", log_file.name, "错误:", err_msg)
-
-                -- 记录上传失败的运维日志
-                if config.aircloud_mtn_log_enabled then
-                    exmtn.log("info", "aircloud", "mtn_upload_error", "文件上传失败", "file", log_file.name, "error", err_msg)
-                end
-            end
+            -- 在上传前再次检查文件是否存在且不为空
+            local file_size = io.fileSize(file_path)
+            if file_size and file_size > 0 then
+                processed_count = processed_count + 1
 
-            -- 通知上传进度
-            if callback_func then
-                callback_func("mtn_log_upload_progress", {
-                    current_file = i,
-                    total_files = total_files,
-                    file_name = log_file.name,
-                    file_size = log_file.size,
-                    status = success and "success" or "failed",
-                    error_msg = err_msg
-                })
-            end
+                -- 发送开始上传状态
+                send_mtn_log_status(MTN_LOG_STATUS.START, i, file_name, file_size)
+
+                log.info("[excloud]开始上传运维日志文件", "文件:", file_name, "大小:", file_size)
+
+                -- 上传文件
+                local success, err_msg = excloud.upload_mtnlog(file_path, file_name)
+
+                if success then
+                    -- 发送上传成功状态
+                    log.info("运维日志文件上传成功", "文件:", file_name, "大小:", file_size)
+                    send_mtn_log_status(MTN_LOG_STATUS.SUCCESS, i, file_name, file_size)
+                    success_count = success_count + 1
 
-            -- 文件间延迟,避免同时上传多个文件
-            if i < total_files then
-                sys.wait(2000)
+                    -- 记录上传成功的运维日志
+                    if config.aircloud_mtn_log_enabled then
+                        exmtn.log("info", "aircloud", "mtn_upload", "文件上传成功", "file", file_name, "size", file_size)
+                    end
+                else
+                    -- 发送上传失败状态
+                    log.error("运维日志文件上传失败", "文件:", file_name, "错误:", err_msg)
+                    send_mtn_log_status(MTN_LOG_STATUS.FAILED, i, file_name, file_size)
+                    failed_count = failed_count + 1
+
+                    -- 记录上传失败的运维日志
+                    if config.aircloud_mtn_log_enabled then
+                        exmtn.log("info", "aircloud", "mtn_upload_error", "文件上传失败", "file", file_name, "error", err_msg)
+                    end
+                end
+
+                -- 通知上传进度
+                if callback_func then
+                    callback_func("mtn_log_upload_progress", {
+                        current_file = processed_count,
+                        total_files = total_files,
+                        file_name = file_name,
+                        file_size = file_size,
+                        status = success and "success" or "failed",
+                        error_msg = err_msg
+                    })
+                end
+            else
+                -- 文件不存在或为空,跳过上传
+                log.info("运维日志文件不存在或为空,跳过上传", "文件:", file_name)
             end
         end
 
-        log.info("运维日志上传完成", "成功:", success_count, "失败:", failed_count, "总计:", total_files)
+        log.info("运维日志上传完成", "成功:", success_count, "失败:", failed_count, "总计:", processed_count)
 
         -- 记录上传完成日志
         if config.aircloud_mtn_log_enabled then
             exmtn.log("info", "aircloud", "mtn_upload", "运维日志上传完成", "success", success_count, "failed", failed_count,
-                "total", total_files)
+                "total", processed_count)
         end
+
         -- 通知上传完成
         if callback_func then
             callback_func("mtn_log_upload_complete", {
                 success_count = success_count,
                 failed_count = failed_count,
-                total_files = total_files
+                total_files = processed_count
             })
         end
     end)
 end
+
 -- 处理运维日志上传请求
 local function handle_mtn_log_upload_request()
-    local log_files = scan_mtn_log_files()
-    local total_files = #log_files
-    local latest_index = total_files > 0 and log_files[#log_files].index or 0
+    local total_files = 4 -- 固定为4个日志文件
+    local latest_index = 4 -- 最新序号固定为4
 
     if config.aircloud_mtn_log_enabled then
         exmtn.log("info", "aircloud", "cloud_cmd", "收到运维日志上传请求", "file_count", total_files)
@@ -855,21 +856,9 @@ local function handle_mtn_log_upload_request()
     log.info("运维日志上传响应已发送", "文件总数:", total_files, "最新序号:", latest_index)
 
     -- 开始上传日志文件
-    if total_files > 0 then
-        sys.timerStart(function()
-            upload_mtn_log_files(log_files)
-        end, 100)
-    else
-        log.info("没有运维日志文件需要上传")
-
-        if callback_func then
-            callback_func("mtn_log_upload_complete", {
-                success_count = 0,
-                failed_count = 0,
-                total_files = 0
-            })
-        end
-    end
+    sys.timerStart(function()
+        upload_mtn_log_files()
+    end, 100)
 end
 
 
@@ -1215,12 +1204,13 @@ local function upload_file(file_type, file_path, file_name)
     if not upload_info.url then
         return false, "上传URL为空"
     end
-
     local file_size = io.fileSize(file_path)
     if not file_size or file_size == 0 then
+        log.info("[excloud]文件不存在或为空", "文件:", file_name,file_size)
         return false, "文件不存在或为空"
     end
 
+    log.info("[excloud]开始文件上传", "类型:", file_type, "文件:", file_path, "大小:", file_size)
     log.info("[excloud]开始文件上传", "类型:", file_type, "文件:", file_name, "大小:", file_size)
 
     -- 发送上传开始通知(运维日志不需要)
@@ -1231,42 +1221,55 @@ local function upload_file(file_type, file_path, file_name)
         end
     end
 
-    -- 执行HTTP请求
-    local code, response = httpplus.request(
-        {
-            method = "POST",
-            url = upload_info.url,
-            forms = { ["key"] = upload_info.data_param.key },
-            files = { [upload_info.data_key or "f"] = file_path }
-        })
-    -- 检查响应是否为nil
-    if not response then
-        log.error("[excloud]HTTP请求返回空响应")
-        -- 运维日志不需要发送上传完成通知
-        if file_type ~= 3 then
-            send_file_upload_finish(file_type, timestamped_filename, false)
-        end
-        return false, "HTTP请求失败: 空响应"
-    end
-    log.info("[excloud]excloud.getip文件上传响应", "HTTP Code:", code, "Body:", response.body:query(), "Body:",
-        json.encode(response))
-
+    -- 执行HTTP请求,添加重传机制
+    local max_retries = 1
+    local retry_count = 0
+    local code, response
     local upload_success = false
     local result_msg = ""
 
-    if code == 200 then
-        local resp_data, err = json.decode(response.body:query())
-        if resp_data and resp_data.code == 0 then
-            upload_success = true
-            result_msg = "上传成功"
-            log.info("[excloud]文件上传成功", "URL:", resp_data.value and resp_data.value.uri or "未知")
+    while retry_count <= max_retries do
+        code, response = httpplus.request(
+            {
+                method = "POST",
+                url = upload_info.url,
+                forms = { ["key"] = upload_info.data_param.key },
+                files = { [upload_info.data_key or "f"] = file_path }
+            })
+
+        -- 检查响应
+        if response then
+            log.info("[excloud]excloud.getip文件上传响应", "HTTP Code:", code, "Body:", response.body:query(), "Body:",
+                json.encode(response))
+
+            if code == 200 then
+                local resp_data, err = json.decode(response.body:query())
+                if resp_data and resp_data.code == 0 then
+                    upload_success = true
+                    result_msg = "上传成功"
+                    log.info("[excloud]文件上传成功", "URL:", resp_data.value and resp_data.value.uri or "未知")
+                    break
+                else
+                    result_msg = "服务器返回错误: " .. (resp_data and tostring(resp_data.code) or "未知")
+                    log.error("文件上传失败", result_msg, "响应:", response.body:query())
+                end
+            else
+                result_msg = "HTTP请求失败: " .. tostring(code)
+                log.error("文件上传HTTP请求失败", result_msg)
+            end
         else
-            result_msg = "服务器返回错误: " .. (resp_data and tostring(resp_data.code) or "未知")
-            log.error("文件上传失败", result_msg, "响应:", resp_body)
+            log.error("[excloud]HTTP请求返回空响应")
+            result_msg = "HTTP请求失败: 空响应"
+        end
+
+        -- 如果失败且未达到最大重试次数,则重试
+        if not upload_success and retry_count < max_retries then
+            retry_count = retry_count + 1
+            log.info("[excloud]文件上传失败,开始第" .. retry_count .. "次重试")
+            sys.wait(1000) -- 等待1秒后重试
+        else
+            break
         end
-    else
-        result_msg = "HTTP请求失败: " .. tostring(code)
-        log.error("文件上传HTTP请求失败", result_msg)
     end
 
     -- 发送上传完成通知(运维日志不需要)
@@ -1287,13 +1290,13 @@ function excloud.upload_mtnlog(file_path, file_name)
         log.warn("[excloud]手动填写IP时不允许上传文件")
         return false, "手动填写IP时不允许上传文件"
     end
-    file_name = file_name or "mtn_log_" .. os.time() .. ".trc"
+
 
     -- 检查文件是否存在
     if not io.exists(file_path) then
         return false, "文件不存在: " .. file_path
     end
-
+    log.info("[excloud]excloud.upload_mtnlog", "文件路径:", file_path, "文件名:", file_name)
     -- 如果没有文件上传配置,先获取
     if not config.current_mtninfo then
         log.info("[excloud]获取运维日志上传配置...")
@@ -1307,7 +1310,7 @@ function excloud.upload_mtnlog(file_path, file_name)
             return false, "获取运维日志上传配置失败: " .. err
         end
     end
-
+    log.info("[excloud]excloud.upload_mtnlog", "文件路径:", file_path, "文件名:", file_name)
     return upload_file(3, file_path, file_name) -- 文件类型为3
 end