mirror of https://github.com/apache/nifi.git
NIFI-10114 This closes #6122. Removed Single Refresh from ShellUserGroupProvider
Signed-off-by: Joe Witt <joewitt@apache.org>
This commit is contained in:
parent
00a96d79e0
commit
f91d877043
|
@ -45,40 +45,6 @@ class NssShellCommands implements ShellCommandsProvider {
|
||||||
return String.format("getent group %s | cut -f 4 -d ':'", groupName);
|
return String.format("getent group %s | cut -f 4 -d ':'", groupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user by id.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format("getent passwd %s | cut -f 1,3,4 -d ':'", userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method reuses `getUserById` because the getent command is the same for
|
|
||||||
* both uid and username.
|
|
||||||
*
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return getUserById(userName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method supports gid or group name because getent does.
|
|
||||||
*
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format("getent group %s | cut -f 1,3,4 -d ':'", groupId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This gives exit code 0 on all tested distributions.
|
* This gives exit code 0 on all tested distributions.
|
||||||
*
|
*
|
||||||
|
|
|
@ -47,32 +47,6 @@ class OsxShellCommands implements ShellCommandsProvider {
|
||||||
return String.format("dscl . -read /Groups/%s GroupMembership | cut -f 2- -d ' ' | sed 's/\\ /,/g'", groupName);
|
return String.format("dscl . -read /Groups/%s GroupMembership | cut -f 2- -d ' ' | sed 's/\\ /,/g'", groupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format("id -P %s | cut -f 1,3,4 -d ':'", userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return getUserById(userName); // 'id' command works for both uid/username
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format(" dscl . -read /Groups/`dscl . -search /Groups gid %s | head -n 1 | cut -f 1` RecordName PrimaryGroupID | awk 'BEGIN { OFS = \":\"; ORS=\"\\n\"; i=0;} " +
|
|
||||||
"/RecordName: / {name = $2;i = 1;}/PrimaryGroupID: / {gid = $2;}; {if (i==1) {print name,gid,\"\"}}'", groupId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Shell command string that will exit normally (0) on a suitable system.
|
* @return Shell command string that will exit normally (0) on a suitable system.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -56,18 +56,6 @@ class RemoteShellCommands implements ShellCommandsProvider {
|
||||||
return String.format(remoteCommand, innerProvider.getGroupMembers(groupName), privateKeyPath, remotePort, remoteHost);
|
return String.format(remoteCommand, innerProvider.getGroupMembers(groupName), privateKeyPath, remotePort, remoteHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getUserById(userId), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getUserByName(userName), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getGroupById(groupId), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSystemCheck() {
|
public String getSystemCheck() {
|
||||||
return String.format(remoteCommand, innerProvider.getSystemCheck(), privateKeyPath, remotePort, remoteHost);
|
return String.format(remoteCommand, innerProvider.getSystemCheck(), privateKeyPath, remotePort, remoteHost);
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,39 +55,6 @@ interface ShellCommandsProvider {
|
||||||
*/
|
*/
|
||||||
String getGroupMembers(String groupName);
|
String getGroupMembers(String groupName);
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user by id. Implementations may return null if reading a single
|
|
||||||
* user by id is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
String getUserById(String userId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user. Implementations may return null if reading a single user by
|
|
||||||
* username is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
String getUserByName(String userName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single group. Implementations may return null if reading a single group
|
|
||||||
* by name is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getGroupsList`.
|
|
||||||
*
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
String getGroupById(String groupId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the command for checking the suitability of the host system.
|
* Gets the command for checking the suitability of the host system.
|
||||||
*
|
*
|
||||||
|
|
|
@ -133,11 +133,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
user = usersByName.get(identity);
|
user = usersByName.get(identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
refreshOneUser(selectedShellCommands.getUserByName(identity), "Get Single User by Name");
|
|
||||||
user = usersByName.get(identity);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
logger.debug("getUser (by name) user not found: " + identity);
|
logger.debug("getUser (by name) user not found: " + identity);
|
||||||
} else {
|
} else {
|
||||||
|
@ -175,11 +170,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
group = groupsById.get(identifier);
|
group = groupsById.get(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (group == null) {
|
|
||||||
refreshOneGroup(selectedShellCommands.getGroupById(identifier), "Get Single Group by Id");
|
|
||||||
group = groupsById.get(identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (group == null) {
|
if (group == null) {
|
||||||
logger.debug("getGroup (by id) group not found: " + identifier);
|
logger.debug("getGroup (by id) group not found: " + identifier);
|
||||||
} else {
|
} else {
|
||||||
|
@ -279,7 +269,7 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
// Our next init step is to run the system check from that command set to determine if the other commands
|
// Our next init step is to run the system check from that command set to determine if the other commands
|
||||||
// will work on this host or not.
|
// will work on this host or not.
|
||||||
try {
|
try {
|
||||||
shellRunner.runShell(commands.getSystemCheck());
|
shellRunner.runShell(commands.getSystemCheck(), "Supported System Check");
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
logger.error("initialize exception: " + e + " system check command: " + commands.getSystemCheck());
|
logger.error("initialize exception: " + e + " system check command: " + commands.getSystemCheck());
|
||||||
throw new AuthorizerCreationException(SYS_CHECK_ERROR, e);
|
throw new AuthorizerCreationException(SYS_CHECK_ERROR, e);
|
||||||
|
@ -412,73 +402,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
selectedShellCommands = commandsProvider;
|
selectedShellCommands = commandsProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Refresh a single user.
|
|
||||||
*
|
|
||||||
* @param command Shell command to read a single user. Pre-formatted by caller.
|
|
||||||
* @param description Shell command description.
|
|
||||||
*/
|
|
||||||
private void refreshOneUser(String command, String description) {
|
|
||||||
if (command != null) {
|
|
||||||
Map<String, User> idToUser = new HashMap<>();
|
|
||||||
Map<String, User> usernameToUser = new HashMap<>();
|
|
||||||
Map<String, User> gidToUser = new HashMap<>();
|
|
||||||
List<String> userLines;
|
|
||||||
|
|
||||||
try {
|
|
||||||
userLines = shellRunner.runShell(command, description);
|
|
||||||
rebuildUsers(userLines, idToUser, usernameToUser, gidToUser);
|
|
||||||
} catch (final IOException ioexc) {
|
|
||||||
logger.error("refreshOneUser shell exception: " + ioexc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idToUser.size() > 0) {
|
|
||||||
synchronized (usersById) {
|
|
||||||
usersById.putAll(idToUser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usernameToUser.size() > 0) {
|
|
||||||
synchronized (usersByName) {
|
|
||||||
usersByName.putAll(usernameToUser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.info("Get Single User not supported on this system.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Refresh a single group.
|
|
||||||
*
|
|
||||||
* @param command Shell command to read a single group. Pre-formatted by caller.
|
|
||||||
* @param description Shell command description.
|
|
||||||
*/
|
|
||||||
private void refreshOneGroup(String command, String description) {
|
|
||||||
if (command != null) {
|
|
||||||
Map<String, Group> gidToGroup = new HashMap<>();
|
|
||||||
List<String> groupLines;
|
|
||||||
|
|
||||||
try {
|
|
||||||
groupLines = shellRunner.runShell(command, description);
|
|
||||||
rebuildGroups(groupLines, gidToGroup);
|
|
||||||
} catch (final IOException ioexc) {
|
|
||||||
logger.error("refreshOneGroup shell exception: " + ioexc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gidToGroup.size() > 0) {
|
|
||||||
synchronized (groupsById) {
|
|
||||||
groupsById.putAll(gidToGroup);
|
|
||||||
}
|
|
||||||
synchronized (groupsByName) {
|
|
||||||
gidToGroup.values().forEach(g -> groupsByName.put(g.getName(), g));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.info("Get Single Group not supported on this system.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is our entry point for user and group refresh. This method runs the top-level
|
* This is our entry point for user and group refresh. This method runs the top-level
|
||||||
* `getUserList()` and `getGroupsList()` shell commands, then passes those results to the
|
* `getUserList()` and `getGroupsList()` shell commands, then passes those results to the
|
||||||
|
@ -614,7 +537,7 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String groupMembersCommand = selectedShellCommands.getGroupMembers(groupName);
|
String groupMembersCommand = selectedShellCommands.getGroupMembers(groupName);
|
||||||
List<String> memberLines = shellRunner.runShell(groupMembersCommand);
|
List<String> memberLines = shellRunner.runShell(groupMembersCommand, "Get Group Members");
|
||||||
// Use the first line only, and log if the line count isn't exactly one:
|
// Use the first line only, and log if the line count isn't exactly one:
|
||||||
if (!memberLines.isEmpty()) {
|
if (!memberLines.isEmpty()) {
|
||||||
String memberLine = memberLines.get(0);
|
String memberLine = memberLines.get(0);
|
||||||
|
|
|
@ -52,10 +52,6 @@ public class ShellRunner {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> runShell(String command) throws IOException {
|
|
||||||
return runShell(command, "<unknown>");
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> runShell(String command, String description) throws IOException {
|
public List<String> runShell(String command, String description) throws IOException {
|
||||||
final ProcessBuilder builder = new ProcessBuilder(SHELL, OPTS, command);
|
final ProcessBuilder builder = new ProcessBuilder(SHELL, OPTS, command);
|
||||||
builder.redirectErrorStream(true);
|
builder.redirectErrorStream(true);
|
||||||
|
|
|
@ -101,7 +101,7 @@ public class ShellUserGroupProviderIT {
|
||||||
try {
|
try {
|
||||||
// NB: this command is a bit perplexing: it works without prompt from the shell, but hangs
|
// NB: this command is a bit perplexing: it works without prompt from the shell, but hangs
|
||||||
// here without the pipe from `yes`:
|
// here without the pipe from `yes`:
|
||||||
shellRunner.runShell("yes | ssh-keygen -C '' -N '' -t rsa -f " + sshPrivKeyFile);
|
shellRunner.runShell("yes | ssh-keygen -C '' -N '' -t rsa -f " + sshPrivKeyFile, "Setup");
|
||||||
} catch (final IOException ioexc) {
|
} catch (final IOException ioexc) {
|
||||||
systemCheckFailed = true;
|
systemCheckFailed = true;
|
||||||
logger.error("setupOnce() exception: " + ioexc + "; tests cannot run on this system.");
|
logger.error("setupOnce() exception: " + ioexc + "; tests cannot run on this system.");
|
||||||
|
|
|
@ -44,40 +44,6 @@ class NssShellCommands implements ShellCommandsProvider {
|
||||||
return String.format("getent group %s | cut -f 4 -d ':'", groupName);
|
return String.format("getent group %s | cut -f 4 -d ':'", groupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user by id.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format("getent passwd %s | cut -f 1,3,4 -d ':'", userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method reuses `getUserById` because the getent command is the same for
|
|
||||||
* both uid and username.
|
|
||||||
*
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return getUserById(userName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method supports gid or group name because getent does.
|
|
||||||
*
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format("getent group %s | cut -f 1,3,4 -d ':'", groupId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This gives exit code 0 on all tested distributions.
|
* This gives exit code 0 on all tested distributions.
|
||||||
*
|
*
|
||||||
|
|
|
@ -46,32 +46,6 @@ class OsxShellCommands implements ShellCommandsProvider {
|
||||||
return String.format("dscl . -read /Groups/%s GroupMembership | cut -f 2- -d ' ' | sed 's/\\ /,/g'", groupName);
|
return String.format("dscl . -read /Groups/%s GroupMembership | cut -f 2- -d ' ' | sed 's/\\ /,/g'", groupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format("id -P %s | cut -f 1,3,4 -d ':'", userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return getUserById(userName); // 'id' command works for both uid/username
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format(" dscl . -read /Groups/`dscl . -search /Groups gid %s | head -n 1 | cut -f 1` RecordName PrimaryGroupID | awk 'BEGIN { OFS = \":\"; ORS=\"\\n\"; i=0;} " +
|
|
||||||
"/RecordName: / {name = $2;i = 1;}/PrimaryGroupID: / {gid = $2;}; {if (i==1) {print name,gid,\"\"}}'", groupId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Shell command string that will exit normally (0) on a suitable system.
|
* @return Shell command string that will exit normally (0) on a suitable system.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.nifi.registry.security.authorization.shell;
|
|
||||||
|
|
||||||
class RemoteShellCommands implements ShellCommandsProvider {
|
|
||||||
// Carefully crafted command replacement string:
|
|
||||||
private final static String remoteCommand = "ssh " +
|
|
||||||
"-o 'StrictHostKeyChecking no' " +
|
|
||||||
"-o 'PasswordAuthentication no' " +
|
|
||||||
"-o \"RemoteCommand %s\" " +
|
|
||||||
"-i %s -p %s -l root %s";
|
|
||||||
|
|
||||||
private ShellCommandsProvider innerProvider;
|
|
||||||
private String privateKeyPath;
|
|
||||||
private String remoteHost;
|
|
||||||
private Integer remotePort;
|
|
||||||
|
|
||||||
private RemoteShellCommands() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ShellCommandsProvider wrapOtherProvider(ShellCommandsProvider otherProvider, String keyPath, String host, Integer port) {
|
|
||||||
RemoteShellCommands remote = new RemoteShellCommands();
|
|
||||||
|
|
||||||
remote.innerProvider = otherProvider;
|
|
||||||
remote.privateKeyPath = keyPath;
|
|
||||||
remote.remoteHost = host;
|
|
||||||
remote.remotePort = port;
|
|
||||||
|
|
||||||
return remote;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsersList() {
|
|
||||||
return String.format(remoteCommand, innerProvider.getUsersList(), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroupsList() {
|
|
||||||
return String.format(remoteCommand, innerProvider.getGroupsList(), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroupMembers(String groupName) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getGroupMembers(groupName), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserById(String userId) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getUserById(userId), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserByName(String userName) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getUserByName(userName), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroupById(String groupId) {
|
|
||||||
return String.format(remoteCommand, innerProvider.getGroupById(groupId), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSystemCheck() {
|
|
||||||
return String.format(remoteCommand, innerProvider.getSystemCheck(), privateKeyPath, remotePort, remoteHost);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -55,39 +55,6 @@ interface ShellCommandsProvider {
|
||||||
*/
|
*/
|
||||||
String getGroupMembers(String groupName);
|
String getGroupMembers(String groupName);
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user by id. Implementations may return null if reading a single
|
|
||||||
* user by id is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userId name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
String getUserById(String userId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single user. Implementations may return null if reading a single user by
|
|
||||||
* username is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getUsersList`.
|
|
||||||
*
|
|
||||||
* @param userName name of user.
|
|
||||||
* @return Shell command string that will read a single user.
|
|
||||||
*/
|
|
||||||
String getUserByName(String userName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the command for reading a single group. Implementations may return null if reading a single group
|
|
||||||
* by name is not supported.
|
|
||||||
*
|
|
||||||
* When executed, this command should output a single line, in the format used by `getGroupsList`.
|
|
||||||
*
|
|
||||||
* @param groupId name of group.
|
|
||||||
* @return Shell command string that will read a single group.
|
|
||||||
*/
|
|
||||||
String getGroupById(String groupId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the command for checking the suitability of the host system.
|
* Gets the command for checking the suitability of the host system.
|
||||||
*
|
*
|
||||||
|
|
|
@ -52,10 +52,6 @@ public class ShellRunner {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> runShell(String command) throws IOException {
|
|
||||||
return runShell(command, "<unknown>");
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> runShell(String command, String description) throws IOException {
|
public List<String> runShell(String command, String description) throws IOException {
|
||||||
final ProcessBuilder builder = new ProcessBuilder(SHELL, OPTS, command);
|
final ProcessBuilder builder = new ProcessBuilder(SHELL, OPTS, command);
|
||||||
builder.redirectErrorStream(true);
|
builder.redirectErrorStream(true);
|
||||||
|
|
|
@ -135,11 +135,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
user = usersByName.get(identity);
|
user = usersByName.get(identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
refreshOneUser(selectedShellCommands.getUserByName(identity), "Get Single User by Name");
|
|
||||||
user = usersByName.get(identity);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
logger.debug("getUser (by name) user not found: " + identity);
|
logger.debug("getUser (by name) user not found: " + identity);
|
||||||
} else {
|
} else {
|
||||||
|
@ -177,11 +172,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
group = groupsById.get(identifier);
|
group = groupsById.get(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (group == null) {
|
|
||||||
refreshOneGroup(selectedShellCommands.getGroupById(identifier), "Get Single Group by Id");
|
|
||||||
group = groupsById.get(identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (group == null) {
|
if (group == null) {
|
||||||
logger.debug("getGroup (by id) group not found: " + identifier);
|
logger.debug("getGroup (by id) group not found: " + identifier);
|
||||||
} else {
|
} else {
|
||||||
|
@ -265,7 +255,7 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
// Our next init step is to run the system check from that command set to determine if the other commands
|
// Our next init step is to run the system check from that command set to determine if the other commands
|
||||||
// will work on this host or not.
|
// will work on this host or not.
|
||||||
try {
|
try {
|
||||||
shellRunner.runShell(commands.getSystemCheck());
|
shellRunner.runShell(commands.getSystemCheck(), "Supported System Check");
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
logger.error("initialize exception: " + e + " system check command: " + commands.getSystemCheck());
|
logger.error("initialize exception: " + e + " system check command: " + commands.getSystemCheck());
|
||||||
throw new SecurityProviderCreationException(SYS_CHECK_ERROR, e);
|
throw new SecurityProviderCreationException(SYS_CHECK_ERROR, e);
|
||||||
|
@ -395,70 +385,6 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
selectedShellCommands = commandsProvider;
|
selectedShellCommands = commandsProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Refresh a single user.
|
|
||||||
*
|
|
||||||
* @param command Shell command to read a single user. Pre-formatted by caller.
|
|
||||||
* @param description Shell command description.
|
|
||||||
*/
|
|
||||||
private void refreshOneUser(String command, String description) {
|
|
||||||
if (command != null) {
|
|
||||||
Map<String, User> idToUser = new HashMap<>();
|
|
||||||
Map<String, User> usernameToUser = new HashMap<>();
|
|
||||||
Map<String, User> gidToUser = new HashMap<>();
|
|
||||||
List<String> userLines;
|
|
||||||
|
|
||||||
try {
|
|
||||||
userLines = shellRunner.runShell(command, description);
|
|
||||||
rebuildUsers(userLines, idToUser, usernameToUser, gidToUser);
|
|
||||||
} catch (final IOException ioexc) {
|
|
||||||
logger.error("refreshOneUser shell exception: " + ioexc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idToUser.size() > 0) {
|
|
||||||
synchronized (usersById) {
|
|
||||||
usersById.putAll(idToUser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usernameToUser.size() > 0) {
|
|
||||||
synchronized (usersByName) {
|
|
||||||
usersByName.putAll(usernameToUser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.info("Get Single User not supported on this system.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Refresh a single group.
|
|
||||||
*
|
|
||||||
* @param command Shell command to read a single group. Pre-formatted by caller.
|
|
||||||
* @param description Shell command description.
|
|
||||||
*/
|
|
||||||
private void refreshOneGroup(String command, String description) {
|
|
||||||
if (command != null) {
|
|
||||||
Map<String, Group> gidToGroup = new HashMap<>();
|
|
||||||
List<String> groupLines;
|
|
||||||
|
|
||||||
try {
|
|
||||||
groupLines = shellRunner.runShell(command, description);
|
|
||||||
rebuildGroups(groupLines, gidToGroup);
|
|
||||||
} catch (final IOException ioexc) {
|
|
||||||
logger.error("refreshOneGroup shell exception: " + ioexc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gidToGroup.size() > 0) {
|
|
||||||
synchronized (groupsById) {
|
|
||||||
groupsById.putAll(gidToGroup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.info("Get Single Group not supported on this system.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is our entry point for user and group refresh. This method runs the top-level
|
* This is our entry point for user and group refresh. This method runs the top-level
|
||||||
* `getUserList()` and `getGroupsList()` shell commands, then passes those results to the
|
* `getUserList()` and `getGroupsList()` shell commands, then passes those results to the
|
||||||
|
@ -588,7 +514,7 @@ public class ShellUserGroupProvider implements UserGroupProvider {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String groupMembersCommand = selectedShellCommands.getGroupMembers(groupName);
|
String groupMembersCommand = selectedShellCommands.getGroupMembers(groupName);
|
||||||
List<String> memberLines = shellRunner.runShell(groupMembersCommand);
|
List<String> memberLines = shellRunner.runShell(groupMembersCommand, "Get Group Members");
|
||||||
// Use the first line only, and log if the line count isn't exactly one:
|
// Use the first line only, and log if the line count isn't exactly one:
|
||||||
if (!memberLines.isEmpty()) {
|
if (!memberLines.isEmpty()) {
|
||||||
String memberLine = memberLines.get(0);
|
String memberLine = memberLines.get(0);
|
||||||
|
|
Loading…
Reference in New Issue