From f7f069f340e82c7e47185cd615aa2a7d95af3a41 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 31 Dec 2010 17:22:04 +0000 Subject: [PATCH] add RMI authentication options to nodetool patch by mck; reviewed by jbellis for CASSANDRA-1921 git-svn-id: https://svn.apache.org/repos/asf/cassandra/branches/cassandra-0.7@1054137 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 1 + .../org/apache/cassandra/tools/NodeCmd.java | 10 ++++++- .../org/apache/cassandra/tools/NodeProbe.java | 29 ++++++++++++++++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index c74dfc0972..496885bff0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,7 @@ dev * upgrade to TFastFramedTransport (CASSANDRA-1743) * avoid polluting page cache with commitlog or sstable writes and seq scan operations (CASSANDRA-1470) + * add RMI authentication options to nodetool (CASSANDRA-1921) 0.7.0-rc4 diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java index 74dc3d6e4f..47f5139365 100644 --- a/src/java/org/apache/cassandra/tools/NodeCmd.java +++ b/src/java/org/apache/cassandra/tools/NodeCmd.java @@ -45,6 +45,10 @@ public class NodeCmd { private static final String HOST_OPT_SHORT = "h"; private static final String PORT_OPT_LONG = "port"; private static final String PORT_OPT_SHORT = "p"; + private static final String USERNAME_OPT_LONG = "username"; + private static final String USERNAME_OPT_SHORT = "u"; + private static final String PASSWORD_OPT_LONG = "password"; + private static final String PASSWORD_OPT_SHORT = "pw"; private static final int defaultPort = 8080; private static Options options = null; @@ -57,6 +61,8 @@ public class NodeCmd { optHost.setRequired(true); options.addOption(optHost); options.addOption(PORT_OPT_SHORT, PORT_OPT_LONG, true, "remote jmx agent port number"); + options.addOption(USERNAME_OPT_SHORT, USERNAME_OPT_LONG, true, "remote jmx agent username"); + options.addOption(PASSWORD_OPT_SHORT, PASSWORD_OPT_LONG, true, "remote jmx agent password"); } public NodeCmd(NodeProbe probe) @@ -469,11 +475,13 @@ public class NodeCmd { throw new ParseException("Port must be a number"); } } + String username = cmd.getOptionValue(USERNAME_OPT_LONG); + String password = cmd.getOptionValue(PASSWORD_OPT_LONG); NodeProbe probe = null; try { - probe = new NodeProbe(host, port); + probe = username == null ? new NodeProbe(host, port) : new NodeProbe(host, port, username, password); } catch (IOException ioe) { diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 5458528f6a..8177a2988a 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -63,6 +63,8 @@ public class NodeProbe private static final int defaultPort = 8080; final String host; final int port; + private String username; + private String password; private JMXConnector jmxc; private MBeanServerConnection mbeanServerConn; @@ -72,6 +74,25 @@ public class NodeProbe private RuntimeMXBean runtimeProxy; private StreamingServiceMBean streamProxy; + /** + * Creates a NodeProbe using the specified JMX host, port, username, and password. + * + * @param host hostname or IP address of the JMX agent + * @param port TCP port of the remote JMX agent + * @throws IOException on connection failures + */ + public NodeProbe(String host, int port, String username, String password) throws IOException, InterruptedException + { + assert username != null && !username.isEmpty() && null != password && !password.isEmpty() + : "neither username nor password can be blank"; + + this.host = host; + this.port = port; + this.username = username; + this.password = password; + connect(); + } + /** * Creates a NodeProbe using the specified JMX host and port. * @@ -107,7 +128,13 @@ public class NodeProbe private void connect() throws IOException { JMXServiceURL jmxUrl = new JMXServiceURL(String.format(fmtUrl, host, port)); - jmxc = JMXConnectorFactory.connect(jmxUrl, null); + Map env = new HashMap(); + if (username != null) + { + String[] creds = { username, password }; + env.put(JMXConnector.CREDENTIALS, creds); + } + jmxc = JMXConnectorFactory.connect(jmxUrl, env); mbeanServerConn = jmxc.getMBeanServerConnection(); try