mirror of https://github.com/apache/lucene.git
SOLR-11482: RunExecutableListener was removed for security reasons
This commit is contained in:
parent
8a7d04a658
commit
7b313bb597
|
@ -96,6 +96,10 @@ Upgrade Notes
|
||||||
* SOLR-10962: in the ReplicationHandler the master.commitReserveDuration sub-element is deprecated. Instead
|
* SOLR-10962: in the ReplicationHandler the master.commitReserveDuration sub-element is deprecated. Instead
|
||||||
please configure a direct commitReserveDuration element for use in all modes (master, slave, cloud).
|
please configure a direct commitReserveDuration element for use in all modes (master, slave, cloud).
|
||||||
|
|
||||||
|
* SOLR-11482: RunExecutableListener was removed for security reasons. If you want to listen to
|
||||||
|
events caused by updates, commits, or optimize, write your own listener as native Java class
|
||||||
|
as part of a Solr plugin.
|
||||||
|
|
||||||
New Features
|
New Features
|
||||||
----------------------
|
----------------------
|
||||||
* SOLR-10339: New set-trigger and remove-trigger APIs for autoscaling. (shalin)
|
* SOLR-10339: New set-trigger and remove-trigger APIs for autoscaling. (shalin)
|
||||||
|
@ -368,6 +372,9 @@ Other Changes
|
||||||
* SOLR-11306: Fix inaccurate comments on docValues and StrField in the example schemas
|
* SOLR-11306: Fix inaccurate comments on docValues and StrField in the example schemas
|
||||||
(Tom Burton-West, Jason Gerlowski, Varun Thacker)
|
(Tom Burton-West, Jason Gerlowski, Varun Thacker)
|
||||||
|
|
||||||
|
* SOLR-11482: RunExecutableListener was removed for security reasons. (Michael Stepankin,
|
||||||
|
Olga Barinova, Uwe Schindler, Tomás Fernández Löbbe)
|
||||||
|
|
||||||
================== 7.0.1 ==================
|
================== 7.0.1 ==================
|
||||||
|
|
||||||
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
||||||
|
|
|
@ -63,31 +63,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit or optimize command
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
<!-- A postOptimize event is fired only after every optimize command, useful
|
|
||||||
in conjunction with index distribution to only distribute optimized indicies
|
|
||||||
<listener event="postOptimize" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">snapshooter</str>
|
|
||||||
<str name="dir">solr/bin</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -40,24 +40,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -101,31 +101,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
The RunExecutableListener executes an external command from a hook
|
|
||||||
such as postCommit or postOptimize. exe - the name of the
|
|
||||||
executable to run dir - dir to use as the current working
|
|
||||||
directory. default="." wait - the calling thread waits until the
|
|
||||||
executable returns. default="true" args - the arguments to pass to
|
|
||||||
the program. default=nothing env - environment variables to set.
|
|
||||||
default=nothing
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
A postCommit event is fired after every commit or optimize command
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str> <str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool> <arr name="args"> <str>arg1</str>
|
|
||||||
<str>arg2</str> </arr> <arr name="env"> <str>MYVAR=val1</str>
|
|
||||||
</arr> </listener>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
A postOptimize event is fired only after every optimize command
|
|
||||||
<listener event="postOptimize" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">snapshooter</str> <str name="dir">solr/bin</str>
|
|
||||||
<bool name="wait">true</bool> </listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -100,31 +100,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
The RunExecutableListener executes an external command from a hook
|
|
||||||
such as postCommit or postOptimize. exe - the name of the
|
|
||||||
executable to run dir - dir to use as the current working
|
|
||||||
directory. default="." wait - the calling thread waits until the
|
|
||||||
executable returns. default="true" args - the arguments to pass to
|
|
||||||
the program. default=nothing env - environment variables to set.
|
|
||||||
default=nothing
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
A postCommit event is fired after every commit or optimize command
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str> <str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool> <arr name="args"> <str>arg1</str>
|
|
||||||
<str>arg2</str> </arr> <arr name="env"> <str>MYVAR=val1</str>
|
|
||||||
</arr> </listener>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
A postOptimize event is fired only after every optimize command
|
|
||||||
<listener event="postOptimize" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">snapshooter</str> <str name="dir">solr/bin</str>
|
|
||||||
<bool name="wait">true</bool> </listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -1,148 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
* (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.apache.solr.core;
|
|
||||||
|
|
||||||
import org.apache.solr.common.SolrException;
|
|
||||||
import org.apache.solr.common.SolrException.ErrorCode;
|
|
||||||
import org.apache.solr.common.util.NamedList;
|
|
||||||
import org.apache.solr.search.SolrIndexSearcher;
|
|
||||||
import org.apache.solr.util.plugin.SolrCoreAware;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.invoke.MethodHandles;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
class RunExecutableListener extends AbstractSolrEventListener implements SolrCoreAware {
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
|
||||||
|
|
||||||
public RunExecutableListener(SolrCore core) {
|
|
||||||
super(core);
|
|
||||||
}
|
|
||||||
protected String[] cmd;
|
|
||||||
protected File dir;
|
|
||||||
protected String[] envp;
|
|
||||||
protected boolean wait=true;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(NamedList args) {
|
|
||||||
super.init(args);
|
|
||||||
|
|
||||||
List cmdlist = new ArrayList();
|
|
||||||
cmdlist.add(args.get("exe"));
|
|
||||||
List lst = (List)args.get("args");
|
|
||||||
if (lst != null) cmdlist.addAll(lst);
|
|
||||||
cmd = (String[])cmdlist.toArray(new String[cmdlist.size()]);
|
|
||||||
|
|
||||||
lst = (List)args.get("env");
|
|
||||||
if (lst != null) {
|
|
||||||
envp = (String[])lst.toArray(new String[lst.size()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
String str = (String)args.get("dir");
|
|
||||||
if (str==null || str.equals("") || str.equals(".") || str.equals("./")) {
|
|
||||||
dir = null;
|
|
||||||
} else {
|
|
||||||
dir = new File(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("false".equals(args.get("wait")) || Boolean.FALSE.equals(args.get("wait"))) wait=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void inform(SolrCore core) {
|
|
||||||
if (!core.getCoreDescriptor().isConfigSetTrusted()) {
|
|
||||||
throw new SolrException(ErrorCode.UNAUTHORIZED, "The configset for this collection was uploaded without any authentication in place,"
|
|
||||||
+ " and this operation is not available for collections with untrusted configsets. To have this component, re-upload the configset"
|
|
||||||
+ " after enabling authentication and authorization.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* External executable listener.
|
|
||||||
*
|
|
||||||
* @param callback Unused (As of solr 1.4-dev)
|
|
||||||
* @return Error code indicating if the command has executed successfully. <br />
|
|
||||||
* 0 , indicates normal termination.<br />
|
|
||||||
* non-zero , otherwise.
|
|
||||||
*/
|
|
||||||
protected int exec(String callback) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
try {
|
|
||||||
boolean doLog = log.isDebugEnabled();
|
|
||||||
if (doLog) {
|
|
||||||
log.debug("About to exec " + cmd[0]);
|
|
||||||
}
|
|
||||||
final Process proc;
|
|
||||||
try {
|
|
||||||
proc = Runtime.getRuntime().exec(cmd, envp ,dir);
|
|
||||||
} catch (Error err) {
|
|
||||||
// Create better error message
|
|
||||||
if (err.getMessage() != null && (err.getMessage().contains("posix_spawn") || err.getMessage().contains("UNIXProcess"))) {
|
|
||||||
Error newErr = new Error("Error forking command due to JVM locale bug (see https://issues.apache.org/jira/browse/SOLR-6387): " + err.getMessage());
|
|
||||||
newErr.setStackTrace(err.getStackTrace());
|
|
||||||
err = newErr;
|
|
||||||
}
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wait) {
|
|
||||||
try {
|
|
||||||
ret = proc.waitFor();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
SolrException.log(log,e);
|
|
||||||
ret = INVALID_PROCESS_RETURN_CODE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wait && doLog) {
|
|
||||||
log.debug("Executable " + cmd[0] + " returned " + ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (IOException e) {
|
|
||||||
// don't throw exception, just log it...
|
|
||||||
SolrException.log(log,e);
|
|
||||||
ret = INVALID_PROCESS_RETURN_CODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postCommit() {
|
|
||||||
// anything generic need to be passed to the external program?
|
|
||||||
// the directory of the index? the command that caused it to be
|
|
||||||
// invoked? the version of the index?
|
|
||||||
exec("postCommit");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
|
|
||||||
exec("newSearcher");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Non-zero value for an invalid return code **/
|
|
||||||
private static int INVALID_PROCESS_RETURN_CODE = -1;
|
|
||||||
|
|
||||||
}
|
|
|
@ -62,23 +62,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<updateLog enable="${enable.update.log:true}">
|
<updateLog enable="${enable.update.log:true}">
|
||||||
<str name="dir">${solr.ulog.dir:}</str>
|
<str name="dir">${solr.ulog.dir:}</str>
|
||||||
</updateLog>
|
</updateLog>
|
||||||
|
|
|
@ -62,23 +62,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<updateLog enable="${enable.update.log:true}">
|
<updateLog enable="${enable.update.log:true}">
|
||||||
<str name="dir">${solr.ulog.dir:}</str>
|
<str name="dir">${solr.ulog.dir:}</str>
|
||||||
</updateLog>
|
</updateLog>
|
||||||
|
|
|
@ -43,23 +43,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
<query>
|
<query>
|
||||||
|
|
|
@ -60,22 +60,6 @@
|
||||||
<maxTime>3600000</maxTime>
|
<maxTime>3600000</maxTime>
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<updateLog enable="${enable.update.log:true}">
|
<updateLog enable="${enable.update.log:true}">
|
||||||
<str name="dir">${solr.ulog.dir:}</str>
|
<str name="dir">${solr.ulog.dir:}</str>
|
||||||
|
|
|
@ -74,23 +74,6 @@
|
||||||
</autoCommit>
|
</autoCommit>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- The RunExecutableListener executes an external command.
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. default="."
|
|
||||||
wait - the calling thread waits until the executable returns. default="true"
|
|
||||||
args - the arguments to pass to the program. default=nothing
|
|
||||||
env - environment variables to set. default=nothing
|
|
||||||
-->
|
|
||||||
<!-- A postCommit event is fired after every commit
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<updateLog enable="${enable.update.log:true}">
|
<updateLog enable="${enable.update.log:true}">
|
||||||
<str name="dir">${solr.ulog.dir:}</str>
|
<str name="dir">${solr.ulog.dir:}</str>
|
||||||
</updateLog>
|
</updateLog>
|
||||||
|
|
|
@ -331,29 +331,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
<schema name="minimal" version="1.1">
|
|
||||||
<types>
|
|
||||||
<fieldType name="string" class="solr.StrField"/>
|
|
||||||
</types>
|
|
||||||
<fields>
|
|
||||||
<dynamicField name="*" type="string" indexed="true" stored="true" />
|
|
||||||
</fields>
|
|
||||||
</schema>
|
|
|
@ -1,69 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- This is a "kitchen sink" config file that tests can use.
|
|
||||||
When writting a new test, feel free to add *new* items (plugins,
|
|
||||||
config options, etc...) as long as they don't break any existing
|
|
||||||
tests. if you need to test something esoteric please add a new
|
|
||||||
"solrconfig-your-esoteric-purpose.xml" config file.
|
|
||||||
|
|
||||||
Note in particular that this test is used by MinimalSchemaTest so
|
|
||||||
Anything added to this file needs to work correctly even if there
|
|
||||||
is now uniqueKey or defaultSearch Field.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<config>
|
|
||||||
|
|
||||||
<dataDir>${solr.data.dir:}</dataDir>
|
|
||||||
|
|
||||||
<directoryFactory name="DirectoryFactory"
|
|
||||||
class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
|
|
||||||
|
|
||||||
<luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
|
|
||||||
|
|
||||||
<updateHandler class="solr.DirectUpdateHandler2">
|
|
||||||
<commitWithin>
|
|
||||||
<softCommit>${solr.commitwithin.softcommit:true}</softCommit>
|
|
||||||
</commitWithin>
|
|
||||||
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">/var/opt/resin3/__PORT__/scripts/solr/snapshooter</str>
|
|
||||||
<str name="dir">/var/opt/resin3/__PORT__</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
|
|
||||||
</updateHandler>
|
|
||||||
<requestHandler name="/select" class="solr.SearchHandler">
|
|
||||||
<lst name="defaults">
|
|
||||||
<str name="echoParams">explicit</str>
|
|
||||||
<str name="indent">true</str>
|
|
||||||
<str name="df">text</str>
|
|
||||||
</lst>
|
|
||||||
|
|
||||||
</requestHandler>
|
|
||||||
|
|
||||||
<requestHandler name="/update/xslt"
|
|
||||||
startup="lazy"
|
|
||||||
class="solr.XsltUpdateRequestHandler"/>
|
|
||||||
|
|
||||||
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
|
|
||||||
</config>
|
|
||||||
|
|
|
@ -327,18 +327,6 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
|
||||||
createCollection("newcollection", "regular" + suffix, 1, 1, solrCluster.getSolrClient());
|
createCollection("newcollection", "regular" + suffix, 1, 1, solrCluster.getSolrClient());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testUploadWithRunExecutableListener() throws Exception {
|
|
||||||
String suffix = "-untrusted";
|
|
||||||
uploadConfigSet("with-run-executable-listener", suffix, null, null);
|
|
||||||
// try to create a collection with the uploaded configset
|
|
||||||
CollectionAdminResponse resp = createCollection("newcollection3", "with-run-executable-listener" + suffix, 1, 1, solrCluster.getSolrClient());
|
|
||||||
log.info("Client saw errors: "+resp.getErrorMessages());
|
|
||||||
assertTrue(resp.getErrorMessages() != null && resp.getErrorMessages().size() > 0);
|
|
||||||
assertTrue(resp.getErrorMessages().getVal(0).
|
|
||||||
contains("The configset for this collection was uploaded without any authentication"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUploadWithScriptUpdateProcessor() throws Exception {
|
public void testUploadWithScriptUpdateProcessor() throws Exception {
|
||||||
for (boolean withAuthorization: Arrays.asList(false, true)) {
|
for (boolean withAuthorization: Arrays.asList(false, true)) {
|
||||||
|
|
|
@ -321,29 +321,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -324,29 +324,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -321,29 +321,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -322,29 +322,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -331,29 +331,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -336,29 +336,6 @@
|
||||||
postCommit - fired after every commit or optimize command
|
postCommit - fired after every commit or optimize command
|
||||||
postOptimize - fired after every optimize command
|
postOptimize - fired after every optimize command
|
||||||
-->
|
-->
|
||||||
<!-- The RunExecutableListener executes an external command from a
|
|
||||||
hook such as postCommit or postOptimize.
|
|
||||||
|
|
||||||
exe - the name of the executable to run
|
|
||||||
dir - dir to use as the current working directory. (default=".")
|
|
||||||
wait - the calling thread waits until the executable returns.
|
|
||||||
(default="true")
|
|
||||||
args - the arguments to pass to the program. (default is none)
|
|
||||||
env - environment variables to set. (default is none)
|
|
||||||
-->
|
|
||||||
<!-- This example shows how RunExecutableListener could be used
|
|
||||||
with the script based replication...
|
|
||||||
http://wiki.apache.org/solr/CollectionDistribution
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<listener event="postCommit" class="solr.RunExecutableListener">
|
|
||||||
<str name="exe">solr/bin/snapshooter</str>
|
|
||||||
<str name="dir">.</str>
|
|
||||||
<bool name="wait">true</bool>
|
|
||||||
<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
|
|
||||||
<arr name="env"> <str>MYVAR=val1</str> </arr>
|
|
||||||
</listener>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
</updateHandler>
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,6 @@ http://localhost:8983/solr/admin/configs?action=LIST
|
||||||
|
|
||||||
Upload a ConfigSet, sent in as a zipped file. Please note that a ConfigSet is uploaded in a "trusted" mode if authentication is enabled and this upload operation is performed as an authenticated request. Without authentication, a ConfigSet is uploaded in an "untrusted" mode. Upon creation of a collection using an "untrusted" ConfigSet, the following functionality would not work:
|
Upload a ConfigSet, sent in as a zipped file. Please note that a ConfigSet is uploaded in a "trusted" mode if authentication is enabled and this upload operation is performed as an authenticated request. Without authentication, a ConfigSet is uploaded in an "untrusted" mode. Upon creation of a collection using an "untrusted" ConfigSet, the following functionality would not work:
|
||||||
|
|
||||||
* RunExecutableListener does not initialize, if specified in the ConfigSet.
|
|
||||||
* DataImportHandler's ScriptTransformer does not initialize, if specified in the ConfigSet.
|
* DataImportHandler's ScriptTransformer does not initialize, if specified in the ConfigSet.
|
||||||
* XSLT transformer (tr parameter) cannot be used at request processing time.
|
* XSLT transformer (tr parameter) cannot be used at request processing time.
|
||||||
* StatelessScriptUpdateProcessor does not initialize, if specified in the ConfigSet.
|
* StatelessScriptUpdateProcessor does not initialize, if specified in the ConfigSet.
|
||||||
|
|
|
@ -91,22 +91,8 @@ With this configuration, when you call `commitWithin` as part of your update mes
|
||||||
|
|
||||||
The UpdateHandler section is also where update-related event listeners can be configured. These can be triggered to occur after any commit (`event="postCommit"`) or only after optimize commands (`event="postOptimize"`).
|
The UpdateHandler section is also where update-related event listeners can be configured. These can be triggered to occur after any commit (`event="postCommit"`) or only after optimize commands (`event="postOptimize"`).
|
||||||
|
|
||||||
Users can write custom update event listener classes, but a common use case is to run external executables via the `RunExecutableListener`:
|
Users can write custom update event listener classes in Solr plugins. As of Solr 7.1,
|
||||||
|
`RunExecutableListener` was removed for security reasons.
|
||||||
`exe`::
|
|
||||||
The name of the executable to run. It should include the path to the file, relative to Solr home.
|
|
||||||
|
|
||||||
`dir`::
|
|
||||||
The directory to use as the working directory. The default is the current directory (".").
|
|
||||||
|
|
||||||
`wait`::
|
|
||||||
Forces the calling thread to wait until the executable returns a response. The default is `true`.
|
|
||||||
|
|
||||||
`args`::
|
|
||||||
Any arguments to pass to the program. The default is none.
|
|
||||||
|
|
||||||
`env`::
|
|
||||||
Any environment variables to set. The default is none.
|
|
||||||
|
|
||||||
== Transaction Log
|
== Transaction Log
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue