Skip to content
Snippets Groups Projects
Commit 8319bdf7 authored by Amin Ben Romdhane's avatar Amin Ben Romdhane
Browse files

Add a custom input to keep config when switching banks

 - Device.DeviceInfo.FirmwareImage.{i}.Activate() input:X_IOPSYS_EU_KeepConfig
parent 25cf2cbf
No related branches found
No related tags found
No related merge requests found
Pipeline #196646 passed
This commit is part of merge request !25. Comments created here will be created in the context of that merge request.
......@@ -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,29 @@ static char *get_fwbank_bank_id(const char *option_name)
return bank_id ? bank_id : "";
}
static bool fwbank_set_bootbank(char *bank_id)
static bool fwbank_copy_config(void)
{
char output[64] = {0};
bool res = false;
if (run_cmd(COPY_CONFIG_CMD, output, sizeof(output)) != 0)
return false;
if (DM_STRLEN(output) != 0) {
json_object *json_obj = NULL;
remove_new_line(output);
json_obj = json_tokener_parse(output);
char *success = dmjson_get_value(json_obj, 1, "success");
res = (DM_LSTRCMP(success, "true") == 0) ? true : false;
json_object_put(json_obj);
}
BBFDM_ERR("res=%d", res);
return res;
}
static bool fwbank_set_bootbank(const char *bank_id)
{
int res = sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id), NULL);
......@@ -102,7 +127,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);
......@@ -360,6 +385,7 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char
{
char *allowed_objects[] = {"Device.DeviceInfo.FirmwareImage.", NULL};
struct dm_reference reference = {0};
char *keep_config = NULL;
bbfdm_get_reference_linker(ctx, value, &reference);
......@@ -386,8 +412,20 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char
if (DM_LSTRCMP(available, "false") == 0)
return FAULT_9001;
BBFDM_ERR("++ bank_id=%s", bank_id + 1);
if (!fwbank_set_bootbank(bank_id + 1))
return FAULT_9001;
dmuci_set_value("sysmngr","globals", "switch_bank", "1");
dmuci_get_option_value_string("sysmngr","globals","keep_config", &keep_config);
BBFDM_ERR("++ keep_config=%s", keep_config);
if (DM_STRCMP(keep_config, "1") == 0) {
BBFDM_ERR("");
if (!fwbank_copy_config())
return FAULT_9001;
BBFDM_ERR("");
}
}
break;
}
......@@ -533,6 +571,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,7 +596,7 @@ 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");
#endif
......@@ -574,7 +613,9 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
static operation_args firmware_image_activate_args = {
.in = (const char *[]) {
#ifdef SYSMNGR_VENDOR_EXTENSIONS
CUSTOM_PREFIX"KeepConfig",
#endif
"TimeWindow.{i}.Start",
"TimeWindow.{i}.End",
"TimeWindow.{i}.Mode",
......@@ -592,9 +633,6 @@ 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};
......@@ -602,6 +640,14 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
char *user_message[MAX_TIME_WINDOW] = {0};
char *max_retries[MAX_TIME_WINDOW] = {0};
int res = 0, last_idx = -1;
bool keep_config = true;
#ifdef SYSMNGR_VENDOR_EXTENSIONS
char *custom_keep_config = dmjson_get_value((json_object *)value, 1, CUSTOM_PREFIX"KeepConfig");
if (DM_STRLEN(custom_keep_config)) {
string_to_bool(custom_keep_config, &keep_config);
}
#endif
for (int i = 0; i < MAX_TIME_WINDOW; i++) {
char buf[32] = {0};
......@@ -666,7 +712,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 +723,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 ? "1" : "0");
fprintf(file, "%s", buffer);
}
......@@ -689,6 +736,11 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
if (!fwbank_set_bootbank(bank_id))
return USP_FAULT_COMMAND_FAILURE;
if (keep_config) {
if (!fwbank_copy_config())
return USP_FAULT_COMMAND_FAILURE;
}
bbfdm_task_fork(_exec_reboot, NULL, NULL, NULL);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment