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/branches/branch-2@1594717 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fe0180dd6c
commit
ba2483f31e
|
@ -141,6 +141,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
|
||||||
|
|
|
@ -74,7 +74,8 @@ public class ShellBasedUnixGroupsMapping
|
||||||
* 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 @@ public class ShellBasedUnixGroupsMapping
|
||||||
} 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 @@ public class ShellBasedUnixGroupsMapping
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,11 +132,17 @@ abstract public class Shell {
|
||||||
: 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 */
|
||||||
|
|
Loading…
Reference in New Issue