local helpers = require('helpers')
local paths = require('paths')
local rec = require('recovery')
local backup = require('backup')
local restore = require('restore')
local update = require('update')
local factory = require('factory')
local scripts = {}
scripts[rec.sys.boot_reason_codes.backup] = backup
scripts[rec.sys.boot_reason_codes.restore] = restore
scripts[rec.sys.boot_reason_codes.update] = update
scripts[rec.sys.boot_reason_codes.factory] = factory
--- Display image
-- @function display_image
-- @param path path to raw image data
local function display_image(path)
local raw_data = helpers.read_whole_file(path)
rec.gui.clear()
rec.gui.display_raw_img(600, 480, raw_data)
-- Give some time to an user to view the displayed image
rec.sys.sleep(5)
end
local function print_recovery_info()
print(string.format("PureRecovery version: %s, branch: %s, revision: %s", rec.version(), rec.branch(),
rec.revision()))
end
local function print_boot_reason()
print(string.format("Boot reason: %s", rec.sys.boot_reason_str()))
end
local function generate_report_file(boot_reason_str, success, message)
local file_path = paths.temp_dir .. "/recovery_status.json"
local body = string.format(
"{\"version\": \"%s\",\"branch\": \"%s\",\"revision\": \"%s\",\"operation\": \"%s\",\"successful\": %s,\"message\": \"%s\"}",
rec.version(), rec.branch(), rec.revision(), boot_reason_str, tostring(success), message)
local fd = assert(io.open(file_path, 'w'))
fd:write(body)
fd:close()
end
local function handle_boot_reason()
local boot_reason = rec.sys.boot_reason()
local boot_reason_str = rec.sys.boot_reason_str()
rec.sys.set_boot_reason(rec.sys.boot_reason_codes.os)
return boot_reason, boot_reason_str
end
local function handle_script_success(boot_reason)
display_image(scripts[boot_reason].img_success)
print("Finished successfully")
end
local function handle_script_failure(boot_reason, message)
display_image(scripts[boot_reason].img_failure)
print(message)
end
local function handle_exit(boot_reason_str, status, message)
generate_report_file(boot_reason_str, status, message)
rec.gui.clear()
end
local function invoke_script(boot_reason)
print(string.format("Executing '%s' script...", scripts[boot_reason].script_name))
display_image(scripts[boot_reason].img_in_progress)
local status, message = pcall(scripts[boot_reason].execute)
if status then
handle_script_success(boot_reason)
return true, "ok"
else
handle_script_failure(boot_reason, message)
return false, message
end
end
print_recovery_info()
print_boot_reason()
local boot_reason, boot_reason_str = handle_boot_reason()
local status, message = invoke_script(boot_reason)
handle_exit(boot_reason_str, status, message)