mirror of
https://dev.iopsys.eu/system/sysmngr.git
synced 2025-12-10 00:06:19 +01:00
Store keep_config option under '/var/state'
This commit is contained in:
parent
25cf2cbffd
commit
711ed36156
2 changed files with 61 additions and 15 deletions
|
|
@ -19,6 +19,7 @@ log() {
|
|||
|
||||
activate_and_reboot_device() {
|
||||
local bank_id="${1}"
|
||||
local keep_config="${2}"
|
||||
local success
|
||||
|
||||
success=$(ubus call fwbank set_bootbank "{'bank':${bank_id}}" | jsonfilter -e @.success)
|
||||
|
|
@ -27,6 +28,14 @@ activate_and_reboot_device() {
|
|||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${keep_config}" = "1" ]; then
|
||||
success=$(/etc/sysmngr/fwbank call copy_config 2> /dev/null | jsonfilter -e @.success)
|
||||
if [ "${success}" != "true" ]; then
|
||||
log "Can't copy config"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
log "The device will restart after a few seconds"
|
||||
ubus call rpc-sys reboot
|
||||
exit 0
|
||||
|
|
@ -36,6 +45,7 @@ handle_whenidle_mode() {
|
|||
local bank_id="${1}"
|
||||
local end_time="${2}"
|
||||
local force_activation="${3}"
|
||||
local keep_config="${4}"
|
||||
local diff=0
|
||||
|
||||
[ ! -x "${CHECK_IDLE_FILE}" ] && {
|
||||
|
|
@ -71,7 +81,7 @@ handle_whenidle_mode() {
|
|||
done
|
||||
|
||||
[ "${force_activation}" = "1" ] && {
|
||||
activate_and_reboot_device "${bank_id}"
|
||||
activate_and_reboot_device "${bank_id}" "${keep_config}"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -83,11 +93,11 @@ handle_confirmation_needed_mode() {
|
|||
|
||||
######################## main ########################
|
||||
if [ "${MODE}" = "Immediately" ] || [ "${MODE}" = "AnyTime" ]; then
|
||||
activate_and_reboot_device "${2}"
|
||||
activate_and_reboot_device "${2}" "${7}"
|
||||
elif [ "${MODE}" = "WhenIdle" ]; then
|
||||
handle_whenidle_mode "${2}" "${3}" "${4}"
|
||||
handle_whenidle_mode "${2}" "${3}" "${4}" "${7}"
|
||||
elif [ "${MODE}" = "ConfirmationNeeded" ]; then
|
||||
handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}"
|
||||
handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}" "${7}"
|
||||
else
|
||||
log "[${MODE}] mode is not supported"
|
||||
exit 1
|
||||
|
|
|
|||
|
|
@ -12,13 +12,16 @@
|
|||
#include "utils.h"
|
||||
#include "fwbank.h"
|
||||
|
||||
#define MAX_TIME_WINDOW 5
|
||||
|
||||
struct sysupgrade_ev_data {
|
||||
const char *bank_id;
|
||||
bool status;
|
||||
};
|
||||
|
||||
#define CRONTABS_ROOT "/etc/crontabs/root"
|
||||
#define ACTIVATE_HANDLER_FILE "/usr/share/bbfdm/scripts/bbf_activate_handler.sh"
|
||||
#define COPY_CONFIG_CMD "/etc/sysmngr/fwbank call copy_config 2> /dev/null"
|
||||
#define MAX_TIME_WINDOW 5
|
||||
|
||||
/*************************************************************
|
||||
* COMMON FUNCTIONS
|
||||
**************************************************************/
|
||||
|
|
@ -92,7 +95,25 @@ static char *get_fwbank_bank_id(const char *option_name)
|
|||
return bank_id ? bank_id : "";
|
||||
}
|
||||
|
||||
static bool fwbank_set_bootbank(char *bank_id)
|
||||
static struct uci_section *is_varstate_section_exist(const char *package, const char *section)
|
||||
{
|
||||
struct uci_section *s = NULL;
|
||||
|
||||
uci_path_foreach_sections(varstate, package, section, s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void fwbank_copy_config(void)
|
||||
{
|
||||
char output[64] = {0};
|
||||
|
||||
run_cmd(COPY_CONFIG_CMD, output, sizeof(output));
|
||||
}
|
||||
|
||||
static bool fwbank_set_bootbank(const char *bank_id)
|
||||
{
|
||||
int res = sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id), NULL);
|
||||
|
||||
|
|
@ -102,7 +123,7 @@ static bool fwbank_set_bootbank(char *bank_id)
|
|||
static bool fwbank_upgrade(const char *path, const char *auto_activate, const char *bank_id, const char *keep_settings)
|
||||
{
|
||||
json_object *json_obj = NULL;
|
||||
int res = 0;
|
||||
bool res = false;
|
||||
|
||||
dmubus_call_blocking("fwbank", "upgrade", UBUS_ARGS{{"path", path, String}, {"auto_activate", auto_activate, Boolean}, {"bank", bank_id, Integer}, {"keep_settings", keep_settings, Boolean}}, 4, &json_obj);
|
||||
|
||||
|
|
@ -533,6 +554,7 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
|
|||
{
|
||||
const char *command = "Download()";
|
||||
char obj_path[256] = {0};
|
||||
char *keep_config = NULL;
|
||||
|
||||
char *ret = DM_STRRCHR(refparam, '.');
|
||||
if (!ret)
|
||||
|
|
@ -557,9 +579,17 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
|
|||
char *checksum_algorithm = dmjson_get_value((json_object *)value, 1, "CheckSumAlgorithm");
|
||||
char *checksum = dmjson_get_value((json_object *)value, 1, "CheckSum");
|
||||
char *commandKey = dmjson_get_value((json_object *)value, 1, "CommandKey");
|
||||
char *keep_config = NULL;
|
||||
|
||||
#ifdef SYSMNGR_VENDOR_EXTENSIONS
|
||||
keep_config = dmjson_get_value((json_object *)value, 1, CUSTOM_PREFIX"KeepConfig");
|
||||
|
||||
bool keep = DM_STRLEN(keep_config) ? dmuci_string_to_boolean(keep_config) : true;
|
||||
|
||||
struct uci_section *s = is_varstate_section_exist("sysmngr", "globals");
|
||||
if (!s) dmuci_add_section_varstate("sysmngr", "globals", &s);
|
||||
|
||||
dmuci_set_value_by_section_varstate(s, "keep_config", keep ? "1" : "0");
|
||||
dmuci_commit_package_varstate("sysmngr");
|
||||
#endif
|
||||
char *bank_id = get_fwbank_option_value(data, "id");
|
||||
|
||||
|
|
@ -574,7 +604,6 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
|
|||
|
||||
static operation_args firmware_image_activate_args = {
|
||||
.in = (const char *[]) {
|
||||
|
||||
"TimeWindow.{i}.Start",
|
||||
"TimeWindow.{i}.End",
|
||||
"TimeWindow.{i}.Mode",
|
||||
|
|
@ -592,17 +621,20 @@ static int get_operate_args_DeviceInfoFirmwareImage_Activate(char *refparam, str
|
|||
|
||||
static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
#define CRONTABS_ROOT "/etc/crontabs/root"
|
||||
#define ACTIVATE_HANDLER_FILE "/usr/share/bbfdm/scripts/bbf_activate_handler.sh"
|
||||
|
||||
char *FW_Mode[] = {"AnyTime", "Immediately", "WhenIdle", "ConfirmationNeeded", NULL};
|
||||
char *start_time[MAX_TIME_WINDOW] = {0};
|
||||
char *end_time[MAX_TIME_WINDOW] = {0};
|
||||
char *mode[MAX_TIME_WINDOW] = {0};
|
||||
char *user_message[MAX_TIME_WINDOW] = {0};
|
||||
char *max_retries[MAX_TIME_WINDOW] = {0};
|
||||
char *keep_config = NULL;
|
||||
int res = 0, last_idx = -1;
|
||||
|
||||
dmuci_get_option_value_string_varstate("sysmngr", "globals", "keep_config", &keep_config);
|
||||
if (DM_STRLEN(keep_config) == 0) {
|
||||
keep_config = dmstrdup("1");
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_TIME_WINDOW; i++) {
|
||||
char buf[32] = {0};
|
||||
|
||||
|
|
@ -666,7 +698,7 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
|
|||
t_time += start_t;
|
||||
struct tm *tm_local = localtime(&t_time);
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "%d %d %d %d * sh %s '%s' '%s' '%ld' '%d' '%s' '%s'\n",
|
||||
snprintf(buffer, sizeof(buffer), "%d %d %d %d * sh %s '%s' '%s' '%ld' '%d' '%s' '%s' '%s'\n",
|
||||
tm_local->tm_min,
|
||||
tm_local->tm_hour,
|
||||
tm_local->tm_mday,
|
||||
|
|
@ -677,7 +709,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
|
|||
(DM_STRTOL(end_time[i]) - DM_STRTOL(start_time[i])),
|
||||
(i == last_idx),
|
||||
user_message[i],
|
||||
max_retries[i]);
|
||||
max_retries[i],
|
||||
keep_config);
|
||||
|
||||
fprintf(file, "%s", buffer);
|
||||
}
|
||||
|
|
@ -689,6 +722,9 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
|
|||
if (!fwbank_set_bootbank(bank_id))
|
||||
return USP_FAULT_COMMAND_FAILURE;
|
||||
|
||||
if (DM_STRCMP(keep_config, "1") == 0)
|
||||
fwbank_copy_config();
|
||||
|
||||
bbfdm_task_fork(_exec_reboot, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue