Class PluginInstaller
- java.lang.Object
-
- net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
-
- net.shibboleth.idp.installer.plugin.impl.PluginInstaller
-
- All Implemented Interfaces:
AutoCloseable,Component,DestructableComponent,InitializableComponent
public final class PluginInstaller extends AbstractInitializableComponent implements AutoCloseable
The class where the heavy lifting of managing a plugin happens.
-
-
Field Summary
Fields Modifier and Type Field Description private Predicate<String>acceptKeyThe callback before we install a key into the TrustStore.private IdPPlugindescriptionThe plugin's story about itself.private PathdistPathDistDir.private PathdistributionThe actual distribution.private PathdownloadDirectoryWhere we have downloaded.private org.apache.http.client.HttpClienthttpClientWhat to use to download things.private PathidpHomeWhere we are installing to.private List<Path>installedContentsThe absolute paths of what was installed - this is setup byloadCopiedFiles().private URLClassLoaderinstalledPluginsLoaderThe "plugins" classpath loader.private StringinstalledVersionFromContentsThe version from the contents file, or null if it isn't loaded.private URLClassLoaderinstallingPluginLoaderThe "plugin under construction" classpath loader.private static org.slf4j.LoggerLOGClass logger.private Map<IdPModule.ModuleResource,IdPModule.ResourceResult>moduleChangesModule Changes.private ModuleContextmoduleContextThe Module Context.private static StringPLUGIN_FILE_PROPERTY_PREFIXProperty Prefix for install files .private static StringPLUGIN_RELATIVE_PATHS_PROPERTYProperty Name for whether paths are relative.private static StringPLUGIN_VERSION_PROPERTYProperty Name for version.private StringpluginIdWhat we are dealing with.private PathpluginsContentsPluginss webapp.private PathpluginsWebappPluginss webapp.private booleanrebuildWarDo we rebuild?private HttpClientSecurityParameterssecurityParamsThe securityParams for the module context.private StringtruststoreWhere to get the keys from if not defaulted.private PathunpackDirectoryWhere we have unpacked into.private List<URL>updateOverrideURLsIf overridden these are the urls to us for update (rather than what the plugin asks for.private PathworkspacePathDumping space for renamed files.
-
Constructor Summary
Constructors Constructor Description PluginInstaller()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidbuildHttpClient()Build the Http Client if it doesn't exist.private voidcaptureChanges(Map<IdPModule.ModuleResource,IdPModule.ResourceResult> changes)Capture module changes.private voidcheckRequiredModules(Set<String> loadedModules)Police that required modules for plugin installation are enabled.private voidcheckSignature(Path base, String fileName)Check the signature of the plugin.voidclose()private voidcloseSilently(AutoCloseable what)close, ignoring errors.protected voiddoInitialize()private voiddoReportOperation(IdPModule.ModuleResource resource, IdPModule.ResourceResult result)Report on a resource result.private voiddownload(URL baseURL, String fileName)Method to download a zip file to the {downloadDirectory.private voiddownload(Resource baseResource, String fileName)Download helper method.private voidemitModuleChanges()Emit module changes.private URLClassLoadergetDistributionLoader()Generate aURLClassLoaderwhich looks at the installing WEB-INF.protected static PluginVersiongetIdPVersion()Return a version we can use in a test proof manner.List<Path>getInstalledContents()What files were installed to webapp for this plugin?IdPPlugingetInstalledPlugin(String name)Find theIdPPluginwith the provided Id.List<IdPPlugin>getInstalledPlugins()Return a list of the installed plugins.private URLClassLoadergetInstalledPluginsLoader()Generate aURLClassLoaderwhich looks at the installed WEB-INF/lib in addition to the dist webapp and bin/lib directories.private Set<String>getLoadedModules()What modules (on the installed plugins Classpath) are currently loaded?private org.apache.commons.compress.archivers.ArchiveInputStreamgetStreamFor(Path fullName, boolean isZip)Create the correctArchiveInputStreamfor the input.StringgetVersionFromContents()return the version that the contents page thinks is installed.private PathinferInstalledIdpHome(Properties props)Infer where the properties were installed to.private voidinstallNew(RollbackPluginInstall rollBack)Copy the webapp folder from the distribution to the per plugin location inside dist.voidinstallPlugin(URL baseURL, String fileName, boolean checkVersion)Install the plugin from the provided URL.voidinstallPlugin(Path base, String fileName, boolean checkVersion)Install the plugin from a local path.booleanisRebuildWar()Do we rebuild the war?private booleanisZip(String fileName)does the file name end in .zip?private voidloadCopiedFiles()Load the contents for this plugin from the properties file used during installation.private voidreEnableModules(Set<String> loadedModules)Re-enabled the listed modules iff then are implemented by the plugin we just installed.private voidsaveCopiedFiles(List<Path> copiedFiles)Stream the copy list to a property file and empty it.voidsetAcceptKey(Predicate<String> what)Set the acceptKey predicate.voidsetHttpClient(org.apache.http.client.HttpClient what)Set the httpClient.voidsetIdpHome(Path home)Set IdP Home.voidsetModuleContextSecurityParams(HttpClientSecurityParameters params)Set the Module Context security parameters.voidsetPluginId(String id)Set the plugin id.voidsetRebuildWar(boolean what)Set whether we rebuild the war.voidsetTrustore(String loc)Set the truststore.voidsetUpdateOverrideURLs(List<URL> urls)Set the override URLS.private voidsetupDescriptionFromDistribution()Get hold of theIdPPluginfor this plugin.private voidsetupPluginId()Look into the distribution and suck out the plugin id.voiduninstall()Remove the jars for this plugin and rebuild the war.private voiduninstallOld(RollbackPluginInstall rollback)Uninstall the old version of the plugin.private voidunpack(Path base, String fileName)Method to unpack a zip or tgz file into out {unpackDirectory.-
Methods inherited from class net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
destroy, doDestroy, initialize, isDestroyed, isInitialized
-
-
-
-
Field Detail
-
LOG
@Nonnull private static final org.slf4j.Logger LOG
Class logger.
-
PLUGIN_VERSION_PROPERTY
private static final String PLUGIN_VERSION_PROPERTY
Property Name for version.- See Also:
- Constant Field Values
-
PLUGIN_FILE_PROPERTY_PREFIX
private static final String PLUGIN_FILE_PROPERTY_PREFIX
Property Prefix for install files .- See Also:
- Constant Field Values
-
PLUGIN_RELATIVE_PATHS_PROPERTY
private static final String PLUGIN_RELATIVE_PATHS_PROPERTY
Property Name for whether paths are relative.- See Also:
- Constant Field Values
-
idpHome
@NonnullAfterInit private Path idpHome
Where we are installing to.
-
pluginId
private String pluginId
What we are dealing with.
-
unpackDirectory
private Path unpackDirectory
Where we have unpacked into.
-
downloadDirectory
private Path downloadDirectory
Where we have downloaded.
-
description
private IdPPlugin description
The plugin's story about itself.
-
acceptKey
@Nonnull private Predicate<String> acceptKey
The callback before we install a key into the TrustStore.
-
distribution
private Path distribution
The actual distribution.
-
truststore
private String truststore
Where to get the keys from if not defaulted.
-
httpClient
private org.apache.http.client.HttpClient httpClient
What to use to download things.
-
updateOverrideURLs
@Nonnull private List<URL> updateOverrideURLs
If overridden these are the urls to us for update (rather than what the plugin asks for.
-
workspacePath
@NonnullAfterInit private Path workspacePath
Dumping space for renamed files.
-
distPath
@NonnullAfterInit private Path distPath
DistDir.
-
pluginsWebapp
@NonnullAfterInit private Path pluginsWebapp
Pluginss webapp.
-
pluginsContents
@NonnullAfterInit private Path pluginsContents
Pluginss webapp.
-
installedContents
@Nullable private List<Path> installedContents
The absolute paths of what was installed - this is setup byloadCopiedFiles().
-
installedVersionFromContents
@Nullable private String installedVersionFromContents
The version from the contents file, or null if it isn't loaded.
-
moduleContext
@NonnullAfterInit private ModuleContext moduleContext
The Module Context.
-
moduleChanges
private final Map<IdPModule.ModuleResource,IdPModule.ResourceResult> moduleChanges
Module Changes.
-
installedPluginsLoader
private URLClassLoader installedPluginsLoader
The "plugins" classpath loader. AutoClosed.
-
installingPluginLoader
private URLClassLoader installingPluginLoader
The "plugin under construction" classpath loader. AutoClosed.
-
securityParams
private HttpClientSecurityParameters securityParams
The securityParams for the module context.
-
rebuildWar
private boolean rebuildWar
Do we rebuild?
-
-
Method Detail
-
setIdpHome
public void setIdpHome(@Nonnull Path home)Set IdP Home.- Parameters:
home- Where we are working from
-
setPluginId
public void setPluginId(@Nonnull @NotEmpty String id)
Set the plugin id.- Parameters:
id- what to set.
-
setTrustore
public void setTrustore(@Nullable String loc)Set the truststore.- Parameters:
loc- what set.
-
setAcceptKey
public void setAcceptKey(@Nonnull Predicate<String> what)Set the acceptKey predicate.- Parameters:
what- what to set.
-
setHttpClient
public void setHttpClient(@Nonnull org.apache.http.client.HttpClient what)Set the httpClient.- Parameters:
what- what to set.
-
setUpdateOverrideURLs
public void setUpdateOverrideURLs(@Nonnull List<URL> urls)Set the override URLS.- Parameters:
urls- The updateOverrideURLs to set.
-
setModuleContextSecurityParams
public void setModuleContextSecurityParams(@Nullable HttpClientSecurityParameters params)Set the Module Context security parameters.- Parameters:
params- what to set.
-
setRebuildWar
public void setRebuildWar(boolean what)
Set whether we rebuild the war.- Parameters:
what- - whether we will or not
-
isRebuildWar
public boolean isRebuildWar()
Do we rebuild the war?- Returns:
- true if we are going to.
-
installPlugin
public void installPlugin(@Nonnull URL baseURL, @Nonnull @NotEmpty String fileName, boolean checkVersion) throws org.apache.tools.ant.BuildExceptionInstall the plugin from the provided URL. Involves downloading the file and then doing ainstallPlugin(Path, String, boolean).- Parameters:
baseURL- where we get the files fromfileName- the namecheckVersion- do we want to check vs the IdP Version?- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
installPlugin
public void installPlugin(@Nonnull Path base, @Nonnull @NotEmpty String fileName, boolean checkVersion) throws org.apache.tools.ant.BuildExceptionInstall the plugin from a local path.- Check signature
- Unpack to temp folder
- Install from the folder
- Parameters:
base- the directory where the files arefileName- the namecheckVersion- do we want to check vs the IdP Version?- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
uninstall
public void uninstall() throws org.apache.tools.ant.BuildExceptionRemove the jars for this plugin and rebuild the war.- Throws:
org.apache.tools.ant.BuildException- if badness occurs.
-
setupDescriptionFromDistribution
private void setupDescriptionFromDistribution() throws org.apache.tools.ant.BuildExceptionGet hold of theIdPPluginfor this plugin.- Throws:
org.apache.tools.ant.BuildException- if badness is happens.
-
getInstalledContents
@Nonnull public List<Path> getInstalledContents()
What files were installed to webapp for this plugin?- Returns:
- a list of the absolute paths of the installed contents, may be empty if nothing is installed or the plugin didn't install anything.
-
getVersionFromContents
@Nullable public String getVersionFromContents()
return the version that the contents page thinks is installed.- Returns:
- the version, or null if it is not found.
-
getLoadedModules
private Set<String> getLoadedModules() throws org.apache.tools.ant.BuildException
What modules (on the installed plugins Classpath) are currently loaded?- Returns:
- a set of the names of the currently enabled Modules.
- Throws:
org.apache.tools.ant.BuildException- on loading a module
-
checkRequiredModules
private void checkRequiredModules(Set<String> loadedModules) throws org.apache.tools.ant.BuildException
Police that required modules for plugin installation are enabled.- Parameters:
loadedModules- the modules we know to be enabled- Throws:
org.apache.tools.ant.BuildException- if any required modules are missing or disabled
-
reEnableModules
private void reEnableModules(Set<String> loadedModules) throws org.apache.tools.ant.BuildException
Re-enabled the listed modules iff then are implemented by the plugin we just installed.- Parameters:
loadedModules- the modules to enable- Throws:
org.apache.tools.ant.BuildException- on errors finding or enabling the modules
-
installNew
private void installNew(RollbackPluginInstall rollBack) throws org.apache.tools.ant.BuildException
Copy the webapp folder from the distribution to the per plugin location inside dist.- Parameters:
rollBack- Roll Back Context- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
uninstallOld
private void uninstallOld(RollbackPluginInstall rollback) throws org.apache.tools.ant.BuildException
Uninstall the old version of the plugin.- Parameters:
rollback- Rollback Context- Throws:
org.apache.tools.ant.BuildException- on IO or module errors
-
saveCopiedFiles
private void saveCopiedFiles(List<Path> copiedFiles) throws org.apache.tools.ant.BuildException
Stream the copy list to a property file and empty it.- Parameters:
copiedFiles- The copied files- Throws:
org.apache.tools.ant.BuildException- If we hit an IO exception
-
inferInstalledIdpHome
private Path inferInstalledIdpHome(Properties props)
Infer where the properties were installed to.- Parameters:
props- The property files- Returns:
- the idpHome it was installed to or null if no files installed
-
loadCopiedFiles
private void loadCopiedFiles() throws org.apache.tools.ant.BuildExceptionLoad the contents for this plugin from the properties file used during installation.- Throws:
org.apache.tools.ant.BuildException- if the load fails
-
download
private void download(URL baseURL, String fileName) throws org.apache.tools.ant.BuildException
Method to download a zip file to the {downloadDirectory.- Parameters:
baseURL- Where the zip/tgz and signature file isfileName- the name.- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
buildHttpClient
private void buildHttpClient()
Build the Http Client if it doesn't exist.
-
captureChanges
private void captureChanges(Map<IdPModule.ModuleResource,IdPModule.ResourceResult> changes)
Capture module changes.- Parameters:
changes- what has changed
-
emitModuleChanges
private void emitModuleChanges()
Emit module changes.
-
doReportOperation
private void doReportOperation(@Nonnull IdPModule.ModuleResource resource, @Nonnull IdPModule.ResourceResult result)Report on a resource result.- Parameters:
resource- resourceresult- result of operation
-
download
private void download(Resource baseResource, String fileName) throws IOException
Download helper method.- Parameters:
baseResource- where to go for the filefileName- the file name- Throws:
IOException- as required
-
unpack
private void unpack(Path base, String fileName) throws org.apache.tools.ant.BuildException
Method to unpack a zip or tgz file into out {unpackDirectory.- Parameters:
base- Where the zip/tgz file isfileName- the name.- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
isZip
private boolean isZip(String fileName) throws org.apache.tools.ant.BuildException
does the file name end in .zip?- Parameters:
fileName- the name to consider- Returns:
- true if it ends with .zip
- Throws:
org.apache.tools.ant.BuildException- if the name is too short
-
getStreamFor
private org.apache.commons.compress.archivers.ArchiveInputStream getStreamFor(Path fullName, boolean isZip) throws IOException
Create the correctArchiveInputStreamfor the input.- Parameters:
fullName- the path of the zip file to unpack.isZip- if true then this is a zip file, otherwise a tgz file- Returns:
- the the appropriate
ArchiveInputStream - Throws:
IOException- if we trip over an unpack
-
setupPluginId
private void setupPluginId() throws org.apache.tools.ant.BuildExceptionLook into the distribution and suck out the plugin id.- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
checkSignature
private void checkSignature(Path base, String fileName) throws org.apache.tools.ant.BuildException
Check the signature of the plugin.- Parameters:
base- Where the zip/tgz file isfileName- the name.- Throws:
org.apache.tools.ant.BuildException- if badness is detected.
-
doInitialize
protected void doInitialize() throws ComponentInitializationException- Overrides:
doInitializein classAbstractInitializableComponent- Throws:
ComponentInitializationException
-
getInstalledPluginsLoader
private URLClassLoader getInstalledPluginsLoader() throws org.apache.tools.ant.BuildException
Generate aURLClassLoaderwhich looks at the installed WEB-INF/lib in addition to the dist webapp and bin/lib directories. As a side effect, it also copies the libs (since they may well be overwritten)- Returns:
- an appropriate loader
- Throws:
org.apache.tools.ant.BuildException- if a directory traversal fails.
-
getDistributionLoader
private URLClassLoader getDistributionLoader() throws org.apache.tools.ant.BuildException
Generate aURLClassLoaderwhich looks at the installing WEB-INF.- Returns:
- an appropriate loader
- Throws:
org.apache.tools.ant.BuildException- if a directory traversal fails.
-
getInstalledPlugins
public List<IdPPlugin> getInstalledPlugins() throws org.apache.tools.ant.BuildException
Return a list of the installed plugins.- Returns:
- All the plugins.
- Throws:
org.apache.tools.ant.BuildException- if loafing the classpath fails.
-
getInstalledPlugin
@Nullable public IdPPlugin getInstalledPlugin(@Nonnull String name)
Find theIdPPluginwith the provided Id.- Parameters:
name- what to find- Returns:
- the
IdPPluginor null if not found.
-
closeSilently
private void closeSilently(AutoCloseable what)
close, ignoring errors.- Parameters:
what- what to close
-
close
public void close()
- Specified by:
closein interfaceAutoCloseable
-
getIdPVersion
protected static PluginVersion getIdPVersion()
Return a version we can use in a test proof manner.- Returns:
- the IdP version or a fixed value
-
-