1+ // Licensed to the Apache Software Foundation (ASF) under one
2+ // or more contributor license agreements. See the NOTICE file
3+ // distributed with this work for additional information
4+ // regarding copyright ownership. The ASF licenses this file
5+ // to you under the Apache License, Version 2.0 (the
6+ // "License"); you may not use this file except in compliance
7+ // with the License. You may obtain a copy of the License at
8+ //
9+ // http://www.apache.org/licenses/LICENSE-2.0
10+ //
11+ // Unless required by applicable law or agreed to in writing,
12+ // software distributed under the License is distributed on an
13+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+ // KIND, either express or implied. See the License for the
15+ // specific language governing permissions and limitations
16+ // under the License
17+
18+ package org .apache .cloudstack .alert .snmp ;
19+
20+ import org .apache .log4j .EnhancedPatternLayout ;
21+ import org .apache .log4j .spi .LoggingEvent ;
22+
23+ import java .util .Date ;
24+ import java .util .StringTokenizer ;
25+
26+ public class SnmpEnhancedPatternLayout extends EnhancedPatternLayout {
27+ private String _pairDelimiter = "//" ;
28+ private String _keyValueDelimiter = "::" ;
29+
30+ private static final int LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER = 9 ;
31+ private static final int LENGTH_OF_STRING_MESSAGE = 8 ;
32+
33+ public String getKeyValueDelimeter () {
34+ return _keyValueDelimiter ;
35+ }
36+
37+ public void setKeyValueDelimiter (String keyValueDelimiter ) {
38+ this ._keyValueDelimiter = keyValueDelimiter ;
39+ }
40+
41+ public String getPairDelimiter () {
42+ return _pairDelimiter ;
43+ }
44+
45+ public void setPairDelimiter (String pairDelimiter ) {
46+ this ._pairDelimiter = pairDelimiter ;
47+ }
48+
49+ public SnmpTrapInfo parseEvent (LoggingEvent event ) {
50+ SnmpTrapInfo snmpTrapInfo = null ;
51+
52+ final String message = event .getRenderedMessage ();
53+ if (message .contains ("alertType" ) && message .contains ("message" )) {
54+ snmpTrapInfo = new SnmpTrapInfo ();
55+ final StringTokenizer messageSplitter = new StringTokenizer (message , _pairDelimiter );
56+ while (messageSplitter .hasMoreTokens ()) {
57+ final String pairToken = messageSplitter .nextToken ();
58+ final StringTokenizer pairSplitter = new StringTokenizer (pairToken , _keyValueDelimiter );
59+ String keyToken ;
60+ String valueToken ;
61+
62+ if (pairSplitter .hasMoreTokens ()) {
63+ keyToken = pairSplitter .nextToken ().trim ();
64+ } else {
65+ break ;
66+ }
67+
68+ if (pairSplitter .hasMoreTokens ()) {
69+ valueToken = pairSplitter .nextToken ().trim ();
70+ } else {
71+ break ;
72+ }
73+
74+ if (keyToken .equalsIgnoreCase ("alertType" ) && !valueToken .equalsIgnoreCase ("null" )) {
75+ snmpTrapInfo .setAlertType (Short .parseShort (valueToken ));
76+ } else if (keyToken .equalsIgnoreCase ("dataCenterId" ) && !valueToken .equalsIgnoreCase ("null" )) {
77+ snmpTrapInfo .setDataCenterId (Long .parseLong (valueToken ));
78+ } else if (keyToken .equalsIgnoreCase ("podId" ) && !valueToken .equalsIgnoreCase ("null" )) {
79+ snmpTrapInfo .setPodId (Long .parseLong (valueToken ));
80+ } else if (keyToken .equalsIgnoreCase ("clusterId" ) && !valueToken .equalsIgnoreCase ("null" )) {
81+ snmpTrapInfo .setClusterId (Long .parseLong (valueToken ));
82+ } else if (keyToken .equalsIgnoreCase ("message" ) && !valueToken .equalsIgnoreCase ("null" )) {
83+ snmpTrapInfo .setMessage (getSnmpMessage (message ));
84+ }
85+ }
86+
87+ snmpTrapInfo .setGenerationTime (new Date (event .getTimeStamp ()));
88+ }
89+ return snmpTrapInfo ;
90+ }
91+
92+ private String getSnmpMessage (String message ) {
93+ int lastIndexOfKeyValueDelimiter = message .lastIndexOf (_keyValueDelimiter );
94+ int lastIndexOfMessageInString = message .lastIndexOf ("message" );
95+
96+ if (lastIndexOfKeyValueDelimiter - lastIndexOfMessageInString <=
97+ LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER ) {
98+ return message .substring (lastIndexOfKeyValueDelimiter + _keyValueDelimiter .length ()).trim ();
99+ } else if (lastIndexOfMessageInString < lastIndexOfKeyValueDelimiter ) {
100+ return message .substring (
101+ lastIndexOfMessageInString + _keyValueDelimiter .length () + LENGTH_OF_STRING_MESSAGE ).trim ();
102+ }
103+
104+ return message .substring (message .lastIndexOf ("message" + _keyValueDelimiter ) +
105+ LENGTH_OF_STRING_MESSAGE_AND_KEY_VALUE_DELIMITER ).trim ();
106+ }
107+ }
0 commit comments