mirror of
https://github.com/Telecominfraproject/wlan-cloud-owprov.git
synced 2025-11-01 02:58:00 +00:00
Compare commits
8 Commits
v2.6.0-RC4
...
v2.6.0-RC5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c2017859b | ||
|
|
eecf9a49c2 | ||
|
|
5945d02b3d | ||
|
|
0ac192cdc0 | ||
|
|
1b5eb87eef | ||
|
|
46db18d7cd | ||
|
|
30b8665d7d | ||
|
|
c8b3a3b060 |
@@ -9,7 +9,7 @@ fullnameOverride: ""
|
|||||||
images:
|
images:
|
||||||
owprov:
|
owprov:
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owprov
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owprov
|
||||||
tag: v2.6.0-RC4
|
tag: v2.6.0-RC5
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
# regcred:
|
# regcred:
|
||||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace OpenWifi {
|
|||||||
void Stop() override;
|
void Stop() override;
|
||||||
void ConnectionReceived( const std::string & Key, const std::string & Payload) {
|
void ConnectionReceived( const std::string & Key, const std::string & Payload) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
Logger().information(Poco::format("Device(%s): Connection/Ping message.", Key));
|
poco_debug(Logger(),Poco::format("Device(%s): Connection/Ping message.", Key));
|
||||||
Queue_.enqueueNotification( new DiscoveryMessage(Key,Payload));
|
Queue_.enqueueNotification( new DiscoveryMessage(Key,Payload));
|
||||||
}
|
}
|
||||||
void run() override;
|
void run() override;
|
||||||
|
|||||||
@@ -33,22 +33,22 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
|
|
||||||
for(auto &job:jobs_) {
|
for(auto ¤t_job:jobs_) {
|
||||||
if(job!=nullptr) {
|
if(current_job!=nullptr) {
|
||||||
if(job->Started()==0 && Pool_.used()<Pool_.available()) {
|
if(current_job->Started()==0 && Pool_.used()<Pool_.available()) {
|
||||||
job->Logger().information(fmt::format("Starting {}: {}",job->JobId(),job->Name()));
|
current_job->Logger().information(fmt::format("Starting {}: {}",current_job->JobId(),current_job->Name()));
|
||||||
job->Start();
|
current_job->Start();
|
||||||
Pool_.start(*job);
|
Pool_.start(*current_job);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto it = jobs_.begin(); it!=jobs_.end();) {
|
for(auto it = jobs_.begin(); it!=jobs_.end();) {\
|
||||||
if(*it!=nullptr && (*it)->Completed()!=0) {
|
auto current_job = *it;
|
||||||
auto tmp = it;
|
if(current_job!=nullptr && current_job->Completed()!=0) {
|
||||||
(*it)->Logger().information(fmt::format("Completed {}: {}",(*it)->JobId(),(*it)->Name()));
|
current_job->Logger().information(fmt::format("Completed {}: {}",current_job->JobId(),current_job->Name()));
|
||||||
it = jobs_.erase(it);
|
it = jobs_.erase(it);
|
||||||
delete *tmp;
|
delete current_job;
|
||||||
} else {
|
} else {
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ namespace OpenWifi {
|
|||||||
auto Status = Results->get("status").extract<Poco::JSON::Object::Ptr>();
|
auto Status = Results->get("status").extract<Poco::JSON::Object::Ptr>();
|
||||||
auto Rejected = Status->getArray("rejected");
|
auto Rejected = Status->getArray("rejected");
|
||||||
std::transform(Rejected->begin(),Rejected->end(),std::back_inserter(Warnings), [](auto i) -> auto { return i.toString(); });
|
std::transform(Rejected->begin(),Rejected->end(),std::back_inserter(Warnings), [](auto i) -> auto { return i.toString(); });
|
||||||
// for(const auto &i:*Rejected)
|
|
||||||
// Warnings.push_back(i.toString());
|
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
@@ -106,78 +104,66 @@ namespace OpenWifi {
|
|||||||
ProvObjects::Venue Venue;
|
ProvObjects::Venue Venue;
|
||||||
uint64_t Updated = 0, Failed = 0 , BadConfigs = 0 ;
|
uint64_t Updated = 0, Failed = 0 , BadConfigs = 0 ;
|
||||||
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
||||||
const std::size_t MaxThreads=16;
|
|
||||||
struct tState {
|
|
||||||
Poco::Thread thr_;
|
|
||||||
VenueDeviceConfigUpdater *task= nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
N.content.title = fmt::format("Updating {} configurations", Venue.info.name);
|
N.content.title = fmt::format("Updating {} configurations", Venue.info.name);
|
||||||
N.content.jobId = JobId();
|
N.content.jobId = JobId();
|
||||||
|
|
||||||
std::array<tState,MaxThreads> Tasks;
|
Poco::ThreadPool Pool_;
|
||||||
|
std::list<VenueDeviceConfigUpdater*> JobList;
|
||||||
|
|
||||||
|
|
||||||
for(const auto &uuid:Venue.devices) {
|
for(const auto &uuid:Venue.devices) {
|
||||||
auto NewTask = new VenueDeviceConfigUpdater(uuid, Venue.info.name, Logger());
|
auto NewTask = new VenueDeviceConfigUpdater(uuid, Venue.info.name, Logger());
|
||||||
// std::cout << "Scheduling config push for " << uuid << std::endl;
|
bool TaskAdded=false;
|
||||||
bool found_slot = false;
|
while(!TaskAdded) {
|
||||||
while (!found_slot) {
|
if (Pool_.available()) {
|
||||||
for (auto &cur_task: Tasks) {
|
JobList.push_back(NewTask);
|
||||||
if (cur_task.task == nullptr) {
|
Pool_.start(*NewTask);
|
||||||
cur_task.task = NewTask;
|
TaskAdded = true;
|
||||||
cur_task.thr_.start(*NewTask);
|
continue;
|
||||||
found_slot = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Let's look for a slot...
|
for(auto job_it = JobList.begin(); job_it !=JobList.end();) {
|
||||||
if (!found_slot) {
|
VenueDeviceConfigUpdater * current_job = *job_it;
|
||||||
for (auto &cur_task: Tasks) {
|
if(current_job!= nullptr && current_job->done_) {
|
||||||
if (cur_task.task != nullptr && cur_task.task->started_) {
|
Updated += current_job->updated_;
|
||||||
if (cur_task.thr_.isRunning())
|
Failed += current_job->failed_;
|
||||||
continue;
|
BadConfigs += current_job->bad_config_;
|
||||||
if (!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
if(current_job->updated_) {
|
||||||
cur_task.thr_.join();
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
Updated += cur_task.task->updated_;
|
} else if(current_job->failed_) {
|
||||||
Failed += cur_task.task->failed_;
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
BadConfigs += cur_task.task->bad_config_;
|
} else {
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
N.content.error.push_back(current_job->SerialNumber);
|
||||||
delete cur_task.task;
|
|
||||||
cur_task.task = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
job_it = JobList.erase(job_it);
|
||||||
|
delete current_job;
|
||||||
|
} else {
|
||||||
|
++job_it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger().debug("Waiting for outstanding update threads to finish.");
|
Logger().debug("Waiting for outstanding update threads to finish.");
|
||||||
bool stillTasksRunning=true;
|
Pool_.joinAll();
|
||||||
while(stillTasksRunning) {
|
for(auto job_it = JobList.begin(); job_it !=JobList.end();) {
|
||||||
stillTasksRunning = false;
|
VenueDeviceConfigUpdater * current_job = *job_it;
|
||||||
for(auto &cur_task:Tasks) {
|
if(current_job!= nullptr && current_job->done_) {
|
||||||
if(cur_task.task!= nullptr && cur_task.task->started_) {
|
Updated += current_job->updated_;
|
||||||
if(cur_task.thr_.isRunning()) {
|
Failed += current_job->failed_;
|
||||||
stillTasksRunning = true;
|
BadConfigs += current_job->bad_config_;
|
||||||
continue;
|
if(current_job->updated_) {
|
||||||
}
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
if(!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
} else if(current_job->failed_) {
|
||||||
cur_task.thr_.join();
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
if(cur_task.task->updated_) {
|
} else {
|
||||||
Updated++;
|
N.content.error.push_back(current_job->SerialNumber);
|
||||||
N.content.success.push_back(cur_task.task->SerialNumber);
|
|
||||||
} else if(cur_task.task->failed_) {
|
|
||||||
Failed++;
|
|
||||||
N.content.warning.push_back(cur_task.task->SerialNumber);
|
|
||||||
} else {
|
|
||||||
BadConfigs++;
|
|
||||||
N.content.error.push_back(cur_task.task->SerialNumber);
|
|
||||||
}
|
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
|
||||||
delete cur_task.task;
|
|
||||||
cur_task.task = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
job_it = JobList.erase(job_it);
|
||||||
|
delete current_job;
|
||||||
|
} else {
|
||||||
|
++job_it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,6 +175,7 @@ namespace OpenWifi {
|
|||||||
Logger().warning(N.content.details);
|
Logger().warning(N.content.details);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// std::cout << N.content.details << std::endl;
|
||||||
WebSocketClientNotificationVenueUpdateJobCompletionToUser(UserInfo().email, N);
|
WebSocketClientNotificationVenueUpdateJobCompletionToUser(UserInfo().email, N);
|
||||||
Logger().information(fmt::format("Job {} Completed: {} updated, {} failed to update , {} bad configurations.",
|
Logger().information(fmt::format("Job {} Completed: {} updated, {} failed to update , {} bad configurations.",
|
||||||
JobId(), Updated ,Failed, BadConfigs));
|
JobId(), Updated ,Failed, BadConfigs));
|
||||||
|
|||||||
@@ -66,77 +66,59 @@ namespace OpenWifi {
|
|||||||
ProvObjects::Venue Venue;
|
ProvObjects::Venue Venue;
|
||||||
uint64_t rebooted_ = 0, failed_ = 0;
|
uint64_t rebooted_ = 0, failed_ = 0;
|
||||||
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
||||||
const std::size_t MaxThreads=16;
|
|
||||||
struct tState {
|
|
||||||
Poco::Thread thr_;
|
|
||||||
VenueDeviceRebooter *task= nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
N.content.title = fmt::format("Rebooting {} devices.", Venue.info.name);
|
N.content.title = fmt::format("Rebooting {} devices.", Venue.info.name);
|
||||||
N.content.jobId = JobId();
|
N.content.jobId = JobId();
|
||||||
|
|
||||||
std::array<tState,MaxThreads> Tasks;
|
Poco::ThreadPool Pool_;
|
||||||
|
std::list<VenueDeviceRebooter*> JobList;
|
||||||
|
|
||||||
for(const auto &uuid:Venue.devices) {
|
for(const auto &uuid:Venue.devices) {
|
||||||
auto NewTask = new VenueDeviceRebooter(uuid, Venue.info.name, Logger());
|
auto NewTask = new VenueDeviceRebooter(uuid, Venue.info.name, Logger());
|
||||||
// std::cout << "Scheduling config push for " << uuid << std::endl;
|
bool TaskAdded=false;
|
||||||
bool found_slot = false;
|
while(!TaskAdded) {
|
||||||
while (!found_slot) {
|
if (Pool_.available()) {
|
||||||
for (auto &cur_task: Tasks) {
|
JobList.push_back(NewTask);
|
||||||
if (cur_task.task == nullptr) {
|
Pool_.start(*NewTask);
|
||||||
cur_task.task = NewTask;
|
TaskAdded = true;
|
||||||
cur_task.thr_.start(*NewTask);
|
continue;
|
||||||
found_slot = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Let's look for a slot...
|
for(auto job_it = JobList.begin(); job_it !=JobList.end();) {
|
||||||
if (!found_slot) {
|
VenueDeviceRebooter * current_job = *job_it;
|
||||||
for (auto &cur_task: Tasks) {
|
if(current_job!= nullptr && current_job->done_) {
|
||||||
if (cur_task.task != nullptr && cur_task.task->started_) {
|
if(current_job->rebooted_)
|
||||||
if (cur_task.thr_.isRunning())
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
continue;
|
else
|
||||||
if (!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
cur_task.thr_.join();
|
rebooted_ += current_job->rebooted_;
|
||||||
rebooted_ += cur_task.task->rebooted_;
|
failed_ += current_job->failed_;
|
||||||
failed_ += cur_task.task->failed_;
|
job_it = JobList.erase(job_it);
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
delete current_job;
|
||||||
delete cur_task.task;
|
} else {
|
||||||
cur_task.task = nullptr;
|
++job_it;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger().debug("Waiting for outstanding update threads to finish.");
|
Logger().debug("Waiting for outstanding update threads to finish.");
|
||||||
bool stillTasksRunning=true;
|
Pool_.joinAll();
|
||||||
while(stillTasksRunning) {
|
for(auto job_it = JobList.begin(); job_it !=JobList.end();) {
|
||||||
stillTasksRunning = false;
|
VenueDeviceRebooter * current_job = *job_it;
|
||||||
for(auto &cur_task:Tasks) {
|
if(current_job!= nullptr && current_job->done_) {
|
||||||
if(cur_task.task!= nullptr && cur_task.task->started_) {
|
if(current_job->rebooted_)
|
||||||
if(cur_task.thr_.isRunning()) {
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
stillTasksRunning = true;
|
else
|
||||||
continue;
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
}
|
rebooted_ += current_job->rebooted_;
|
||||||
if(!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
failed_ += current_job->failed_;
|
||||||
cur_task.thr_.join();
|
job_it = JobList.erase(job_it);
|
||||||
if(cur_task.task->rebooted_) {
|
delete current_job;
|
||||||
rebooted_++;
|
} else {
|
||||||
N.content.success.push_back(cur_task.task->SerialNumber);
|
++job_it;
|
||||||
} else if(cur_task.task->failed_) {
|
|
||||||
failed_++;
|
|
||||||
N.content.warning.push_back(cur_task.task->SerialNumber);
|
|
||||||
}
|
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
|
||||||
delete cur_task.task;
|
|
||||||
cur_task.task = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
N.content.details = fmt::format("Job {} Completed: {} rebooted, {} failed to reboot.",
|
N.content.details = fmt::format("Job {} Completed: {} rebooted, {} failed to reboot.",
|
||||||
JobId(), rebooted_ ,failed_);
|
JobId(), rebooted_ ,failed_);
|
||||||
|
|
||||||
@@ -145,6 +127,7 @@ namespace OpenWifi {
|
|||||||
Logger().warning(N.content.details);
|
Logger().warning(N.content.details);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// std::cout << N.content.details << std::endl;
|
||||||
WebSocketClientNotificationVenueRebootCompletionToUser(UserInfo().email,N);
|
WebSocketClientNotificationVenueRebootCompletionToUser(UserInfo().email,N);
|
||||||
Logger().information(fmt::format("Job {} Completed: {} rebooted, {} failed to reboot.",
|
Logger().information(fmt::format("Job {} Completed: {} rebooted, {} failed to reboot.",
|
||||||
JobId(), rebooted_ ,failed_));
|
JobId(), rebooted_ ,failed_));
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
Storage::ApplyRules(rules_,Device.deviceRules);
|
Storage::ApplyRules(rules_,Device.deviceRules);
|
||||||
if(Device.deviceRules.firmwareUpgrade=="no") {
|
if(Device.deviceRules.firmwareUpgrade=="no") {
|
||||||
std::cout << "Skipped Upgrade:" << Device.serialNumber << std::endl;
|
poco_debug(Logger(),fmt::format("Skipped Upgrade: {}", Device.serialNumber));
|
||||||
skipped_++;
|
skipped_++;
|
||||||
done_=true;
|
done_=true;
|
||||||
return;
|
return;
|
||||||
@@ -40,16 +40,14 @@ namespace OpenWifi {
|
|||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if(SDK::FMS::Firmware::GetLatest(Device.deviceType,Device.deviceRules.rcOnly=="yes",F)) {
|
if(SDK::FMS::Firmware::GetLatest(Device.deviceType,Device.deviceRules.rcOnly=="yes",F)) {
|
||||||
if (SDK::GW::Device::Upgrade(nullptr, Device.serialNumber, 0, F.uri)) {
|
if (SDK::GW::Device::Upgrade(nullptr, Device.serialNumber, 0, F.uri)) {
|
||||||
std::cout << "Upgraded:" << Device.serialNumber << " to " << F.uri << std::endl;
|
|
||||||
Logger().debug(fmt::format("{}: Upgraded.",Device.serialNumber));
|
Logger().debug(fmt::format("{}: Upgraded.",Device.serialNumber));
|
||||||
upgraded_++;
|
upgraded_++;
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Did not Upgrade:" << Device.serialNumber << " to " << F.uri << std::endl;
|
|
||||||
Logger().information(fmt::format("{}: Not Upgraded.", Device.serialNumber));
|
Logger().information(fmt::format("{}: Not Upgraded.", Device.serialNumber));
|
||||||
failed_++;
|
failed_++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Did not Upgrade:" << Device.serialNumber << " to <unknown>" << std::endl;
|
Logger().information(fmt::format("{}: Not Upgraded. No firmware available.", Device.serialNumber));
|
||||||
failed_++;
|
failed_++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,88 +85,71 @@ namespace OpenWifi {
|
|||||||
ProvObjects::Venue Venue;
|
ProvObjects::Venue Venue;
|
||||||
uint64_t upgraded_ = 0, failed_ = 0;
|
uint64_t upgraded_ = 0, failed_ = 0;
|
||||||
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
if(StorageService()->VenueDB().GetRecord("id",VenueUUID_,Venue)) {
|
||||||
const std::size_t MaxThreads=16;
|
|
||||||
struct tState {
|
|
||||||
Poco::Thread thr_;
|
|
||||||
VenueDeviceUpgrade *task= nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
N.content.title = fmt::format("Upgrading {} devices.", Venue.info.name);
|
N.content.title = fmt::format("Upgrading {} devices.", Venue.info.name);
|
||||||
N.content.jobId = JobId();
|
N.content.jobId = JobId();
|
||||||
|
|
||||||
std::array<tState,MaxThreads> Tasks;
|
Poco::ThreadPool Pool_;
|
||||||
ProvObjects::DeviceRules Rules;
|
std::list<VenueDeviceUpgrade*> JobList;
|
||||||
|
ProvObjects::DeviceRules Rules;
|
||||||
|
|
||||||
StorageService()->VenueDB().EvaluateDeviceRules(Venue.info.id, Rules);
|
StorageService()->VenueDB().EvaluateDeviceRules(Venue.info.id, Rules);
|
||||||
|
|
||||||
for(const auto &uuid:Venue.devices) {
|
for(const auto &uuid:Venue.devices) {
|
||||||
auto NewTask = new VenueDeviceUpgrade(uuid, Venue.info.name, Rules,Logger());
|
auto NewTask = new VenueDeviceUpgrade(uuid, Venue.info.name, Rules, Logger());
|
||||||
// std::cout << "Scheduling config push for " << uuid << std::endl;
|
bool TaskAdded = false;
|
||||||
bool found_slot = false;
|
while (!TaskAdded) {
|
||||||
while (!found_slot) {
|
if (Pool_.available()) {
|
||||||
for (auto &cur_task: Tasks) {
|
JobList.push_back(NewTask);
|
||||||
if (cur_task.task == nullptr) {
|
Pool_.start(*NewTask);
|
||||||
cur_task.task = NewTask;
|
TaskAdded = true;
|
||||||
cur_task.thr_.start(*NewTask);
|
continue;
|
||||||
found_slot = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Let's look for a slot...
|
for (auto job_it = JobList.begin(); job_it != JobList.end();) {
|
||||||
if (!found_slot) {
|
VenueDeviceUpgrade *current_job = *job_it;
|
||||||
for (auto &cur_task: Tasks) {
|
if (current_job != nullptr && current_job->done_) {
|
||||||
if (cur_task.task != nullptr && cur_task.task->started_) {
|
if (current_job->upgraded_)
|
||||||
if (cur_task.thr_.isRunning())
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
continue;
|
else
|
||||||
if (!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
cur_task.thr_.join();
|
upgraded_ += current_job->upgraded_;
|
||||||
upgraded_ += cur_task.task->upgraded_;
|
failed_ += current_job->failed_;
|
||||||
failed_ += cur_task.task->failed_;
|
job_it = JobList.erase(job_it);
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
delete current_job;
|
||||||
delete cur_task.task;
|
} else {
|
||||||
cur_task.task = nullptr;
|
++job_it;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Logger().debug("Waiting for outstanding update threads to finish.");
|
|
||||||
bool stillTasksRunning=true;
|
Logger().debug("Waiting for outstanding upgrade threads to finish.");
|
||||||
while(stillTasksRunning) {
|
Pool_.joinAll();
|
||||||
stillTasksRunning = false;
|
for(auto job_it = JobList.begin(); job_it !=JobList.end();) {
|
||||||
for(auto &cur_task:Tasks) {
|
VenueDeviceUpgrade * current_job = *job_it;
|
||||||
if(cur_task.task!= nullptr && cur_task.task->started_) {
|
if(current_job!= nullptr && current_job->done_) {
|
||||||
if(cur_task.thr_.isRunning()) {
|
if(current_job->upgraded_)
|
||||||
stillTasksRunning = true;
|
N.content.success.push_back(current_job->SerialNumber);
|
||||||
continue;
|
else
|
||||||
}
|
N.content.warning.push_back(current_job->SerialNumber);
|
||||||
if(!cur_task.thr_.isRunning() && cur_task.task->done_) {
|
upgraded_ += current_job->upgraded_;
|
||||||
cur_task.thr_.join();
|
failed_ += current_job->failed_;
|
||||||
if(cur_task.task->upgraded_) {
|
job_it = JobList.erase(job_it);
|
||||||
upgraded_++;
|
delete current_job;
|
||||||
N.content.success.push_back(cur_task.task->SerialNumber);
|
} else {
|
||||||
} else if(cur_task.task->failed_) {
|
++job_it;
|
||||||
failed_++;
|
|
||||||
N.content.warning.push_back(cur_task.task->SerialNumber);
|
|
||||||
}
|
|
||||||
cur_task.task->started_ = cur_task.task->done_ = false;
|
|
||||||
delete cur_task.task;
|
|
||||||
cur_task.task = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
N.content.details = fmt::format("Job {} Completed: {} upgraded, {} failed to upgrade.",
|
N.content.details = fmt::format("Job {} Completed: {} upgraded, {} failed to upgrade.",
|
||||||
JobId(), upgraded_ ,failed_);
|
JobId(), upgraded_ ,failed_);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
N.content.details = fmt::format("Venue {} no longer exists.",VenueUUID_);
|
N.content.details = fmt::format("Venue {} no longer exists.",VenueUUID_);
|
||||||
Logger().warning(N.content.details);
|
Logger().warning(N.content.details);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// std::cout << N.content.details << std::endl;
|
||||||
WebSocketClientNotificationVenueRebootCompletionToUser(UserInfo().email,N);
|
WebSocketClientNotificationVenueRebootCompletionToUser(UserInfo().email,N);
|
||||||
Logger().information(fmt::format("Job {} Completed: {} upgraded, {} failed to upgrade.",
|
Logger().information(fmt::format("Job {} Completed: {} upgraded, {} failed to upgrade.",
|
||||||
JobId(), upgraded_ ,failed_));
|
JobId(), upgraded_ ,failed_));
|
||||||
|
|||||||
Reference in New Issue
Block a user