[java-identity-provider] branch main updated: IDP-1691 Re-Enable modules after an installation update
Rod Widdowson
rdw at steadingsoftware.com
Sat Nov 21 11:05:18 UTC 2020
This is an automated email from the git hooks/post-receive script.
rdw pushed a commit to branch main
in repository java-identity-provider.
View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=7415b09444a65fc8e608abe6943560500c825d6f
The following commit(s) were added to refs/heads/main by this push:
new 7415b0944 IDP-1691 Re-Enable modules after an installation update
7415b0944 is described below
commit 7415b09444a65fc8e608abe6943560500c825d6f
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sat Nov 21 11:04:29 2020 +0000
IDP-1691 Re-Enable modules after an installation update
https://issues.shibboleth.net/jira/browse/IDP-1691
---
.../idp/installer/CurrentInstallState.java | 9 ++++
.../net/shibboleth/idp/installer/V4Install.java | 33 ++++++++++++++
.../installer/impl/CurrentInstallStateImpl.java | 50 ++++++++++++++++++++--
3 files changed, 89 insertions(+), 3 deletions(-)
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
index f2c589f80..8c54b2358 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
@@ -18,6 +18,8 @@
package net.shibboleth.idp.installer;
import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Properties;
@@ -74,4 +76,11 @@ public interface CurrentInstallState extends InitializableComponent {
default boolean isSystemPresent() {
return true;
}
+
+ /** Which modules (by ID) are enabled for this release.
+ * @return those modules enabled.
+ */
+ default @Nonnull Collection<String> getEnabledModules() {
+ return Collections.emptySet();
+ }
}
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
index 0f535bf89..ddc829c43 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
@@ -28,7 +28,10 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Instant;
import java.util.Collections;
+import java.util.Iterator;
import java.util.Properties;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
import java.util.Set;
import javax.annotation.Nonnull;
@@ -45,6 +48,9 @@ import org.springframework.core.io.Resource;
import net.shibboleth.ext.spring.util.ApplicationContextBuilder;
import net.shibboleth.idp.Version;
+import net.shibboleth.idp.module.IdPModule;
+import net.shibboleth.idp.module.ModuleContext;
+import net.shibboleth.idp.module.ModuleException;
import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -106,6 +112,7 @@ public class V4Install extends AbstractInitializableComponent {
populatePropertyFiles(keyManager.isCreatedSealer());
handleEditWebApp();
populateUserDirectories();
+ reEnableModules();
deleteSpuriousFiles();
generateMetadata();
reprotect();
@@ -388,6 +395,32 @@ public class V4Install extends AbstractInitializableComponent {
InstallerSupport.createDirectory(targetBase.resolve("logs"));
}
+ /** ReEnable modules which were already enabled.
+ * @throws BuildException if badness occurs
+ */
+ protected void reEnableModules() throws BuildException {
+ final ModuleContext moduleContext = new ModuleContext(installerProps.getTargetDir());
+ final Iterator<IdPModule> modules = ServiceLoader.load(IdPModule.class).iterator();
+
+ while (modules.hasNext()) {
+ try {
+ final IdPModule module = modules.next();
+ final String id = module.getId();
+ if (currentState.getEnabledModules().contains(id)) {
+ log.debug("Re-enabling Module {}", id);
+ try {
+ module.enable(moduleContext);
+ } catch (final ModuleException e) {
+ log.error("Error re-enabling module {}", id, e);
+ throw new BuildException(e);
+ }
+ }
+ } catch (final ServiceConfigurationError e) {
+ log.error("Error loading modules", e);
+ }
+ }
+ }
+
/** Delete those files which were created but not needed.
* @throws BuildException if badness occurs
*/
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
index 0adf3e43d..566447fc7 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
@@ -24,9 +24,15 @@ import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Properties;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
+import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -37,6 +43,8 @@ import org.slf4j.LoggerFactory;
import net.shibboleth.idp.installer.CurrentInstallState;
import net.shibboleth.idp.installer.InstallerProperties;
import net.shibboleth.idp.installer.InstallerSupport;
+import net.shibboleth.idp.module.IdPModule;
+import net.shibboleth.idp.module.ModuleContext;
import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
@@ -53,8 +61,10 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
private final Path targetDir;
/** The files we will delete if they created on upgrade. */
- private final String[][] deleteAfterUpgrades = { { "credentials", "secrets.properties", },
- };
+ private final String[][] deleteAfterUpgrades = { { "credentials", "secrets.properties", }, };
+
+ /** The module IDs which are enabled. */
+ private Set<String> enabledModules = Collections.emptySet();
/** Whether the IdP properties file exists.*/
private boolean idpPropertiesPresent;
@@ -118,8 +128,9 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
/** Populate {{@link #props} from idp.properties and other files pointed to by
* {@value IdPPropertiesApplicationContextInitializer#IDP_ADDITIONAL_PROPERTY}.
+ * @throws ComponentInitializationException
*/
- private void setupPreviousProps() {
+ private void setupPreviousProps() throws ComponentInitializationException {
if (!isIdPPropertiesPresent()) {
return ;
}
@@ -147,7 +158,34 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
props.load(stream);
} catch (final IOException e) {
log.error("Error loading {}", path, e);
+ throw new ComponentInitializationException(e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Populate {{@link #enabledModules} from the current classpath and the new IdP home.
+ */
+ private void findEnabledModules() {
+ if (getInstalledVersion()==null) {
+ return;
+ }
+ final ModuleContext moduleContext = new ModuleContext(targetDir);
+ enabledModules = new HashSet<>();
+ final Iterator<IdPModule> modules = ServiceLoader.load(IdPModule.class).iterator();
+
+ while (modules.hasNext()) {
+ try {
+ final IdPModule module = modules.next();
+ if (module.isEnabled(moduleContext)) {
+ log.debug("Detected enabled Module {}", module.getId());
+ enabledModules.add(module.getId());
+ } else {
+ log.debug("Detected disabled Module {}", module.getId());
}
+ } catch (final ServiceConfigurationError e) {
+ log.error("Error loading modules", e);
}
}
}
@@ -160,6 +198,7 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
systemPresent = Files.exists(targetDir.resolve("system"));
findPreviousVersion();
setupPreviousProps();
+ findEnabledModules();
if (null == getInstalledVersion()) {
// New install. We need all files
@@ -209,4 +248,9 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
public boolean isSystemPresent() {
return systemPresent;
}
+
+ /** {@inheritDoc} */
+ @Nonnull public Collection<String> getEnabledModules() {
+ return enabledModules;
+ }
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list