Streamlining DeviceRules processing and upgrading RRM device listing.

This commit is contained in:
stephb9959
2022-05-20 10:01:47 -07:00
parent 744b6c4b2a
commit fb065dd0e4
4 changed files with 33 additions and 174 deletions

View File

@@ -59,17 +59,10 @@ namespace OpenWifi{
} }
return ReturnObject(Answer); return ReturnObject(Answer);
} else if(HasParameter("firmwareOptions", Arg) && Arg=="true") { } else if(HasParameter("firmwareOptions", Arg) && Arg=="true") {
ProvObjects::FIRMWARE_UPGRADE_RULES Rules; ProvObjects::DeviceRules Rules;
StorageService()->InventoryDB().EvaluateDeviceSerialNumberRules(SerialNumber,Rules);
StorageService()->InventoryDB().FindFirmwareOptions(SerialNumber,Rules); Answer.set("firmwareUpgrade",Rules.firmwareUpgrade);
Answer.set("firmwareRCOnly", Rules.rcOnly == "yes" );
if(Rules == ProvObjects::dont_upgrade) {
Answer.set("firmwareUpgrade","no");
} else {
Answer.set("firmwareUpgrade","yes");
if(Rules == ProvObjects::upgrade_release_only)
Answer.set("firmwareRCOnly", Rules == ProvObjects::upgrade_release_only );
}
return ReturnObject(Answer); return ReturnObject(Answer);
} else if(HasParameter("applyConfiguration",Arg) && Arg=="true") { } else if(HasParameter("applyConfiguration",Arg) && Arg=="true") {
Logger().debug(Poco::format("%s: Retrieving configuration.",Existing.serialNumber)); Logger().debug(Poco::format("%s: Retrieving configuration.",Existing.serialNumber));

View File

@@ -85,13 +85,14 @@ namespace OpenWifi {
return (R_res.rrm=="inherit" || R_res.rcOnly=="inherit" || R_res.firmwareUpgrade=="inherit"); return (R_res.rrm=="inherit" || R_res.rcOnly=="inherit" || R_res.firmwareUpgrade=="inherit");
} }
static inline void ApplyConfigRules(ProvObjects::DeviceRules & R_res) { static inline bool ApplyConfigRules(ProvObjects::DeviceRules & R_res) {
if(R_res.firmwareUpgrade=="inherit") if(R_res.firmwareUpgrade=="inherit")
R_res.firmwareUpgrade=MicroService::instance().ConfigGetString("firmware.updater.upgrade","yes"); R_res.firmwareUpgrade=MicroService::instance().ConfigGetString("firmware.updater.upgrade","yes");
if(R_res.rcOnly=="inherit") if(R_res.rcOnly=="inherit")
R_res.rcOnly=MicroService::instance().ConfigGetString("firmware.updater.releaseonly","yes"); R_res.rcOnly=MicroService::instance().ConfigGetString("firmware.updater.releaseonly","yes");
if(R_res.rrm=="inherit") if(R_res.rrm=="inherit")
R_res.rrm=MicroService::instance().ConfigGetString("rrm.default","no"); R_res.rrm=MicroService::instance().ConfigGetString("rrm.default","no");
return true;
} }
private: private:

View File

@@ -186,109 +186,27 @@ namespace OpenWifi {
return false; return false;
} }
bool InventoryDB::FindFirmwareOptionsForEntity(const std::string &EntityUUID, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules) { bool InventoryDB::EvaluateDeviceIDRules(const std::string &id, ProvObjects::DeviceRules &Rules) {
std::string UUID = EntityUUID; ProvObjects::InventoryTag T;
while(!UUID.empty() && UUID!=EntityDB::RootUUID()) { if(GetRecord("id", id, T))
ProvObjects::Entity E; return EvaluateDeviceRules(T,Rules);
if(StorageService()->EntityDB().GetRecord("id",UUID,E)) {
if(!E.deviceConfiguration.empty()) {
ProvObjects::DeviceConfiguration C;
for(const auto &i:E.deviceConfiguration) {
if(StorageService()->ConfigurationDB().GetRecord("id",i,C)) {
if(C.deviceRules.firmwareUpgrade=="no") {
Rules = ProvObjects::dont_upgrade;
return false;
}
if(C.deviceRules.firmwareUpgrade=="yes") {
if(C.deviceRules.rcOnly=="yes")
Rules = ProvObjects::upgrade_release_only;
else
Rules = ProvObjects::upgrade_latest;
return true;
}
}
}
}
UUID = E.parent;
} else {
break;
}
}
Rules = Daemon()->FirmwareRules();
return false; return false;
} }
bool InventoryDB::FindFirmwareOptionsForVenue(const std::string &VenueUUID, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules) { bool InventoryDB::EvaluateDeviceSerialNumberRules(const std::string &serialNumber, ProvObjects::DeviceRules &Rules) {
std::string UUID = VenueUUID; ProvObjects::InventoryTag T;
while(!UUID.empty()) { if(GetRecord("serialNumber", serialNumber, T))
ProvObjects::Venue V; return EvaluateDeviceRules(T,Rules);
if(StorageService()->VenueDB().GetRecord("id",UUID,V)) {
if(!V.deviceConfiguration.empty()) {
ProvObjects::DeviceConfiguration C;
for(const auto &i:V.deviceConfiguration) {
if(StorageService()->ConfigurationDB().GetRecord("id",i,C)) {
if(C.deviceRules.firmwareUpgrade=="no") {
Rules = ProvObjects::dont_upgrade;
return false;
}
if(C.deviceRules.firmwareUpgrade=="yes") {
if(C.deviceRules.rcOnly=="yes")
Rules = ProvObjects::upgrade_release_only;
else
Rules = ProvObjects::upgrade_latest;
return true;
}
}
}
}
if(!V.entity.empty()) {
return FindFirmwareOptionsForEntity(V.entity,Rules);
} else {
UUID = V.parent;
}
} else {
break;
}
}
Rules = Daemon()->FirmwareRules();
return false; return false;
} }
bool InventoryDB::FindFirmwareOptions(std::string &SerialNumber, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules) { bool InventoryDB::EvaluateDeviceRules(const ProvObjects::InventoryTag &T, ProvObjects::DeviceRules &Rules) {
ProvObjects::InventoryTag T; Rules = T.deviceRules;
if(GetRecord("serialNumber",SerialNumber,T)) { if(!T.venue.empty())
std::cout << "SerialNumber: " << SerialNumber << " found device." << std::endl; return StorageService()->VenueDB().EvaluateDeviceRules(T.venue,Rules);
// if there is a local configuration, use this if(!T.entity.empty())
if(!T.deviceConfiguration.empty()) { return StorageService()->EntityDB().EvaluateDeviceRules(T.venue,Rules);
ProvObjects::DeviceConfiguration C; return Storage::ApplyConfigRules(Rules);
if(StorageService()->ConfigurationDB().GetRecord("id",T.deviceConfiguration,C)) {
if(C.deviceRules.firmwareUpgrade=="no") {
Rules = ProvObjects::dont_upgrade;
return false;
}
if(C.deviceRules.firmwareUpgrade=="yes") {
if(C.deviceRules.rcOnly=="yes")
Rules = ProvObjects::upgrade_release_only;
else
Rules = ProvObjects::upgrade_latest;
return true;
}
}
}
// look at entity...
if(!T.entity.empty()) {
return FindFirmwareOptionsForEntity(T.entity,Rules);
}
if(!T.venue.empty()) {
return FindFirmwareOptionsForVenue(T.venue,Rules);
}
Rules = Daemon()->FirmwareRules();
return false;
}
Rules = ProvObjects::dont_upgrade;
return false;
} }
void InventoryDB::InitializeSerialCache() { void InventoryDB::InitializeSerialCache() {
@@ -296,71 +214,17 @@ namespace OpenWifi {
Iterate(F); Iterate(F);
} }
bool InventoryDB::LookForRRMInEntity(const std::string &Entity) {
try {
ProvObjects::Entity E;
if(StorageService()->EntityDB().GetRecord("id", Entity, E)) {
if(E.deviceRules.rrm == "inherit") {
if(!E.parent.empty())
return LookForRRMInEntity(E.parent);
return false;
}
if(E.deviceRules.rrm=="no")
return false;
return true;
}
return false;
} catch(...) {
}
return false;
}
bool InventoryDB::LookForRRMInVenue(const std::string &Venue) {
try {
ProvObjects::Venue V;
if(StorageService()->VenueDB().GetRecord("id", Venue, V)) {
if(V.deviceRules.rrm == "inherit") {
if(!V.parent.empty())
return LookForRRMInVenue(V.parent);
if(!V.entity.empty())
return LookForRRMInEntity(V.entity);
return false;
}
if(V.deviceRules.rrm=="no")
return false;
return true;
}
return false;
} catch(...) {
}
return false;
}
bool InventoryDB::LookForRRM(const ProvObjects::InventoryTag &T) {
if(!T.venue.empty())
return LookForRRMInVenue(T.venue);
if(!T.entity.empty())
return LookForRRMInEntity(T.entity);
return false;
}
bool InventoryDB::GetRRMDeviceList(Types::UUIDvec_t &DeviceList) { bool InventoryDB::GetRRMDeviceList(Types::UUIDvec_t &DeviceList) {
// get a local copy of the cache - this could be expensive. // get a local copy of the cache - this could be expensive.
auto C = SerialNumberCache()->GetCacheCopy(); auto C = SerialNumberCache()->GetCacheCopy();
for(const auto &i:C) { for(const auto &i:C) {
std::string SerialNumber = Utils::IntToSerialNumber(i);
ProvObjects::InventoryTag Tag; ProvObjects::InventoryTag Tag;
if(StorageService()->InventoryDB().GetRecord("serialNumber",SerialNumber,Tag)) { ProvObjects::DeviceRules Rules;
if(Tag.deviceRules.rrm=="no") std::string SerialNumber = Utils::IntToSerialNumber(i);
continue; if(EvaluateDeviceSerialNumberRules(SerialNumber,Rules)) {
if(Tag.deviceRules.rrm=="inherit") { if(Rules.rrm=="yes")
if(!LookForRRM(Tag)) DeviceList.push_back(SerialNumber);
continue;
}
DeviceList.push_back(SerialNumber);
} }
} }
return true; return true;

View File

@@ -44,19 +44,20 @@ namespace OpenWifi {
virtual ~InventoryDB() {}; virtual ~InventoryDB() {};
bool CreateFromConnection(const std::string & SerialNumber, const std::string & ConnectionInfo, bool CreateFromConnection(const std::string & SerialNumber, const std::string & ConnectionInfo,
const std::string & DeviceType, const std::string &Locale ); const std::string & DeviceType, const std::string &Locale );
bool FindFirmwareOptions(std::string & SerialNumber, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules);
static bool FindFirmwareOptionsForEntity(const std::string & EntityUUID, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules);
static bool FindFirmwareOptionsForVenue(const std::string & VenueUUID, ProvObjects::FIRMWARE_UPGRADE_RULES & Rules);
void InitializeSerialCache(); void InitializeSerialCache();
bool GetRRMDeviceList(Types::UUIDvec_t & DeviceList); bool GetRRMDeviceList(Types::UUIDvec_t & DeviceList);
bool LookForRRM( const ProvObjects::InventoryTag &T);
bool LookForRRMInVenue(const std::string &Venue); bool EvaluateDeviceIDRules(const std::string &id, ProvObjects::DeviceRules &Rules);
bool LookForRRMInEntity(const std::string &Entity); bool EvaluateDeviceSerialNumberRules(const std::string &serialNumber, ProvObjects::DeviceRules &Rules);
inline uint32_t Version() override { inline uint32_t Version() override {
return 1; return 1;
} }
bool Upgrade(uint32_t from, uint32_t &to) override; bool Upgrade(uint32_t from, uint32_t &to) override;
private: private:
bool EvaluateDeviceRules(const ProvObjects::InventoryTag &T, ProvObjects::DeviceRules &Rules);
}; };
} }