/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2016 ZAP development team
*
* Licensed 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.zaproxy.zap.extension.stats;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.extension.ExtensionHook;
import org.parosproxy.paros.extension.OptionsChangedListener;
import org.parosproxy.paros.model.OptionsParam;
import org.zaproxy.zap.utils.Stats;
public class ExtensionStats extends ExtensionAdaptor implements OptionsChangedListener {
public static final String NAME = "ExtensionStats";
private InMemoryStats inMemStats;
private Statsd statsd;
private OptionsStatsPanel optionsStatsPanel;
private StatsParam statsParam;
private static final Logger LOG = Logger.getLogger(ExtensionStats.class);
public ExtensionStats() {
super();
initialize();
}
private void initialize() {
this.setName(NAME);
}
@Override
public void hook(ExtensionHook extensionHook) {
super.hook(extensionHook);
extensionHook.addOptionsChangedListener(this);
extensionHook.addOptionsParamSet(getStatsParam());
if (getView() != null) {
extensionHook.getHookView().addOptionPanel(getOptionsStatsPanel());
}
StatsAPI statsAPI = new StatsAPI(this);
extensionHook.addApiImplementor(statsAPI);
statsAPI.addApiOptions(getStatsParam());
}
@Override
public void optionsLoaded() {
optionsChanged();
}
private OptionsStatsPanel getOptionsStatsPanel() {
if (optionsStatsPanel == null) {
optionsStatsPanel = new OptionsStatsPanel();
}
return optionsStatsPanel;
}
private StatsParam getStatsParam() {
if (statsParam == null) {
statsParam = new StatsParam();
}
return statsParam;
}
@Override
public boolean isCore() {
return true;
}
@Override
public String getAuthor() {
return Constant.ZAP_TEAM;
}
@Override
public String getDescription() {
return Constant.messages.getString("stats.desc");
}
@Override
public URL getURL() {
try {
return new URL(Constant.ZAP_HOMEPAGE);
} catch (MalformedURLException e) {
return null;
}
}
/**
* No database tables used, so all supported
*/
@Override
public boolean supportsDb(String type) {
return true;
}
@Override
public void optionsChanged(OptionsParam optionsParam) {
optionsChanged();
}
private void optionsChanged() {
boolean inMemStatsInit = inMemStats != null;
if (inMemStatsInit != this.getStatsParam().isInMemoryEnabled()) {
// Somethings changed
if (!inMemStatsInit) {
LOG.info("Start recording in memory stats");
inMemStats = new InMemoryStats();
Stats.addListener(inMemStats);
} else {
LOG.info("Stop recording in memory stats");
Stats.removeListener(inMemStats);
inMemStats.allCleared();
inMemStats = null;
}
}
boolean statsdInit = statsd != null;
if (statsdInit != this.getStatsParam().isStatsdEnabled()) {
// Somethings changed
if (! statsdInit) {
LOG.info("Start sending stats to statsd server");
try {
statsd = newStatsD(this.getStatsParam());
Stats.addListener(statsd);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
} else {
LOG.info("Stop sending stats to statsd server");
Stats.removeListener(statsd);
statsd = null;
}
} else if (statsdInit) {
if (! StringUtils.equals(this.getStatsParam().getStatsdHost(), statsd.getHost()) ||
this.getStatsParam().getStatsdPort() != statsd.getPort()) {
// Have to re-initialise it
LOG.info("Restart sending stats to statsd server");
try {
Stats.removeListener(statsd);
statsd = newStatsD(this.getStatsParam());
Stats.addListener(statsd);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
} else if (! StringUtils.equals(this.getStatsParam().getStatsdPrefix(), statsd.getPrefix())) {
statsd.setPrefix(this.getStatsParam().getStatsdPrefix());
}
}
}
private Statsd newStatsD (StatsParam param) throws UnknownHostException, IOException {
return new Statsd(
param.getStatsdHost(),
param.getStatsdPort(),
param.getStatsdPrefix());
}
public InMemoryStats getInMemoryStats() {
return this.inMemStats;
}
}