lgq
3 天以前 081f12a52906abe6c2d139fdc144135978681009
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
import * as os from "os"
import common from '../../../dxmodules/dxCommon.js'
import dxos from "../../../dxmodules/dxOs.js"
const utils = {}
 
// 获取url文件下载大小(字节数)
utils.getUrlFileSize = function (url) {
    let actualSize = dxos.systemWithRes(`wget --spider -S ${url} 2>&1 | grep 'Length' | awk '{print $2}'`, 100).match(/\d+/g)
    return actualSize ? parseInt(actualSize) : 0
}
// 判断是否为""/null/undefined
utils.isEmpty = function (str) {
    return (str === "" || str === null || str === undefined)
}
/**
 * 解析字符串改为 json,注意value内不能有"号
 * @param {string} inputString 
 * @returns 
 */
utils.parseString = function (inputString) {
    // 获取{}及其之间的内容
    inputString = inputString.slice(inputString.indexOf("{"), inputString.lastIndexOf("}") + 1)
    // key=value正则,key是\w+(字母数字下划线,区别大小写),=两边可有空格,value是\w+或相邻两个"之间的内容(包含")
    const keyValueRegex = /(\w+)\s*=\s*("[^"]*"|\w+)/g;
    let jsonObject = {};
    let match;
    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') {
            value = true
        } else if (value == 'false') {
            value = false
        } else {
            // 字符串
            value = value.replace(/"/g, '').trim()
        }
        jsonObject[key] = value;
    }
    return jsonObject;
}
 
/**
 * 等待下载结果,注意超时时间不得超过喂狗时间,否则下载慢会重启
 * @param {string} update_addr 下载地址
 * @param {string} downloadPath 存储路径
 * @param {number} timeout 超时
 * @param {string} update_md5 md5校验
 * @param {number} fileSize 文件大小
 * @returns 下载结果(bool)
 */
utils.waitDownload = function (update_addr, downloadPath, timeout, update_md5, fileSize) {
    // 删除原文件
    dxos.systemBrief(`rm -rf "${downloadPath}"`)
    // 异步下载
    dxos.systemBrief(`wget -c "${update_addr}" -O "${downloadPath}" &`)
    let startTime = new Date().getTime()
    while (true) {
        // 计算已下载的文件大小
        let size = parseInt(dxos.systemWithRes(`file="${downloadPath}"; [ -e "$file" ] && wc -c "$file" | awk '{print $1}' || echo "0"`, 100).split(/\s/g)[0])
        // 如果相等,则下载成功
        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校验成功返回true
                    return true
                }
            }
            dxos.systemBrief(`rm -rf "${downloadPath}"`)
            // md5校验失败返回false
            return false
        }
        // 如果下载超时,删除下载的文件并且重启,停止异步继续下载
        if (new Date().getTime() - startTime > timeout) {
            vf203.pwm.fail()
            dxos.systemBrief(`rm -rf "${downloadPath}"`)
            // 立即重启
            this.restart()
            return false
        }
        os.sleep(100)
    }
}
// 立即重启
utils.restart = function () {
    dxos.systemBrief("reboot -f")
}
 
utils.formatUnixTimestamp = function (timestamp) {
    let padZero = (v) => {
        // 双位补0
        return v.toString(10).padStart(2, '0')
    }
    const date = new Date(timestamp * 1000);
    const year = date.getFullYear().toString();
    const month = padZero(date.getMonth() + 1);
    const day = padZero(date.getDate());
    const hours = padZero(date.getHours());
    const minutes = padZero(date.getMinutes());
    const seconds = padZero(date.getSeconds());
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
 
export default utils