/*
* Copyright (c) 2014 SDN Hub. 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: Luis Chiang
*/
package org.sdnhub.dnsguard.northbound;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import org.codehaus.enunciate.jaxrs.StatusCodes;
import org.codehaus.enunciate.jaxrs.TypeHint;
import org.opendaylight.controller.northbound.commons.RestMessages;
import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException;
import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils;
import org.opendaylight.controller.sal.authorization.Privilege;
import org.opendaylight.controller.sal.utils.ServiceHelper;
import org.sdnhub.dnsguard.DnsReply;
import org.sdnhub.dnsguard.IDnsGuard;
import org.sdnhub.dnsguard.renders.D3pieData;
import org.sdnhub.dnsguard.renders.DataTableObject;
import org.sdnhub.dnsguard.renders.DnsRecordReply;
import org.sdnhub.dnsguard.renders.DnsUsage;
import org.sdnhub.dnsguard.renders.Violator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* Northbound REST API
*
* This entire web class can be accessed via /northbound prefix as specified in
* web.xml
*
*
*
* Authentication scheme : HTTP Basic
* Authentication realm : opendaylight
* Transport : HTTP and HTTPS
*
* HTTPS Authentication is disabled by default.
*/
@Path("/")
public class AppNorthbound {
protected static final Logger log = LoggerFactory.getLogger(AppNorthbound.class);
@Context
private UriInfo _uriInfo;
private String username;
@Context
public void setSecurityContext(SecurityContext context) {
if (context != null && context.getUserPrincipal() != null) {
username = context.getUserPrincipal().getName();
}
}
protected String getUserName() {
return username;
}
/**
*
* Sample REST API call
*
* @return A response string
*
*
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/test * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/test") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(String.class) @StatusCodes() public String getTest() { String result = "
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/echo/{echo} * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/echo/{echo}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(String.class) @StatusCodes() public String getEcho(@PathParam("echo") String echo) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } String result = "
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/resolv * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/resolv/{IpFrom}/{AppIp}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String getQuery(@PathParam("IpFrom") String ipFrom, @PathParam("AppIp") String appIP) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } String result = "
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/lazyresolv/appIp * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/lazyresolv/{appIp}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String lazyresolv(@PathParam("appIp") String appIp) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } String json = new Gson().toJson( dnshandler.lazyresolv(appIp) ); return json; } /*** * * @param http://127.0.0.1:8080/dnsguard/northbound/appsbyip/{sourceIp} * @return The domains visited by an internal IP */ @Path("/appsbyip/{sourceIp}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String appsbyip(@PathParam("sourceIp") String sourceIp) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } String json = new Gson().toJson( dnshandler.appsbyip(sourceIp) ); return json; } /** * * Returns the violators of the local dns server * * @return A response string * *
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/getviolators * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/getviolators") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String getViolators() { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } List
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/getrecords * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/getrecords") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String getRecords() { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } List
* Example: * * Request URL: * http://127.0.0.1:8080/dnsguard/northbound/getrecords * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/findrecords/") @POST @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String findRecords(@FormParam("draw") String draw, @FormParam("start") String start, @FormParam("length") String length, @FormParam("search[value]") String search) { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } log.info("draw " + draw + " start " + start + " length " + length + " search " + search); //TODO: LC, change behaivor List
* Example: * * Request URL: * http://localhost:8080/dnsguard/northbound/getTopExternalDnsUsage * * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * Sample Northbound API * * Response body in JSON: * Sample Northbound API **/ @Path("/getTopExternalDnsUsage") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON }) @TypeHint(String.class) @StatusCodes() public String getTopExternalDnsUsage() { if (!NorthboundUtils.isAuthorized(getUserName(), "default", Privilege.READ, this)) { throw new UnauthorizedException("User is not authorized to perform this operation"); } IDnsGuard dnshandler = (IDnsGuard) ServiceHelper.getInstance(IDnsGuard.class, "default", this); if (dnshandler == null) { throw new ServiceUnavailableException("DnsHandler Service " + RestMessages.SERVICEUNAVAILABLE.toString()); } List