From b7a385008a2b7e8293c5987599defe6e58e92eaa Mon Sep 17 00:00:00 2001 From: rahul kumar Date: Fri, 26 Jun 2026 15:11:19 +0530 Subject: [PATCH 1/2] Add cron to remove RAG database tag for MINI_RUNTIME versions <1.70.8 Co-Authored-By: Claude Sonnet 4.6 --- .../akto/listener/InitializerListener.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) 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..73c080a5b7f 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,63 @@ 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; + } + logger.infoAndAddToDb("removeRagDatabaseTagCron: version <1.70.8 for accountId=" + accountId + ", removing RAG database tag", 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); + if (count > 0) { + 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 " + count + " collections for accountId=" + accountId, LogDb.DASHBOARD); + } else { + logger.infoAndAddToDb("removeRagDatabaseTagCron: no collections with RAG database tag found 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 +2739,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); From 0740148a9bb9555c4af14d6db6993be1c6335324 Mon Sep 17 00:00:00 2001 From: rahul kumar Date: Fri, 26 Jun 2026 15:31:25 +0530 Subject: [PATCH 2/2] Replace one-time migration with recurring cron to remove RAG database tag based on module version Co-Authored-By: Claude Sonnet 4.6 --- .../akto/listener/InitializerListener.java | 43 +++++-------------- 1 file changed, 11 insertions(+), 32 deletions(-) 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 73c080a5b7f..db638d73430 100644 --- a/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java +++ b/apps/dashboard/src/main/java/com/akto/listener/InitializerListener.java @@ -1655,17 +1655,22 @@ public void accept(Account account) { logger.infoAndAddToDb("removeRagDatabaseTagCron: version >=1.70.8 for accountId=" + accountId + ", skipping tag removal", LogDb.DASHBOARD); return; } - logger.infoAndAddToDb("removeRagDatabaseTagCron: version <1.70.8 for accountId=" + accountId + ", removing RAG database tag", LogDb.DASHBOARD); + 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)); - long count = ApiCollectionsDao.instance.getMCollection().countDocuments(ragTagFilter); - if (count > 0) { + 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 " + count + " collections for accountId=" + accountId, LogDb.DASHBOARD); - } else { - logger.infoAndAddToDb("removeRagDatabaseTagCron: no collections with RAG database tag found for accountId=" + accountId, LogDb.DASHBOARD); + 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); @@ -3661,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);