blob: d7dba5ad615d4d1941c5a6623c2d657220cb3d29 [file] [log] [blame]
/*
* =========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
* ========================================================================
*/
package com.gemstone.gemfire.management.internal.cli.shell;
import java.io.File;
import java.util.logging.Level;
import com.gemstone.gemfire.internal.lang.StringUtils;
import com.gemstone.gemfire.internal.util.IOUtils;
/**
*
* @author Abhishek Chaudhari
* @since 7.0
*/
// According to 8.0 discussions, gfsh should have as less confing as possible
// hence Persisting GfshConfig is not done
public class GfshConfig {
private static final String LOG_DIR_PROPERTY = "gfsh.log-dir";
private static final String LOG_LEVEL_PROPERTY = "gfsh.log-level";
private static final String LOG_FILE_SIZE_LIMIT_PROPERTY = "gfsh.log-file-size-limit";
private static final String LOG_DISK_SPACE_LIMIT_PROPERTY = "gfsh.log-disk-space-limit";
private static final File HISTORY_FILE = new File(getHomeGemFireDirectory(), ".gfsh.history");
// History file size
private static final int MAX_HISTORY_SIZE = 500;
private static final Level DEFAULT_LOGLEVEL = Level.OFF;
private static final int DEFAULT_LOGFILE_SIZE_LIMIT = 1024*1024*10;
private static final int DEFAULT_LOGFILE_DISK_USAGE = 1024*1024*10;
private static final String DEFAULT_PROMPT = "{0}gfsh{1}>";
private String historyFileName;
private String defaultPrompt;
private int historySize;
private String logDir;
private Level logLevel;
private int logFileSizeLimit;
private int logFileDiskLimit;
public GfshConfig() {
this(HISTORY_FILE.getAbsolutePath(), DEFAULT_PROMPT, MAX_HISTORY_SIZE, null, null, null, null);
}
public GfshConfig(String historyFileName, String defaultPrompt,
int historySize, String logDir, Level logLevel, Integer logLimit,
Integer logCount) {
this.historyFileName = historyFileName;
this.defaultPrompt = defaultPrompt;
this.historySize = historySize;
// Logger properties
if (logDir == null) {
this.logDir = System.getProperty(LOG_DIR_PROPERTY, ".");
} else {
this.logDir = logDir;
}
if (logLevel == null) {
this.logLevel = getLogLevel(System.getProperty(LOG_LEVEL_PROPERTY, DEFAULT_LOGLEVEL.getName()));
} else {
this.logLevel = logLevel;
}
if (logLimit == null) {
this.logFileSizeLimit = getParsedOrDefault(System.getProperty(LOG_FILE_SIZE_LIMIT_PROPERTY), LOG_FILE_SIZE_LIMIT_PROPERTY, DEFAULT_LOGFILE_SIZE_LIMIT);
} else {
this.logFileSizeLimit = logLimit;
}
if (logCount == null) {
// validation & correction to default is done in getLogFileCount()
this.logFileDiskLimit = getParsedOrDefault(System.getProperty(LOG_DISK_SPACE_LIMIT_PROPERTY), LOG_DISK_SPACE_LIMIT_PROPERTY, DEFAULT_LOGFILE_DISK_USAGE);
} else {
this.logFileDiskLimit = logCount;
}
}
public String getHistoryFileName() {
return historyFileName;
}
public String getDefaultPrompt() {
return defaultPrompt;
}
public int getHistorySize() {
return historySize;
}
public String getLogFilePath() {
return IOUtils.tryGetCanonicalPathElseGetAbsolutePath(new File(logDir, "gfsh-%u_%g.log"));
}
public Level getLogLevel() {
return logLevel;
}
public int getLogFileSizeLimit() {
return logFileSizeLimit;
}
protected int getLogFileDiskLimit() {
return logFileDiskLimit;
}
public int getLogFileCount() {
int logCount;
try {
logCount = getLogFileSizeLimit()/getLogFileDiskLimit();
logCount = logCount >= 1 ? logCount : 1;
} catch (java.lang.ArithmeticException e) { // for divide by zero
logCount = 1;
}
return logCount;
}
public boolean isLoggingEnabled() {
// keep call for getLogLevel() instead of logLevel for inheritance
return !Level.OFF.equals(getLogLevel());
}
private String getLoggerConfig() {
StringBuilder builder = new StringBuilder();
builder.append("log-file="+getLogFilePath()).append(Gfsh.LINE_SEPARATOR);
builder.append("log-level="+getLogLevel().getName()).append(Gfsh.LINE_SEPARATOR);
builder.append("log-file-size-limit="+getLogFileSizeLimit()).append(Gfsh.LINE_SEPARATOR);
builder.append("log-disk-space-limit="+getLogFileDiskLimit()).append(Gfsh.LINE_SEPARATOR);
builder.append("log-count="+getLogFileCount()).append(Gfsh.LINE_SEPARATOR);
return builder.toString();
}
public boolean isTestConfig() {
return false;
}
public boolean isANSISupported() {
return !Boolean.getBoolean("gfsh.disable.color");
}
private static Level getLogLevel(final String logLevelString) {
try {
String logLevelAsString = StringUtils.isBlank(logLevelString) ? "" : logLevelString.trim(); //trim spaces if any
// To support level NONE, used by GemFire
if ("NONE".equalsIgnoreCase(logLevelAsString)) {
logLevelAsString = Level.OFF.getName();
}
// To support level ERROR, used by GemFire, fall to WARNING
if ("ERROR".equalsIgnoreCase(logLevelAsString)) {
logLevelAsString = Level.WARNING.getName();
}
return Level.parse(logLevelAsString.toUpperCase());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return DEFAULT_LOGLEVEL;
}
}
private static String getHomeGemFireDirectory() {
String userHome = System.getProperty("user.home");
String homeDirPath = userHome + "/.gemfire";
File alternateDir = new File(homeDirPath);
if (!alternateDir.exists()) {
if (!alternateDir.mkdirs()) {
homeDirPath = ".";
}
}
return homeDirPath;
}
private static int getParsedOrDefault(final String numberString, final String parseValueFor, final int defaultValue) {
if (numberString == null) {
return defaultValue;
}
try {
return Integer.valueOf(numberString);
} catch (NumberFormatException e) {
System.err.println("Invalid value \"" + numberString + "\" specified for: \"" + parseValueFor + "\". Using default value: \""+defaultValue+"\".");
return defaultValue;
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(getClass().getSimpleName());
builder.append(" [historyFileName=");
builder.append(getHistoryFileName());
builder.append(", historySize=");
builder.append(getHistorySize());
builder.append(", loggerConfig={");
builder.append(getLoggerConfig()).append("}");
builder.append(", isANSISupported=");
builder.append(isANSISupported());
builder.append("]");
return builder.toString();
}
}