/** * Copyright 2014 Comcast Cable Communications Management, LLC * * This file is part of CATS. * * CATS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CATS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with CATS. If not, see <http://www.gnu.org/licenses/>. */ package com.comcast.cats.monitor.reboot; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A reboot monitor that detects reboot specific to Barcelona RNG boxes. * * @author skurup00c */ public class BarcelonaRebootMonitor extends SNMPRebootMonitor { protected final static String BARCELONA_COMMUNITY_STRING = "hDaFHJG7"; protected final static String BARCELONA_REBOOT_OID = ".1.3.6.1.2.1.1.3.0"; protected final static String REBOOT_DETECTION_REGEX_STRING = "days?[&&,]"; protected final static String[] EXPECTED_DATE_FORMATS = { "H:mm:ss.S" }; public final static String PREFERRED_SCHEDULE_CRON_EXPRESSION = "0 0/2 * 1/1 * ? *"; private Logger logger = LoggerFactory.getLogger( BarcelonaRebootMonitor.class ); public BarcelonaRebootMonitor() { setCommunity( BARCELONA_COMMUNITY_STRING ); setRebootOID( BARCELONA_REBOOT_OID ); } @Override public void setState( Object stateObject ) { if ( stateObject instanceof Calendar ) { super.setState( stateObject ); } else { logger.warn( "State object obtained is not what is expected by BarcelonaRebootMonitor " ); throw new IllegalArgumentException( "State object obtained is not what is expected by BarcelonaRebootMonitor " ); } } /** * Parse the snmp result to detect reboot. * * Examples of expected results : "18:54:41.36", "2 days, 18:54:41.36", * "1 day, 18:54:41.36" */ @Override protected void parseRebootInfo( String snmpQueryResult ) { logger.debug( "snmpQueryResult " + snmpQueryResult ); long upTime = 0; String upTimeDays = null; String upTimehours; try { if ( snmpQueryResult != null && !snmpQueryResult.isEmpty() ) { Pattern pattern = Pattern.compile( REBOOT_DETECTION_REGEX_STRING ); Matcher matcher = pattern.matcher( snmpQueryResult ); if ( matcher.find() ) { // seperate the days information and the time information. upTimeDays = StringUtils.substringBefore( snmpQueryResult, matcher.group() ).trim(); upTimehours = StringUtils.substringAfter( snmpQueryResult, matcher.group() ).trim(); } else { upTimehours = snmpQueryResult.trim(); } upTime = calculateUptime( upTimeDays, upTimehours ); long timeInterval = calculcateMonitorTimeIntervalInMillis(); logger.debug( "timeInterval sec " + ( timeInterval / ( 1000 ) ) ); logger.debug( "upTime sec " + ( upTime ) / 1000 ); if ( timeInterval > upTime ) { logger.debug( "Reboot Happened" ); RebootStatistics stats = new RebootStatistics( new Date() ); stats.setMonitorType( REBOOT_TYPE ); stats.setMessage( "UP Time " + snmpQueryResult, settop.getHostMacAddress() ); stats.setUptime( upTime/1000 ); alarm(stats); } else { logger.trace( "NO Reboot Happened" ); } } else { logger.debug( "SNMP detection failed : No response from settop " + snmpQueryResult ); } } catch ( ParseException e ) { logger.trace( "Result not in an expected format : " + e.getMessage() ); } catch ( NumberFormatException e ) { logger.trace( "Result not in an expected format : " + e.getMessage() ); } ((Calendar)getState()).setTime( new Date() ); } /** * Calculates the uptime of the box. */ private long calculateUptime( String upTimeDays, String upTimehours ) throws ParseException, NumberFormatException { Date actualUptime = DateUtils.parseDate( upTimehours, EXPECTED_DATE_FORMATS ); if ( upTimeDays != null ) { actualUptime = DateUtils.addDays( actualUptime, Integer.parseInt( upTimeDays ) ); } Calendar cal = Calendar.getInstance(); cal.setTime( actualUptime ); cal.getTimeInMillis(); long upTimemillis = ( cal.get( Calendar.HOUR_OF_DAY ) * 60 * 60 * 1000 ) + ( cal.get( Calendar.MINUTE ) * 60 * 1000 ) + ( cal.get( Calendar.SECOND ) * 1000 ) + ( cal.get( Calendar.MILLISECOND ) ); return upTimemillis; } /** * Calculate time interval between SNMP queries. * * @return time difference in millis */ private long calculcateMonitorTimeIntervalInMillis() { Calendar currentTime = Calendar.getInstance(); Calendar lastMonitoredTime = ( Calendar ) getState(); return currentTime.getTimeInMillis() - lastMonitoredTime.getTimeInMillis(); } }