org.apache.metron.rest.controller.PcapController.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.metron.rest.controller.PcapController.java

Source

/**
 * 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.metron.rest.controller;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.commons.io.IOUtils;
import org.apache.metron.job.JobStatus;
import org.apache.metron.rest.RestException;
import org.apache.metron.rest.model.pcap.FixedPcapRequest;
import org.apache.metron.rest.model.pcap.PcapStatus;
import org.apache.metron.rest.model.pcap.Pdml;
import org.apache.metron.rest.model.pcap.QueryPcapRequest;
import org.apache.metron.rest.security.SecurityUtils;
import org.apache.metron.rest.service.PcapService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/v1/pcap")
public class PcapController {

    private static final String PCAP_FILENAME_FORMAT = "pcap_%s_%s.pcap";

    @Autowired
    private PcapService pcapQueryService;

    @ApiOperation(value = "Executes a Fixed Filter Pcap Query.")
    @ApiResponses(value = { @ApiResponse(message = "Returns a job status with job ID.", code = 200) })
    @RequestMapping(value = "/fixed", method = RequestMethod.POST)
    ResponseEntity<PcapStatus> fixed(@ApiParam(name = "fixedPcapRequest", value = "A Fixed Pcap Request"
            + " which includes fixed filter fields like ip source address and protocol", required = true) @RequestBody FixedPcapRequest fixedPcapRequest)
            throws RestException {
        PcapStatus pcapStatus = pcapQueryService.submit(SecurityUtils.getCurrentUser(), fixedPcapRequest);
        return new ResponseEntity<>(pcapStatus, HttpStatus.OK);
    }

    @ApiOperation(value = "Executes a Query Filter Pcap Query.")
    @ApiResponses(value = { @ApiResponse(message = "Returns a job status with job ID.", code = 200) })
    @RequestMapping(value = "/query", method = RequestMethod.POST)
    ResponseEntity<PcapStatus> query(@ApiParam(name = "queryPcapRequest", value = "A Query Pcap Request"
            + " which includes Stellar query field", required = true) @RequestBody QueryPcapRequest queryPcapRequest)
            throws RestException {
        PcapStatus pcapStatus = pcapQueryService.submit(SecurityUtils.getCurrentUser(), queryPcapRequest);
        return new ResponseEntity<>(pcapStatus, HttpStatus.OK);
    }

    @ApiOperation(value = "Gets job status for Pcap query job.")
    @ApiResponses(value = { @ApiResponse(message = "Returns a job status for the Job ID.", code = 200),
            @ApiResponse(message = "Job is missing.", code = 404) })
    @RequestMapping(value = "/{jobId}", method = RequestMethod.GET)
    ResponseEntity<PcapStatus> getStatus(
            @ApiParam(name = "jobId", value = "Job ID of submitted job", required = true) @PathVariable String jobId)
            throws RestException {
        PcapStatus jobStatus = pcapQueryService.getJobStatus(SecurityUtils.getCurrentUser(), jobId);
        if (jobStatus != null) {
            return new ResponseEntity<>(jobStatus, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @ApiOperation(value = "Gets a list of job statuses for Pcap query jobs that match the requested state.")
    @ApiResponses(value = {
            @ApiResponse(message = "Returns a list of job statuses for jobs that match the requested state.", code = 200) })
    @RequestMapping(method = RequestMethod.GET)
    ResponseEntity<List<PcapStatus>> getStatuses(
            @ApiParam(name = "state", value = "Job state", required = true) @RequestParam String state)
            throws RestException {

        List<PcapStatus> jobs = pcapQueryService.getJobStatus(SecurityUtils.getCurrentUser(),
                JobStatus.State.valueOf(state));
        return new ResponseEntity<>(jobs, HttpStatus.OK);
    }

    @ApiOperation(value = "Gets Pcap Results for a page in PDML format.")
    @ApiResponses(value = { @ApiResponse(message = "Returns PDML in json format.", code = 200),
            @ApiResponse(message = "Job or page is missing.", code = 404) })
    @RequestMapping(value = "/{jobId}/pdml", method = RequestMethod.GET)
    ResponseEntity<Pdml> pdml(
            @ApiParam(name = "jobId", value = "Job ID of submitted job", required = true) @PathVariable String jobId,
            @ApiParam(name = "page", value = "Page number", required = true) @RequestParam Integer page)
            throws RestException {
        Pdml pdml = pcapQueryService.getPdml(SecurityUtils.getCurrentUser(), jobId, page);
        if (pdml != null) {
            return new ResponseEntity<>(pdml, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @ApiOperation(value = "Kills running job.")
    @ApiResponses(value = { @ApiResponse(message = "Kills passed job.", code = 200) })
    @RequestMapping(value = "/kill/{jobId}", method = RequestMethod.DELETE)
    ResponseEntity<PcapStatus> killJob(
            @ApiParam(name = "jobId", value = "Job ID of submitted job", required = true) @PathVariable String jobId)
            throws RestException {
        PcapStatus jobStatus = pcapQueryService.killJob(SecurityUtils.getCurrentUser(), jobId);
        if (jobStatus != null) {
            return new ResponseEntity<>(jobStatus, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @ApiOperation(value = "Download Pcap Results for a page.")
    @ApiResponses(value = { @ApiResponse(message = "Returns Pcap as a file download.", code = 200),
            @ApiResponse(message = "Job or page is missing.", code = 404) })
    @RequestMapping(value = "/{jobId}/raw", method = RequestMethod.GET)
    void raw(
            @ApiParam(name = "jobId", value = "Job ID of submitted job", required = true) @PathVariable String jobId,
            @ApiParam(name = "page", value = "Page number", required = true) @RequestParam Integer page,
            @RequestParam(defaultValue = "", required = false) String fileName, final HttpServletRequest request,
            final HttpServletResponse response) throws RestException {
        try (InputStream inputStream = pcapQueryService.getRawPcap(SecurityUtils.getCurrentUser(), jobId, page);
                OutputStream output = response.getOutputStream()) {
            response.reset();
            if (inputStream == null) {
                response.setStatus(HttpStatus.NOT_FOUND.value());
            } else {
                response.setContentType("application/octet-stream");
                if (fileName.isEmpty()) {
                    fileName = String.format(PCAP_FILENAME_FORMAT, jobId, page);
                }
                response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
                int size = IOUtils.copy(inputStream, output);
                response.setContentLength(size);
                output.flush();
            }
        } catch (IOException e) {
            throw new RestException(e);
        }
    }

    @ApiOperation(value = "Gets job configuration for Pcap query job.")
    @ApiResponses(value = { @ApiResponse(message = "Returns a map of job properties for the Job ID.", code = 200),
            @ApiResponse(message = "Job is missing.", code = 404) })
    @RequestMapping(value = "/{jobId}/config", method = RequestMethod.GET)
    ResponseEntity<Map<String, Object>> getConfiguration(
            @ApiParam(name = "jobId", value = "Job ID of submitted job", required = true) @PathVariable String jobId)
            throws RestException {
        Map<String, Object> configuration = pcapQueryService.getConfiguration(SecurityUtils.getCurrentUser(),
                jobId);
        if (configuration != null) {
            return new ResponseEntity<>(configuration, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

}