Ticket refs #6907: icwmp Download: Not able to import vendor config file with uci

This commit is contained in:
Omar Kallel 2021-12-29 11:05:02 +01:00
parent 4cd757bf33
commit 6a03433e3b
4 changed files with 44 additions and 18 deletions

View file

@ -707,9 +707,8 @@ int cwmp_uci_import(char *package_name, const char *input_path, uci_config_paths
struct uci_element *e = NULL;
int ret = CWMP_OK;
FILE *input = fopen(input_path, "r");
if (!input) {
if (!input)
return -1;
}
if (uci_import(uci_save_conf_paths[uci_type].uci_ctx, input, package_name, &package, (package_name != NULL)) != UCI_OK) {
ret = -1;

View file

@ -18,6 +18,7 @@
#include "log.h"
#include "cwmp_time.h"
#include "event.h"
#include "cwmp_uci.h"
LIST_HEAD(list_download);
LIST_HEAD(list_schedule_download);
@ -168,7 +169,7 @@ int cwmp_apply_multiple_firmware()
return CWMP_OK;
}
int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struct transfer_complete **ptransfer_complete)
int cwmp_launch_download(struct download *pdownload, char *download_file_name, enum load_type ltype, struct transfer_complete **ptransfer_complete)
{
int error = FAULT_CPE_NO_FAULT;
char *download_startTime;
@ -216,7 +217,13 @@ int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struc
//TODO Not Supported
error = FAULT_CPE_NO_FAULT;
} else if (strcmp(pdownload->file_type, VENDOR_CONFIG_FILE_TYPE) == 0) {
rename(ICWMP_DOWNLOAD_FILE, VENDOR_CONFIG_FILE);
if (download_file_name != NULL) {
char file_path[512];
snprintf(file_path, sizeof(file_path), "/tmp/%s", download_file_name);
rename(ICWMP_DOWNLOAD_FILE, file_path);
} else
rename(ICWMP_DOWNLOAD_FILE, VENDOR_CONFIG_FILE);
error = FAULT_CPE_NO_FAULT;
} else if (strcmp(pdownload->file_type, TONE_FILE_TYPE) == 0) {
//TODO Not Supported
@ -249,7 +256,15 @@ end_download:
return error;
}
int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, struct transfer_complete *ptransfer_complete)
char *get_file_name_by_download_url(char *url)
{
char *slash = strrchr(url, '/');
if (slash == NULL)
return NULL;
return slash+1;
}
int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, char *download_file_name, struct transfer_complete *ptransfer_complete)
{
int error = FAULT_CPE_NO_FAULT;
if (pdownload->file_type[0] == '1') {
@ -273,7 +288,17 @@ int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, struct
error = FAULT_CPE_NO_FAULT;
} else if (strcmp(pdownload->file_type, VENDOR_CONFIG_FILE_TYPE) == 0) {
cwmp_uci_init();
int err = cwmp_uci_import(NULL, VENDOR_CONFIG_FILE, UCI_STANDARD_CONFIG);
int err = CWMP_OK;
if (download_file_name != NULL) {
char file_path[512];
snprintf(file_path, sizeof(file_path), "/tmp/%s", download_file_name);
err = cwmp_uci_import(download_file_name, file_path, UCI_STANDARD_CONFIG);
remove(file_path);
} else {
err = cwmp_uci_import("vendor_conf_file", VENDOR_CONFIG_FILE, UCI_STANDARD_CONFIG);
remove(VENDOR_CONFIG_FILE);
}
cwmp_uci_exit();
if (err == CWMP_OK)
error = FAULT_CPE_NO_FAULT;
@ -368,8 +393,9 @@ void *thread_cwmp_rpc_cpe_download(void *v)
}
if ((timeout >= 0) && (timeout <= time_of_grace)) {
pthread_mutex_lock(&(cwmp->mutex_session_send));
char *download_file_name = get_file_name_by_download_url(pdownload->url);
CWMP_LOG(INFO, "Launch download file %s", pdownload->url);
error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(pdownload, download_file_name, TYPE_DOWNLOAD, &ptransfer_complete);
sleep(3);
if (error != FAULT_CPE_NO_FAULT) {
bkp_session_insert_transfer_complete(ptransfer_complete);
@ -377,7 +403,7 @@ void *thread_cwmp_rpc_cpe_download(void *v)
cwmp_root_cause_transfer_complete(cwmp, ptransfer_complete);
bkp_session_delete_transfer_complete(ptransfer_complete);
} else {
error = apply_downloaded_file(cwmp, pdownload, ptransfer_complete);
error = apply_downloaded_file(cwmp, pdownload, download_file_name, ptransfer_complete);
if (error || pdownload->file_type[0] == '6')
bkp_session_delete_transfer_complete(ptransfer_complete);
}
@ -511,11 +537,12 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v)
if (min_time == 0) {
continue;
} else if (min_time <= current_time) {
char *download_file_name = get_file_name_by_download_url(current_download->url);
if ((min_time == current_download->timewindowstruct[0].windowstart && (current_download->timewindowstruct[0].windowmode)[0] == '2') || (min_time == current_download->timewindowstruct[1].windowstart && (current_download->timewindowstruct[1].windowmode)[0] == '2')) {
pthread_mutex_lock(&mutex_schedule_download);
ptransfer_complete = calloc(1, sizeof(struct transfer_complete));
ptransfer_complete->type = TYPE_SCHEDULE_DOWNLOAD;
error = cwmp_launch_download(current_download, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(current_download, download_file_name, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete);
if (error != FAULT_CPE_NO_FAULT) {
bkp_session_insert_transfer_complete(ptransfer_complete);
bkp_session_save();
@ -526,7 +553,7 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v)
if (pthread_mutex_trylock(&(cwmp->mutex_session_send)) == 0) {
pthread_mutex_lock(&mutex_apply_schedule_download);
pthread_mutex_lock(&mutex_schedule_download);
error = apply_downloaded_file(cwmp, current_download, ptransfer_complete);
error = apply_downloaded_file(cwmp, current_download, download_file_name, ptransfer_complete);
if (error == FAULT_CPE_NO_FAULT)
exit(EXIT_SUCCESS);
@ -551,14 +578,14 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v)
else {
pthread_mutex_lock(&(cwmp->mutex_session_send));
CWMP_LOG(INFO, "Launch download file %s", current_download->url);
error = cwmp_launch_download(current_download, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(current_download, download_file_name, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete);
if (error != FAULT_CPE_NO_FAULT) {
bkp_session_insert_transfer_complete(ptransfer_complete);
bkp_session_save();
cwmp_root_cause_transfer_complete(cwmp, ptransfer_complete);
bkp_session_delete_transfer_complete(ptransfer_complete);
} else {
error = apply_downloaded_file(cwmp, current_download, ptransfer_complete);
error = apply_downloaded_file(cwmp, current_download, download_file_name, ptransfer_complete);
if (error == FAULT_CPE_NO_FAULT)
exit(EXIT_SUCCESS);
}

View file

@ -7,7 +7,7 @@
#define ICWMP_DOWNLOAD_FILE "/tmp/icwmp_download"
#define FIRMWARE_UPGRADE_IMAGE "/tmp/firmware.bin"
#define WEB_CONTENT_FILE "/tmp/web_content.ipk"
#define VENDOR_CONFIG_FILE "/tmp/vendor_configuration_file.cfg"
#define VENDOR_CONFIG_FILE "/tmp/vendor_conf_file"
#define FIRMWARE_UPGRADE_IMAGE_FILE_TYPE "1 Firmware Upgrade Image"
#define WEB_CONTENT_FILE_TYPE "2 Web Content"
@ -41,5 +41,5 @@ int cwmp_rpc_acs_destroy_data_transfer_complete(struct session *session, struct
void *thread_cwmp_rpc_cpe_download(void *v);
void *thread_cwmp_rpc_cpe_schedule_download(void *v);
void *thread_cwmp_rpc_cpe_apply_schedule_download(void *v);
int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struct transfer_complete **ptransfer_complete);
int cwmp_launch_download(struct download *pdownload, char *download_file_name, enum load_type ltype, struct transfer_complete **ptransfer_complete);
#endif

View file

@ -94,7 +94,7 @@ static void cwmp_launch_download_unit_test(void **state)
pdownload->password = icwmp_strdup("iopsys");
pdownload->url = icwmp_strdup("http://127.0.0.1/firmware_v1.0.bin");
int error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete);
int error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete);
transfer_complete_test = ptransfer_complete;
assert_int_equal(error, FAULT_CPE_NO_FAULT);
@ -119,7 +119,7 @@ static void cwmp_launch_download_unit_test(void **state)
pdownload->password = icwmp_strdup("iopsys");
pdownload->url = icwmp_strdup("http://127.0.0.1/firmware.bin");
error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete);
transfer_complete_test = ptransfer_complete;
assert_int_equal(error, FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER);
@ -143,7 +143,7 @@ static void cwmp_launch_download_unit_test(void **state)
pdownload->password = icwmp_strdup("iopsys");
pdownload->url = icwmp_strdup("http://127.0.0.1/firmware_v1.0.bin");
error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete);
transfer_complete_test = ptransfer_complete;
assert_int_equal(error, FAULT_CPE_INVALID_ARGUMENTS);
@ -167,7 +167,7 @@ static void cwmp_launch_download_unit_test(void **state)
pdownload->password = icwmp_strdup("iopsys");
pdownload->url = icwmp_strdup("http://127.0.0.1/invalid_firmware_v1.0.bin");
error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete);
error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete);
transfer_complete_test = ptransfer_complete;
assert_int_equal(error, FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED);