From 711ed361563fed7805fbdf6780019a0dbb0f5b72 Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane <amin.benromdhane@iopsys.eu> Date: Tue, 4 Mar 2025 10:49:20 +0100 Subject: [PATCH] Store keep_config option under '/var/state' --- .../bbfdm/scripts/bbf_activate_handler.sh | 18 ++++-- src/fw_images.c | 58 +++++++++++++++---- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh b/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh index 8619310..57c2caa 100755 --- a/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh +++ b/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh @@ -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 diff --git a/src/fw_images.c b/src/fw_images.c index 9876928..38a50c4 100644 --- a/src/fw_images.c +++ b/src/fw_images.c @@ -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); } -- GitLab