Skip to content

Commit bf78f42

Browse files
feat[backend](updated filters and rules): added removed rules and filters routines
1 parent 820a1c7 commit bf78f42

File tree

6 files changed

+71
-15
lines changed

6 files changed

+71
-15
lines changed

backend/src/main/java/com/park/utmstack/domain/application_modules/enums/ModuleName.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,7 @@ public enum ModuleName {
6666
ORACLE,
6767
SURICATA,
6868
UTMSTACK,
69-
CROWDSTRIKE
69+
CROWDSTRIKE,
70+
SYSLOG_GENERIC,
71+
WINDOWS_EVENTS
7072
}

backend/src/main/java/com/park/utmstack/domain/logstash_filter/UtmLogstashFilter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ public class UtmLogstashFilter implements Serializable {
6565
private Instant updatedAt;
6666

6767
@JsonIgnore
68-
@ManyToOne(fetch = FetchType.LAZY)
69-
@JoinColumn(name = "module_name", referencedColumnName = "module_name",insertable = false, updatable = false)
68+
@ManyToOne(fetch = FetchType.LAZY, optional = true)
69+
@org.hibernate.annotations.NotFound(action = org.hibernate.annotations.NotFoundAction.IGNORE)
70+
@JoinColumn(name = "module_name", referencedColumnName = "module_name", insertable = false, updatable = false, nullable = true)
7071
private UtmModule module;
7172

7273
public UtmLogstashFilter() {

backend/src/main/java/com/park/utmstack/repository/correlation/rules/UtmCorrelationRulesRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,7 @@ Page<UtmCorrelationRules> searchByFilters(@Param("ruleName") String ruleName,
5656

5757
Optional<UtmCorrelationRules> findOneByRuleName(String ruleName);
5858

59+
List<UtmCorrelationRules> findAllBySystemOwnerIsTrue();
60+
5961
Optional<UtmCorrelationRules> findFirstBySystemOwnerIsTrueOrderByIdDesc();
6062
}

backend/src/main/java/com/park/utmstack/repository/logstash_filter/UtmLogstashFilterRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public interface UtmLogstashFilterRepository extends JpaRepository<UtmLogstashFi
2020

2121
void deleteAllBySystemOwnerIsTrueAndIdNotIn(List<Long> ids);
2222

23+
List<UtmLogstashFilter> findAllBySystemOwnerIsTrue();
24+
2325
@Query(nativeQuery = true, value = "select utm_logstash_filter.* from utm_logstash_filter where :nameShort = any(string_to_array(utm_logstash_filter.module_name, ','))")
2426
List<UtmLogstashFilter> findAllByModuleName(@Param("nameShort") String nameShort);
2527

backend/src/main/java/com/park/utmstack/service/DefinitionSyncService.java

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.springframework.transaction.annotation.Transactional;
2222
import org.yaml.snakeyaml.Yaml;
2323

24+
import javax.annotation.PostConstruct;
2425
import java.io.IOException;
26+
import java.lang.Exception;
2527
import java.nio.file.Files;
2628
import java.nio.file.Path;
2729
import java.nio.file.Paths;
@@ -44,26 +46,37 @@ public class DefinitionSyncService implements CommandLineRunner {
4446
private final UtmLogstashFilterService filterService;
4547

4648
@Override
47-
@Transactional
4849
public void run(String... args) {
49-
log.info("Starting definition sync from filesystem...");
50-
syncFilters();
51-
syncRules();
52-
log.info("Definition sync completed.");
50+
log.info("Starting definition sync from filesystem... ---");
51+
try {
52+
Set<String> filesystemFilters = syncFilters();
53+
Set<String> filesystemRules = syncRules();
54+
55+
cleanupOrphanedFilters(filesystemFilters);
56+
cleanupOrphanedRules(filesystemRules);
57+
58+
log.info("Definition sync completed successfully. ---");
59+
} catch (Exception e) {
60+
log.error("CRITICAL: Definition sync failed. Reason: {} ---", e.getMessage(), e);
61+
}
5362
}
5463

55-
private void syncFilters() {
64+
private Set<String> syncFilters() {
65+
Set<String> foundModules = new HashSet<>();
5666
Path filtersPath = Paths.get(".",Constants.APP_FILTER_DEFINITIONS);
5767
if (!Files.exists(filtersPath) || !Files.isDirectory(filtersPath)) {
5868
log.warn("Filters directory not found: {}", Constants.APP_FILTER_DEFINITIONS);
59-
return;
69+
return foundModules;
6070
}
6171

6272
try (Stream<Path> paths = Files.walk(filtersPath)) {
6373
paths.filter(path -> Files.isRegularFile(path) && isYamlFile(path)).forEach(path -> {
64-
String moduleName = getFileNameWithoutExtension(path);
74+
String rawName = getFileNameWithoutExtension(path);
75+
String moduleName = rawName.toUpperCase().replace("-", "_");
76+
foundModules.add(moduleName);
6577
try {
6678
String content = Files.readString(path);
79+
6780
Optional<UtmLogstashFilter> filterOpt = filterRepository.findOneByModuleName(moduleName);
6881

6982
if (filterOpt.isPresent()) {
@@ -75,7 +88,6 @@ private void syncFilters() {
7588
filterService.save(filter, true);
7689
}
7790
} else {
78-
log.info("Inserting new filter for module: {}", moduleName);
7991
UtmLogstashFilter filter = new UtmLogstashFilter();
8092
filter.setModuleName(moduleName);
8193
filter.setFilterName(moduleName + " Filter");
@@ -99,13 +111,15 @@ private void syncFilters() {
99111
} catch (IOException e) {
100112
log.error("Error listing filters directory: {}", e.getMessage());
101113
}
114+
return foundModules;
102115
}
103116

104-
private void syncRules() {
117+
private Set<String> syncRules() {
118+
Set<String> foundRules = new HashSet<>();
105119
Path rulesPath = Paths.get(".",Constants.APP_RULE_DEFINITIONS);
106120
if (!Files.exists(rulesPath) || !Files.isDirectory(rulesPath)) {
107121
log.warn("Rules directory not found: {}", Constants.APP_RULE_DEFINITIONS);
108-
return;
122+
return foundRules;
109123
}
110124

111125
Yaml yaml = new Yaml();
@@ -120,6 +134,7 @@ private void syncRules() {
120134
return;
121135
}
122136

137+
foundRules.add(ruleYaml.getName());
123138
Optional<UtmCorrelationRules> ruleOpt = rulesRepository.findOneByRuleName(ruleYaml.getName());
124139
UtmCorrelationRulesDTO ruleDto = new UtmCorrelationRulesDTO();
125140

@@ -173,6 +188,35 @@ private void syncRules() {
173188
} catch (IOException e) {
174189
log.error("Error walking rules directory: {}", e.getMessage());
175190
}
191+
return foundRules;
192+
}
193+
194+
private void cleanupOrphanedFilters(Set<String> currentFilesystemModules) {
195+
if (currentFilesystemModules.isEmpty()) return;
196+
197+
List<UtmLogstashFilter> systemFilters = filterRepository.findAllBySystemOwnerIsTrue();
198+
systemFilters.stream()
199+
.filter(filter -> !currentFilesystemModules.contains(filter.getModuleName()))
200+
.forEach(filter -> {
201+
log.info("Deleting orphaned system filter: {}", filter.getModuleName());
202+
filterService.delete(filter.getId());
203+
});
204+
}
205+
206+
private void cleanupOrphanedRules(Set<String> currentFilesystemRules) {
207+
if (currentFilesystemRules.isEmpty()) return;
208+
209+
List<UtmCorrelationRules> systemRules = rulesRepository.findAllBySystemOwnerIsTrue();
210+
systemRules.stream()
211+
.filter(rule -> !currentFilesystemRules.contains(rule.getRuleName()))
212+
.forEach(rule -> {
213+
log.info("Deleting orphaned system rule: {}", rule.getRuleName());
214+
try {
215+
rulesService.deleteRule(rule.getId(), true);
216+
} catch (Exception e) {
217+
log.error("Error deleting orphaned system rule {}: {}", rule.getRuleName(), e.getMessage());
218+
}
219+
});
176220
}
177221

178222
private boolean isYamlFile(Path path) {

backend/src/main/java/com/park/utmstack/service/correlation/rules/UtmCorrelationRulesService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,17 @@ public void setRuleActivation(Long ruleId, boolean setActive) throws Exception {
158158
* */
159159
@Transactional
160160
public void deleteRule (Long id) throws Exception {
161+
deleteRule(id, false);
162+
}
163+
164+
@Transactional
165+
public void deleteRule (Long id, boolean forcedSystemMode) throws Exception {
161166
final String ctx = CLASSNAME + ".deleteRule";
162167
Optional<UtmCorrelationRules> find = utmCorrelationRulesRepository.findById(id);
163168
if (find.isEmpty()) {
164169
throw new BadRequestException(ctx + ": The rule you're trying to delete is not present in database.");
165170
}
166-
if(find.get().getSystemOwner()) {
171+
if(find.get().getSystemOwner() && !forcedSystemMode) {
167172
throw new BadRequestException(ctx + ": System's rules can't be removed.");
168173
}
169174
utmCorrelationRulesRepository.deleteById(id);

0 commit comments

Comments
 (0)