/*
* JBoss, Home of Professional Open Source
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.searchisko.api.rest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
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.SecurityContext;
import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolFilterBuilder;
import org.elasticsearch.index.query.FilterBuilders;
import org.searchisko.api.audit.annotation.Audit;
import org.searchisko.api.audit.annotation.AuditIgnore;
import org.searchisko.api.security.Role;
import org.searchisko.api.service.SearchIndexMissingException;
import org.searchisko.api.service.StatsClientService;
import org.searchisko.api.service.StatsRecordType;
import org.searchisko.api.service.SystemInfoService;
import org.searchisko.persistence.service.PersistenceService;
/**
* System related REST service
*
* @author Lukas Vcek
* @author Vlastimil Elias (velias at redhat dot com)
*/
@Path("/sys")
@RequestScoped
@RolesAllowed(Role.ADMIN)
@Audit
public class SystemRestService {
@Context
protected SecurityContext securityContext;
@Inject
private SystemInfoService systemInfoService;
@Inject
private StatsClientService statsClientService;
@Inject
private PersistenceService persistenceService;
@GET
@Path("/info")
@Produces(MediaType.APPLICATION_JSON)
@PermitAll
public Map<Object, Object> info() throws IOException {
return systemInfoService.getSystemInfo(securityContext.isUserInRole(Role.ADMIN));
}
@GET
@Path("/persistence")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> persistence() {
Map<String, Object> tables = persistenceService.getTableCounts();
Map<String, Object> row_counts = new HashMap<>();
row_counts.put("counts", tables);
Map<String, Object> ret = new HashMap<>();
ret.put("tables", row_counts);
return ret;
}
@GET
@Path("/auditlog")
@Produces(MediaType.APPLICATION_JSON)
@AuditIgnore
public StreamingOutput getAuditLog(
@QueryParam("operation") String operation,
@QueryParam("path") String path,
@QueryParam("username") String username,
@QueryParam("usertype") String usertype,
@QueryParam("id") String id,
@QueryParam("from") Integer from,
@QueryParam("size") Integer size,
@QueryParam("sort") String sort) throws IOException {
BoolFilterBuilder filterBuilder = FilterBuilders.boolFilter();
boolean filterAdded = false;
if (StringUtils.isNotBlank(path)) {
filterAdded = true;
filterBuilder.must(FilterBuilders.prefixFilter("path", path));
}
if (StringUtils.isNotBlank(operation)) {
filterAdded = true;
filterBuilder.must(FilterBuilders.termFilter("operation", operation));
}
if (StringUtils.isNotBlank(username)) {
filterAdded = true;
filterBuilder.must(FilterBuilders.termFilter("username", username));
}
if (StringUtils.isNotBlank(usertype)) {
filterAdded = true;
filterBuilder.must(FilterBuilders.termFilter("usertype", usertype));
}
if (StringUtils.isNotBlank(id)) {
filterAdded = true;
filterBuilder.must(FilterBuilders.termFilter("id", id));
}
if (!filterAdded) {
filterBuilder = null;
}
try {
SearchResponse response = statsClientService.performSearch(StatsRecordType.AUDIT, filterBuilder, from, size, sort);
return new ESDataOnlyResponse(response);
} catch (SearchIndexMissingException e) {
return null;
}
}
}