/**
* Copyright (c) <2013> <Radware Ltd.> and others. All rights reserved.
*
* This program and the accompanying materials are made available under the terms of the Eclipse Public License
* v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
* @author Konstantin Pozdeev
* @version 0.1
*/
package org.opendaylight.defense4all.framework.restservice;
import org.opendaylight.defense4all.framework.core.EventRecordData;
import org.opendaylight.defense4all.framework.core.FMHolder;
import org.opendaylight.defense4all.framework.core.FR;
import org.opendaylight.defense4all.framework.core.FR.FilterRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Path("/fr")
public class FlightRecorderRestService {
static Logger log = LoggerFactory.getLogger("org.opendaylight.defense4all.restservice");
static final String MAX_NUM_PARAM = "maxNum";
static final String FROM_DATE_PARAM = "fromDate";
static final String TO_DATE_PARAM = "toDate";
static final String TO_FILE_PARAM = "toFile";
static final String OLDER_DAYS_PARAM = "olderDays";
static final String FILTER_PARAM = "filter";
static final SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy_hh:mm:ss");
@Context
UriInfo uriInfo;
@Context
Request request;
@GET
@Path("events")
@Produces(MediaType.APPLICATION_JSON)
public List<EventRecordData> getEvents(@QueryParam(MAX_NUM_PARAM) int maxNum,
@QueryParam(FROM_DATE_PARAM) String fromDateStr, @QueryParam(TO_DATE_PARAM) String toDateStr,
@QueryParam(FILTER_PARAM) String filterStr,
@Context HttpServletResponse servletResponse) throws IOException {
log.debug("FlightRecorderRestService latest : invoked");
log.debug("Params :"+maxNum+":"+fromDateStr+":"+toDateStr);
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
// verifying the format of the sent date
Date fromDate = null; Date toDate = null;
try {
if (fromDateStr != null )
fromDate = sdf.parse(fromDateStr);
if ( toDateStr != null )
toDate = sdf.parse( toDateStr );
} catch ( Throwable pe) {
log.error("Failed to parse input parameters " + pe.getLocalizedMessage());
servletResponse.sendError(400);
return null;
}
if ( fromDate == null || toDate == null ) {
log.error("Bad input parameters");
servletResponse.sendError(400);
return null;
}
FilterRecord filterRec = null;
if ( filterStr != null ) {
filterRec = FMHolder.get().getFR().createFilter(filterStr);
}
List<EventRecordData> events;
try {
events = FMHolder.get().getFR().getTimeRangeEvents(fromDate, toDate, maxNum, filterRec);
} catch (Throwable e) {
log.error("Failed to retrieve time range events. " + e.getLocalizedMessage());
servletResponse.sendError(500);
return null;
}
return events;
}
@GET
@Path("latest")
@Produces(MediaType.APPLICATION_JSON)
public List<EventRecordData> getLatest(@QueryParam(MAX_NUM_PARAM) int maxNum, @QueryParam(FILTER_PARAM) String filterStr,
@Context HttpServletResponse servletResponse) throws IOException {
log.debug("FlightRecorderRestService events : invoked");
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
FilterRecord filterRec = null;
if ( filterStr != null ) {
filterRec = FMHolder.get().getFR().createFilter(filterStr);
}
List<EventRecordData> events = null;
try {
events = FMHolder.get().getFR().getLatestEvents(maxNum, filterRec);
} catch (Throwable e) {
log.error("Failed to retrieve latest events. " + e.getLocalizedMessage());
servletResponse.sendError(500);
return null;
}
return events;
}
@GET
@Path("outputFilePrefix")
@Produces(MediaType.APPLICATION_JSON)
public String geOutputFilePrefix(@Context HttpServletResponse servletResponse) throws IOException {
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
FR fr =FMHolder.get().getFR();
return fr.getOutputFilePrefix();
}
@GET
@Path("outputFileSuffix")
@Produces(MediaType.APPLICATION_JSON)
public String geOutputFileSuffix(@Context HttpServletResponse servletResponse) throws IOException {
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
FR fr = FMHolder.get().getFR();
return fr.getOutputFileSuffix();
}
@POST
@Path("dump")
@Consumes(MediaType.APPLICATION_JSON)
public String dump(Map<String,String> input , @Context HttpServletResponse servletResponse) throws Exception {
log.debug("FlightRecorderRestService dump");
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
String fileName = input.get(TO_FILE_PARAM);
if ( fileName == null ) {
log.error("Empty file name parameter" );
servletResponse.sendError(400);
return null;
}
// verifying the format of the sent date
String fromDateStr = input.get(FROM_DATE_PARAM);
String toDateStr = input.get(TO_DATE_PARAM);
String maxNumStr = input.get(MAX_NUM_PARAM );
String filterStr = input.get(FILTER_PARAM );
Date fromDate = null; Date toDate = null;
Integer maxNum = 0; FilterRecord filterRec = null;
try {
if (fromDateStr != null )
fromDate = sdf.parse(fromDateStr);
if ( toDateStr != null )
toDate = sdf.parse( toDateStr );
if ( maxNumStr != null )
maxNum = Integer.valueOf(maxNumStr);
if (filterStr != null )
filterRec = FMHolder.get().getFR().createFilter(filterStr);
} catch ( Throwable pe) {
log.error("Failed to parse input parameters " + pe.getLocalizedMessage());
servletResponse.sendError(400);
return null;
}
try {
if ( fromDate != null && toDate != null )
FMHolder.get().getFR().dump(fileName, fromDate, toDate, maxNum, filterRec);
else
FMHolder.get().getFR().dump(fileName, filterRec);
} catch (Throwable ex ) {
StringBuilder sb = new StringBuilder();
sb.append("Failed to dump to "); sb.append(fileName);
sb.append(". filter = "); sb.append(filterStr);
if(fromDate != null) {
sb.append(". from date = "); sb.append(fromDate);
}
if(toDate != null) {
sb.append(". to date = "); sb.append(toDate);
}
log.error(sb.toString());
log.error(ex.getLocalizedMessage() );
servletResponse.sendError(500);
}
return fileName;
}
@POST
@Path("cleanup")
@Consumes(MediaType.APPLICATION_JSON)
public String cleanup(Map<String,String> input , @Context HttpServletResponse servletResponse) throws Exception {
log.debug("FlightRecorderRestService cleanup");
if ( ! FMHolder.get().isOpenForBusiness() ) {
servletResponse.sendError(503, "Service is unavailable" );
return null;
}
String olderDaysStr = null; int olderDays = 0;
olderDaysStr = input.get(OLDER_DAYS_PARAM);
if ( olderDaysStr == null ) {
log.error("Empty cleanup days parameter." );
servletResponse.sendError(400);
return null;
}
try {
olderDays = Integer.valueOf(olderDaysStr);
} catch ( Throwable pe) {
log.error("Failed to parse olderDaysStr. " + pe.getLocalizedMessage());
servletResponse.sendError(400);
return null;
}
try {
FMHolder.get().getFR().reset(olderDays);
} catch (Throwable ex ) {
log.error("Failed to reset flight recorder.");
log.error(ex.getLocalizedMessage() );
servletResponse.sendError(500);
}
return olderDaysStr;
}
}