|
@@ -0,0 +1,249 @@
|
|
|
+/**
|
|
|
+ * 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.hadoop.mapreduce.v2.hs.client;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.net.InetSocketAddress;
|
|
|
+import java.util.Arrays;
|
|
|
+
|
|
|
+import org.apache.hadoop.classification.InterfaceAudience.Private;
|
|
|
+import org.apache.hadoop.conf.Configuration;
|
|
|
+import org.apache.hadoop.conf.Configured;
|
|
|
+import org.apache.hadoop.mapreduce.v2.hs.HSProxies;
|
|
|
+import org.apache.hadoop.mapreduce.v2.hs.protocol.HSAdminRefreshProtocol;
|
|
|
+import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig;
|
|
|
+import org.apache.hadoop.security.RefreshUserMappingsProtocol;
|
|
|
+import org.apache.hadoop.security.UserGroupInformation;
|
|
|
+import org.apache.hadoop.tools.GetUserMappingsProtocol;
|
|
|
+import org.apache.hadoop.util.Tool;
|
|
|
+import org.apache.hadoop.util.ToolRunner;
|
|
|
+
|
|
|
+@Private
|
|
|
+public class HSAdmin extends Configured implements Tool {
|
|
|
+
|
|
|
+ public HSAdmin() {
|
|
|
+ super();
|
|
|
+ }
|
|
|
+
|
|
|
+ public HSAdmin(Configuration conf) {
|
|
|
+ super(conf);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Displays format of commands.
|
|
|
+ *
|
|
|
+ * @param cmd
|
|
|
+ * The command that is being executed.
|
|
|
+ */
|
|
|
+ private static void printUsage(String cmd) {
|
|
|
+ if ("-refreshUserToGroupsMappings".equals(cmd)) {
|
|
|
+ System.err
|
|
|
+ .println("Usage: mapred hsadmin [-refreshUserToGroupsMappings]");
|
|
|
+ } else if ("-refreshSuperUserGroupsConfiguration".equals(cmd)) {
|
|
|
+ System.err
|
|
|
+ .println("Usage: mapred hsadmin [-refreshSuperUserGroupsConfiguration]");
|
|
|
+ } else if ("-refreshAdminAcls".equals(cmd)) {
|
|
|
+ System.err.println("Usage: mapred hsadmin [-refreshAdminAcls]");
|
|
|
+ } else if ("-getGroups".equals(cmd)) {
|
|
|
+ System.err.println("Usage: mapred hsadmin" + " [-getGroups [username]]");
|
|
|
+ } else {
|
|
|
+ System.err.println("Usage: mapred hsadmin");
|
|
|
+ System.err.println(" [-refreshUserToGroupsMappings]");
|
|
|
+ System.err.println(" [-refreshSuperUserGroupsConfiguration]");
|
|
|
+ System.err.println(" [-refreshAdminAcls]");
|
|
|
+ System.err.println(" [-getGroups [username]]");
|
|
|
+ System.err.println(" [-help [cmd]]");
|
|
|
+ System.err.println();
|
|
|
+ ToolRunner.printGenericCommandUsage(System.err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void printHelp(String cmd) {
|
|
|
+ String summary = "hsadmin is the command to execute Job History server administrative commands.\n"
|
|
|
+ + "The full syntax is: \n\n"
|
|
|
+ + "mapred hsadmin"
|
|
|
+ + " [-refreshUserToGroupsMappings]"
|
|
|
+ + " [-refreshSuperUserGroupsConfiguration]"
|
|
|
+ + " [-refreshAdminAcls]"
|
|
|
+ + " [-getGroups [username]]" + " [-help [cmd]]\n";
|
|
|
+
|
|
|
+ String refreshUserToGroupsMappings = "-refreshUserToGroupsMappings: Refresh user-to-groups mappings\n";
|
|
|
+
|
|
|
+ String refreshSuperUserGroupsConfiguration = "-refreshSuperUserGroupsConfiguration: Refresh superuser proxy groups mappings\n";
|
|
|
+
|
|
|
+ String refreshAdminAcls = "-refreshAdminAcls: Refresh acls for administration of Job history server\n";
|
|
|
+
|
|
|
+ String getGroups = "-getGroups [username]: Get the groups which given user belongs to\n";
|
|
|
+
|
|
|
+ String help = "-help [cmd]: \tDisplays help for the given command or all commands if none\n"
|
|
|
+ + "\t\tis specified.\n";
|
|
|
+
|
|
|
+ if ("refreshUserToGroupsMappings".equals(cmd)) {
|
|
|
+ System.out.println(refreshUserToGroupsMappings);
|
|
|
+ } else if ("help".equals(cmd)) {
|
|
|
+ System.out.println(help);
|
|
|
+ } else if ("refreshSuperUserGroupsConfiguration".equals(cmd)) {
|
|
|
+ System.out.println(refreshSuperUserGroupsConfiguration);
|
|
|
+ } else if ("refreshAdminAcls".equals(cmd)) {
|
|
|
+ System.out.println(refreshAdminAcls);
|
|
|
+ } else if ("getGroups".equals(cmd)) {
|
|
|
+ System.out.println(getGroups);
|
|
|
+ } else {
|
|
|
+ System.out.println(summary);
|
|
|
+ System.out.println(refreshUserToGroupsMappings);
|
|
|
+ System.out.println(refreshSuperUserGroupsConfiguration);
|
|
|
+ System.out.println(refreshAdminAcls);
|
|
|
+ System.out.println(getGroups);
|
|
|
+ System.out.println(help);
|
|
|
+ System.out.println();
|
|
|
+ ToolRunner.printGenericCommandUsage(System.out);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private int getGroups(String[] usernames) throws IOException {
|
|
|
+ // Get groups users belongs to
|
|
|
+ if (usernames.length == 0) {
|
|
|
+ usernames = new String[] { UserGroupInformation.getCurrentUser()
|
|
|
+ .getUserName() };
|
|
|
+ }
|
|
|
+
|
|
|
+ // Get the current configuration
|
|
|
+ Configuration conf = getConf();
|
|
|
+
|
|
|
+ InetSocketAddress address = conf.getSocketAddr(
|
|
|
+ JHAdminConfig.JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_PORT);
|
|
|
+
|
|
|
+ GetUserMappingsProtocol getUserMappingProtocol = HSProxies.createProxy(
|
|
|
+ conf, address, GetUserMappingsProtocol.class,
|
|
|
+ UserGroupInformation.getCurrentUser());
|
|
|
+ for (String username : usernames) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append(username + " :");
|
|
|
+ for (String group : getUserMappingProtocol.getGroupsForUser(username)) {
|
|
|
+ sb.append(" ");
|
|
|
+ sb.append(group);
|
|
|
+ }
|
|
|
+ System.out.println(sb);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int refreshUserToGroupsMappings() throws IOException {
|
|
|
+ // Get the current configuration
|
|
|
+ Configuration conf = getConf();
|
|
|
+
|
|
|
+ InetSocketAddress address = conf.getSocketAddr(
|
|
|
+ JHAdminConfig.JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_PORT);
|
|
|
+
|
|
|
+ RefreshUserMappingsProtocol refreshProtocol = HSProxies.createProxy(conf,
|
|
|
+ address, RefreshUserMappingsProtocol.class,
|
|
|
+ UserGroupInformation.getCurrentUser());
|
|
|
+ // Refresh the user-to-groups mappings
|
|
|
+ refreshProtocol.refreshUserToGroupsMappings();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int refreshSuperUserGroupsConfiguration() throws IOException {
|
|
|
+ // Refresh the super-user groups
|
|
|
+ Configuration conf = getConf();
|
|
|
+ InetSocketAddress address = conf.getSocketAddr(
|
|
|
+ JHAdminConfig.JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_PORT);
|
|
|
+
|
|
|
+ RefreshUserMappingsProtocol refreshProtocol = HSProxies.createProxy(conf,
|
|
|
+ address, RefreshUserMappingsProtocol.class,
|
|
|
+ UserGroupInformation.getCurrentUser());
|
|
|
+ // Refresh the super-user group mappings
|
|
|
+ refreshProtocol.refreshSuperUserGroupsConfiguration();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int refreshAdminAcls() throws IOException {
|
|
|
+ // Refresh the admin acls
|
|
|
+ Configuration conf = getConf();
|
|
|
+ InetSocketAddress address = conf.getSocketAddr(
|
|
|
+ JHAdminConfig.JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_ADDRESS,
|
|
|
+ JHAdminConfig.DEFAULT_JHS_ADMIN_PORT);
|
|
|
+
|
|
|
+ HSAdminRefreshProtocol refreshProtocol = HSProxies.createProxy(conf,
|
|
|
+ address, HSAdminRefreshProtocol.class,
|
|
|
+ UserGroupInformation.getCurrentUser());
|
|
|
+ // Refresh the user-to-groups mappings
|
|
|
+ refreshProtocol.refreshAdminAcls();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int run(String[] args) throws Exception {
|
|
|
+ if (args.length < 1) {
|
|
|
+ printUsage("");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ int exitCode = -1;
|
|
|
+ int i = 0;
|
|
|
+ String cmd = args[i++];
|
|
|
+
|
|
|
+ if ("-refreshUserToGroupsMappings".equals(cmd)
|
|
|
+ || "-refreshSuperUserGroupsConfiguration".equals(cmd)
|
|
|
+ || "-refreshAdminAcls".equals(cmd)) {
|
|
|
+ if (args.length != 1) {
|
|
|
+ printUsage(cmd);
|
|
|
+ return exitCode;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ exitCode = 0;
|
|
|
+ if ("-refreshUserToGroupsMappings".equals(cmd)) {
|
|
|
+ exitCode = refreshUserToGroupsMappings();
|
|
|
+ } else if ("-refreshSuperUserGroupsConfiguration".equals(cmd)) {
|
|
|
+ exitCode = refreshSuperUserGroupsConfiguration();
|
|
|
+ } else if ("-refreshAdminAcls".equals(cmd)) {
|
|
|
+ exitCode = refreshAdminAcls();
|
|
|
+ } else if ("-getGroups".equals(cmd)) {
|
|
|
+ String[] usernames = Arrays.copyOfRange(args, i, args.length);
|
|
|
+ exitCode = getGroups(usernames);
|
|
|
+ } else if ("-help".equals(cmd)) {
|
|
|
+ if (i < args.length) {
|
|
|
+ printHelp(args[i]);
|
|
|
+ } else {
|
|
|
+ printHelp("");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ exitCode = -1;
|
|
|
+ System.err.println(cmd.substring(1) + ": Unknown command");
|
|
|
+ printUsage("");
|
|
|
+ }
|
|
|
+ return exitCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+ int result = ToolRunner.run(new HSAdmin(), args);
|
|
|
+ System.exit(result);
|
|
|
+ }
|
|
|
+}
|