Install-Dynamics365Update.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
function Install-Dynamics365Update {
    param (
        [parameter(Position=0,
        Mandatory=$true)]
        [string]
        $MediaDir,
        [string]
        $LogFilePath = $null,
        [ValidateRange(1,3600)]
        [int]
        $LogFilePullIntervalInSeconds = 30,
        [switch]
        $LogFilePullToOutput = $False
    )
    $setupFilePath = "$mediaDir\CrmUpdateWrapper.exe";
    $fileVersion = ( Get-Command $setupFilePath ).FileVersionInfo.FileVersionRaw.ToString();
    Write-Output "Version of software to be installed: $fileVersion";
    $testResponse = $null;
    try {
        Add-PSSnapin Microsoft.Crm.PowerShell -ErrorAction Ignore
        if ( Get-PSSnapin Microsoft.Crm.PowerShell -ErrorAction Ignore ) {
            $crmServer = Get-CrmServer $env:COMPUTERNAME;
            $testResponse = $crmServer.Version;
        } else {
            "Could not load Microsoft.Crm.PowerShell PSSnapin";
        }
    } catch {
        $_.Exception.Message;
    }
    $productDetected = $null;
    if ( $testResponse.StartsWith( "9." ) -or $testResponse.StartsWith( "8." ) ) {
        $productDetected = $testResponse;
    }
    if ( $productDetected -and ( [version]( ( [version]$productDetected ).ToString(3) ) -lt [version]( ( [version]$fileVersion ).ToString(3) ) ) -and ( ( [version]$productDetected ).Major -eq ( [version]$fileVersion ).Major ) ) {
        if([String]::IsNullOrEmpty($logFilePath) -eq $True) {
            $timeStamp = ( Get-Date -Format u ).Replace(" ","-").Replace(":","-");
            $logFilePath = "$env:Temp\DynamicsUpdateInstallationLog_$timeStamp.txt";
        }

        Write-Output "$(Get-Date) Starting $setupFilePath";
        $installCrmScript = {
            param( $setupFilePath, $logFilePath );
            Write-Output "Start-Process '$setupFilePath' -ArgumentList '/q /log $logFilePath /norestart' -Wait;";
            Start-Process "$setupFilePath" -ArgumentList "/q /log $logFilePath /norestart" -Wait;
        }
        $job = Start-Job -ScriptBlock $installCrmScript -ArgumentList $setupFilePath, $logFilePath;
        Write-Output "$(Get-Date) Started installation job, log will be saved in $logFilePath";
        $lastLinesCount = 0;

        While ( $job.State -ne "Completed" )
        {
            Write-Output "$(Get-Date) Waiting until CRM installation job is done, sleeping $logFilePullIntervalInSeconds sec";
            Start-Sleep $logFilePullIntervalInSeconds;
            if(($logFilePullToOutput -eq $True) -and ((Test-Path $logFilePath) -eq $True)) {

                $linesCount    = (Get-Content $logFilePath | Measure-Object -Line).Lines;
                $newLinesCount = $linesCount - $lastLinesCount;

                if($newLinesCount -gt 0) {
                    Write-Output "$(Get-Date) - new logs: $newLinesCount lines";
                    $lines = Get-Content $logFilePath | Select-Object -First $newLinesCount -Skip $lastLinesCount;

                    foreach($line in $lines) {
                        Write-Output $line;
                    }
                } else {
                   Write-Output "$(Get-Date) - no new logs";
                }

                $lastLinesCount = $linesCount;
            }
        }

        Write-Output "$(Get-Date) Job is complete, output:";
        Write-Output ( Receive-Job $job );
        Remove-Job $job;

        $testResponse = $null;
        try {
            Add-PSSnapin Microsoft.Crm.PowerShell -ErrorAction Ignore
            if ( Get-PSSnapin Microsoft.Crm.PowerShell -ErrorAction Ignore ) {
                $crmServer = Get-CrmServer $env:COMPUTERNAME;
                $testResponse = $crmServer.Version;
            } else {
                "Could not load Microsoft.Crm.PowerShell PSSnapin";
            }
        } catch {
            $_.Exception.Message;
        }

        if ( [version]( ( [version]$testResponse ).ToString(3) ) -eq [version]( ( [version]$fileVersion ).ToString(3) ) ) {
            Write-Output "Installation is finished and verified successfully. Dynamics version installed: '$testResponse'";
        } else {
            if( (Test-Path $logFilePath) -eq $True) {
                $errorLines = Get-Content $logFilePath | Select-String -Pattern "Error" -SimpleMatch;

                if($null -ne $errorLines) {
                    "Errors from install log: $logFilePath";

                    foreach($errorLine in $errorLines) {
                        $errorLine;
                    }
                }
            }
            $errorMessage = "Installation job finished but the product is still not installed. Current product version installed is '$testResponse'";

            Write-Output $errorMessage;
            Throw $errorMessage;
        }
    } else {
        Write-Output "Required product is not installed, skipping the upgrade. Current Dynamics version installed: '$testResponse'";
    }
}