diff --git a/src/RESTAPI/RESTAPI_device_commandHandler.cpp b/src/RESTAPI/RESTAPI_device_commandHandler.cpp index e0a6f0d4..d6a3dcd2 100644 --- a/src/RESTAPI/RESTAPI_device_commandHandler.cpp +++ b/src/RESTAPI/RESTAPI_device_commandHandler.cpp @@ -167,7 +167,9 @@ namespace OpenWifi { {APCommands::Commands::certupdate, false, true, &RESTAPI_device_commandHandler::CertUpdate, 60000ms}, {APCommands::Commands::transfer, false, true, &RESTAPI_device_commandHandler::Transfer, 60000ms}, {APCommands::Commands::script, false, true, &RESTAPI_device_commandHandler::Script, 60000ms}, - {APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms} + {APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms}, + {APCommands::Commands::fixedconfig, false, true, &RESTAPI_device_commandHandler::FixedConfig, 120000ms}, + }; void RESTAPI_device_commandHandler::DoPost() { @@ -1548,4 +1550,41 @@ namespace OpenWifi { Logger_); } + // `fixedconfig` command is used set country propery on AP + // This handler uses `fixedconfig` command definitions + void RESTAPI_device_commandHandler::FixedConfig( + const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout, + [[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) { + poco_debug(Logger_, fmt::format("FIXEDCONFIG({},{}): TID={} user={} serial={}", CMD_UUID, CMD_RPC, + TransactionId_, Requester(), SerialNumber_)); + // do not allow `fixedconfig` command for simulated devices + if(IsDeviceSimulated(SerialNumber_)) { + CallCanceled("FIXEDCONFIG", CMD_UUID, CMD_RPC, RESTAPI::Errors::SimulatedDeviceNotSupported); + return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported); + } + + // setup and validate fixedconfig object + GWObjects::FixedConfig fixed_config; + if(!fixed_config.from_json(ParsedBody_)) { + return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters); + } + + // setup command message + GWObjects::CommandDetails Cmd; + Cmd.SerialNumber = SerialNumber_; + Cmd.SubmittedBy = Requester(); + Cmd.UUID = CMD_UUID; + Cmd.Command = uCentralProtocol::FIXEDCONFIG; + std::ostringstream os; + ParsedBody_->stringify(os); + Cmd.Details = os.str(); + Cmd.RunAt = 0; + Cmd.ErrorCode = 0; + Cmd.WaitingForFile = 0; + + // send fixedconfig command to device and return status + return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::fixedconfig, false, Cmd, + *ParsedBody_, *Request, *Response, timeout, nullptr, this, + Logger_); + } } // namespace OpenWifi diff --git a/src/RESTAPI/RESTAPI_device_commandHandler.h b/src/RESTAPI/RESTAPI_device_commandHandler.h index e20800f3..1b7a2937 100644 --- a/src/RESTAPI/RESTAPI_device_commandHandler.h +++ b/src/RESTAPI/RESTAPI_device_commandHandler.h @@ -70,6 +70,8 @@ namespace OpenWifi { const GWObjects::DeviceRestrictions &R); void PowerCycle(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, const GWObjects::DeviceRestrictions &R); + void FixedConfig(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, + const GWObjects::DeviceRestrictions &R); static auto PathName() { return std::list{"/api/v1/device/{serialNumber}/{command}"}; diff --git a/src/RESTObjects/RESTAPI_GWobjects.cpp b/src/RESTObjects/RESTAPI_GWobjects.cpp index 09da2c36..9c50afc1 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.cpp +++ b/src/RESTObjects/RESTAPI_GWobjects.cpp @@ -799,4 +799,13 @@ namespace OpenWifi::GWObjects { return false; } + bool FixedConfig::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj, "serial", serialNumber); + field_from_json(Obj, "country", country); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } } // namespace OpenWifi::GWObjects diff --git a/src/RESTObjects/RESTAPI_GWobjects.h b/src/RESTObjects/RESTAPI_GWobjects.h index ed17aba7..d70f0c02 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.h +++ b/src/RESTObjects/RESTAPI_GWobjects.h @@ -532,6 +532,12 @@ namespace OpenWifi::GWObjects { std::uint64_t when; std::vector ports; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + struct FixedConfig { + std::string serialNumber; + std::string country; + bool from_json(const Poco::JSON::Object::Ptr &Obj); }; } // namespace OpenWifi::GWObjects diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 2e838ff2..2fed9536 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -580,6 +580,8 @@ namespace OpenWifi::RESTAPI::Protocol { static const char *INTERVAL = "interval"; static const char *UI = "UI"; static const char *BANDWIDTH = "bandwidth"; + + static const char *FIXEDCONFIG = "fixedconfig"; } // namespace OpenWifi::RESTAPI::Protocol namespace OpenWifi::uCentralProtocol { @@ -692,6 +694,8 @@ namespace OpenWifi::uCentralProtocol { static const char *RRM = "rrm"; static const char *ACTIONS = "actions"; + static const char *FIXEDCONFIG = "fixedconfig"; + } // namespace OpenWifi::uCentralProtocol namespace OpenWifi::uCentralProtocol::Events { @@ -788,6 +792,7 @@ namespace OpenWifi::APCommands { certupdate, transfer, powercycle, + fixedconfig, unknown }; @@ -802,7 +807,8 @@ namespace OpenWifi::APCommands { RESTAPI::Protocol::EVENTQUEUE, RESTAPI::Protocol::TELEMETRY, RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT, RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE, - RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE + RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE, + RESTAPI::Protocol::FIXEDCONFIG }; inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }