use program arguments instead of system properties

This commit is contained in:
Florian Reimair 2018-11-08 14:56:44 +01:00
parent 5ab801cad2
commit 7b98445eb9
7 changed files with 61 additions and 22 deletions

View file

@ -193,6 +193,7 @@ public class BisqEnvironment extends StandardEnvironment {
protected final String btcNodes, seedNodes, ignoreDevMsg, useDevPrivilegeKeys, useDevMode, useTorForBtc, rpcUser, rpcPassword, protected final String btcNodes, seedNodes, ignoreDevMsg, useDevPrivilegeKeys, useDevMode, useTorForBtc, rpcUser, rpcPassword,
rpcPort, rpcBlockNotificationPort, dumpBlockchainData, fullDaoNode, rpcPort, rpcBlockNotificationPort, dumpBlockchainData, fullDaoNode,
myAddress, banList, dumpStatistics, maxMemory, socks5ProxyBtcAddress, myAddress, banList, dumpStatistics, maxMemory, socks5ProxyBtcAddress,
torRcFile, torRcOptions,
socks5ProxyHttpAddress, useAllProvidedNodes, numConnectionForBtc, genesisTxId, genesisBlockHeight, referralId, daoActivated; socks5ProxyHttpAddress, useAllProvidedNodes, numConnectionForBtc, genesisTxId, genesisBlockHeight, referralId, daoActivated;
@ -267,6 +268,12 @@ public class BisqEnvironment extends StandardEnvironment {
socks5ProxyHttpAddress = commandLineProperties.containsProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS) ? socks5ProxyHttpAddress = commandLineProperties.containsProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS) ?
(String) commandLineProperties.getProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS) : (String) commandLineProperties.getProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS) :
""; "";
torRcFile = commandLineProperties.containsProperty(NetworkOptionKeys.TORRC_FILE) ?
(String) commandLineProperties.getProperty(NetworkOptionKeys.TORRC_FILE) :
"";
torRcOptions = commandLineProperties.containsProperty(NetworkOptionKeys.TORRC_OPTIONS) ?
(String) commandLineProperties.getProperty(NetworkOptionKeys.TORRC_OPTIONS) :
"";
//RpcOptionKeys //RpcOptionKeys
rpcUser = commandLineProperties.containsProperty(DaoOptionKeys.RPC_USER) ? rpcUser = commandLineProperties.containsProperty(DaoOptionKeys.RPC_USER) ?
@ -435,6 +442,8 @@ public class BisqEnvironment extends StandardEnvironment {
setProperty(NetworkOptionKeys.NETWORK_ID, String.valueOf(baseCurrencyNetwork.ordinal())); setProperty(NetworkOptionKeys.NETWORK_ID, String.valueOf(baseCurrencyNetwork.ordinal()));
setProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS, socks5ProxyBtcAddress); setProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS, socks5ProxyBtcAddress);
setProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS, socks5ProxyHttpAddress); setProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS, socks5ProxyHttpAddress);
setProperty(NetworkOptionKeys.TORRC_FILE, torRcFile);
setProperty(NetworkOptionKeys.TORRC_OPTIONS, torRcOptions);
setProperty(AppOptionKeys.APP_DATA_DIR_KEY, appDataDir); setProperty(AppOptionKeys.APP_DATA_DIR_KEY, appDataDir);
setProperty(AppOptionKeys.DESKTOP_WITH_HTTP_API, desktopWithHttpApi); setProperty(AppOptionKeys.DESKTOP_WITH_HTTP_API, desktopWithHttpApi);

View file

@ -53,6 +53,9 @@ import org.springframework.util.StringUtils;
import joptsimple.OptionException; import joptsimple.OptionException;
import joptsimple.OptionParser; import joptsimple.OptionParser;
import joptsimple.OptionSet; import joptsimple.OptionSet;
import joptsimple.util.PathConverter;
import joptsimple.util.PathProperties;
import joptsimple.util.RegexMatcher;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
@ -330,6 +333,14 @@ public abstract class BisqExecutable implements GracefulShutDownHandler {
parser.accepts(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS, parser.accepts(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS,
description("A proxy address to be used for Http requests (should be non-Tor). [host:port]", "")) description("A proxy address to be used for Http requests (should be non-Tor). [host:port]", ""))
.withRequiredArg(); .withRequiredArg();
parser.accepts(NetworkOptionKeys.TORRC_FILE,
description("An existing torrc-file to be sourced for Tor. Note that torrc-entries, which are critical to Bisqs flawless operation, cannot be overwritten.", ""))
.withRequiredArg();
// .withValuesConvertedBy(new PathConverter(PathProperties.FILE_EXISTING, PathProperties.READABLE));
parser.accepts(NetworkOptionKeys.TORRC_OPTIONS,
description("A list of torrc-entries to amend to Bisqs torrc. Note that torrc-entries, which are critical to Bisqs flawless operation, cannot be overwritten. [torrc options line, torrc option, ...]", ""))
.withRequiredArg();
// .withValuesConvertedBy(RegexMatcher.regex("^([^\\s,]+\\s[^,]+,?\\s*)+$"));
//AppOptionKeys //AppOptionKeys
parser.accepts(AppOptionKeys.USER_DATA_DIR_KEY, parser.accepts(AppOptionKeys.USER_DATA_DIR_KEY,

View file

@ -29,4 +29,6 @@ public class NetworkOptionKeys {
//SOCKS_5_PROXY_BTC_ADDRESS used in network module so dont move it to BtcOptionKeys //SOCKS_5_PROXY_BTC_ADDRESS used in network module so dont move it to BtcOptionKeys
public static final String SOCKS_5_PROXY_BTC_ADDRESS = "socks5ProxyBtcAddress"; public static final String SOCKS_5_PROXY_BTC_ADDRESS = "socks5ProxyBtcAddress";
public static final String SOCKS_5_PROXY_HTTP_ADDRESS = "socks5ProxyHttpAddress"; public static final String SOCKS_5_PROXY_HTTP_ADDRESS = "socks5ProxyHttpAddress";
public static final String TORRC_OPTIONS = "torrcOptions";
public static final String TORRC_FILE = "torrcFile";
} }

View file

@ -42,10 +42,12 @@ public class NetworkNodeProvider implements Provider<NetworkNode> {
@Named(NetworkOptionKeys.USE_LOCALHOST_FOR_P2P) boolean useLocalhostForP2P, @Named(NetworkOptionKeys.USE_LOCALHOST_FOR_P2P) boolean useLocalhostForP2P,
@Named(NetworkOptionKeys.MY_ADDRESS) String address, @Named(NetworkOptionKeys.MY_ADDRESS) String address,
@Named(NetworkOptionKeys.PORT_KEY) int port, @Named(NetworkOptionKeys.PORT_KEY) int port,
@Named(NetworkOptionKeys.TOR_DIR) File torDir) { @Named(NetworkOptionKeys.TOR_DIR) File torDir,
@Named(NetworkOptionKeys.TORRC_FILE) String torrcFile,
@Named(NetworkOptionKeys.TORRC_OPTIONS) String torrcOptions) {
networkNode = useLocalhostForP2P ? networkNode = useLocalhostForP2P ?
new LocalhostNetworkNode(address, port, networkProtoResolver) : new LocalhostNetworkNode(address, port, networkProtoResolver) :
new TorNetworkNode(port, torDir, networkProtoResolver, bridgeAddressProvider); new TorNetworkNode(port, torDir, networkProtoResolver, bridgeAddressProvider, torrcFile, torrcOptions);
} }
@Override @Override

View file

@ -88,5 +88,7 @@ public class P2PModule extends AppModule {
bindConstant().annotatedWith(named(NetworkOptionKeys.BAN_LIST)).to(environment.getRequiredProperty(NetworkOptionKeys.BAN_LIST)); bindConstant().annotatedWith(named(NetworkOptionKeys.BAN_LIST)).to(environment.getRequiredProperty(NetworkOptionKeys.BAN_LIST));
bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS)); bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS));
bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS)); bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS));
bindConstant().annotatedWith(named(NetworkOptionKeys.TORRC_FILE)).to(environment.getRequiredProperty(NetworkOptionKeys.TORRC_FILE));
bindConstant().annotatedWith(named(NetworkOptionKeys.TORRC_OPTIONS)).to(environment.getRequiredProperty(NetworkOptionKeys.TORRC_OPTIONS));
} }
} }

View file

@ -54,7 +54,7 @@ import java.nio.file.Paths;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -77,8 +77,6 @@ public class TorNetworkNode extends NetworkNode {
private static final int MAX_RESTART_ATTEMPTS = 5; private static final int MAX_RESTART_ATTEMPTS = 5;
private static final long SHUT_DOWN_TIMEOUT = 5; private static final long SHUT_DOWN_TIMEOUT = 5;
private static final String CONFIG_TORRCPREFIX = "torrc:";
private static final String CONFIG_TORRCFILE = "torrcfile";
private HiddenServiceSocket hiddenServiceSocket; private HiddenServiceSocket hiddenServiceSocket;
private final File torDir; private final File torDir;
@ -89,15 +87,20 @@ public class TorNetworkNode extends NetworkNode {
private MonadicBinding<Boolean> allShutDown; private MonadicBinding<Boolean> allShutDown;
private Tor tor; private Tor tor;
private String torrcFile = "";
private String torrcOptions = "";
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public TorNetworkNode(int servicePort, File torDir, NetworkProtoResolver networkProtoResolver, BridgeAddressProvider bridgeAddressProvider) { public TorNetworkNode(int servicePort, File torDir, NetworkProtoResolver networkProtoResolver, BridgeAddressProvider bridgeAddressProvider, String torrcFile, String torrcOptions) {
super(servicePort, networkProtoResolver); super(servicePort, networkProtoResolver);
this.torDir = torDir; this.torDir = torDir;
this.bridgeAddressProvider = bridgeAddressProvider; this.bridgeAddressProvider = bridgeAddressProvider;
this.torrcFile = torrcFile;
this.torrcOptions = torrcOptions;
} }
@ -253,28 +256,38 @@ public class TorNetworkNode extends NetworkNode {
Torrc override = null; Torrc override = null;
// check if the user wants to provide his own torrc file // check if the user wants to provide his own torrc file
String torrcFile = System.getProperty(CONFIG_TORRCFILE); if(!"".equals(torrcFile)) {
if(torrcFile != null) {
try { try {
override = new Torrc(new FileInputStream(new File(torrcFile))); override = new Torrc(new FileInputStream(new File(torrcFile)));
} catch(IOException e) { } catch(IOException e) {
log.error("custom torrc file not found (" + torrcFile + "). Proceeding with defaults."); log.error("custom torrc file not found ('{}'). Proceeding with defaults.", torrcFile);
} }
} }
// check if the user wants to temporarily add to the default torrc file // check if the user wants to temporarily add to the default torrc file
LinkedHashMap<String, String> tmp = new LinkedHashMap<>(); LinkedHashMap<String, String> torrcOptionsMap = new LinkedHashMap<>();
System.getProperties().forEach((k, v) -> { if(!"".equals(torrcOptions)) {
if(((String) k).startsWith(CONFIG_TORRCPREFIX)) Arrays.asList(torrcOptions.split(",")).forEach(line -> {
tmp.put(((String) k).substring(CONFIG_TORRCPREFIX.length()), (String) v); line = line.trim();
if(line.matches("^[^\\s]+\\s.+")) {
String[] tmp = line.split("\\s", 2);
torrcOptionsMap.put(tmp[0].trim(), tmp[1].trim());
}
else {
log.error("custom torrc override parse error ('{}'). Proceeding without custom overrides.", line);
torrcOptionsMap.clear();
}
}); });
if(!tmp.isEmpty()) }
// assemble final override options
if(!torrcOptionsMap.isEmpty())
// check for custom torrcFile // check for custom torrcFile
if(null != override) if(override != null)
// and merge the contents // and merge the contents
override = new Torrc(override.getInputStream$tor(), tmp); override = new Torrc(override.getInputStream$tor(), torrcOptionsMap);
else else
override = new Torrc(tmp); override = new Torrc(torrcOptionsMap);
log.info("Starting tor"); log.info("Starting tor");
Tor.setDefault(new NativeTor(torDir, bridgeEntries, override)); Tor.setDefault(new NativeTor(torDir, bridgeEntries, override));

View file

@ -53,7 +53,7 @@ public class TorNetworkNodeTest {
public void testTorNodeBeforeSecondReady() throws InterruptedException, IOException { public void testTorNodeBeforeSecondReady() throws InterruptedException, IOException {
latch = new CountDownLatch(1); latch = new CountDownLatch(1);
int port = 9001; int port = 9001;
TorNetworkNode node1 = new TorNetworkNode(port, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null); TorNetworkNode node1 = new TorNetworkNode(port, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null, "", "");
node1.start(new SetupListener() { node1.start(new SetupListener() {
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {
@ -79,7 +79,7 @@ public class TorNetworkNodeTest {
latch = new CountDownLatch(1); latch = new CountDownLatch(1);
int port2 = 9002; int port2 = 9002;
TorNetworkNode node2 = new TorNetworkNode(port2, new File("torNode_" + port2), TestUtils.getNetworkProtoResolver(), null); TorNetworkNode node2 = new TorNetworkNode(port2, new File("torNode_" + port2), TestUtils.getNetworkProtoResolver(), null, "", "");
node2.start(new SetupListener() { node2.start(new SetupListener() {
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {
@ -136,7 +136,7 @@ public class TorNetworkNodeTest {
public void testTorNodeAfterBothReady() throws InterruptedException, IOException { public void testTorNodeAfterBothReady() throws InterruptedException, IOException {
latch = new CountDownLatch(2); latch = new CountDownLatch(2);
int port = 9001; int port = 9001;
TorNetworkNode node1 = new TorNetworkNode(port, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null); TorNetworkNode node1 = new TorNetworkNode(port, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null, "", "");
node1.start(new SetupListener() { node1.start(new SetupListener() {
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {
@ -161,7 +161,7 @@ public class TorNetworkNodeTest {
}); });
int port2 = 9002; int port2 = 9002;
TorNetworkNode node2 = new TorNetworkNode(port2, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null); TorNetworkNode node2 = new TorNetworkNode(port2, new File("torNode_" + port), TestUtils.getNetworkProtoResolver(), null, "", "");
node2.start(new SetupListener() { node2.start(new SetupListener() {
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {