diff --git a/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java b/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java index d78edcd5a21..db638d73430 100644 --- a/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java +++ b/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java @@ -1619,6 +1619,68 @@ public void accept(Account t) { }, jitterSeconds, 2 * 60 * 60, TimeUnit.SECONDS); } + // Returns true if version string (e.g. "1.62.18-abc123") is >= the given major.minor.patch + private static boolean isVersionAtLeast(String version, int major, int minor, int patch) { + if (version == null) return false; + try { + String numeric = version.split("-")[0]; + String[] parts = numeric.split("\\."); + int vMajor = Integer.parseInt(parts[0]); + int vMinor = Integer.parseInt(parts[1]); + int vPatch = Integer.parseInt(parts[2]); + if (vMajor != major) return vMajor > major; + if (vMinor != minor) return vMinor > minor; + return vPatch >= patch; + } catch (Exception e) { + return false; + } + } + + public void setUpRemoveRagDatabaseTagCron() { + scheduler.scheduleAtFixedRate(new Runnable() { + public void run() { + AccountTask.instance.executeTask(new Consumer() { + @Override + public void accept(Account account) { + try { + int accountId = Context.accountId.get(); + List liveModules = ModuleInfoDao.instance.fetchLiveModulesByType(ModuleInfo.ModuleType.MINI_RUNTIME); + if (liveModules == null || liveModules.isEmpty()) { + logger.infoAndAddToDb("removeRagDatabaseTagCron: no live MINI_RUNTIME modules found for accountId=" + accountId + ", skipping", LogDb.DASHBOARD); + return; + } + boolean hasFixedVersion = liveModules.stream() + .anyMatch(m -> isVersionAtLeast(m.getCurrentVersion(), 1, 70, 8)); + if (hasFixedVersion) { + logger.infoAndAddToDb("removeRagDatabaseTagCron: version >=1.70.8 for accountId=" + accountId + ", skipping tag removal", LogDb.DASHBOARD); + return; + } + String moduleVersions = liveModules.stream().map(ModuleInfo::getCurrentVersion).collect(java.util.stream.Collectors.joining(", ")); + logger.infoAndAddToDb("removeRagDatabaseTagCron: version <1.70.8 for accountId=" + accountId + " versions=[" + moduleVersions + "], removing RAG database tag", LogDb.DASHBOARD); + Bson ragTagFilter = Filters.elemMatch(ApiCollection.TAGS_STRING, Filters.eq(CollectionTags.KEY_NAME, Constants.AKTO_RAG_DATABASE_TAG)); + List taggedCollections = ApiCollectionsDao.instance.findAll(ragTagFilter, Projections.include(Constants.ID, ApiCollection.NAME)); + if (taggedCollections == null || taggedCollections.isEmpty()) { + logger.infoAndAddToDb("removeRagDatabaseTagCron: no collections with RAG database tag found for accountId=" + accountId, LogDb.DASHBOARD); + } else { + String collectionDetails = taggedCollections.stream() + .map(c -> "id=" + c.getId() + " name=" + c.getName()) + .collect(java.util.stream.Collectors.joining(", ")); + logger.infoAndAddToDb("removeRagDatabaseTagCron: found " + taggedCollections.size() + " collections with RAG tag for accountId=" + accountId + ": [" + collectionDetails + "]", LogDb.DASHBOARD); + ApiCollectionsDao.instance.updateMany( + ragTagFilter, + Updates.pull(ApiCollection.TAGS_STRING, new BasicDBObject(CollectionTags.KEY_NAME, Constants.AKTO_RAG_DATABASE_TAG)) + ); + logger.infoAndAddToDb("removeRagDatabaseTagCron: removed RAG database tag from " + taggedCollections.size() + " collections for accountId=" + accountId, LogDb.DASHBOARD); + } + } catch (Exception e) { + logger.errorAndAddToDb(e, "removeRagDatabaseTagCron: error - " + e.getMessage(), LogDb.DASHBOARD); + } + } + }, "remove-rag-database-tag"); + } + }, 0, 30, TimeUnit.MINUTES); + } + static class ChangesInfo { public Map newSensitiveParams = new HashMap<>(); public List newSensitiveParamsObject = new ArrayList<>(); @@ -2682,6 +2744,8 @@ public void accept(Account account) { setUpWebhookScheduler(); logger.warn("Started threat detection rolling reboot scheduler", LogDb.DASHBOARD); setUpThreatDetectionRollingRebootScheduler(); + logger.warn("Started remove RAG database tag scheduler", LogDb.DASHBOARD); + setUpRemoveRagDatabaseTagCron(); logger.warn("Started traffic alert schedulers", LogDb.DASHBOARD); setUpTrafficAlertScheduler(); logger.warn("Started daily schedulers", LogDb.DASHBOARD); @@ -3602,37 +3666,11 @@ private static void moveUserDataFromModuleInfoToAgenticUsers(BackwardCompatibili } } - - private static void removeRagDatabaseTag(BackwardCompatibility backwardCompatibility) { - int accountId = Context.accountId.get(); - if (backwardCompatibility.getRemoveRagDatabaseTag() == 0) { - logger.infoAndAddToDb("removeRagDatabaseTag: starting migration for accountId=" + accountId, LogDb.DASHBOARD); - Bson ragTagFilter = Filters.elemMatch(ApiCollection.TAGS_STRING, Filters.eq(CollectionTags.KEY_NAME, Constants.AKTO_RAG_DATABASE_TAG)); - long count = ApiCollectionsDao.instance.getMCollection().countDocuments(ragTagFilter); - logger.infoAndAddToDb("removeRagDatabaseTag: found " + count + " collections with RAG database tag for accountId=" + accountId, LogDb.DASHBOARD); - if (count > 0) { - ApiCollectionsDao.instance.updateMany( - ragTagFilter, - Updates.pull(ApiCollection.TAGS_STRING, new BasicDBObject(CollectionTags.KEY_NAME, Constants.AKTO_RAG_DATABASE_TAG)) - ); - logger.infoAndAddToDb("removeRagDatabaseTag: removed RAG database tag from " + count + " collections for accountId=" + accountId, LogDb.DASHBOARD); - } - BackwardCompatibilityDao.instance.updateOne( - Filters.eq("_id", backwardCompatibility.getId()), - Updates.set(BackwardCompatibility.REMOVE_RAG_DATABASE_TAG, Context.now()) - ); - logger.infoAndAddToDb("removeRagDatabaseTag: migration complete for accountId=" + accountId, LogDb.DASHBOARD); - } else { - logger.infoAndAddToDb("removeRagDatabaseTag: already executed, skipping for accountId=" + accountId, LogDb.DASHBOARD); - } - } - public static void setBackwardCompatibilities(BackwardCompatibility backwardCompatibility){ if (DashboardMode.isMetered()) { initializeOrganizationAccountBelongsTo(backwardCompatibility); setOrganizationsInBilling(backwardCompatibility); } - removeRagDatabaseTag(backwardCompatibility); setAktoDefaultNewUI(backwardCompatibility); updateCustomDataTypeOperator(backwardCompatibility); markSummariesAsVulnerable(backwardCompatibility);