blob: 5374e39916d45304c6e17643f8757dc16944b2f4 [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.cloudstack.alert.snmp;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;
import com.cloud.utils.net.NetUtils;
public class SnmpTrapAppender extends AppenderSkeleton {
private String _delimiter = ",";
private String _snmpManagerIpAddresses;
private String _snmpManagerPorts;
private String _snmpManagerCommunities;
private String _oldSnmpManagerIpAddresses = null;
private String _oldSnmpManagerPorts = null;
private String _oldSnmpManagerCommunities = null;
private List<String> _ipAddresses = null;
private List<String> _communities = null;
private List<String> _ports = null;
List<SnmpHelper> _snmpHelpers = new ArrayList<SnmpHelper>();
@Override
protected void append(LoggingEvent event) {
SnmpEnhancedPatternLayout snmpEnhancedPatternLayout;
if (getLayout() == null) {
errorHandler.error("No layout set for the Appender named [" + getName() + ']', null, ErrorCode.MISSING_LAYOUT);
return;
}
if (getLayout() instanceof SnmpEnhancedPatternLayout) {
snmpEnhancedPatternLayout = (SnmpEnhancedPatternLayout)getLayout();
} else {
return;
}
if (!isAsSevereAsThreshold(event.getLevel())) {
return;
}
SnmpTrapInfo snmpTrapInfo = snmpEnhancedPatternLayout.parseEvent(event);
if (snmpTrapInfo != null && !_snmpHelpers.isEmpty()) {
for (SnmpHelper helper : _snmpHelpers) {
try {
helper.sendSnmpTrap(snmpTrapInfo);
} catch (Exception e) {
errorHandler.error(e.getMessage());
}
}
}
}
void setSnmpHelpers() {
if (_snmpManagerIpAddresses == null || _snmpManagerIpAddresses.trim().isEmpty() || _snmpManagerCommunities == null || _snmpManagerCommunities.trim().isEmpty() ||
_snmpManagerPorts == null || _snmpManagerPorts.trim().isEmpty()) {
reset();
return;
}
if (_oldSnmpManagerIpAddresses != null && _oldSnmpManagerIpAddresses.equals(_snmpManagerIpAddresses) &&
_oldSnmpManagerCommunities.equals(_snmpManagerCommunities) && _oldSnmpManagerPorts.equals(_snmpManagerPorts)) {
return;
}
_oldSnmpManagerIpAddresses = _snmpManagerIpAddresses;
_oldSnmpManagerPorts = _snmpManagerPorts;
_oldSnmpManagerCommunities = _snmpManagerCommunities;
_ipAddresses = parse(_snmpManagerIpAddresses);
_communities = parse(_snmpManagerCommunities);
_ports = parse(_snmpManagerPorts);
if (!(_ipAddresses.size() == _communities.size() && _ipAddresses.size() == _ports.size())) {
reset();
errorHandler.error(" size of ip addresses , communities, " + "and ports list doesn't match, " + "setting all to null");
return;
}
if (!validateIpAddresses() || !validatePorts()) {
reset();
errorHandler.error(" Invalid format for the IP Addresses or Ports parameter ");
return;
}
String address;
for (int i = 0; i < _ipAddresses.size(); i++) {
address = _ipAddresses.get(i) + "/" + _ports.get(i);
try {
_snmpHelpers.add(new SnmpHelper(address, _communities.get(i)));
} catch (Exception e) {
errorHandler.error(e.getMessage());
}
}
}
private void reset() {
_ipAddresses = null;
_communities = null;
_ports = null;
_snmpHelpers.clear();
}
@Override
public void close() {
if (!closed)
closed = true;
}
@Override
public boolean requiresLayout() {
return true;
}
private List<String> parse(String str) {
List<String> result = new ArrayList<String>();
final StringTokenizer tokenizer = new StringTokenizer(str, _delimiter);
while (tokenizer.hasMoreTokens()) {
result.add(tokenizer.nextToken().trim());
}
return result;
}
private boolean validatePorts() {
for (String port : _ports) {
if (!NetUtils.isValidPort(port)) {
return false;
}
}
return true;
}
private boolean validateIpAddresses() {
for (String ipAddress : _ipAddresses) {
if (ipAddress.trim().equalsIgnoreCase("localhost")) {
continue;
}
if (!NetUtils.isValidIp4(ipAddress)) {
return false;
}
}
return true;
}
public String getSnmpManagerIpAddresses() {
return _snmpManagerIpAddresses;
}
public void setSnmpManagerIpAddresses(String snmpManagerIpAddresses) {
this._snmpManagerIpAddresses = snmpManagerIpAddresses;
setSnmpHelpers();
}
public String getSnmpManagerPorts() {
return _snmpManagerPorts;
}
public void setSnmpManagerPorts(String snmpManagerPorts) {
this._snmpManagerPorts = snmpManagerPorts;
setSnmpHelpers();
}
public String getSnmpManagerCommunities() {
return _snmpManagerCommunities;
}
public void setSnmpManagerCommunities(String snmpManagerCommunities) {
this._snmpManagerCommunities = snmpManagerCommunities;
setSnmpHelpers();
}
public String getDelimiter() {
return _delimiter;
}
public void setDelimiter(String delimiter) {
this._delimiter = delimiter;
}
}