Adding processing for system commands to support OS information.

This commit is contained in:
stephb9959
2021-09-18 10:05:05 -07:00
parent c93459bf18
commit 222f7df0e4
7 changed files with 59 additions and 59 deletions

View File

@@ -2173,9 +2173,7 @@ paths:
name: command
schema:
type: string
enum:
- version
- times
description: A list made up of the words - version, times, host
required: true
responses:

View File

@@ -93,14 +93,11 @@ namespace OpenWifi {
std::lock_guard G(Mutex_);
CommandTagIndex TI{.Id=Id,.SerialNumber=SerialNumber};
auto Hint=OutStandingRequests_.find(TI);
if(Hint!=OutStandingRequests_.end()) {
if(Hint->second.Completed) {
T = Hint->second;
OutStandingRequests_.erase(Hint);
return true;
}
}
return false;
if(Hint==OutStandingRequests_.end() || Hint->second.Completed==0)
return false;
T = Hint->second;
OutStandingRequests_.erase(Hint);
return true;
}
bool CommandManager::SendCommand( const std::string &SerialNumber,
@@ -110,25 +107,24 @@ namespace OpenWifi {
uint64_t & Id) {
std::stringstream ToSend;
{
std::lock_guard G(Mutex_);
Id = ++Id_;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, Id);
CompleteRPC.set(uCentralProtocol::METHOD, Method);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Logger_.information(
Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Id));
CommandTagIndex Idx{.Id = Id, .SerialNumber = SerialNumber};
CommandTag Tag;
Tag.UUID = UUID;
Tag.Submitted = std::time(nullptr);
Tag.Completed = 0;
Tag.Result = Poco::makeShared<Poco::JSON::Object>();
OutStandingRequests_[Idx] = Tag;
}
std::unique_lock G(Mutex_);
Id = ++Id_;
Poco::JSON::Object CompleteRPC;
CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
CompleteRPC.set(uCentralProtocol::ID, Id);
CompleteRPC.set(uCentralProtocol::METHOD, Method);
CompleteRPC.set(uCentralProtocol::PARAMS, Params);
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
Logger_.information(
Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Id));
CommandTagIndex Idx{.Id = Id, .SerialNumber = SerialNumber};
CommandTag Tag;
Tag.UUID = UUID;
Tag.Submitted = std::time(nullptr);
Tag.Completed = 0;
Tag.Result = Poco::makeShared<Poco::JSON::Object>();
OutStandingRequests_[Idx] = Tag;
G.unlock();
return DeviceRegistry()->SendFrame(SerialNumber, ToSend.str());
}
@@ -142,7 +138,7 @@ namespace OpenWifi {
uint64_t ID = Obj->get(uCentralProtocol::ID);
if(ID<2)
return;
std::lock_guard G(Mutex_);
std::unique_lock G(Mutex_);
auto Idx = CommandTagIndex{.Id = ID, .SerialNumber = SerialNumber};
auto RPC = OutStandingRequests_.find(Idx);
if (RPC == OutStandingRequests_.end()) {
@@ -152,6 +148,7 @@ namespace OpenWifi {
RPC->second.Completed = std::time(nullptr);
RPC->second.Result = Obj;
Logger_.information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
G.unlock();
Storage()->CommandCompleted(RPC->second.UUID, Obj, true);
}

View File

@@ -69,6 +69,7 @@ namespace OpenWifi::RESTAPI::Protocol {
static const char * COMMANDUUID = "commandUUID";
static const char * FIRMWARES = "firmwares";
static const char * TOPIC = "topic";
static const char * HOST = "host";
static const char * REASON = "reason";
static const char * FILEUUID = "uuid";
static const char * USERID = "userId";

View File

@@ -80,28 +80,31 @@ namespace OpenWifi {
void RESTAPI_system_command::DoGet() {
auto Command = GetParameter(RESTAPI::Protocol::COMMAND, "");
if (!Poco::icompare(Command, RESTAPI::Protocol::VERSION)) {
Poco::JSON::Object Answer;
Answer.set(RESTAPI::Protocol::TAG, RESTAPI::Protocol::VERSION);
Answer.set(RESTAPI::Protocol::VALUE, Daemon()->Version());
ReturnObject(Answer);
return;
Poco::StringTokenizer Tokens(Command,",");
Poco::JSON::Object Answer;
for(const auto &i:Tokens) {
if (!Poco::icompare(i, RESTAPI::Protocol::VERSION)) {
Answer.set(RESTAPI::Protocol::TAG, RESTAPI::Protocol::VERSION);
Answer.set(RESTAPI::Protocol::VALUE, Daemon()->Version());
} else if (!Poco::icompare(i, RESTAPI::Protocol::TIMES)) {
Poco::JSON::Array Array;
Poco::JSON::Object UpTimeObj;
UpTimeObj.set(RESTAPI::Protocol::TAG, RESTAPI::Protocol::UPTIME);
UpTimeObj.set(RESTAPI::Protocol::VALUE, Daemon()->uptime().totalSeconds());
Poco::JSON::Object StartObj;
StartObj.set(RESTAPI::Protocol::TAG, RESTAPI::Protocol::START);
StartObj.set(RESTAPI::Protocol::VALUE, Daemon()->startTime().epochTime());
Array.add(UpTimeObj);
Array.add(StartObj);
Answer.set(RESTAPI::Protocol::TIMES, Array);
} else if (!Poco::icompare(i, RESTAPI::Protocol::HOST)) {
Answer.set("os", Poco::Environment::osName());
Answer.set("processors", Poco::Environment::processorCount());
Answer.set("hostname",Poco::Environment::nodeName());
}
}
if (!Poco::icompare(Command, RESTAPI::Protocol::TIMES)) {
Poco::JSON::Array Array;
Poco::JSON::Object Answer;
Poco::JSON::Object UpTimeObj;
UpTimeObj.set(RESTAPI::Protocol::TAG,RESTAPI::Protocol::UPTIME);
UpTimeObj.set(RESTAPI::Protocol::VALUE, Daemon()->uptime().totalSeconds());
Poco::JSON::Object StartObj;
StartObj.set(RESTAPI::Protocol::TAG,RESTAPI::Protocol::START);
StartObj.set(RESTAPI::Protocol::VALUE, Daemon()->startTime().epochTime());
Array.add(UpTimeObj);
Array.add(StartObj);
Answer.set(RESTAPI::Protocol::TIMES, Array);
ReturnObject(Answer);
return;
}
BadRequest("Unsupported or missing parameters.");
ReturnObject(Answer);
}
}

View File

@@ -115,7 +115,7 @@ namespace OpenWifi {
bool CommandCompleted(std::string & UUID, const Poco::JSON::Object::Ptr & ReturnVars, bool FullCommand);
bool AttachFileToCommand(std::string & UUID);
bool CancelWaitFile( std::string & UUID, std::string & ErrorText );
bool GetAttachedFile(std::string & UUID, std::string & SerialNumber, const std::string & FileName, std::string &Type);
bool GetAttachedFile(std::string & UUID, const std::string & SerialNumber, const std::string & FileName, std::string &Type);
bool RemoveAttachedFile(std::string & UUID);
bool SetCommandResult(std::string & UUID, std::string & Result);
bool GetNewestCommands(std::string &SerialNumber, uint64_t HowMany, std::vector<GWObjects::CommandDetails> & Commands);

View File

@@ -38,6 +38,7 @@ namespace OpenWifi {
uint64_t,
uint64_t,
std::string> CommandDetailsRecordTuple;
typedef std::vector<CommandDetailsRecordTuple> CommandDetailsRecordList;
bool Storage::AddCommand(std::string &SerialNumber, GWObjects::CommandDetails &Command, CommandExecutionType Type) {
try {
@@ -239,7 +240,7 @@ namespace OpenWifi {
return false;
}
typedef std::vector<CommandDetailsRecordTuple> RecordList;
// typedef std::vector<CommandDetailsRecordTuple> RecordList;
bool Storage::GetNonExecutedCommands(uint64_t Offset, uint64_t HowMany,
std::vector<GWObjects::CommandDetails> &Commands) {
@@ -266,7 +267,7 @@ namespace OpenWifi {
*/
try {
RecordList Records;
CommandDetailsRecordList Records;
Poco::Data::Session Sess = Pool_->get();
Poco::Data::Statement Select(Sess);
@@ -466,7 +467,7 @@ namespace OpenWifi {
bool Storage::GetNewestCommands(std::string &SerialNumber, uint64_t HowMany, std::vector<GWObjects::CommandDetails> &Commands) {
try {
RecordList Records;
CommandDetailsRecordList Records;
Poco::Data::Session Sess = Pool_->get();
Poco::Data::Statement Select(Sess);
@@ -728,7 +729,7 @@ namespace OpenWifi {
return false;
}
bool Storage::GetAttachedFile(std::string &UUID, std::string & SerialNumber, const std::string &FileName, std::string &Type) {
bool Storage::GetAttachedFile(std::string &UUID, const std::string & SerialNumber, const std::string &FileName, std::string &Type) {
try {
Poco::Data::LOB<char> L;
/*

View File

@@ -513,7 +513,7 @@ dashboard() {
}
gwversion() {
curl ${FLAGS} -X GET "https://${OWGW}/api/v1/system?command=version" \
curl ${FLAGS} -X GET "https://${OWGW}/api/v1/system?command=version,times,host" \
-H "accept: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
jq < ${result_file}