--[[ @object-name: upgrade @object-desc: 升级 --]] local lfactory = require 'lfactory' local http = require 'resty.http' local utils = require 'oui.utils' local M = {} local ERR_PARAMETER = -1 local ERR_GET_FIRMWARE_URL = -2 local ERR_FIRMWARE_NOT_EXIST = -4 local function fetch_firmware_info(url) local httpc = http.new() local res, err = httpc:request_uri(url, { ssl_verify = false }) if not res then return nil, err end httpc:close() local body = res.body if not body then return nil, 'no response data' end local name, sha256 = body:match('^%S+%s+(%S+)%s+(%x+)') if not name or not sha256 then return nil, 'invalid response' end return name, sha256 end --[[ @method-type: call @method-name: upgrade_online @method-desc: 在线升级 @in bool keep_config 为true保留配置升级. @in bool keep_package 为true保留安装包升级. @in string ?url 在线升级 url: 用于升级指定的固件 @in string ?sha256 当使用 url 升级时需要 @out number ?err_code Error code,-2:获取固件连接错误. @out string ?err_msg Error message @in-example: {"jsonrpc":"2.0","method":"call","params":["","upgrade","upgrade_online",{}],"id":1} @out-example: {"jsonrpc":"2.0","id":1,"result":{}} --]] M.upgrade_online = function(params) local firmware_url = params.url local sha256 = params.sha256 if firmware_url and not sha256 then return { err_code = ERR_PARAMETER, err_msg = 'found url but sha256' } end local firmware_type = utils.readfile('/etc/firmware_type', '*l') if firmware_type == '2b' and not firmware_url then return { err_code = ERR_PARAMETER, err_msg = 'url is required for 2B' } end if not firmware_url then local firmware_path_url = lfactory.platform_get_frimware_url() if not firmware_path_url then return { err_code = ERR_GET_FIRMWARE_URL, err_msg = 'Error obtaining firmware address' } end local filename filename, sha256 = fetch_firmware_info(firmware_path_url .. '/list-sha256.txt') if not filename then return { err_code = ERR_FIRMWARE_NOT_EXIST, err_msg = 'fetch firmware name fail: ' .. sha256 } end firmware_url = firmware_path_url .. '/' .. filename end local keep_config = params.keep_config local keep_package = params.keep_package local cmd = string.format('/usr/bin/one_click_upgrade %s %s %s %s &', firmware_url, sha256, keep_config and '1' or '0', keep_package and '1' or '0') ngx.timer.at(1, function() os.execute(cmd) end) end return M