mirror of
https://github.com/Icinga/icinga-powershell-framework.git
synced 2025-12-21 07:10:15 -05:00
137 lines
5.8 KiB
PowerShell
137 lines
5.8 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Download a PowerShell Module from a custom source or from GitHub
|
|
by providing a repository and the user space
|
|
.DESCRIPTION
|
|
Download a PowerShell Module from a custom source or from GitHub
|
|
by providing a repository and the user space
|
|
.FUNCTIONALITY
|
|
Download and install a PowerShell module from a custom or GitHub source
|
|
.EXAMPLE
|
|
PS>Get-IcingaPowerShellModuleArchive -ModuleName 'Plugins' -Repository 'icinga-powershell-plugins' -Release 1;
|
|
.EXAMPLE
|
|
PS>Get-IcingaPowerShellModuleArchive -ModuleName 'Plugins' -Repository 'icinga-powershell-plugins' -Release 1 -DryRun 1;
|
|
.PARAMETER DownloadUrl
|
|
The Url to a ZIP-Archive to download from (skips the wizard)
|
|
.PARAMETER ModuleName
|
|
The name which is used inside output messages
|
|
.PARAMETER Repository
|
|
The repository to download the ZIP-Archive from
|
|
.PARAMETER GitHubUser
|
|
The user from which a repository is downloaded from
|
|
.PARAMETER Release
|
|
Download the latest release
|
|
.PARAMETER Snapshot
|
|
Download the latest package from the master branch
|
|
.PARAMETER DryRun
|
|
Only return the finished build Url including the version to install but
|
|
do not modify the system in any way
|
|
.INPUTS
|
|
System.String
|
|
.OUTPUTS
|
|
System.Hashtable
|
|
.LINK
|
|
https://github.com/Icinga/icinga-powershell-framework
|
|
#>
|
|
|
|
function Get-IcingaPowerShellModuleArchive()
|
|
{
|
|
param(
|
|
[string]$DownloadUrl = '',
|
|
[string]$ModuleName = '',
|
|
[string]$Repository = '',
|
|
[string]$GitHubUser = 'Icinga',
|
|
[bool]$Release = $FALSE,
|
|
[bool]$Snapshot = $FALSE,
|
|
[bool]$DryRun = $FALSE
|
|
);
|
|
|
|
Set-IcingaTLSVersion;
|
|
$ProgressPreference = "SilentlyContinue";
|
|
$Tag = 'master';
|
|
[bool]$SkipRepo = $FALSE;
|
|
|
|
if ($Release -Or $Snapshot) {
|
|
$SkipRepo = $TRUE;
|
|
}
|
|
|
|
# Fix TLS errors while connecting to GitHub with old PowerShell versions
|
|
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11";
|
|
|
|
if ([string]::IsNullOrEmpty($DownloadUrl)) {
|
|
if ($SkipRepo -Or (Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Do you provide a custom repository for "{0}"?', $ModuleName)) -Default 'n').result -eq 1) {
|
|
if ($Release -eq $FALSE -And $Snapshot -eq $FALSE) {
|
|
$branch = (Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Which version of the "{0}" do you want to install? (release/snapshot)', $ModuleName)) -Default 'v' -DefaultInput 'release').answer;
|
|
} elseif ($Release) {
|
|
$branch = 'release';
|
|
} else {
|
|
$branch = 'snapshot'
|
|
}
|
|
if ($branch.ToLower() -eq 'snapshot') {
|
|
$DownloadUrl = [string]::Format('https://github.com/{0}/{1}/archive/master.zip', $GitHubUser, $Repository);
|
|
} else {
|
|
$WebResponse = Invoke-IcingaWebRequest -Uri 'https://github.com/{0}/{1}/releases/latest' -Objects $GitHubUser, $Repository -UseBasicParsing;
|
|
|
|
if ($null -eq $WebResponse.HasErrors -Or $WebResponse.HasErrors -eq $FALSE) {
|
|
$LatestRelease = $WebResponse.BaseResponse.ResponseUri.AbsoluteUri;
|
|
$DownloadUrl = $LatestRelease.Replace('/releases/tag/', '/archive/');
|
|
$Tag = $DownloadUrl.Split('/')[-1];
|
|
} else {
|
|
Write-IcingaConsoleError -Message 'Failed to fetch latest release for "{0}" from GitHub. Either the module or the GitHub account do not exist' -Objects $ModuleName;
|
|
}
|
|
|
|
$DownloadUrl = [string]::Format('{0}/{1}.zip', $DownloadUrl, $Tag);
|
|
|
|
$CurrentVersion = Get-IcingaPowerShellModuleVersion $Repository;
|
|
|
|
if ($null -ne $CurrentVersion -And $CurrentVersion -eq $Tag) {
|
|
Write-IcingaConsoleNotice -Message 'Your "{0}" is already up-to-date' -Objects $ModuleName;
|
|
return @{
|
|
'DownloadUrl' = $DownloadUrl;
|
|
'Version' = $Tag;
|
|
'Directory' = '';
|
|
'Archive' = '';
|
|
'ModuleRoot' = (Get-IcingaFrameworkRootPath);
|
|
'Installed' = $FALSE;
|
|
};
|
|
}
|
|
}
|
|
} else {
|
|
$DownloadUrl = (Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Please enter the full path of the custom repository for the "{0}" (location of zip file)', $ModuleName)) -Default 'v').answer;
|
|
}
|
|
}
|
|
|
|
if ($DryRun) {
|
|
return @{
|
|
'DownloadUrl' = $DownloadUrl;
|
|
'Version' = $Tag;
|
|
'Directory' = '';
|
|
'Archive' = '';
|
|
'ModuleRoot' = (Get-IcingaFrameworkRootPath);
|
|
'Installed' = $FALSE;
|
|
};
|
|
}
|
|
|
|
$DownloadDirectory = New-IcingaTemporaryDirectory;
|
|
$DownloadDestination = (Join-Path -Path $DownloadDirectory -ChildPath ([string]::Format('{0}.zip', $Repository)));
|
|
Write-IcingaConsoleNotice ([string]::Format('Downloading "{0}" into "{1}"', $ModuleName, $DownloadDirectory));
|
|
|
|
if ((Invoke-IcingaWebRequest -UseBasicParsing -Uri $DownloadUrl -OutFile $DownloadDestination).HasErrors) {
|
|
Write-IcingaConsoleError ([string]::Format('Failed to download "{0}" into "{1}". Starting cleanup process', $ModuleName, $DownloadDirectory));
|
|
Start-Sleep -Seconds 2;
|
|
Remove-Item -Path $DownloadDirectory -Recurse -Force;
|
|
|
|
Write-IcingaConsoleNotice 'Starting to re-run the download wizard';
|
|
|
|
return Get-IcingaPowerShellModuleArchive -ModuleName $ModuleName -Repository $Repository;
|
|
}
|
|
|
|
return @{
|
|
'DownloadUrl' = $DownloadUrl;
|
|
'Version' = $Tag;
|
|
'Directory' = $DownloadDirectory;
|
|
'Archive' = $DownloadDestination;
|
|
'ModuleRoot' = (Get-IcingaFrameworkRootPath);
|
|
'Installed' = $TRUE;
|
|
};
|
|
}
|