blob: 7e611a95cad510b257eef8f5f813817cc6938629 [file] [log] [blame]
/*
* 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.geode.management.internal.cli.shell;
import java.io.File;
import java.util.logging.Level;
import org.apache.commons.lang3.StringUtils;
import org.apache.geode.annotations.Immutable;
import org.apache.geode.internal.util.IOUtils;
/**
*
* @since GemFire 7.0
*/
// According to 8.0 discussions, gfsh should have as less confing as possible
// hence Persisting GfshConfig is not done
public class GfshConfig {
public static final String INIT_FILE_PROPERTY = "gfsh.init-file";
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;
public static final String DEFAULT_INIT_FILE_NAME = ".gfsh2rc";
@Immutable
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 final String historyFileName;
private final String initFileName;
private final String defaultPrompt;
private final int historySize;
private final String logDir;
private final Level logLevel;
private final int logFileSizeLimit;
private final int logFileDiskLimit;
public GfshConfig() {
this(HISTORY_FILE.getAbsolutePath(), DEFAULT_PROMPT, MAX_HISTORY_SIZE, null, null, null, null,
null);
}
public boolean deleteHistoryFile() {
if (historyFileName == null) {
return true;
}
File file = new File(historyFileName);
if (!file.exists()) {
return true;
}
return file.delete();
}
public GfshConfig(String historyFileName, String defaultPrompt, int historySize, String logDir,
Level logLevel, Integer logLimit, Integer logCount, String initFileName) {
this.historyFileName = historyFileName;
this.defaultPrompt = defaultPrompt;
this.historySize = historySize;
if (initFileName == null) {
this.initFileName = searchForInitFileName();
} else {
this.initFileName = initFileName;
}
// 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) {
logFileSizeLimit = getParsedOrDefault(System.getProperty(LOG_FILE_SIZE_LIMIT_PROPERTY),
LOG_FILE_SIZE_LIMIT_PROPERTY, DEFAULT_LOGFILE_SIZE_LIMIT);
} else {
logFileSizeLimit = logLimit;
}
if (logCount == null) {
// validation & correction to default is done in getLogFileCount()
logFileDiskLimit = getParsedOrDefault(System.getProperty(LOG_DISK_SPACE_LIMIT_PROPERTY),
LOG_DISK_SPACE_LIMIT_PROPERTY, DEFAULT_LOGFILE_DISK_USAGE);
} else {
logFileDiskLimit = logCount;
}
}
public String getHistoryFileName() {
return historyFileName;
}
public String getInitFileName() {
return initFileName;
}
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() {
return "init-file=" + (getInitFileName() == null ? "" : getInitFileName())
+ Gfsh.LINE_SEPARATOR
+ "log-file=" + getLogFilePath() + Gfsh.LINE_SEPARATOR
+ "log-level=" + getLogLevel().getName() + Gfsh.LINE_SEPARATOR
+ "log-file-size-limit=" + getLogFileSizeLimit() + Gfsh.LINE_SEPARATOR
+ "log-disk-space-limit=" + getLogFileDiskLimit() + Gfsh.LINE_SEPARATOR
+ "log-count=" + getLogFileCount() + Gfsh.LINE_SEPARATOR;
}
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 + "/.geode";
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.parseInt(numberString);
} catch (NumberFormatException e) {
System.err.println("Invalid value \"" + numberString + "\" specified for: \"" + parseValueFor
+ "\". Using default value: \"" + defaultValue + "\".");
return defaultValue;
}
}
@Override
public String toString() {
return getClass().getSimpleName()
+ " [initFileName="
+ (getInitFileName() == null ? "" : getInitFileName())
+ ", historyFileName="
+ getHistoryFileName()
+ ", historySize="
+ getHistorySize()
+ ", loggerConfig={"
+ getLoggerConfig() + "}"
+ ", isANSISupported="
+ isANSISupported()
+ "]";
}
/*
* Search for the init file using the system property, then the current directory, then the home
* directory. It need not exist at all.
*/
private String searchForInitFileName() {
String homeDirectoryInitFileName =
System.getProperty("user.home") + File.separatorChar + DEFAULT_INIT_FILE_NAME;
String currentDirectoryInitFileName =
System.getProperty("user.dir") + File.separatorChar + DEFAULT_INIT_FILE_NAME;
String systemPropertyInitFileName = System.getProperty(INIT_FILE_PROPERTY);
String[] initFileNames =
{systemPropertyInitFileName, currentDirectoryInitFileName, homeDirectoryInitFileName};
for (String initFileName : initFileNames) {
if (IOUtils.isExistingPathname(initFileName)) {
return initFileName;
}
}
return null;
}
}