Support reloading of sshd.requestlog configuration

Change-Id: Ic885392e4fb5479920e7619a244394febeaf30b6
This commit is contained in:
Gustaf Lundh
2018-04-16 10:56:31 +02:00
parent ca7eb79077
commit 4e859935f0
3 changed files with 63 additions and 9 deletions

View File

@@ -23,6 +23,9 @@ import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PeerDaemonUser;
import com.google.gerrit.server.audit.AuditService;
import com.google.gerrit.server.audit.SshAuditEvent;
import com.google.gerrit.server.config.ConfigKey;
import com.google.gerrit.server.config.ConfigUpdatedEvent;
import com.google.gerrit.server.config.GerritConfigListener;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.util.IdGenerator;
import com.google.gerrit.server.util.SystemLog;
@@ -30,6 +33,8 @@ import com.google.gerrit.sshd.SshScope.Context;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.util.Collections;
import java.util.List;
import org.apache.log4j.AsyncAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
@@ -37,7 +42,7 @@ import org.apache.log4j.spi.LoggingEvent;
import org.eclipse.jgit.lib.Config;
@Singleton
class SshLog implements LifecycleListener {
class SshLog implements LifecycleListener, GerritConfigListener {
private static final Logger log = Logger.getLogger(SshLog.class);
private static final String LOG_NAME = "sshd_log";
private static final String P_SESSION = "session";
@@ -50,8 +55,11 @@ class SshLog implements LifecycleListener {
private final Provider<SshSession> session;
private final Provider<Context> context;
private final AsyncAppender async;
private volatile AsyncAppender async;
private final AuditService auditService;
private final SystemLog systemLog;
private final Object lock = new Object();
@Inject
SshLog(
@@ -63,12 +71,34 @@ class SshLog implements LifecycleListener {
this.session = session;
this.context = context;
this.auditService = auditService;
this.systemLog = systemLog;
if (!config.getBoolean("sshd", "requestLog", true)) {
async = null;
return;
if (config.getBoolean("sshd", "requestLog", true)) {
enableLogging();
}
}
/** @return true if a change in state has occurred */
public boolean enableLogging() {
synchronized (lock) {
if (async == null) {
async = systemLog.createAsyncAppender(LOG_NAME, new SshLogLayout());
return true;
}
return false;
}
}
/** @return true if a change in state has occurred */
public boolean disableLogging() {
synchronized (lock) {
if (async != null) {
async.close();
async = null;
return true;
}
return false;
}
async = systemLog.createAsyncAppender(LOG_NAME, new SshLogLayout());
}
@Override
@@ -76,9 +106,7 @@ class SshLog implements LifecycleListener {
@Override
public void stop() {
if (async != null) {
async.close();
}
disableLogging();
}
void onLogin() {
@@ -288,4 +316,23 @@ class SshLog implements LifecycleListener {
}
return commandName.toString();
}
@Override
public List<ConfigUpdatedEvent.Update> configUpdated(ConfigUpdatedEvent event) {
ConfigKey sshdRequestLog = ConfigKey.create("sshd", "requestLog");
if (!event.isValueUpdated(sshdRequestLog)) {
return Collections.emptyList();
}
boolean enabled = event.getNewConfig().getBoolean("sshd", "requestLog", true);
boolean stateUpdated;
if (enabled) {
stateUpdated = enableLogging();
} else {
stateUpdated = disableLogging();
}
return stateUpdated
? Collections.singletonList(event.accept(sshdRequestLog))
: Collections.emptyList();
}
}