blob: 5761e7041e76c57cd33725b9ad0fc94f6d8d070e [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.Date;
import java.util.StringTokenizer;
import org.apache.log4j.EnhancedPatternLayout;
import org.apache.log4j.spi.LoggingEvent;
public class SnmpEnhancedPatternLayout extends EnhancedPatternLayout {
private String _pairDelimiter = "//";
private String _keyValueDelimiter = "::";
private static final int LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER = 9;
private static final int LENGTH_OF_STRING_MESSAGE = 8;
public String getKeyValueDelimeter() {
return _keyValueDelimiter;
}
public void setKeyValueDelimiter(String keyValueDelimiter) {
this._keyValueDelimiter = keyValueDelimiter;
}
public String getPairDelimiter() {
return _pairDelimiter;
}
public void setPairDelimiter(String pairDelimiter) {
this._pairDelimiter = pairDelimiter;
}
public SnmpTrapInfo parseEvent(LoggingEvent event) {
SnmpTrapInfo snmpTrapInfo = null;
final String message = event.getRenderedMessage();
if (message.contains("alertType") && message.contains("message")) {
snmpTrapInfo = new SnmpTrapInfo();
final StringTokenizer messageSplitter = new StringTokenizer(message, _pairDelimiter);
while (messageSplitter.hasMoreTokens()) {
final String pairToken = messageSplitter.nextToken();
final StringTokenizer pairSplitter = new StringTokenizer(pairToken, _keyValueDelimiter);
String keyToken;
String valueToken;
if (pairSplitter.hasMoreTokens()) {
keyToken = pairSplitter.nextToken().trim();
} else {
break;
}
if (pairSplitter.hasMoreTokens()) {
valueToken = pairSplitter.nextToken().trim();
} else {
break;
}
if (keyToken.equalsIgnoreCase("alertType") && !valueToken.equalsIgnoreCase("null")) {
snmpTrapInfo.setAlertType(Short.parseShort(valueToken));
} else if (keyToken.equalsIgnoreCase("dataCenterId") && !valueToken.equalsIgnoreCase("null")) {
snmpTrapInfo.setDataCenterId(Long.parseLong(valueToken));
} else if (keyToken.equalsIgnoreCase("podId") && !valueToken.equalsIgnoreCase("null")) {
snmpTrapInfo.setPodId(Long.parseLong(valueToken));
} else if (keyToken.equalsIgnoreCase("clusterId") && !valueToken.equalsIgnoreCase("null")) {
snmpTrapInfo.setClusterId(Long.parseLong(valueToken));
} else if (keyToken.equalsIgnoreCase("message") && !valueToken.equalsIgnoreCase("null")) {
snmpTrapInfo.setMessage(getSnmpMessage(message));
}
}
snmpTrapInfo.setGenerationTime(new Date(event.getTimeStamp()));
}
return snmpTrapInfo;
}
private String getSnmpMessage(String message) {
int lastIndexOfKeyValueDelimiter = message.lastIndexOf(_keyValueDelimiter);
int lastIndexOfMessageInString = message.lastIndexOf("message");
if (lastIndexOfKeyValueDelimiter - lastIndexOfMessageInString <= LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER) {
return message.substring(lastIndexOfKeyValueDelimiter + _keyValueDelimiter.length()).trim();
} else if (lastIndexOfMessageInString < lastIndexOfKeyValueDelimiter) {
return message.substring(lastIndexOfMessageInString + _keyValueDelimiter.length() + LENGTH_OF_STRING_MESSAGE).trim();
}
return message.substring(message.lastIndexOf("message" + _keyValueDelimiter) + LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER).trim();
}
}