package com.intrbiz.bergamot.ui.router; import static com.intrbiz.bergamot.ui.util.Sorter.*; import java.io.IOException; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; import org.apache.log4j.Logger; import com.intrbiz.Util; import com.intrbiz.balsa.engine.route.Router; import com.intrbiz.balsa.metadata.WithDataAdapter; import com.intrbiz.bergamot.config.model.BergamotCfg; import com.intrbiz.bergamot.config.model.GroupCfg; import com.intrbiz.bergamot.data.BergamotDB; import com.intrbiz.bergamot.importer.BergamotImportReport; import com.intrbiz.bergamot.metadata.GetBergamotSite; import com.intrbiz.bergamot.metadata.IsaObjectId; import com.intrbiz.bergamot.model.ActiveCheck; import com.intrbiz.bergamot.model.Check; import com.intrbiz.bergamot.model.Config; import com.intrbiz.bergamot.model.ConfigChange; import com.intrbiz.bergamot.model.Contact; import com.intrbiz.bergamot.model.Group; import com.intrbiz.bergamot.model.Site; import com.intrbiz.bergamot.ui.BergamotApp; import com.intrbiz.configuration.Configuration; import com.intrbiz.metadata.Any; import com.intrbiz.metadata.CheckStringLength; import com.intrbiz.metadata.CurrentPrincipal; import com.intrbiz.metadata.Get; import com.intrbiz.metadata.ListParam; import com.intrbiz.metadata.Param; import com.intrbiz.metadata.Post; import com.intrbiz.metadata.Prefix; import com.intrbiz.metadata.RequireValidPrincipal; import com.intrbiz.metadata.Template; @Prefix("/group") @Template("layout/main") @RequireValidPrincipal() public class GroupsRouter extends Router<BergamotApp> { private Logger logger = Logger.getLogger(GroupsRouter.class); @Any("/") @WithDataAdapter(BergamotDB.class) public void showGroups(BergamotDB db, @GetBergamotSite() Site site) { model("groups", orderGroupsByStatus(permission("read", db.getRootGroups(site.getId())))); encode("group/index"); } @Any("/name/:name") @WithDataAdapter(BergamotDB.class) public void showHostGroupByName(BergamotDB db, String name, @GetBergamotSite() Site site) { Group group = model("group", notNull(db.getGroupByName(site.getId(), name))); require(permission("read", group)); model("checks", orderCheckByStatus(permission("read", group.getChecks()))); model("groups", orderGroupsByStatus(permission("read", group.getChildren()))); encode("group/group"); } @Any("/id/:id") @WithDataAdapter(BergamotDB.class) public void showHostGroupByName(BergamotDB db, @IsaObjectId UUID id, @CurrentPrincipal Contact user) { Group group = model("group", notNull(db.getGroup(id))); require(permission("read", group)); model("checks", orderCheckByStatus(permission("read", group.getChecks()))); model("groups", orderGroupsByStatus(permission("read", group.getChildren()))); encode("group/group"); } @Any("/execute-all-checks/:id") @WithDataAdapter(BergamotDB.class) public void executeChecksInGroup(BergamotDB db, @IsaObjectId UUID id) throws IOException { for (Check<?,?> check : db.getChecksInGroup(id)) { if (check instanceof ActiveCheck) { if (permission("execute", check)) action("execute-check", check); } } redirect("/group/id/" + id); } @Get("/create") @WithDataAdapter(BergamotDB.class) public void create(BergamotDB db, @GetBergamotSite() Site site) { var("templates", db.listConfigTemplates(site.getId(), Configuration.getRootElement(GroupCfg.class)).stream().filter((t) -> permission("read", t.getId())).sorted((a, b) -> a.getSummary().compareTo(b.getSummary())).collect(Collectors.toList())); var("locations", db.listLocations(site.getId()).stream().filter((l) -> permission("read", l)).sorted((a, b) -> a.getSummary().compareTo(b.getSummary())).collect(Collectors.toList())); var("groups", db.listGroups(site.getId()).stream().filter((g) -> permission("read", g)).sorted((a, b) -> a.getSummary().compareTo(b.getSummary())).collect(Collectors.toList())); encode("/group/create"); } @Post("/create") @WithDataAdapter(BergamotDB.class) public void doCreate( BergamotDB db, @GetBergamotSite() Site site, @CurrentPrincipal() Contact user, @Param("group_extends") @IsaObjectId(mandatory = false) UUID templateId, @Param("group_summary") @CheckStringLength(mandatory = true, max = 255) String summary, @Param("group_name") @CheckStringLength(mandatory = true, max = 255) String name, @Param("group_description") @CheckStringLength(mandatory = false, max = 4096) String description, @ListParam("group_group") @IsaObjectId(mandatory = false) List<UUID> groupGroups ) { // create the configuration object we are going to add GroupCfg config = new GroupCfg(); config.setSummary(summary); config.setName(name); if (! Util.isEmpty(description)) config.setDescription(description); // extends if (templateId != null) { Config extendsCfg = db.getConfig(templateId); if (extendsCfg != null && extendsCfg.getConfiguration() instanceof GroupCfg) { config.getInheritedTemplates().add(extendsCfg.getConfiguration().getName()); } } // groups if (groupGroups != null && (! groupGroups.isEmpty())) { for (UUID groupId : groupGroups) { if (groupId != null) { Config groupCfg = db.getConfig(groupId); if (groupCfg != null && groupCfg.getConfiguration() instanceof GroupCfg) { config.getGroups().add(groupCfg.getConfiguration().getName()); } } } } // the container BergamotCfg configContainer = new BergamotCfg(); configContainer.setSite(site.getName()); configContainer.setSummary("Create group: " + name); configContainer.getGroups().add(config); logger.info("Creating group " + name + ":\n" + configContainer); // create the configuration change ConfigChange change = new ConfigChange(site.getId(), user, configContainer); db.setConfigChange(change); // apply the change BergamotImportReport report = action("apply-config-change", site.getId(), change.getId(), balsa().url(balsa().path("/reset")), user); logger.info("Created group " + name + " success=" + report.isSuccessful() + ":\n" + report.toString()); // success var("report", report); var("config", config); var("change", change); encode("group/created"); } }