HADOOP-10401. ShellBasedUnixGroupsMapping#getGroups does not always return primary group first (ajisakaa via cmccabe)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1594714 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Colin McCabe 2014-05-14 21:01:03 +00:00
parent 88e76f9c45
commit f099fa4cd4
3 changed files with 25 additions and 3 deletions

View File

@ -476,6 +476,9 @@ Release 2.5.0 - UNRELEASED
HADOOP-10585. Retry polices ignore interrupted exceptions (Daryn Sharp via HADOOP-10585. Retry polices ignore interrupted exceptions (Daryn Sharp via
jeagles) jeagles)
HADOOP-10401. ShellBasedUnixGroupsMapping#getGroups does not always return
primary group first (Akira AJISAKA via Colin Patrick McCabe)
Release 2.4.1 - UNRELEASED Release 2.4.1 - UNRELEASED
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -74,7 +74,8 @@ public void cacheGroupsAdd(List<String> groups) throws IOException {
* Get the current user's group list from Unix by running the command 'groups' * Get the current user's group list from Unix by running the command 'groups'
* NOTE. For non-existing user it will return EMPTY list * NOTE. For non-existing user it will return EMPTY list
* @param user user name * @param user user name
* @return the groups list that the <code>user</code> belongs to * @return the groups list that the <code>user</code> belongs to. The primary
* group is returned first.
* @throws IOException if encounter any error when running the command * @throws IOException if encounter any error when running the command
*/ */
private static List<String> getUnixGroups(final String user) throws IOException { private static List<String> getUnixGroups(final String user) throws IOException {
@ -84,6 +85,7 @@ private static List<String> getUnixGroups(final String user) throws IOException
} catch (ExitCodeException e) { } catch (ExitCodeException e) {
// if we didn't get the group - just return empty list; // if we didn't get the group - just return empty list;
LOG.warn("got exception trying to get groups for user " + user, e); LOG.warn("got exception trying to get groups for user " + user, e);
return new LinkedList<String>();
} }
StringTokenizer tokenizer = StringTokenizer tokenizer =
@ -92,6 +94,17 @@ private static List<String> getUnixGroups(final String user) throws IOException
while (tokenizer.hasMoreTokens()) { while (tokenizer.hasMoreTokens()) {
groups.add(tokenizer.nextToken()); groups.add(tokenizer.nextToken());
} }
// remove duplicated primary group
if (!Shell.WINDOWS) {
for (int i = 1; i < groups.size(); i++) {
if (groups.get(i).equals(groups.get(0))) {
groups.remove(i);
break;
}
}
}
return groups; return groups;
} }
} }

View File

@ -132,11 +132,17 @@ public static String[] getGroupsCommand() {
: new String[]{"bash", "-c", "groups"}; : new String[]{"bash", "-c", "groups"};
} }
/** a Unix command to get a given user's groups list */ /**
* a Unix command to get a given user's groups list.
* If the OS is not WINDOWS, the command will get the user's primary group
* first and finally get the groups list which includes the primary group.
* i.e. the user's primary group will be included twice.
*/
public static String[] getGroupsForUserCommand(final String user) { public static String[] getGroupsForUserCommand(final String user) {
//'groups username' command return is non-consistent across different unixes //'groups username' command return is non-consistent across different unixes
return (WINDOWS)? new String[] { WINUTILS, "groups", "-F", "\"" + user + "\""} return (WINDOWS)? new String[] { WINUTILS, "groups", "-F", "\"" + user + "\""}
: new String [] {"bash", "-c", "id -Gn " + user}; : new String [] {"bash", "-c", "id -gn " + user
+ "&& id -Gn " + user};
} }
/** a Unix command to get a given netgroup's user list */ /** a Unix command to get a given netgroup's user list */