package com.intrbiz.bergamot.ui.api;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import com.intrbiz.balsa.engine.route.Router;
import com.intrbiz.balsa.metadata.WithDataAdapter;
import com.intrbiz.bergamot.config.model.HostCfg;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.metadata.IgnoreBinding;
import com.intrbiz.bergamot.metadata.IsaObjectId;
import com.intrbiz.bergamot.model.Host;
import com.intrbiz.bergamot.model.Service;
import com.intrbiz.bergamot.model.Site;
import com.intrbiz.bergamot.model.Trap;
import com.intrbiz.bergamot.model.message.HostMO;
import com.intrbiz.bergamot.model.message.ServiceMO;
import com.intrbiz.bergamot.model.message.TrapMO;
import com.intrbiz.bergamot.model.message.state.CheckStateMO;
import com.intrbiz.bergamot.ui.BergamotApp;
import com.intrbiz.metadata.Get;
import com.intrbiz.metadata.JSON;
import com.intrbiz.metadata.ListOf;
import com.intrbiz.metadata.Prefix;
import com.intrbiz.metadata.RequirePermission;
import com.intrbiz.metadata.RequireValidPrincipal;
import com.intrbiz.metadata.Var;
import com.intrbiz.metadata.XML;
@Prefix("/api/host")
@RequireValidPrincipal()
public class HostAPIRouter extends Router<BergamotApp>
{
@Get("/")
@JSON
@WithDataAdapter(BergamotDB.class)
@ListOf(HostMO.class)
public List<HostMO> getHosts(BergamotDB db, @Var("site") Site site)
{
return db.listHosts(site.getId()).stream().map((x) -> x.toStubMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/name/:name")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public HostMO getHostByName(BergamotDB db, @Var("site") Site site, String name)
{
Host host = notNull(db.getHostByName(site.getId(), name));
require(permission("read", host));
return host.toMO(currentPrincipal());
}
@Get("/name/:name/state")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public CheckStateMO getHostStateByName(BergamotDB db, @Var("site") Site site, String name)
{
Host host = notNull(db.getHostByName(site.getId(), name));
require(permission("read", host));
return host.getState().toMO(currentPrincipal());
}
@Get("/id/:id")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public HostMO getHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("read", host));
return host.toMO(currentPrincipal());
}
@Get("/id/:id/state")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public CheckStateMO getHostState(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("read", host));
return host.getState().toMO(currentPrincipal());
}
@Get("/name/:name/services")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(ServiceMO.class)
public List<ServiceMO> getHostServicesByName(BergamotDB db, @Var("site") Site site, String name)
{
Host host = notNull(db.getHostByName(site.getId(), name));
require(permission("read", host));
return host.getServices().stream().filter((x) -> permission("read", x)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/id/:id/services")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(ServiceMO.class)
public List<ServiceMO> getHostServices(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("read", host));
return host.getServices().stream().filter((x) -> permission("read", x)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/name/:name/traps")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(TrapMO.class)
public List<TrapMO> getHostTrapsByName(BergamotDB db, @Var("site") Site site, String name)
{
Host host = notNull(db.getHostByName(site.getId(), name));
require(permission("read", host));
return host.getTraps().stream().filter((x) -> permission("read", x)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/id/:id/traps")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(TrapMO.class)
public List<TrapMO> getHostTraps(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("read", host));
return host.getTraps().stream().filter((x) -> permission("read", x)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/id/:id/execute")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String executeHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("execute", host));
action("execute-check", host);
return "Ok";
}
@Get("/id/:id/suppress")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String suppress(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("suppress", host));
action("suppress-check", host);
return "Ok";
}
@Get("/id/:id/unsuppress")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String unsuppress(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("unsuppress", host));
action("unsuppress-check", host);
return "Ok";
}
@Get("/id/:id/execute-services")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String executeServicesOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int executed = 0;
for (Service service : host.getServices())
{
if (permission("execute", service))
{
action("execute-check", service);
executed++;
}
}
return "Ok, executed " + executed + " services";
}
@Get("/id/:id/suppress-services")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String suppressServicesOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int suppressed = 0;
for (Service service : host.getServices())
{
if (permission("suppress", service))
{
action("suppress-check", service);
suppressed++;
}
}
return "Ok, suppressed " + suppressed + " services";
}
@Get("/id/:id/unsuppress-services")
@JSON()
@RequirePermission("api.write.host.unsuppress")
@RequirePermission("api.write.service.unsuppress")
@WithDataAdapter(BergamotDB.class)
public String unsuppressServicesOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int unsuppressed = 0;
for (Service service : host.getServices())
{
if (permission("unsuppress", service))
{
action("unsuppress-check", service);
unsuppressed++;
}
}
return "Ok, unsuppressed " + unsuppressed + " services";
}
@Get("/id/:id/suppress-traps")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String suppressTrapsOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int suppressed = 0;
for (Trap trap : host.getTraps())
{
if (permission("suppress", trap))
{
action("suppress-check", trap);
suppressed++;
}
}
return "Ok, suppressed " + suppressed + " traps";
}
@Get("/id/:id/unsuppress-traps")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String unsuppressTrapsOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int unsuppressed = 0;
for (Trap trap : host.getTraps())
{
if (permission("unsuppress", trap))
{
action("unsuppress-check", trap);
unsuppressed++;
}
}
return "Ok, unsuppressed " + unsuppressed + " traps";
}
@Get("/id/:id/suppress-all")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String suppressAllOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int suppressed = 0;
for (Service service : host.getServices())
{
if (permission("suppress", service))
{
action("suppress-check", service);
suppressed++;
}
}
for (Trap trap : host.getTraps())
{
if (permission("suppress", trap))
{
action("suppress-check", trap);
suppressed++;
}
}
return "Ok, suppressed " + suppressed;
}
@Get("/id/:id/unsuppress-all")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String unsuppressAllOnHost(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
int unsuppressed = 0;
for (Service service : host.getServices())
{
if (permission("unsuppress", service))
{
action("unsuppress-check", service);
unsuppressed++;
}
}
for (Trap trap : host.getTraps())
{
if (permission("unsuppress", trap))
{
action("unsuppress-check", trap);
unsuppressed++;
}
}
return "Ok, unsuppressed " + unsuppressed;
}
@Get("/name/:name/config.xml")
@XML(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@IgnoreBinding
public HostCfg getHostConfigByName(BergamotDB db, @Var("site") Site site, String name)
{
Host host = notNull(db.getHostByName(site.getId(), name));
require(permission("read.config", host));
return host.getConfiguration();
}
@Get("/id/:id/config.xml")
@XML(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@IgnoreBinding
public HostCfg getHostConfig(BergamotDB db, @IsaObjectId() UUID id)
{
Host host = notNull(db.getHost(id));
require(permission("read.config", host));
return host.getConfiguration();
}
}