made the last of the config pages support dynamic updates (w3wt)
This commit is contained in:
@ -0,0 +1,153 @@
|
|||||||
|
package net.i2p.router.web;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Properties;
|
||||||
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler to deal with form submissions from the logging config form and act
|
||||||
|
* upon the values.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ConfigLoggingHandler extends FormHandler {
|
||||||
|
private boolean _shouldSave;
|
||||||
|
private String _levels;
|
||||||
|
private String _defaultLevel;
|
||||||
|
private String _filename;
|
||||||
|
private String _recordFormat;
|
||||||
|
private String _dateFormat;
|
||||||
|
private String _fileSize;
|
||||||
|
|
||||||
|
public void ConfigNetHandler() {
|
||||||
|
_shouldSave = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processForm() {
|
||||||
|
if (_shouldSave) {
|
||||||
|
saveChanges();
|
||||||
|
} else {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShouldsave(String moo) { _shouldSave = true; }
|
||||||
|
|
||||||
|
public void setLevels(String levels) {
|
||||||
|
_levels = (levels != null ? levels.trim() : null);
|
||||||
|
}
|
||||||
|
public void setDefaultloglevel(String level) {
|
||||||
|
_defaultLevel = (level != null ? level.trim() : null);
|
||||||
|
}
|
||||||
|
public void setFilename(String filename) {
|
||||||
|
_filename = (filename != null ? filename.trim() : null);
|
||||||
|
}
|
||||||
|
public void setRecordformat(String format) {
|
||||||
|
_recordFormat = (format != null ? format.trim() : null);
|
||||||
|
}
|
||||||
|
public void setDateformat(String format) {
|
||||||
|
_dateFormat = (format != null ? format.trim() : null);
|
||||||
|
}
|
||||||
|
public void setFilesize(String size) {
|
||||||
|
_fileSize = (size != null ? size.trim() : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user made changes to the config and wants to save them, so
|
||||||
|
* lets go ahead and do so.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void saveChanges() {
|
||||||
|
boolean shouldSave = false;
|
||||||
|
|
||||||
|
if (_levels != null) {
|
||||||
|
try {
|
||||||
|
Properties props = new Properties();
|
||||||
|
props.load(new ByteArrayInputStream(_levels.getBytes()));
|
||||||
|
_context.logManager().setLimits(props);
|
||||||
|
shouldSave = true;
|
||||||
|
addFormNotice("Log limits updated");
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
_context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe);
|
||||||
|
addFormError("Error updating the log limits - levels not valid");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_context.logManager().setLimits(null);
|
||||||
|
addFormNotice("Log limits cleared");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_defaultLevel != null) {
|
||||||
|
String oldDefault = _context.logManager().getDefaultLimit();
|
||||||
|
if (_defaultLevel.equals(oldDefault)) {
|
||||||
|
// noop
|
||||||
|
} else {
|
||||||
|
shouldSave = true;
|
||||||
|
_context.logManager().setDefaultLimit(_defaultLevel);
|
||||||
|
addFormNotice("Default log level updated from " + oldDefault + " to " + _defaultLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_dateFormat != null) {
|
||||||
|
boolean valid = _context.logManager().setDateFormat(_dateFormat);
|
||||||
|
if (valid) {
|
||||||
|
shouldSave = true;
|
||||||
|
addFormNotice("Date format updated");
|
||||||
|
} else {
|
||||||
|
addFormError("Specified date format is not valid (" + _dateFormat + ") - not updated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_fileSize != null) {
|
||||||
|
int newBytes = _context.logManager().getFileSize(_fileSize);
|
||||||
|
int oldBytes = _context.logManager().getFileSize();
|
||||||
|
if (newBytes > 0) {
|
||||||
|
if (oldBytes != newBytes) {
|
||||||
|
_context.logManager().setFileSize(newBytes);
|
||||||
|
shouldSave = true;
|
||||||
|
addFormNotice("File size updated");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addFormError("Specified file size limit is not valid (" + _fileSize + ") - not updated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (_filename != null) && (_filename.trim().length() > 0) ) {
|
||||||
|
_filename = _filename.trim();
|
||||||
|
String old = _context.logManager().getBaseLogfilename();
|
||||||
|
if ( (old != null) && (_filename.equals(old)) ) {
|
||||||
|
// noop - don't update since its the same
|
||||||
|
} else {
|
||||||
|
shouldSave = true;
|
||||||
|
_context.logManager().setBaseLogfilename(_filename);
|
||||||
|
addFormNotice("Log file name pattern updated to " + _filename
|
||||||
|
+ " (note: will not take effect until next rotation)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (_recordFormat != null) && (_recordFormat.trim().length() > 0) ) {
|
||||||
|
_recordFormat = _recordFormat.trim();
|
||||||
|
String old = new String(_context.logManager().getFormat());
|
||||||
|
if (_recordFormat.equalsIgnoreCase(old)) {
|
||||||
|
// noop - no change
|
||||||
|
} else {
|
||||||
|
char fmt[] = new char[_recordFormat.length()];
|
||||||
|
for (int i = 0; i < fmt.length; i++)
|
||||||
|
fmt[i] = _recordFormat.charAt(i);
|
||||||
|
_context.logManager().setFormat(fmt);
|
||||||
|
shouldSave = true;
|
||||||
|
addFormNotice("Log record format updated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldSave) {
|
||||||
|
boolean saved = _context.logManager().saveConfig();
|
||||||
|
|
||||||
|
if (saved)
|
||||||
|
addFormNotice("Log configuration saved and applied successfully");
|
||||||
|
else
|
||||||
|
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,9 +2,10 @@ package net.i2p.router.web;
|
|||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.TreeMap;
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -49,65 +50,49 @@ public class ConfigLoggingHelper {
|
|||||||
}
|
}
|
||||||
public String getLogLevelTable() {
|
public String getLogLevelTable() {
|
||||||
StringBuffer buf = new StringBuffer(32*1024);
|
StringBuffer buf = new StringBuffer(32*1024);
|
||||||
buf.append("<textarea rows=\"20\" cols=\"80\">");
|
Properties limits = _context.logManager().getLimits();
|
||||||
List logs = _context.logManager().getLogs();
|
TreeSet sortedLogs = new TreeSet();
|
||||||
TreeMap sortedLogs = new TreeMap();
|
for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
|
||||||
for (int i = 0; i < logs.size(); i++) {
|
String prefix = (String)iter.next();
|
||||||
Log l = (Log)logs.get(i);
|
sortedLogs.add(prefix);
|
||||||
sortedLogs.put(l.getName(), l);
|
|
||||||
}
|
}
|
||||||
int i = 0;
|
|
||||||
for (Iterator iter = sortedLogs.values().iterator(); iter.hasNext(); i++) {
|
buf.append("<textarea name=\"levels\" rows=\"20\" cols=\"70\">");
|
||||||
Log l = (Log)iter.next();
|
for (Iterator iter = sortedLogs.iterator(); iter.hasNext(); ) {
|
||||||
buf.append(l.getName()).append('=');
|
String prefix = (String)iter.next();
|
||||||
buf.append(Log.toLevelString(l.getMinimumPriority()));
|
String level = limits.getProperty(prefix);
|
||||||
buf.append("\n");
|
buf.append(prefix).append('=').append(level).append('\n');
|
||||||
}
|
}
|
||||||
buf.append("</textarea><br />\n");
|
buf.append("</textarea><br />\n");
|
||||||
buf.append("<i>Valid levels are DEBUG, INFO, WARN, ERROR, CRIT</i>\n");
|
buf.append("<i>Valid levels are DEBUG, INFO, WARN, ERROR, CRIT</i>\n");
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
public String getLogLevelTableDetail() {
|
public String getDefaultLogLevelBox() {
|
||||||
StringBuffer buf = new StringBuffer(8*1024);
|
String cur = _context.logManager().getDefaultLimit();
|
||||||
buf.append("<table border=\"1\">\n");
|
StringBuffer buf = new StringBuffer(128);
|
||||||
buf.append("<tr><td>Package/class</td><td>Level</td></tr>\n");
|
buf.append("<select name=\"defaultloglevel\">\n");
|
||||||
List logs = _context.logManager().getLogs();
|
|
||||||
TreeMap sortedLogs = new TreeMap();
|
buf.append("<option value=\"DEBUG\" ");
|
||||||
for (int i = 0; i < logs.size(); i++) {
|
if ("DEFAULT".equals(cur)) buf.append(" selected=\"true\" ");
|
||||||
Log l = (Log)logs.get(i);
|
buf.append(">DEBUG</option>\n");
|
||||||
sortedLogs.put(l.getName(), l);
|
|
||||||
}
|
buf.append("<option value=\"INFO\" ");
|
||||||
int i = 0;
|
if ("INFO".equals(cur)) buf.append(" selected=\"true\" ");
|
||||||
for (Iterator iter = sortedLogs.values().iterator(); iter.hasNext(); i++) {
|
buf.append(">INFO</option>\n");
|
||||||
Log l = (Log)iter.next();
|
|
||||||
buf.append("<tr>\n <td><input size=\"50\" type=\"text\" name=\"logrecord.");
|
buf.append("<option value=\"WARN\" ");
|
||||||
buf.append(i).append(".package\" value=\"").append(l.getName());
|
if ("WARN".equals(cur)) buf.append(" selected=\"true\" ");
|
||||||
buf.append("\" /></td>\n");
|
buf.append(">WARN</option>\n");
|
||||||
buf.append("<td><select name=\"logrecord.").append(i);
|
|
||||||
buf.append(".level\">\n\t");
|
buf.append("<option value=\"ERROR\" ");
|
||||||
buf.append("<option value=\"DEBUG\" ");
|
if ("WARN".equals(cur)) buf.append(" selected=\"true\" ");
|
||||||
if (l.getMinimumPriority() == Log.DEBUG)
|
buf.append(">ERROR</option>\n");
|
||||||
buf.append("selected=\"true\" ");
|
|
||||||
buf.append(">Debug</option>\n\t");
|
buf.append("<option value=\"CRIT\" ");
|
||||||
buf.append("<option value=\"INFO\" ");
|
if ("CRIT".equals(cur)) buf.append(" selected=\"true\" ");
|
||||||
if (l.getMinimumPriority() == Log.INFO)
|
buf.append(">CRIT</option>\n");
|
||||||
buf.append("selected=\"true\" ");
|
|
||||||
buf.append(">Info</option>\n\t");
|
buf.append("</select>\n");
|
||||||
buf.append("<option value=\"WARN\" ");
|
|
||||||
if (l.getMinimumPriority() == Log.WARN)
|
|
||||||
buf.append("selected=\"true\" ");
|
|
||||||
buf.append(">Warn</option>\n\t");
|
|
||||||
buf.append("<option value=\"ERROR\" ");
|
|
||||||
if (l.getMinimumPriority() == Log.ERROR)
|
|
||||||
buf.append("selected=\"true\" ");
|
|
||||||
buf.append(">Error</option>\n\t");
|
|
||||||
buf.append("<option value=\"CRIT\" ");
|
|
||||||
if (l.getMinimumPriority() == Log.CRIT)
|
|
||||||
buf.append("selected=\"true\" ");
|
|
||||||
buf.append(">Critical</option>\n\t");
|
|
||||||
buf.append("</select></td>\n</tr>\n");
|
|
||||||
}
|
|
||||||
buf.append("</table>\n");
|
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,13 @@
|
|||||||
|
|
||||||
<div class="main" id="main">
|
<div class="main" id="main">
|
||||||
<%@include file="confignav.jsp" %>
|
<%@include file="confignav.jsp" %>
|
||||||
|
|
||||||
|
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHandler" id="formhandler" scope="request" />
|
||||||
|
<jsp:setProperty name="formhandler" property="*" />
|
||||||
|
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
|
||||||
|
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font>
|
||||||
|
<i><jsp:getProperty name="formhandler" property="notices" /></i>
|
||||||
|
|
||||||
<form action="configlogging.jsp" method="POST">
|
<form action="configlogging.jsp" method="POST">
|
||||||
<b>Logging filename:</b>
|
<b>Logging filename:</b>
|
||||||
<input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" /><br />
|
<input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" /><br />
|
||||||
@ -28,9 +35,12 @@
|
|||||||
<input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" /><br />
|
<input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" /><br />
|
||||||
<hr />
|
<hr />
|
||||||
<b>Log levels:</b> <br />
|
<b>Log levels:</b> <br />
|
||||||
|
<b>Default log level:</b>
|
||||||
|
<jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /><br />
|
||||||
<jsp:getProperty name="logginghelper" property="logLevelTable" />
|
<jsp:getProperty name="logginghelper" property="logLevelTable" />
|
||||||
<hr />
|
<hr />
|
||||||
<input type="submit" value="Apply changes" /> <input type="submit" value="Apply and Save" /> <input type="reset" value="Cancel" />
|
<input type="submit" name="shouldsave" value="Save changes" />
|
||||||
|
<input type="reset" value="Cancel" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user