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