On 09/16/2014 04:03 PM, Doug Balog wrote:
Not sure if this will work, but try to use ssh to setup a SOCKS proxy via
the -D 9999 command option.
Then use the socksProxyHost and socksProxyPort via the java command line
(ie java -DsocksProxyHost="localhost") or
System.setProperty("socksProxyHost","localhost") from your code. Make sure
to specify both the host and the port.
See
http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
Unfortunately Jsch does not seem to provide the "-D" "socks5" over
"ssh" option.
- In case this may help others -
Because the production system will have direct access to the cluster and
this is being setup for accessing the production cloud from our office
we instead did the following:
SolrTunnels t = new SolrTunnels();
t.connect();
LBHttpSolrServer server = new LBHttpSolrServer();
server.setParser(new BinaryResponseParser());
server.setAliveCheckInterval(500);
for (SolrHost solr: t.getEndpoints()) {
server.addSolrServer("http://127.0.0.1:"+solr.forward+"/solr/test");
}
WHERE:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.newsrx.util.NrxLog;
public class SolrTunnels {
static final private String sshUser = "autossh";
static final private String sshPass = "LETMEIN";
static private String sshHost = "public.solr.gateway.host.com;
static final private int sshPort = 22;
static volatile private JSch jsch = new JSch();
static private Session solrSSH = null;
public static class SolrHost {
public String host;
public int port;
public int forward;
public SolrHost() {}
public SolrHost(String host, int port) {
super();
this.host = host;
this.port = port;
this.forward = -1;
}
}
final static private List<SolrHost> nodes;
static {
nodes=new ArrayList<>();
nodes.add(new SolrHost("solr1.private", 8983));
nodes.add(new SolrHost("solr2.private", 8983));
}
public SolrTunnels() {
}
public void connect() {
if (solrSSH != null) {
if (solrSSH.isConnected()) {
return;
}
}
JSch.setConfig("StrictHostKeyChecking", "no");
JSch.setConfig("Compression", "none");//compressionsometimes
causes ssh transport breakage
int maxTries = 100;
do {
try {
if (solrSSH !=null) {
solrSSH.disconnect();
}
solrSSH = jsch.getSession(sshUser, sshHost, sshPort);
solrSSH.setPassword(sshPass);
solrSSH.connect(1000);
Iterator<SolrHost> isolr = nodes.iterator();
while (isolr.hasNext()) {
SolrHost solr = isolr.next();
solr.forward=solrSSH.setPortForwardingL(0, solr.host,solr.port);
Console.log("http://127.0.0.1:"+solr.forward+"/solr");
}
} catch (JSchException e) {
e.printStackTrace();
try {
Console.log("Sleeping 100 ms");
Thread.sleep(100);
} catch (InterruptedException e1) {
}
}
} while (maxTries-- > 0&&!solrSSH.isConnected());
}
public Collection<SolrHost> getEndpoints() {
List<SolrHost> list = new ArrayList<>();
Iterator<SolrHost> isolr = nodes.iterator();
while (isolr.hasNext()) {
SolrHost solr = isolr.next();
if (solr.forward>0) {
list.add(solr);
}
}
return list;
}
public void disconnect() {
if (solrSSH !=null) {
Iterator<SolrHost> isolr = nodes.iterator();
while (isolr.hasNext()) {
SolrHost solr = isolr.next();
try {
solrSSH.delPortForwardingL(solr.forward);
} catch (JSchException e) {
}
}
solrSSH.disconnect();
}
}
}