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

Add a custom parameter to keep config when switching banks

 - Device.DeviceInfo.X_IOWRT_EU_KeepConfig
parent 25cf2cbf
No related branches found
No related tags found
1 merge request!25Add a custom parameter to keep config when switching banks
Pipeline #196803 passed
...@@ -227,6 +227,30 @@ static int get_deviceinfo_base_mac_addr(char *refparam, struct dmctx *ctx, void ...@@ -227,6 +227,30 @@ static int get_deviceinfo_base_mac_addr(char *refparam, struct dmctx *ctx, void
return 0; return 0;
} }
static int get_deviceinfo_keep_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
*value = dmuci_get_option_value_fallback_def("sysmngr", "globals", "keep_config", "1");
return 0;
}
static int set_deviceinfo_keep_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
bool b;
switch (action) {
case VALUECHECK:
if (bbfdm_validate_boolean(ctx, value))
return FAULT_9007;
break;
case VALUESET:
string_to_bool(value, &b);
dmuci_set_value("sysmngr", "globals", "keep_config", b ? "1" : "0");
break;
}
return 0;
}
static int get_DeviceInfoFileDescriptors_Used(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) static int get_DeviceInfoFileDescriptors_Used(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{ {
char val[32] = {'\0'}; char val[32] = {'\0'};
...@@ -345,6 +369,7 @@ DMLEAF tDeviceInfoParams[] = { ...@@ -345,6 +369,7 @@ DMLEAF tDeviceInfoParams[] = {
#ifdef SYSMNGR_VENDOR_EXTENSIONS #ifdef SYSMNGR_VENDOR_EXTENSIONS
{CUSTOM_PREFIX"BaseMACAddress", &DMREAD, DMT_STRING, get_deviceinfo_base_mac_addr, NULL, BBFDM_BOTH}, {CUSTOM_PREFIX"BaseMACAddress", &DMREAD, DMT_STRING, get_deviceinfo_base_mac_addr, NULL, BBFDM_BOTH},
{CUSTOM_PREFIX"KeepConfig", &DMWRITE, DMT_BOOL, get_deviceinfo_keep_config, set_deviceinfo_keep_config, BBFDM_BOTH},
#endif #endif
{0} {0}
......
...@@ -19,6 +19,7 @@ log() { ...@@ -19,6 +19,7 @@ log() {
activate_and_reboot_device() { activate_and_reboot_device() {
local bank_id="${1}" local bank_id="${1}"
local keep_config="${2}"
local success local success
success=$(ubus call fwbank set_bootbank "{'bank':${bank_id}}" | jsonfilter -e @.success) success=$(ubus call fwbank set_bootbank "{'bank':${bank_id}}" | jsonfilter -e @.success)
...@@ -27,6 +28,14 @@ activate_and_reboot_device() { ...@@ -27,6 +28,14 @@ activate_and_reboot_device() {
exit 1 exit 1
fi 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" log "The device will restart after a few seconds"
ubus call rpc-sys reboot ubus call rpc-sys reboot
exit 0 exit 0
...@@ -36,6 +45,7 @@ handle_whenidle_mode() { ...@@ -36,6 +45,7 @@ handle_whenidle_mode() {
local bank_id="${1}" local bank_id="${1}"
local end_time="${2}" local end_time="${2}"
local force_activation="${3}" local force_activation="${3}"
local keep_config="${4}"
local diff=0 local diff=0
[ ! -x "${CHECK_IDLE_FILE}" ] && { [ ! -x "${CHECK_IDLE_FILE}" ] && {
...@@ -71,7 +81,7 @@ handle_whenidle_mode() { ...@@ -71,7 +81,7 @@ handle_whenidle_mode() {
done done
[ "${force_activation}" = "1" ] && { [ "${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() { ...@@ -83,11 +93,11 @@ handle_confirmation_needed_mode() {
######################## main ######################## ######################## main ########################
if [ "${MODE}" = "Immediately" ] || [ "${MODE}" = "AnyTime" ]; then if [ "${MODE}" = "Immediately" ] || [ "${MODE}" = "AnyTime" ]; then
activate_and_reboot_device "${2}" activate_and_reboot_device "${2}" "${7}"
elif [ "${MODE}" = "WhenIdle" ]; then elif [ "${MODE}" = "WhenIdle" ]; then
handle_whenidle_mode "${2}" "${3}" "${4}" handle_whenidle_mode "${2}" "${3}" "${4}" "${7}"
elif [ "${MODE}" = "ConfirmationNeeded" ]; then elif [ "${MODE}" = "ConfirmationNeeded" ]; then
handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}" handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}" "${7}"
else else
log "[${MODE}] mode is not supported" log "[${MODE}] mode is not supported"
exit 1 exit 1
......
...@@ -12,13 +12,16 @@ ...@@ -12,13 +12,16 @@
#include "utils.h" #include "utils.h"
#include "fwbank.h" #include "fwbank.h"
#define MAX_TIME_WINDOW 5
struct sysupgrade_ev_data { struct sysupgrade_ev_data {
const char *bank_id; const char *bank_id;
bool status; 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 * COMMON FUNCTIONS
**************************************************************/ **************************************************************/
...@@ -92,7 +95,14 @@ static char *get_fwbank_bank_id(const char *option_name) ...@@ -92,7 +95,14 @@ static char *get_fwbank_bank_id(const char *option_name)
return bank_id ? bank_id : ""; return bank_id ? bank_id : "";
} }
static bool fwbank_set_bootbank(char *bank_id) 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); int res = sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id), NULL);
...@@ -102,7 +112,7 @@ static bool fwbank_set_bootbank(char *bank_id) ...@@ -102,7 +112,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) static bool fwbank_upgrade(const char *path, const char *auto_activate, const char *bank_id, const char *keep_settings)
{ {
json_object *json_obj = NULL; 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); 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 +370,7 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char ...@@ -360,6 +370,7 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char
{ {
char *allowed_objects[] = {"Device.DeviceInfo.FirmwareImage.", NULL}; char *allowed_objects[] = {"Device.DeviceInfo.FirmwareImage.", NULL};
struct dm_reference reference = {0}; struct dm_reference reference = {0};
char *keep_config = NULL;
bbfdm_get_reference_linker(ctx, value, &reference); bbfdm_get_reference_linker(ctx, value, &reference);
...@@ -388,6 +399,12 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char ...@@ -388,6 +399,12 @@ int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char
if (!fwbank_set_bootbank(bank_id + 1)) if (!fwbank_set_bootbank(bank_id + 1))
return FAULT_9001; return FAULT_9001;
dmuci_set_value("sysmngr","globals", "switch_bank", "1");
keep_config = dmuci_get_option_value_fallback_def("sysmngr", "globals", "keep_config", "1");
if (DM_STRCMP(keep_config, "1") == 0)
fwbank_copy_config();
} }
break; break;
} }
...@@ -516,9 +533,6 @@ static operation_args firmware_image_download_args = { ...@@ -516,9 +533,6 @@ static operation_args firmware_image_download_args = {
"CheckSumAlgorithm", "CheckSumAlgorithm",
"CheckSum", "CheckSum",
"CommandKey", "CommandKey",
#ifdef SYSMNGR_VENDOR_EXTENSIONS
CUSTOM_PREFIX"KeepConfig",
#endif
NULL NULL
} }
}; };
...@@ -557,10 +571,9 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx ...@@ -557,10 +571,9 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
char *checksum_algorithm = dmjson_get_value((json_object *)value, 1, "CheckSumAlgorithm"); char *checksum_algorithm = dmjson_get_value((json_object *)value, 1, "CheckSumAlgorithm");
char *checksum = dmjson_get_value((json_object *)value, 1, "CheckSum"); char *checksum = dmjson_get_value((json_object *)value, 1, "CheckSum");
char *commandKey = dmjson_get_value((json_object *)value, 1, "CommandKey"); char *commandKey = dmjson_get_value((json_object *)value, 1, "CommandKey");
char *keep_config = NULL;
#ifdef SYSMNGR_VENDOR_EXTENSIONS char *keep_config = dmuci_get_option_value_fallback_def("sysmngr", "globals", "keep_config", "1");
keep_config = dmjson_get_value((json_object *)value, 1, CUSTOM_PREFIX"KeepConfig");
#endif
char *bank_id = get_fwbank_option_value(data, "id"); char *bank_id = get_fwbank_option_value(data, "id");
int res = bbf_fw_image_download(ctx->ubus_ctx, url, auto_activate, username, password, file_size, checksum_algorithm, checksum, bank_id, command, obj_path, commandKey, keep_config); int res = bbf_fw_image_download(ctx->ubus_ctx, url, auto_activate, username, password, file_size, checksum_algorithm, checksum, bank_id, command, obj_path, commandKey, keep_config);
...@@ -574,7 +587,6 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx ...@@ -574,7 +587,6 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
static operation_args firmware_image_activate_args = { static operation_args firmware_image_activate_args = {
.in = (const char *[]) { .in = (const char *[]) {
"TimeWindow.{i}.Start", "TimeWindow.{i}.Start",
"TimeWindow.{i}.End", "TimeWindow.{i}.End",
"TimeWindow.{i}.Mode", "TimeWindow.{i}.Mode",
...@@ -592,9 +604,6 @@ static int get_operate_args_DeviceInfoFirmwareImage_Activate(char *refparam, str ...@@ -592,9 +604,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) 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 *FW_Mode[] = {"AnyTime", "Immediately", "WhenIdle", "ConfirmationNeeded", NULL};
char *start_time[MAX_TIME_WINDOW] = {0}; char *start_time[MAX_TIME_WINDOW] = {0};
char *end_time[MAX_TIME_WINDOW] = {0}; char *end_time[MAX_TIME_WINDOW] = {0};
...@@ -603,6 +612,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx ...@@ -603,6 +612,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
char *max_retries[MAX_TIME_WINDOW] = {0}; char *max_retries[MAX_TIME_WINDOW] = {0};
int res = 0, last_idx = -1; int res = 0, last_idx = -1;
char *keep_config = dmuci_get_option_value_fallback_def("sysmngr", "globals", "keep_config", "1");
for (int i = 0; i < MAX_TIME_WINDOW; i++) { for (int i = 0; i < MAX_TIME_WINDOW; i++) {
char buf[32] = {0}; char buf[32] = {0};
...@@ -666,7 +677,7 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx ...@@ -666,7 +677,7 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
t_time += start_t; t_time += start_t;
struct tm *tm_local = localtime(&t_time); 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_min,
tm_local->tm_hour, tm_local->tm_hour,
tm_local->tm_mday, tm_local->tm_mday,
...@@ -677,7 +688,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx ...@@ -677,7 +688,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
(DM_STRTOL(end_time[i]) - DM_STRTOL(start_time[i])), (DM_STRTOL(end_time[i]) - DM_STRTOL(start_time[i])),
(i == last_idx), (i == last_idx),
user_message[i], user_message[i],
max_retries[i]); max_retries[i],
keep_config);
fprintf(file, "%s", buffer); fprintf(file, "%s", buffer);
} }
...@@ -689,6 +701,9 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx ...@@ -689,6 +701,9 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
if (!fwbank_set_bootbank(bank_id)) if (!fwbank_set_bootbank(bank_id))
return USP_FAULT_COMMAND_FAILURE; return USP_FAULT_COMMAND_FAILURE;
if (DM_STRCMP(keep_config, "1") == 0)
fwbank_copy_config();
bbfdm_task_fork(_exec_reboot, NULL, NULL, NULL); bbfdm_task_fork(_exec_reboot, NULL, NULL, NULL);
} }
......
...@@ -709,8 +709,15 @@ static int upgrade_handler(struct ubus_context *ctx, struct ubus_object *obj, ...@@ -709,8 +709,15 @@ static int upgrade_handler(struct ubus_context *ctx, struct ubus_object *obj,
if (tb[UPGRADE_BANK]) if (tb[UPGRADE_BANK])
bank_id = blobmsg_get_u32(tb[UPGRADE_BANK]); bank_id = blobmsg_get_u32(tb[UPGRADE_BANK]);
if (tb[UPGRADE_KEEP_SETTINGS]) if (tb[UPGRADE_KEEP_SETTINGS]) {
keep_settings = blobmsg_get_bool(tb[UPGRADE_KEEP_SETTINGS]); keep_settings = blobmsg_get_bool(tb[UPGRADE_KEEP_SETTINGS]);
} else {
char buf[8] = {0};
BBFDM_UCI_GET("sysmngr", "globals", "keep_config", "1", buf, sizeof(buf));
keep_settings = ((int)strtol(buf, NULL, 10) != 0);
BBFDM_DEBUG("'keep_settings' option is not provided. Falling back to the value from UCI config: 'sysmngr.globals.keep_config'");
}
res = sysmngr_fwbank_upgrade(fw_path, auto_activate, bank_id, keep_settings, req); res = sysmngr_fwbank_upgrade(fw_path, auto_activate, bank_id, keep_settings, req);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment