340 lines
17 KiB
PowerShell
340 lines
17 KiB
PowerShell
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# AUTEUR : François ALBERT le 28/06/2022
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
#
|
|
# Paramètres possibles à l'exécution :
|
|
#
|
|
# -UnInstall = Désinstallation
|
|
# -Install = Installation
|
|
# -PostInstall = PostInstallation
|
|
# -Trace = Débogage
|
|
#
|
|
Param(
|
|
[Parameter(Mandatory=$False)]
|
|
[Switch]$UnInstall,
|
|
[Parameter(Mandatory=$False)]
|
|
[Switch]$Install,
|
|
[Parameter(Mandatory=$False)]
|
|
[Switch]$PostInstall,
|
|
[Parameter(Mandatory=$False)]
|
|
[Switch]$RollBack,
|
|
[Parameter(Mandatory=$False)]
|
|
[Switch]$Trace
|
|
)
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# PACKAGE / VERSION
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
[String]$AppName = 'Duplicati - IPR Foton'
|
|
[String]$AppVersion = '2.0.6.3'
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# SCRIPT
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
Try {
|
|
|
|
# Positionnement du Débogage (Trace) si demandé
|
|
If ($Trace) {
|
|
$Global:EnableDebugMessage = $True
|
|
}
|
|
|
|
# -----------------
|
|
# INITIALISATIONS
|
|
# -----------------
|
|
$ScriptTime = [Diagnostics.Stopwatch]::StartNew()
|
|
[String]$CurrentScript = $MyInvocation.MyCommand.Definition # Chemin complet de ce script
|
|
[String]$CurrentPath = Split-Path -Path $CurrentScript -Parent # Dossier parent de ce script
|
|
[String]$ScriptParameters = ($MyInvocation.BoundParameters.Keys | Out-String) -Replace("`r`n"," ") # Liste des paramètres
|
|
[String]$LogPath = $($ENV:SystemRoot + '\Logs\UR1_Software') # Dossier parent du fichier de log
|
|
[String]$Global:LogFile = $($LogPath + '\' + $AppName + '-' + $AppVersion + '-' + $(Get-Date -UFormat '%Y%m%d-%Hh%M') + '.log') # Chemin complet du fichier de log
|
|
If ($RollBack) {
|
|
[String]$Global:LogFile = $($LogPath + '\RollBack - ' + $AppName + '-' + $AppVersion + '-' + $(Get-Date -UFormat '%Y%m%d-%Hh%M') + '.log') # Chemin complet du fichier de log du RollBack
|
|
}
|
|
|
|
# ---------------------
|
|
# IMPORT DE MODULE(S)
|
|
# ---------------------
|
|
Import-Module "$CurrentPath\Bin\Module_UR1.psd1" -ErrorAction 'Stop'
|
|
|
|
# -----------------------
|
|
# INITIALISATION DU LOG
|
|
# -----------------------
|
|
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Début d'exécution de '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Script : $CurrentScript" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Paramètres : $ScriptParameters" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
# -------------------------------------------
|
|
# DÉFINITION DES VARIABLES SYSTÈME & SCRIPT
|
|
# -------------------------------------------
|
|
Set-ScriptVariables
|
|
|
|
# Variables disponibles : variables système standard +
|
|
# $Arch, $CommonProgFiles, $CommonProgFiles86, $Default, $Desktop, $HomeDrive, $Msiexec, $OS, $OSName, $OSServicePack, $OSVersion,
|
|
# $ProgFiles, $ProgFiles86, $ProcessArch, $Public, $Reg, $SchTasks, $StartMenu, $UserDesktop, $UsersProfile, $UserStartMenu
|
|
#
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# UNINSTALL
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
If ($UnInstall) {
|
|
[String]$Step = 'Désinstallation'
|
|
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message "***** $($Step.ToUpper()) **********************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
#
|
|
# Début des commandes de Désinstallation
|
|
# --------------------------------------
|
|
#
|
|
|
|
# Interaction avec un utilisateur éventuellement connecté si process en cours
|
|
#
|
|
$Process = Invoke-KillProcessWithPopUp -AppName $AppName -PackageVersion $AppVersion -Process $('Duplicati.GUI.TrayIcon')
|
|
If ($Process -gt '1') {
|
|
# Le code retour de l'interaction est supérieur à 1, on sort du script
|
|
$ExitUR1 = 1000
|
|
Throw "Script annulé par l'utilisateur ou Process ouvert"
|
|
}
|
|
#
|
|
# Le code retour de l'interaction est 0 ou 1, on poursuit
|
|
|
|
# Désinstallation toutes versions
|
|
#
|
|
[HashTable[]]$Versions =
|
|
@{Version = "2.0.5.1" ; Guid = "{FC1F2B24-1783-4352-98E9-669896601613}"},
|
|
@{Version = "2.0.6.3" ; Guid = "{D2A5D819-4FA0-493B-8D37-9531C659D95A}"}
|
|
|
|
ForEach ($Version in $Versions) {
|
|
# Si exécutable
|
|
Foreach ($Uninst in $Version.Uninst) {
|
|
If ($Uninst -ne $null) {
|
|
If (Test-Path -Path $Uninst -PathType 'Leaf') {
|
|
If (!($Version.ExitCode)) { $Version.ExitCode = '0' }
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message $('Désinstallation EXECUTABLE de la version : ' + $Version.Version) -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message $(' --> Désinstalleur : "' + $Uninst + '"') -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message $(' --> Arguments : "' + $Version.Arguments + '"') -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message $(' --> ExitCode attendu : "' + $Version.ExitCode + '"') -Component $CurrentScript -LogFile $LogFile
|
|
Invoke-LaunchProcess -Path $Uninst -ArgumentList $Version.Arguments -WorkingDirectory $(Split-Path -Path $Uninst -Parent) -ExitCode $Version.ExitCode -NoNewWindow -LogFile $LogFile | Out-Null
|
|
}
|
|
}
|
|
}
|
|
# Si MSI
|
|
$RegUninst64 = 'Registry::HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
|
|
$RegUninst = 'Registry::HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'
|
|
ForEach ($Guid in $Version.Guid) {
|
|
If ($Guid -ne $null) {
|
|
If ((Test-Path -Path $("$RegUninst64" + "$Guid")) -or (Test-Path -Path $("$RegUninst" + "$Guid"))) {
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message $('Désinstallation MSI de la version : ' + $Version.Version) -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message $(' --> Guid : "' + $Guid + '"') -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message $(' --> ExitCode attendu : "' + $Version.ExitCode + '"') -Component $CurrentScript -LogFile $LogFile
|
|
Invoke-MsiInstall -Action 'Uninstall' -ProductCode $Guid -ExitCode $Version.ExitCode -NoLog | Out-Null
|
|
If (Test-Path -Path $("$RegUninst64" + "$Guid")) {
|
|
Write-Log -Message $('Suppression dans le registre : ' + $("$RegUninst64" + "$Guid")) -Component $CurrentScript -LogFile $LogFile
|
|
Remove-Item -Path $("$RegUninst64" + "$Guid") -Recurse -Force -ErrorAction SilentlyContinue | Out-Null
|
|
}
|
|
If (Test-Path -Path $("$RegUninst" + "$Guid")) {
|
|
Write-Log -Message $('Suppression dans le registre : ' + $("$RegUninst" + "$Guid")) -Component $CurrentScript -LogFile $LogFile
|
|
Remove-Item -Path $("$RegUninst" + "$Guid") -Recurse -Force -ErrorAction SilentlyContinue | Out-Null
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
|
|
# Suppression de la clé de registre indiquant la présence de l'application
|
|
#
|
|
Remove-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Recurse -LogFile $LogFile
|
|
|
|
#
|
|
# Fin des commandes de Désinstallation
|
|
# ------------------------------------
|
|
#
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# INSTALL
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
If ($Install) {
|
|
[String]$Step = 'Installation'
|
|
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message "***** $($Step.ToUpper()) **************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
#
|
|
# Début des commandes d'Installation
|
|
# ----------------------------------
|
|
#
|
|
|
|
Invoke-MsiInstall -Path "$Currentpath\Sources\duplicati-2.0.6.3_beta_2021-06-17-x64.msi" -LogFile $LogFile | Out-Null
|
|
|
|
#
|
|
# Fin des commandes d'Installation
|
|
# --------------------------------
|
|
#
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# POSTINSTALL
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
If ($PostInstall) {
|
|
[String]$Step = 'PostInstallation'
|
|
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message "***** $($Step.ToUpper()) ********************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
#
|
|
# Début des commandes de PostInstallation
|
|
# ---------------------------------------
|
|
#
|
|
[String]$NOMMACHINE = "$ENV:COMPUTERNAME"
|
|
[String]$ENTITE = 'IPR'
|
|
|
|
$GetWMIObject = Get-WMIObject Win32_ComputerSystem -Computername $NOMMACHINE
|
|
[String]$CurrentUser = ($GetWMIObject.UserName).Substring(3,($GetWMIObject.UserName).length-3)
|
|
|
|
|
|
# Ménage
|
|
#
|
|
[String[]]$AllItems = "$Desktop\Duplicati 2.lnk"
|
|
ForEach ($Item in $AllItems) {
|
|
If (Test-Path -Path $Item -PathType 'Container') {
|
|
Write-Log -Message $('Suppression de dossier : ' + $Item) -Component $CurrentScript -LogFile $LogFile
|
|
Remove-Item -Path $Item -Recurse -Force -ErrorAction Stop | Out-Null
|
|
} Else {
|
|
If (Test-Path -Path $Item -PathType 'Leaf') {
|
|
Write-Log -Message $('Suppression de fichier : ' + $Item) -Component $CurrentScript -LogFile $LogFile
|
|
Remove-Item -Path $Item -Force -ErrorAction Stop | Out-Null
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
# ----------------------------------------
|
|
# Creation et copie du fichier de config
|
|
# ----------------------------------------
|
|
|
|
if (!(test-path "D:\Home\$CurrentUser\Duplicati\"))
|
|
{
|
|
New-Item "D:\Home\$CurrentUser\Duplicati\" -itemType Directory
|
|
}
|
|
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\"))
|
|
{
|
|
New-Item "D:\Home\$CurrentUser\Duplicati\.ssh\" -itemType Directory
|
|
}
|
|
|
|
$Fichier = get-content "$Currentpath\Files\sauvegarde.duplicati.config.json"
|
|
|
|
#Detection si la machine fait partie de l'entitée FOTON sinon on fait la config pour l'IPR
|
|
if (("$ENV:COMPUTERNAME").Substring(2,3) -eq "034" )
|
|
{
|
|
$ENTITE = "FOTON"
|
|
}
|
|
|
|
switch ($ENTITE)
|
|
{
|
|
IPR
|
|
{
|
|
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519"))
|
|
{
|
|
ssh-keygen -t ed25519 -f "D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519" -q -N '""'
|
|
Write-Log -Message "Création des clefs SSH ed25519 IPR" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
Send-MailMessage -SmtpServer smtpint.univ-rennes1.fr -From "$CurrentUser@univ-rennes.fr" -To IPR.ADMIN.EMAIL@univ-rennes.fr -Subject "$Hostname $CurrentUser - Nouvelle clef Duplicati" -Attachments D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519.pub
|
|
}
|
|
$fichier = $fichier -replace "TARGETURLUR", "ssh://duplicati.ipr.univ-rennes1.fr//home//$CurrentUser//$NOMMACHINE//?auth-username=$CurrentUser&ssh-fingerprint=ssh-ed25519 32 4A:2D:A0:5F:66:7A:D5:3A:F4:B2:63:EC:EE:1E:D0:21&ssh-keyfile=D:\\Home\\$CurrentUser\\Duplicati\\.ssh\\duplicati_id_ed25519"
|
|
}
|
|
FOTON
|
|
{
|
|
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\id_rsa_duplicati"))
|
|
{
|
|
ssh-keygen -t rsa -f "D:\Home\$CurrentUser\Duplicati\.ssh\id_rsa_duplicati" -q -N '""'
|
|
Write-Log -Message "Création des clefs SSH RSA FOTON" -Component $CurrentScript -LogFile $LogFile
|
|
|
|
Send-MailMessage -SmtpServer smtpint.univ-rennes1.fr -From "$CurrentUser@univ-rennes.fr" -To FOTON.ADMIN.EMAIL@univ-rennes.fr -Subject "$Hostname $CurrentUser - Nouvelle clef Duplicati" -Attachments D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519.pub
|
|
}
|
|
$fichier = $fichier -replace "TARGETURLUR", "ssh://bkpdop.univ-rennes1.fr//mnt//datastore_backuppc//duplicati//$CurrentUser.$NOMMACHINE//?auth-username=$CurrentUser&ssh-fingerprint=ssh-rsa 2048 02:b9:38:a6:17:66:ba:90:e0:be:bb:7e:fb:a7:e6:14&ssh-keyfile=D:\\Home\\$CurrentUser\\Duplicati\\.ssh\\id_rsa_duplicati"
|
|
|
|
}
|
|
}
|
|
|
|
$fichier = $fichier -replace "SESAME",$CurrentUser
|
|
|
|
$Fichier | set-content "D:\Home\$CurrentUser\Duplicati\sauvegarde.duplicati.config.json"
|
|
Write-Log -Message "Creation du fichier de configuration pour l'entitée $entite , Utilisateur : $CurrentUser" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message " " -Component $CurrentScript -LogFile $LogFile
|
|
|
|
|
|
Invoke-LaunchProcess -Path "$ProgFiles\Duplicati 2\Duplicati.GUI.TrayIcon.exe" -Argumentlist "--webservice-interface=loopback" -nowait -NoNewWindow -LogFile $LogFile | Out-Null
|
|
|
|
|
|
|
|
# Création de la clé de registre indiquant la présence de l'application ("Version" à utiliser en méthode de détection avec SCCM)
|
|
#
|
|
Set-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Name "Version" -Type String -Value $AppVersion -LogFile $LogFile
|
|
Set-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Name "Date" -Type String -Value $(Get-Date -UFormat '%Y%m%d') -LogFile $LogFile
|
|
|
|
#
|
|
# Fin des commandes de PostInstallation
|
|
# -------------------------------------
|
|
#
|
|
}
|
|
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# SCRIPT EN ERREUR
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
Catch {
|
|
|
|
Write-Log -Message $(' -- Erreur : ' + $_ + ' --') -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message " " -Component $CurrentScript -LogFile $LogFile
|
|
#
|
|
If (!($RollBack)) {
|
|
If ($Step -ne 'Désinstallation') {
|
|
Write-Log -Message 'RollBack lancé' -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
|
Invoke-AppRollback -FileName $CurrentScript
|
|
Write-Log -Message 'RollBack terminé' -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
|
}
|
|
Else {
|
|
Write-Log -Message 'RollBack non lancé, erreur dans la partie Désinstallation' -Severity '3' -Component $CurrentScript -LogFile $LogFile
|
|
}
|
|
}
|
|
Else {
|
|
Write-Log -Message 'Erreur dans la partie Désinstallation du script de RollBack' -Severity '3' -Component $CurrentScript -LogFile $LogFile
|
|
}
|
|
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "$Step EN ERREUR pour '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "A la ligne : $($_.InvocationInfo.ScriptLineNumber)" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
|
Throw $_.Exception.ErrorRecord
|
|
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
# FIN
|
|
# ------------------------------------------------------------------------------------------------------------------------------
|
|
Finally {
|
|
|
|
$ScriptTime.Stop()
|
|
$ScriptDuration = $([String]::Format("{0:d2}:{1:d2}:{2:d2}", $ScriptTime.Elapsed.Hours, $ScriptTime.Elapsed.Minutes, $ScriptTime.Elapsed.Seconds))
|
|
Write-Log -Message " " -LogFile $LogFile
|
|
Write-Log -Message '****************************************************************************************************' -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Fin d'exécution de '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Script : $CurrentScript" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Paramètres : $ScriptParameters" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message "Durée d'exécution : $ScriptDuration" -Component $CurrentScript -LogFile $LogFile
|
|
Write-Log -Message '****************************************************************************************************' -Component $CurrentScript -LogFile $LogFile
|
|
#
|
|
If ($ExitUR1) {
|
|
Exit $ExitUR1
|
|
}
|
|
|
|
}
|