From 686c92312f6c958e77142ea373580e6d23a5a875 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 23 Sep 2015 14:41:00 +0200 Subject: [PATCH] Prevent Watcher to start if `action.auto_create_index` setting is too restrictive. Closes elastic/elasticsearch#649 Original commit: elastic/x-pack-elasticsearch@afe05332ce96f2b8b5450a4c209c3fd0f088c531 --- .../elasticsearch/watcher/WatcherPlugin.java | 71 ++++++++++++++++++- .../watcher/WatcherPluginTests.java | 41 +++++++++++ 2 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 watcher/src/test/java/org/elasticsearch/watcher/WatcherPluginTests.java diff --git a/watcher/src/main/java/org/elasticsearch/watcher/WatcherPlugin.java b/watcher/src/main/java/org/elasticsearch/watcher/WatcherPlugin.java index f208a8a82b0..a3504186e9d 100644 --- a/watcher/src/main/java/org/elasticsearch/watcher/WatcherPlugin.java +++ b/watcher/src/main/java/org/elasticsearch/watcher/WatcherPlugin.java @@ -10,8 +10,14 @@ import org.elasticsearch.client.Client; import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.cluster.settings.Validator; +import org.elasticsearch.common.Booleans; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.Module; +import org.elasticsearch.common.logging.ESLogger; +import org.elasticsearch.common.logging.Loggers; +import org.elasticsearch.common.logging.support.LoggerMessageFormat; +import org.elasticsearch.common.regex.Regex; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.rest.RestModule; @@ -25,6 +31,7 @@ import org.elasticsearch.watcher.client.WatcherClientModule; import org.elasticsearch.watcher.condition.ConditionModule; import org.elasticsearch.watcher.execution.ExecutionModule; import org.elasticsearch.watcher.history.HistoryModule; +import org.elasticsearch.watcher.history.HistoryStore; import org.elasticsearch.watcher.input.InputModule; import org.elasticsearch.watcher.license.LicenseModule; import org.elasticsearch.watcher.license.LicenseService; @@ -63,10 +70,10 @@ import org.elasticsearch.watcher.transport.actions.stats.WatcherStatsAction; import org.elasticsearch.watcher.trigger.TriggerModule; import org.elasticsearch.watcher.trigger.schedule.ScheduleModule; import org.elasticsearch.watcher.watch.WatchModule; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import static org.elasticsearch.common.settings.Settings.settingsBuilder; @@ -75,6 +82,8 @@ public class WatcherPlugin extends Plugin { public static final String NAME = "watcher"; public static final String ENABLED_SETTING = NAME + ".enabled"; + private final static ESLogger logger = Loggers.getLogger(WatcherPlugin.class); + static { MetaData.registerPrototype(WatcherMetaData.TYPE, WatcherMetaData.PROTO); } @@ -87,6 +96,7 @@ public class WatcherPlugin extends Plugin { this.settings = settings; transportClient = "transport".equals(settings.get(Client.CLIENT_TYPE_SETTING)); enabled = watcherEnabled(settings); + validAutoCreateIndex(settings); } @Override public String name() { @@ -208,4 +218,59 @@ public class WatcherPlugin extends Plugin { return settings.getAsBoolean(ENABLED_SETTING, true); } + static void validAutoCreateIndex(Settings settings) { + String value = settings.get("action.auto_create_index"); + if (value == null) { + return; + } + + String errorMessage = LoggerMessageFormat.format("the [action.auto_create_index] setting value [{}] is too restrictive. disable [action.auto_create_index] or set it to [.watches,.triggered_watches,.watch_history*]", (Object) settings); + if (Booleans.isExplicitFalse(value)) { + throw new IllegalArgumentException(errorMessage); + } + + if (Booleans.isExplicitTrue(value)) { + return; + } + + String[] matches = Strings.commaDelimitedListToStringArray(value); + List indices = new ArrayList<>(); + indices.add(".watches"); + indices.add(".triggered_watches"); + DateTime now = new DateTime(DateTimeZone.UTC); + indices.add(HistoryStore.getHistoryIndexNameForTime(now)); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusDays(1))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(1))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(2))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(3))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(4))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(5))); + indices.add(HistoryStore.getHistoryIndexNameForTime(now.plusMonths(6))); + for (String index : indices) { + boolean matched = false; + for (String match : matches) { + char c = match.charAt(0); + if (c == '-') { + if (Regex.simpleMatch(match.substring(1), index)) { + throw new IllegalArgumentException(errorMessage); + } + } else if (c == '+') { + if (Regex.simpleMatch(match.substring(1), index)) { + matched = true; + break; + } + } else { + if (Regex.simpleMatch(match, index)) { + matched = true; + break; + } + } + } + if (!matched) { + throw new IllegalArgumentException(errorMessage); + } + } + logger.warn("the [action.auto_create_index] setting is configured to be restrictive [{}]. for the next 6 months daily history indices are allowed to be created, but please make sure that any future history indices after 6 months with the pattern [.watch_history-YYYY.MM.dd] are allowed to be created", value); + } + } diff --git a/watcher/src/test/java/org/elasticsearch/watcher/WatcherPluginTests.java b/watcher/src/test/java/org/elasticsearch/watcher/WatcherPluginTests.java new file mode 100644 index 00000000000..760035d84ed --- /dev/null +++ b/watcher/src/test/java/org/elasticsearch/watcher/WatcherPluginTests.java @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.watcher; + +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.test.ESTestCase; + +public class WatcherPluginTests extends ESTestCase { + + public void testValidAutoCreateIndex() { + WatcherPlugin.validAutoCreateIndex(Settings.EMPTY); + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", true).build()); + try { + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", false).build()); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + } + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", ".watches,.triggered_watches,.watch_history*").build()); + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", "*w*").build()); + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", ".w*,.t*").build()); + try { + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", ".watches").build()); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + } + try { + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", ".triggered_watch").build()); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + } + try { + WatcherPlugin.validAutoCreateIndex(Settings.builder().put("action.auto_create_index", ".watch_history*").build()); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + } + } + +}