Skip to content

Commit

Permalink
feat: add teams
Browse files Browse the repository at this point in the history
feat: add matrix dashboard
  • Loading branch information
wurstbrot committed Jan 29, 2024
1 parent f50e147 commit 70e9c4d
Show file tree
Hide file tree
Showing 25 changed files with 812 additions and 221 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class GrafanaApplicationController {
public Collection<String> getApplicationIds() throws IOException, GitAPIException, InstantiationException, IllegalAccessException, ClassNotFoundException {
Set<String> applicationIds = new HashSet<>();
for (Application application : applicationDirector.getApplications()) {
applicationIds.add(application.getApplication());
applicationIds.add(application.getName());
}
return applicationIds;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,17 @@ public Collection<Application> getTeamApplications(@PathVariable String teamName
return applicationsToReturn;
}

@RequestMapping(value = "/team/{teamName}/application/names", method = RequestMethod.GET)
@ResponseBody
public Collection<String> getTeamApplicationNames(@PathVariable String teamName) throws Exception {
Collection<String> applicationsToReturn = new ArrayList<String>();
for (Application application : applicationDirector.getApplications()) {
if (application.getTeam().equals(teamName)) {
applicationsToReturn.add(application.getName());
}
}
return applicationsToReturn;
}

@RequestMapping(value = "/activity/{activityName}/simple", method = RequestMethod.GET)
@ResponseBody
Expand All @@ -70,10 +81,10 @@ public Collection<Activity> getTeamActivity(@PathVariable String teamName, @Path
Collection<Activity> activitiesToReturn = new ArrayList<Activity>();
for (Application application : applicationDirector.getApplications()) {
if (application.getTeam().equals(teamName)) {
if (application.getApplication().equals(applicationId)) {
if (application.getName().equals(applicationId)) {
for (Activity activity : application.getActivities()) {
if (activity.getName().equals(activityName)) {
logger.debug("Found activity: " + activity.getName() + " in application: " + application.getApplication());
logger.debug("Found activity: " + activity.getName() + " in application: " + application.getName());
activitiesToReturn.add(activity);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package org.owasp.dsomm.metricca.analyzer.controller;

import org.eclipse.jgit.api.errors.GitAPIException;
import org.owasp.dsomm.metricca.analyzer.deserialization.ApplicationDirector;
import org.owasp.dsomm.metricca.analyzer.deserialization.skeleton.SkeletonActivity;
import org.owasp.dsomm.metricca.analyzer.grafana.*;
import org.owasp.dsomm.metricca.analyzer.grafana.GrafanaDashboardCreator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Controller
public class GrafanaDashboardExportController {
Expand All @@ -25,36 +24,31 @@ public class GrafanaDashboardExportController {
private ApplicationDirector applicationDirector;

@Autowired
private TeamDashboard teamDashboard;
@Autowired
private OverviewDashboard overviewDashboard;

@Value("${metricCA.grafana.baseurl:http://localhost:3000}")
private String grafanaBaseUrl;
private GrafanaDashboardCreator grafanaDashboardCreator;

@Value("${metricCA.grafana.apiKey}")
private String grafanaApiKey;

@Value("${metricCA.grafana.timeoutInSeconds:10}")
private Integer grafanaApiTimeoutInSeconds;

@RequestMapping(value = "/dashboard/overview", method = RequestMethod.GET, produces = "application/json")
@RequestMapping(value = "/dashboard/{type}", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String getOverviewDashboard() throws Exception {
return overviewDashboard.getDashboard(getPanelConfigurations().values());
public String getOverviewDashboard(@PathVariable String type) throws Exception {
HashMap<String, String> dashboards = grafanaDashboardCreator.getDashboards();
if(dashboards.containsKey(type)) {
return dashboards.get(type);
} else {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "Dashboard not found"
);
}
}

@RequestMapping(value = "/dashboard/overview/push", method = RequestMethod.GET, produces = "application/json")
@RequestMapping(value = "/dashboards/push", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String pushOverviewDashboard() throws IOException {
String status = "{\"status\": \"error\"}";
try {
String dashboardString = overviewDashboard.getDashboard(getPanelConfigurations().values());
GrafanaDashboardCreator grafanaDashboardCreator = new GrafanaDashboardCreator(grafanaBaseUrl, grafanaApiKey, dashboardString, grafanaApiTimeoutInSeconds);
if (grafanaDashboardCreator.pushDashboard()) {
status = "{\"status\": \"pushed\", \"dashboard\": \"" + dashboardString + "\"}";
if (grafanaDashboardCreator.pushDashboards()) {
status = "{\"status\": \"pushed\"}";
} else {
status = "{\"status\": \"error\", \"dashboard\": \"" + dashboardString + "\"}";
status = "{\"status\": \"error\"}";
}

} catch (Exception e) {
Expand All @@ -64,42 +58,27 @@ public String pushOverviewDashboard() throws IOException {
return status;
}

private Map<String, PanelConfiguration> getPanelConfigurations() throws GitAPIException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
Map<String, PanelConfiguration> panelConfigurations = new HashMap<String, PanelConfiguration>();
for (SkeletonActivity activity : ApplicationDirector.getSkeletonActivities()) {
for (PanelConfiguration panelConfiguration : activity.getPanelConfigurations()) {
Map<String, PanelConfiguration> fetchedPanelConfigurations = PanelFactory.getPanelsForLevels(panelConfiguration, activity);
for (PanelConfiguration fetchedPanelConfiguration : fetchedPanelConfigurations.values()) {
if (!panelConfigurations.containsKey(fetchedPanelConfiguration.getTitle())) {
panelConfigurations.put(fetchedPanelConfiguration.getTitle(), fetchedPanelConfiguration);
}
}
}
}
for (PanelConfiguration panelConfiguration : panelConfigurations.values()) {
logger.info("panelConfiguration: " + panelConfiguration.getTitle());
}
return panelConfigurations;
}


@RequestMapping(value = "/dashboard/team", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String getTeamDashboard() throws Exception {
Map<String, PanelConfiguration> panelConfigurations = new HashMap<String, PanelConfiguration>();
for (SkeletonActivity skeletonActivity : ApplicationDirector.getSkeletonActivities()) {
for (PanelConfiguration panelConfiguration : skeletonActivity.getPanelConfigurations()) {
Map<String, PanelConfiguration> fetchedPanelConfigurations = PanelFactory.getPanelsForLevels(panelConfiguration, skeletonActivity);
for (PanelConfiguration fetchedPanelConfiguration : fetchedPanelConfigurations.values()) {
if (!panelConfigurations.containsKey(fetchedPanelConfiguration.getTitle())) {
panelConfigurations.put(fetchedPanelConfiguration.getTitle(), fetchedPanelConfiguration);
}
}
}
}
for (PanelConfiguration panelConfiguration : panelConfigurations.values()) {
logger.info("panelConfiguration: " + panelConfiguration.getTitle());
}
return teamDashboard.getDashboard(panelConfigurations.values());
return grafanaDashboardCreator.getDashboards().get("team");

// String dashboardType = "team";
// Map<String, PanelConfiguration> panelConfigurations = new HashMap<String, PanelConfiguration>();
// for (SkeletonActivity skeletonActivity : ApplicationDirector.getSkeletonActivities()) {
// for (PanelConfiguration panelConfiguration : skeletonActivity.getPanelConfigurations(dashboardType)) {
// Map<String, PanelConfiguration> fetchedPanelConfigurations = PanelFactory.getPanelsForLevels(panelConfiguration, skeletonActivity);
// for (PanelConfiguration fetchedPanelConfiguration : fetchedPanelConfigurations.values()) {
// if (!panelConfigurations.containsKey(fetchedPanelConfiguration.getTitle())) {
// panelConfigurations.put(fetchedPanelConfiguration.getTitle(), fetchedPanelConfiguration);
// }
// }
// }
// }
// for (PanelConfiguration panelConfiguration : panelConfigurations.values()) {
// logger.info("panelConfiguration: " + panelConfiguration.getTitle());
// }
// return teamDashboard.getDashboard(panelConfigurations.values());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.owasp.dsomm.metricca.analyzer.controller;

import org.owasp.dsomm.metricca.analyzer.controller.dto.FlattenDate;
import org.owasp.dsomm.metricca.analyzer.deserialization.Application;
import org.owasp.dsomm.metricca.analyzer.deserialization.ApplicationDirector;
import org.owasp.dsomm.metricca.analyzer.deserialization.activity.Activity;
import org.owasp.dsomm.metricca.analyzer.deserialization.activity.SecurityTrainingActivity;
import org.owasp.dsomm.metricca.analyzer.deserialization.activity.component.DatePeriodHoursAndPeople;
import org.owasp.dsomm.metricca.analyzer.grafana.GrafanaDashboardCreator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Controller
public class GrafanaMatrixDashboardController {
private static final Logger logger = LoggerFactory.getLogger(GrafanaMatrixDashboardController.class);

@Autowired
private GrafanaDashboardCreator grafanaDashboardCreator;



@RequestMapping(value = "/matrix/overview", method = RequestMethod.GET)
@ResponseBody
public String getOverviewDashboard() throws Exception {
return grafanaDashboardCreator.getDashboards().get("matrix");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Collection;
import java.util.LinkedHashMap;

@Controller
public class GrafanaTeamDashboardController {
Expand All @@ -27,9 +26,11 @@ public Collection<FlattenDate> getActivitiesPerTeamFlatSimple(@PathVariable Stri
return applicationDirector.getActivitiesPerTeamAndApplicationFlat(application, teamName, activityName);
}

@RequestMapping(value = "/team/{teamName}/application/{application}/activity/{activityName}/map", method = RequestMethod.GET)
@RequestMapping(value = "/team/{teamName}/application/{application}/activity/{activityName}/entries", method = RequestMethod.GET)
@ResponseBody
public LinkedHashMap<String, Collection<FlattenDate>> getActivitiesPerTeamFlatAsMap(@PathVariable String teamName, @PathVariable String application, @PathVariable String activityName) throws Exception {
public Collection<FlattenDate> getActivitiesPerTeamFlatAsMap(@PathVariable String teamName, @PathVariable String application, @PathVariable String activityName) throws Exception {
return applicationDirector.getActivitiesPerTeamAndApplicationFlatAsLevelMap(application, teamName, activityName);
}
}
}

//http://192.168.178.27:8080/team/${team}/application/${application}/activity/Conduction%20of%20simple%20threat%20modeling%20on%20technical%20level/simple
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public Collection<String> getTeamApplicationIds(@PathVariable String teamName) t
Collection<String> applicationsToReturn = new ArrayList<String>();
for (Application application : applicationDirector.getApplications()) {
if (application.getTeam().equals(teamName)) {
applicationsToReturn.add(application.getApplication());
applicationsToReturn.add(application.getName());
}
}
return applicationsToReturn;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,4 @@ public Date getDate() {
public void setDate(Date date) {
this.date = date;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class ActivityDirector {
public ActivityDirector(JsonNode activityObjects, List<SkeletonActivity> skeletonActivities, String kind) throws JsonProcessingException, InstantiationException, IllegalAccessException, ClassNotFoundException {
List<Activity> activities = new ArrayList<>();
for (SkeletonActivity skeletonActivity : skeletonActivities) {
logger.debug("Skeleton Activity kind: " + skeletonActivity.getKind() + " " + skeletonActivity.getClassName());
if (!skeletonActivity.getKind().equals(kind)) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class Application {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
private final List<org.owasp.dsomm.metricca.analyzer.deserialization.activity.Activity> activities;
private String team;
private String application;
private String name;
private String desiredLevel;

public Application(JsonNode applicationYamlReader, List<SkeletonActivity> skeletonActivities, String kind) throws SkeletonNotFoundException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
Expand Down Expand Up @@ -45,12 +45,12 @@ public void setTeam(String team) {
this.team = team;
}

public String getApplication() {
return application;
public String getName() {
return name;
}

public void setApplication(String application) {
this.application = application;
public void setName(String name) {
this.name = name;
}

public String getDesiredLevel() {
Expand Down
Loading

0 comments on commit 70e9c4d

Please sign in to comment.