lgq
2026-03-31 e491cdb48129752324c4e3764f99bd9203c56dec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
 * 工具函数模块
 * 提供系统常用的工具函数,包括文件下载、字符串处理、系统操作等
 */
import * as os from "os"
import common from '../../../dxmodules/dxCommon.js'
import logger from "../../../dxmodules/dxLogger.js"
const utils = {}
 
/**
 * 获取URL文件的下载大小(字节数)
 * @param {string} url - 文件的URL地址
 * @returns {number} 文件大小(字节),如果获取失败则返回0
 */
utils.getUrlFileSize = function (url) {
    // 使用wget命令获取文件大小信息
    let actualSize = common.systemWithRes(`wget --spider -S ${url} 2>&1 | grep 'Length' | awk '{print $2}'`, 100).match(/\d+/g)
    return actualSize ? parseInt(actualSize) : 0
}
 
/**
 * 判断值是否为空(空字符串、null或undefined)
 * @param {*} str - 要判断的值
 * @returns {boolean} 如果值为空则返回true,否则返回false
 */
utils.isEmpty = function (str) {
    return (str === "" || str === null || str === undefined)
}
 
/**
 * 解析字符串为JSON对象
 * 注意:value内不能有"号
 * @param {string} inputString - 要解析的字符串,格式为{key1=value1, key2=value2}
 * @returns {Object} 解析后的JSON对象
 */
utils.parseString = function (inputString) {
    // 获取{}及其之间的内容
    inputString = inputString.slice(inputString.indexOf("{"), inputString.lastIndexOf("}") + 1)
    // key=value正则,key是\w+(字母数字下划线,区别大小写),=两边可有空格,value是\w+或相邻两个"之间的内容(包含")
    const keyValueRegex = /(\w+)\s*=\s*("[^"]*"|\w+(\.\w+)?)/g;
    let jsonObject = {};
    let match;
    
    // 遍历匹配结果,构建JSON对象
    while ((match = keyValueRegex.exec(inputString)) !== null) {
        let key = match[1];
        let value = match[2]
        
        // 根据值的类型进行转换
        if (/^\d+$/.test(value)) {
            // 数字类型
            value = parseInt(value)
        } else if (/^\d+\.\d+$/.test(value)) {
            // 小数类型
            value = parseFloat(value)
        } else if (value == 'true') {
            // 布尔值true
            value = true
        } else if (value == 'false') {
            // 布尔值false
            value = false
        } else {
            // 字符串类型,去除引号和空格
            value = value.replace(/"/g, '').trim()
        }
        
        jsonObject[key] = value;
    }
    
    return jsonObject;
}
 
/**
 * 等待文件下载完成并进行MD5校验
 * 注意:超时时间不得超过喂狗时间,否则下载慢会导致系统重启
 * @param {string} update_addr - 下载地址
 * @param {string} downloadPath - 存储路径
 * @param {number} timeout - 超时时间(毫秒)
 * @param {string} update_md5 - MD5校验值
 * @param {number} fileSize - 文件大小(字节)
 * @returns {boolean} 下载结果:true表示成功,false表示失败
 */
utils.waitDownload = function (update_addr, downloadPath, timeout, update_md5, fileSize) {
    // 删除原文件
    common.systemBrief(`rm -rf "${downloadPath}"`)
    
    // 异步下载文件
    common.systemBrief(`wget -c "${update_addr}" -O "${downloadPath}" &`)
    
    let startTime = new Date().getTime()
    
    // 循环检查下载进度
    while (true) {
        // 计算已下载的文件大小
        let size = parseInt(common.systemWithRes(`file="${downloadPath}"; [ -e "$file" ] && wc -c "$file" | awk '{print $1}' || echo "0"`, 100).split(/\s/g)[0])
        
        // 如果文件大小达到预期,进行MD5校验
        if (size == fileSize) {
            let ret = common.md5HashFile(downloadPath)
            if (ret) {
                let md5 = ret.map(v => v.toString(16).padStart(2, '0')).join('')
                if (md5 == update_md5) {
                    // MD5校验成功
                    return true
                }
            }
            // MD5校验失败,删除文件
            common.systemBrief(`rm -rf "${downloadPath}"`)
            return false
        }
        // 如果下载超时,删除下载的文件并且重启,停止异步继续下载
        if (new Date().getTime() - startTime > timeout) {
            vf203.pwm.fail()
            common.systemBrief(`rm -rf "${downloadPath}"`)
            // 立即重启
            this.restart()
            return false
        }
        
        // 暂停100毫秒后继续检查
        os.sleep(100)
    }
}
 
/**
 * 立即重启
 */
utils.restart = function () {
    common.systemBrief("reboot -f")
}
 
export default utils