diff --git a/Deployment/MSSQL/OptionParser.psm1 b/Deployment/MSSQL/OptionParser.psm1 new file mode 100644 index 000000000..2cd31ad10 --- /dev/null +++ b/Deployment/MSSQL/OptionParser.psm1 @@ -0,0 +1,169 @@ +function New-Option ([string]$Name, [switch]$Switch, [switch]$Boolean, [switch]$String, [switch]$List, $Constraints=$null) { + <# + .SYNOPSIS + ToDo: Describe + + .DESCRIPTION + ToDo: Describe + #> + + $Option = New-Object -TypeName PSObject + + # Fields + $Option | Add-Member NoteProperty Type -value $null + $Option | Add-Member NoteProperty Name -value $null + $Option | Add-Member NoteProperty AllowedValues -value $null + + # Init + + $Option | Add-Member ScriptMethod __init__ { + param([string]$Name, $Switch, $Boolean, $String, $List) + + $this.Name = $Name + + # With respect for our developers we do not check for double type selected + if ($Switch) { + AugmentOptionSwitch($this) + } elseif ($Boolean) { + AugmentOptionBoolean($this) + } elseif ($String) { + AugmentOptionString($this) + } elseif ($List) { + AugmentOptionList($this) + } else { + throw "Switch, Boolean, String or List option type must be provided for option '$Name'" + } + } + + $Option | Add-Member ScriptMethod __post_init__ { + param($Constraints=$null) + if ($Constraints -ne $null) { + $this.AllowedValues = @() + $this.AllowedValues = $this.AllowedValues + $Constraints + } else { + $Constraints = $null + } + } + + # Methods + + $Option | Add-Member -Force ScriptMethod Validate { + if ($this.AllowedValues -ne $null) { + if (-not($this.AllowedValues -contains $this.Value)) { + $Cts = $this.AllowedValues -join ',' + throw "Option '$($this.Name)' may have values ($Cts) but not '$($this.Value)'" + } + } + } + + $Option | Add-Member -Force ScriptMethod ToString { + return "/$($this.Name)" + } + + # invoke constructor + + $Option.__init__($Name, $Switch, $Boolean, $String, $List) + $Option.__post_init__($Constraints) + + return $Option +} + +function AugmentOptionSwitch($Option) { +} + +function AugmentOptionBoolean($Option) { + # Fields + $Option | Add-Member NoteProperty Value -value $false + + # Methods + + $Option | Add-Member -Force ScriptMethod ToString { + if ($this.Value) { + return "/$($this.Name)=1" + } else { + return "/$($this.Name)=0" + } + } +} + +function AugmentOptionString($Option) { + # Fields + $Option | Add-Member NoteProperty Value -value "" + + # Methods + + $Option | Add-Member -Force ScriptMethod ToString { + $v = "$($this.Value)" + if ($v -match '.* .*') { + # TODO: Escape double quote characters if possible + return "/$($this.Name)=`"$v`"" + } else { + return "/$($this.Name)=$v" + } + } +} + +function AugmentOptionList($Option) { + # Fields + $Option | Add-Member NoteProperty Value -value @() + + # Methods + + $Option | Add-Member -Force ScriptMethod Validate { + if ($this.AllowedValues -ne $null) { + foreach ($V in $this.Value) { + if (-not($this.AllowedValues -contains $V)) { + $Cts = $this.AllowedValues -join ',' + throw "Option '$($this.Name)' may have values ($Cts) but not '$V'" + } + } + } + } + + $Option | Add-Member -Force ScriptMethod ToString { + return "/$($this.Name)=$($this.Value -join ',')" + } +} + +function New-OptionParser() { + <# + .SYNOPSIS + ToDo: Describe + + .DESCRIPTION + ToDo: Describe + #> + + $OptionParser = New-Object -TypeName PSObject + + # Fields + $OptionParser | Add-Member NoteProperty Options -value @{} + + # Methods + + $OptionParser | Add-Member ScriptMethod AddOption { + param($Option) + $this.Options.Add($Option.Name, $Option) + } + + $OptionParser | Add-Member ScriptMethod Parse { + param([hashtable]$Options) + + $CommandLine = @() + foreach($OptionName in $($Options.keys)) { + $Option = $this.Options.Get_Item($OptionName) + if ($Option -eq $null) { + throw "Option '$OptionName' is not allowed" + } + $Option.Value = $Options.Get_Item($OptionName) + $Option.Validate() + $CommandLine = $CommandLine + $Option.ToString() + } + return $CommandLine -join ' ' + } + + return $OptionParser +} + +Export-ModuleMember -Function New-OptionParser +Export-ModuleMember -Function New-Option \ No newline at end of file diff --git a/Deployment/MSSQL/SQLServerInstaller.psm1 b/Deployment/MSSQL/SQLServerInstaller.psm1 new file mode 100644 index 000000000..9dcd520d2 --- /dev/null +++ b/Deployment/MSSQL/SQLServerInstaller.psm1 @@ -0,0 +1,166 @@ +Import-Module '.\OptionParser.psm1' + +function New-OptionParserInstall { + <# + .SYNOPSIS + Creates an option parser for MS SQL Server 2012 setup "INSTALL" action. + + .DESCRIPTION + Use this cmdlet to create an option parser for MS SQL Server 2012 setup "INSTALL" action. + All documented option are supported. See the following link for details: + http://msdn.microsoft.com/en-us/library/ms144259.aspx + #> + $OptionParserInstall = New-OptionParser + + $OptionParserInstall.AddOption((New-Option "ACTION" -String -Constraints "INSTALL")) + $OptionParserInstall.AddOption((New-Option "IACCEPTSQLSERVERLICENSETERMS" -Switch)) + $OptionParserInstall.AddOption((New-Option "ENU" -Switch)) + $OptionParserInstall.AddOption((New-Option "UpdateEnabled" -Switch)) + $OptionParserInstall.AddOption((New-Option "UpdateSource" -String)) + $OptionParserInstall.AddOption((New-Option "CONFIGURATIONFILE" -String)) + $OptionParserInstall.AddOption((New-Option "ERRORREPORTING" -Boolean)) + $OptionParserInstall.AddOption((New-Option "FEATURES" -List -Constraints ("SQL","SQLEngine","Replication","FullText","DQ","AS","RS","DQC","IS","MDS","Tools","BC","BOL","BIDS","Conn","SSMS","ADV_SSMS","DREPLAY_CTLR","DREPLAY_CLT","SNAC_SDK","SDK","LocalDB"))) + $OptionParserInstall.AddOption((New-Option "ROLE" -String -Constraints ("SPI_AS_ExistingFarm", "SPI_AS_NewFarm", "AllFeatures_WithDefaults"))) + $OptionParserInstall.AddOption((New-Option "INDICATEPROGRESS" -Switch)) + $OptionParserInstall.AddOption((New-Option "INSTALLSHAREDDIR" -String)) + $OptionParserInstall.AddOption((New-Option "INSTALLSHAREDWOWDIR" -String)) + $OptionParserInstall.AddOption((New-Option "INSTANCEDIR" -String)) + $OptionParserInstall.AddOption((New-Option "INSTANCEID" -String)) + $OptionParserInstall.AddOption((New-Option "INSTANCENAME" -String)) + $OptionParserInstall.AddOption((New-Option "PID" -String)) + $OptionParserInstall.AddOption((New-Option "Q" -Switch)) + $OptionParserInstall.AddOption((New-Option "QS" -Switch)) + $OptionParserInstall.AddOption((New-Option "UIMODE" -String -Constraints ("Normal", "AutoAdvance"))) + $OptionParserInstall.AddOption((New-Option "SQMREPORTING" -Boolean)) + $OptionParserInstall.AddOption((New-Option "HIDECONSOLE" -Switch)) + $OptionParserInstall.AddOption((New-Option "AGTSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "AGTSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "AGTSVCSTARTUPTYPE" -String -Constraints ("Manual", "Automatic", "Disabled"))) + $OptionParserInstall.AddOption((New-Option "ASBACKUPDIR" -String)) + $OptionParserInstall.AddOption((New-Option "ASCOLLATION" -String)) + $OptionParserInstall.AddOption((New-Option "ASCONFIGDIR" -String)) + $OptionParserInstall.AddOption((New-Option "ASDATADIR" -String)) + $OptionParserInstall.AddOption((New-Option "ASLOGDIR" -String)) + $OptionParserInstall.AddOption((New-Option "ASSERVERMODE" -String -Constraints ("MULTIDIMENSIONAL", "POWERPIVOT", "TABULAR"))) + $OptionParserInstall.AddOption((New-Option "ASSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "ASSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "ASSVCSTARTUPTYPE" -String -Constraints ("Manual", "Automatic", "Disabled"))) + $OptionParserInstall.AddOption((New-Option "ASSYSADMINACCOUNTS" -String)) + $OptionParserInstall.AddOption((New-Option "ASTEMPDIR" -String)) + $OptionParserInstall.AddOption((New-Option "ASPROVIDERMSOLAP" -Boolean)) + $OptionParserInstall.AddOption((New-Option "FARMACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "FARMPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "PASSPHRASE" -String)) + $OptionParserInstall.AddOption((New-Option "FARMADMINIPORT" -String)) + $OptionParserInstall.AddOption((New-Option "BROWSERSVCSTARTUPTYPE" -String -Constraints ("Manual", "Automatic", "Disabled"))) + $OptionParserInstall.AddOption((New-Option "ENABLERANU" -Switch)) + $OptionParserInstall.AddOption((New-Option "INSTALLSQLDATADIR" -String)) + $OptionParserInstall.AddOption((New-Option "SAPWD" -String)) + $OptionParserInstall.AddOption((New-Option "SECURITYMODE" -String -Constrainrs ("SQL"))) + $OptionParserInstall.AddOption((New-Option "SQLBACKUPDIR" -String)) + $OptionParserInstall.AddOption((New-Option "SQLCOLLATION" -String)) + $OptionParserInstall.AddOption((New-Option "ADDCURRENTUSERASSQLADMIN" -Switch)) + $OptionParserInstall.AddOption((New-Option "SQLSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "SQLSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "SQLSVCSTARTUPTYPE" -String -Constraints ("Manual", "Automatic", "Disabled"))) + $OptionParserInstall.AddOption((New-Option "SQLSYSADMINACCOUNTS" -Switch)) + $OptionParserInstall.AddOption((New-Option "SQLTEMPDBDIR" -String)) + $OptionParserInstall.AddOption((New-Option "SQLTEMPDBLOGDIR" -String)) + $OptionParserInstall.AddOption((New-Option "SQLUSERDBDIR" -String)) + $OptionParserInstall.AddOption((New-Option "SQLUSERDBLOGDIR" -String)) + $OptionParserInstall.AddOption((New-Option "FILESTREAMLEVEL" -String -Constraints ("0", "1", "2", "3"))) + $OptionParserInstall.AddOption((New-Option "FILESTREAMSHARENAME" -String)) + $OptionParserInstall.AddOption((New-Option "FTSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "FTSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "ISSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "ISSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "ISSVCStartupType" -String -Constraints ("Manual", "Automatic", "Disabled"))) + $OptionParserInstall.AddOption((New-Option "NPENABLED" -Boolean)) + $OptionParserInstall.AddOption((New-Option "TCPENABLED" -Boolean)) + $OptionParserInstall.AddOption((New-Option "RSINSTALLMODE" -String -Constraints ("SharePointFilesOnlyMode", "DefaultNativeMode", "FilesOnlyMode"))) + $OptionParserInstall.AddOption((New-Option "RSSVCACCOUNT" -String)) + $OptionParserInstall.AddOption((New-Option "RSSVCPASSWORD" -String)) + $OptionParserInstall.AddOption((New-Option "RSSVCStartupType" -String -Constraints ("Manual", "Automatic", "Disabled"))) + + return $OptionParserInstall +} + +function New-OptionParserPrepareImage { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserCompleteImage { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserUpgrade { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserEditionUpgrade { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserRepair { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserRebuilddatabase { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserUninstall { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserInstallFailoverCluster { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserPrepareFailoverCluster { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserCompleteFailoverCluster { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserUpgrade { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserAddNode { + # ToDo: Implement + throw "Not yet implemented" +} + +function New-OptionParserRemoveNode { + # ToDo: Implement + throw "Not yet implemented" +} + +Export-ModuleMember -Function New-OptionParserInstall +Export-ModuleMember -Function New-OptionParserPrepareImage +Export-ModuleMember -Function New-OptionParserCompleteImage +Export-ModuleMember -Function New-OptionParserUpgrade +Export-ModuleMember -Function New-OptionParserEditionUpgrade +Export-ModuleMember -Function New-OptionParserRepair +Export-ModuleMember -Function New-OptionParserRebuilddatabase +Export-ModuleMember -Function New-OptionParserUninstall +Export-ModuleMember -Function New-OptionParserInstallFailoverCluster +Export-ModuleMember -Function New-OptionParserPrepareFailoverCluster +Export-ModuleMember -Function New-OptionParserCompleteFailoverCluster +Export-ModuleMember -Function New-OptionParserUpgrade +Export-ModuleMember -Function New-OptionParserAddNode +Export-ModuleMember -Function New-OptionParserRemoveNode