diff --git a/cwmp.c b/cwmp.c index 7d2eba9..b8493ac 100644 --- a/cwmp.c +++ b/cwmp.c @@ -581,6 +581,16 @@ int run_session_end_func (struct session *session) cwmp_apply_acs_changes(); } + + if (session->end_session & END_SESSION_X_FACTORY_RESET_SOFT) + { + CWMP_LOG (INFO,"Executing factory reset soft: end session request"); + external_init(); + external_simple("factory_reset_soft", NULL, 0); + external_exit(); + exit(EXIT_SUCCESS); + } + dm_entry_restart_services(); session->end_session = 0; diff --git a/inc/cwmp.h b/inc/cwmp.h index c36d2d0..c8fc60e 100644 --- a/inc/cwmp.h +++ b/inc/cwmp.h @@ -100,6 +100,7 @@ enum end_session { END_SESSION_IPPING_DIAGNOSTIC = 1<<4, END_SESSION_DOWNLOAD_DIAGNOSTIC = 1<<5, END_SESSION_UPLOAD_DIAGNOSTIC = 1<<6, + END_SESSION_X_FACTORY_RESET_SOFT = 1<<7 }; enum cwmp_start { diff --git a/inc/xml.h b/inc/xml.h index e7bf81b..42cded8 100644 --- a/inc/xml.h +++ b/inc/xml.h @@ -51,6 +51,7 @@ enum rpc_cpe_methods_idx { RPC_CPE_CHANGE_DU_STATE, RPC_CPE_CANCEL_TRANSFER, RPC_CPE_FAULT, + RPC_CPE_X_FACTORY_RESET_SOFT, __RPC_CPE_MAX }; @@ -281,6 +282,7 @@ int cwmp_handle_rpc_cpe_reboot(struct session *session, struct rpc *rpc); int cwmp_handle_rpc_cpe_download(struct session *session, struct rpc *rpc); int cwmp_handle_rpc_cpe_upload(struct session *session, struct rpc *rpc); int cwmp_handle_rpc_cpe_factory_reset(struct session *session, struct rpc *rpc); +int cwmp_handle_rpc_cpe_x_factory_reset_soft(struct session *session, struct rpc *rpc); int cancel_transfer(char * key); int cwmp_handle_rpc_cpe_cancel_transfer(struct session *session, struct rpc *rpc); int cwmp_handle_rpc_cpe_schedule_inform(struct session *session, struct rpc *rpc); diff --git a/scripts/icwmp.sh b/scripts/icwmp.sh index e2b4fe2..f6b643e 100644 --- a/scripts/icwmp.sh +++ b/scripts/icwmp.sh @@ -87,6 +87,9 @@ case "$1" in factory_reset) action="factory_reset" ;; + factory_reset_soft) + action="factory_reset_soft" + ;; reboot) action="reboot" ;; @@ -358,6 +361,12 @@ handle_action() { if [ "$action" = "factory_reset" ]; then /sbin/defaultreset fi + + if [ "$action" = "factory_reset_soft" ]; then + ubus call juci.system defaultreset '{"soft":"true","wifi":"true","fw_redirect":"true","fw_parental":"true","passwd_user":"true","ice":"true"}' + sync + reboot + fi if [ "$action" = "reboot" ]; then sync @@ -452,6 +461,9 @@ handle_action() { factory_reset) action="factory_reset" ;; + factory_reset_soft) + action="factory_reset_soft" + ;; reboot) action="reboot" ;; diff --git a/xml.c b/xml.c index c693b8e..9b9a828 100644 --- a/xml.c +++ b/xml.c @@ -116,6 +116,7 @@ const struct rpc_cpe_method rpc_cpe_methods[] = { [RPC_CPE_SCHEDULE_INFORM] = {"ScheduleInform", cwmp_handle_rpc_cpe_schedule_inform, AMD_1}, [RPC_CPE_SCHEDULE_DOWNLOAD] = {"ScheduleDownload", cwmp_handle_rpc_cpe_schedule_download, AMD_3}, [RPC_CPE_CHANGE_DU_STATE] = {"ChangeDUState", cwmp_handle_rpc_cpe_change_du_state, AMD_3}, + [RPC_CPE_X_FACTORY_RESET_SOFT] = {"X_FactoryResetSoft", cwmp_handle_rpc_cpe_x_factory_reset_soft, AMD_1}, [RPC_CPE_FAULT] = {"Fault", cwmp_handle_rpc_cpe_fault, AMD_1} }; @@ -1906,6 +1907,28 @@ error: return -1; } +int cwmp_handle_rpc_cpe_x_factory_reset_soft(struct session *session, struct rpc *rpc){ + mxml_node_t *b; + + b = mxmlFindElement(session->tree_out, session->tree_out, "soap_env:Body", NULL, NULL, MXML_DESCEND); + if (!b) goto fault; + + b = mxmlNewElement(b, "cwmp:X_FactoryResetSoftResponse"); + if (!b) goto fault; + + cwmp_set_end_session(END_SESSION_X_FACTORY_RESET_SOFT); + + return 0; + +fault: + if (cwmp_create_fault_message(session, rpc, FAULT_CPE_INTERNAL_ERROR)) + goto error; + return 0; + +error: + return -1; +} + /* * [RPC CPE]: CancelTransfer */