From e63884f5528431ebdb288e83bd62cde70a7818d4 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 26 May 2023 12:35:15 -0700 Subject: [PATCH] SHIBUI-2571 Beacon gathering and sending --- .../CoreShibUiConfiguration.java | 14 +++++++++ .../admin/ui/controller/BeaconController.java | 11 ++++++- .../ui/scheduled/BeaconReportingTask.java | 30 +++++++++++++++++-- .../src/main/resources/application.properties | 1 + 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java index d6d137e50..7d001b90f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java @@ -71,6 +71,11 @@ import org.springframework.web.util.UrlPathHelper; import javax.sql.DataSource; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Optional; @SpringBootConfiguration @@ -277,4 +282,13 @@ public IBeaconDataService getBeaconDataService(@Value("${shibui.beacon.productNa BeaconDataServiceImpl result = new BeaconDataServiceImpl(productName, info, tierVersion, entityDescriptorRepository, metadataResolverRepository, filterRepository, groupsRepository, roleRepository, beaconConfigurationRepository, userService); return result; } + + @Bean + public List beaconEndpointUrl(@Value("${shibui.beacon.url}") String urls) throws MalformedURLException { + List result = new ArrayList<>(); + for (String url : Arrays.asList(urls.split(","))) { + result.add(new URL(url)); + } + return result; + } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/BeaconController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/BeaconController.java index f5ece2032..e41f17f39 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/BeaconController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/BeaconController.java @@ -1,11 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; import com.fasterxml.jackson.core.JsonProcessingException; +import edu.internet2.tier.shibboleth.admin.ui.scheduled.BeaconReportingTask; import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,13 +15,20 @@ @RestController @RequestMapping(value = "/api/beacon") public class BeaconController { + @Autowired + BeaconReportingTask beaconReporter; @Autowired private IBeaconDataService service; - @GetMapping(value = "/detail") public ResponseEntity getDetail() throws JsonProcessingException { return ResponseEntity.ok(service.getBeaconData()); } + + @PostMapping("/send") + public ResponseEntity forceSendBeaconData() { + beaconReporter.sendBeaconData(); + return ResponseEntity.ok("Manual push of beacon data completed"); + } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/BeaconReportingTask.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/BeaconReportingTask.java index c87d7017c..5c25c8603 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/BeaconReportingTask.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/BeaconReportingTask.java @@ -4,11 +4,18 @@ import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + @Configuration @ConditionalOnProperty(name = "shibui.beacon.enabled", matchIfMissing=true) @EnableSchedulerLock(defaultLockAtMostFor = "${shibui.maxTask.lockTime:30m}") @@ -16,10 +23,29 @@ public class BeaconReportingTask { @Autowired IBeaconDataService dataService; + @Autowired + @Qualifier("beaconEndpointUrl") + private List endpointUrls; + @Scheduled(cron="#{@getBeaconCronValue}") - @SchedulerLock(name = "generateEntityDescriptorFiles") + @SchedulerLock(name = "sendBeaconData") @Transactional(readOnly = true) - public void generateEntityDescriptorFiles() { + public void sendBeaconData() { + endpointUrls.forEach(url -> { + try { + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/json; utf-8"); + con.setRequestProperty("Accept", "application/json"); + con.setDoOutput(true); + try(OutputStream os = con.getOutputStream()){ + byte[] input = dataService.getBeaconData().getBytes("utf-8"); + os.write(input, 0, input.length); + } + } catch (IOException e) { + e.printStackTrace(); + } + }); } } \ No newline at end of file diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index ac76ebb36..3c4d83008 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -124,6 +124,7 @@ shibui.pac4j-enabled=false shibui.beacon.enabled=true shibui.beacon.productName=ShibUi shibui.beacon.installationID=UNICON-SHIBUI-TESTING +shibui.beacon.url=http://collector.testbed.tier.internet2.edu:5001 ### Swagger/Springdoc patterns springdoc.use-management-port=true