package be.neutrinet.ispng.vpn.api;
import be.neutrinet.ispng.VPN;
import be.neutrinet.ispng.vpn.Client;
import be.neutrinet.ispng.vpn.Clients;
import be.neutrinet.ispng.vpn.ip.IPSubnet;
import be.neutrinet.ispng.vpn.ip.IPSubnets;
import be.neutrinet.ispng.vpn.ip.SubnetLeases;
import org.apache.log4j.Logger;
import org.restlet.data.Status;
import org.restlet.ext.jackson.JacksonRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.Put;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by wannes on 12/1/14.
*/
public class SubnetLease extends ResourceBase {
@Get
public Representation getSubnetLeases() {
try {
if (getRequestAttributes().containsKey("id")) {
return new JacksonRepresentation<>(SubnetLeases.dao.queryForId(getAttribute("id")));
}
HashMap<Client, be.neutrinet.ispng.vpn.ip.SubnetLease> ip6 = new HashMap<>();
for (Client c : Clients.dao.queryForAll()) {
for (be.neutrinet.ispng.vpn.ip.SubnetLease sl : SubnetLeases.dao.queryForEq("client_id", c.id)) {
ip6.put(c, sl);
}
}
return new JacksonRepresentation<>(ip6);
} catch (SQLException ex) {
Logger.getLogger(getClass()).error("Failed to get assigned leases", ex);
}
return DEFAULT_ERROR;
}
@Put
public Representation create(Map<String, Object> data) {
int clientId = (int) data.get("client");
assert clientId > 0;
int version = (int) data.get("version");
assert version == 6;
if (!data.containsKey("prefix")) {
return clientError("INVALID_REQUEST", Status.CLIENT_ERROR_BAD_REQUEST);
}
int v6prefix = Integer.parseInt(data.get("prefix").toString());
if (v6prefix < Integer.parseInt(VPN.cfg.getProperty("vpn.ipv6.pool.minAllocPrefix", "48"))) {
return clientError("IP_ADDRESS_LEASE_TOO_LARGE", Status.CLIENT_ERROR_NOT_ACCEPTABLE);
}
try {
Client client = Clients.dao.queryForId("" + clientId);
IPSubnet ips = IPSubnets.allocate(v6prefix, false, 6);
if (ips == null) {
return clientError("OUT_OF_ADDRESS_SPACE", Status.SERVER_ERROR_INTERNAL);
} else {
be.neutrinet.ispng.vpn.ip.SubnetLease sl = new be.neutrinet.ispng.vpn.ip.SubnetLease();
sl.active = true;
sl.client = client;
sl.subnet = ips;
SubnetLeases.dao.create(sl);
return new JacksonRepresentation<>(ips);
}
} catch (SQLException ex) {
Logger.getLogger(getClass()).error("Failed to create subnet lease", ex);
}
return DEFAULT_ERROR;
}
@Post
public Representation updateLease(be.neutrinet.ispng.vpn.ip.SubnetLease sl) {
if (!getRequestAttributes().containsKey("id"))
return clientError("INVALID_REQUEST", Status.CLIENT_ERROR_BAD_REQUEST);
if (sl == null) return clientError("INVALID_REQUEST", Status.CLIENT_ERROR_BAD_REQUEST);
try {
be.neutrinet.ispng.vpn.ip.SubnetLease subnetLease = SubnetLeases.dao.queryForId(getAttribute("id"));
mergeUpdate(subnetLease, sl);
SubnetLeases.dao.update(subnetLease);
} catch (SQLException ex) {
Logger.getLogger(getClass()).error("Failed to update subnet lease", ex);
}
return new JacksonRepresentation<>(sl);
}
@Delete
public Representation deleteLease() {
if (!getRequestAttributes().containsKey("id"))
return clientError("INVALID_REQUEST", Status.CLIENT_ERROR_BAD_REQUEST);
try {
be.neutrinet.ispng.vpn.ip.SubnetLease sl = SubnetLeases.dao.queryForId(getAttribute("id"));
SubnetLeases.dao.delete(sl);
if (!getRequestAttributes().containsKey("shallow")) {
IPSubnets.dao.delete(sl.subnet);
}
return new JacksonRepresentation<>(sl);
} catch (SQLException ex) {
Logger.getLogger(getClass()).error("Failed to delete subnet lease", ex);
}
return DEFAULT_ERROR;
}
}