From 3472fefea84a91b47f61a9f5b3a5343cf12aacee Mon Sep 17 00:00:00 2001 From: Matt Wrock Date: Wed, 8 Jan 2014 22:25:24 -0800 Subject: [PATCH] added a boxstarter shell for loading modules --- BoxStarter.Common/Boxstarter.Common.psm1 | 16 +----- Boxstarter.Azure/Boxstarter.Azure.pssproj | 1 + .../New-BoxstarterPackage.ps1 | 1 + Boxstarter.sln | 2 + BoxstarterShell.ps1 | 28 ++++++++++ BuildScripts/BoxstarterChocolateyInstall.ps1 | 7 +++ .../nuget/Boxstarter.Chocolatey.nuspec | 2 + BuildScripts/nuget/Boxstarter.nuspec | 3 ++ BuildScripts/setup.ps1 | 48 +++++++++++++++++- boxlogo.ico | Bin 0 -> 21662 bytes 10 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 BuildScripts/BoxstarterChocolateyInstall.ps1 create mode 100644 boxlogo.ico diff --git a/BoxStarter.Common/Boxstarter.Common.psm1 b/BoxStarter.Common/Boxstarter.Common.psm1 index c70f116d..37bca0ad 100644 --- a/BoxStarter.Common/Boxstarter.Common.psm1 +++ b/BoxStarter.Common/Boxstarter.Common.psm1 @@ -1,21 +1,7 @@ Resolve-Path $PSScriptRoot\*.ps1 | % { . $_.ProviderPath } -Export-ModuleMember Write-BoxstarterMessage, - Start-TimedSection, - Stop-TimedSection, - Enter-BoxstarterLogable, - Out-BoxstarterLog, - Log-BoxstarterMessage, - Test-Admin, - Invoke-FromTask, - Get-IsRemote, - Confirm-Choice, - Create-BoxstarterTask, - Remove-BoxstarterTask, - Write-BoxstarterLogo, - Get-CurrentUser, - Get-IsMicrosoftUpdateEnabled +Export-ModuleMember Write-BoxstarterMessage, Start-TimedSection, Stop-TimedSection, Enter-BoxstarterLogable, Out-BoxstarterLog, Log-BoxstarterMessage, Test-Admin, Invoke-FromTask, Get-IsRemote, Confirm-Choice, Create-BoxstarterTask, Remove-BoxstarterTask, Write-BoxstarterLogo, Get-CurrentUser, Get-IsMicrosoftUpdateEnabled Export-ModuleMember -Variable Boxstarter diff --git a/Boxstarter.Azure/Boxstarter.Azure.pssproj b/Boxstarter.Azure/Boxstarter.Azure.pssproj index 06d4fa0b..55b8c204 100644 --- a/Boxstarter.Azure/Boxstarter.Azure.pssproj +++ b/Boxstarter.Azure/Boxstarter.Azure.pssproj @@ -30,6 +30,7 @@ + diff --git a/Boxstarter.Chocolatey/New-BoxstarterPackage.ps1 b/Boxstarter.Chocolatey/New-BoxstarterPackage.ps1 index a8301fa7..75a1dc95 100644 --- a/Boxstarter.Chocolatey/New-BoxstarterPackage.ps1 +++ b/Boxstarter.Chocolatey/New-BoxstarterPackage.ps1 @@ -27,6 +27,7 @@ Optional path whose contents will be copied to the repository .LINK http://boxstarter.codeplex.com +New-PackageFromScript about_boxstarter_chocolatey about_boxstarter_variable_in_chocolatey Invoke-BoxstarterBuild diff --git a/Boxstarter.sln b/Boxstarter.sln index e35c62ce..48d5f236 100644 --- a/Boxstarter.sln +++ b/Boxstarter.sln @@ -15,6 +15,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildScripts", "BuildScripts", "{E959DA78-673C-42A8-B935-F9665BC4C54B}" ProjectSection(SolutionItems) = preProject BuildScripts\bootstrapper.ps1 = BuildScripts\bootstrapper.ps1 + BoxstarterChocolateyInstall.ps1 = BoxstarterChocolateyInstall.ps1 BuildScripts\build.proj = BuildScripts\build.proj BuildScripts\build.ps1 = BuildScripts\build.ps1 BuildScripts\chocolateyinstall.ps1 = BuildScripts\chocolateyinstall.ps1 @@ -29,6 +30,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitignore = .gitignore BoxStarter.bat = BoxStarter.bat boxstarter.config = boxstarter.config + BoxstarterShell.ps1 = BoxstarterShell.ps1 build.bat = build.bat LICENSE.txt = LICENSE.txt EndProjectSection diff --git a/BoxstarterShell.ps1 b/BoxstarterShell.ps1 index e69de29b..fed1ca60 100644 --- a/BoxstarterShell.ps1 +++ b/BoxstarterShell.ps1 @@ -0,0 +1,28 @@ +$here = Split-Path -parent $MyInvocation.MyCommand.Definition +Resolve-Path $here\Boxstarter.*\*.psd1 | + % { Import-Module $_.ProviderPath -DisableNameChecking -Force -ErrorAction SilentlyContinue } +Import-Module $here\Boxstarter.Common\Boxstarter.Common.psd1 -Function Test-Admin + +if(!(Test-Admin)) { + Write-BoxstarterMessage "Not running with administrative rights. Attempting to elevate..." + $command = "-ExecutionPolicy bypass -noexit -command &$here\BoxstarterShell.ps1" + Start-Process powershell -verb runas -argumentlist $command + Exit +} + +$Host.UI.RawUI.WindowTitle="Boxstarter Shell" +cd $env:SystemDrive\ +Write-Output @" +Welcome to the Boxstarter shell! +The Boxstarter commands have been imported from $here and are available for you to run in this shell. +You may also import them into the shell of your choice. + +Here are some commands to get you started: +Install a Package: Install-BoxstarterPackage +Create a Package: New-BoxstarterPackage +Build a Package: Invoke-BoxstarterBuild +Enable a VM: Enable-BoxstarterVM +For Command help: Get-Help -Full + +For Boxstarter documentation, source code, to report bugs or participate in discussions, please visit http://boxstarter.org +"@ \ No newline at end of file diff --git a/BuildScripts/BoxstarterChocolateyInstall.ps1 b/BuildScripts/BoxstarterChocolateyInstall.ps1 new file mode 100644 index 00000000..4152dbf9 --- /dev/null +++ b/BuildScripts/BoxstarterChocolateyInstall.ps1 @@ -0,0 +1,7 @@ +try { + Write-ChocolateySuccess "Boxstarter" + Write-Host "To load all Boxstarter Modules immediately, just enter 'BoxstarterShell'." -ForegroundColor Yellow +} catch { + Write-ChocolateyFailure "Boxstarter" "$($_.Exception.Message)" + throw +} \ No newline at end of file diff --git a/BuildScripts/nuget/Boxstarter.Chocolatey.nuspec b/BuildScripts/nuget/Boxstarter.Chocolatey.nuspec index 1c16064b..426e1cc8 100644 --- a/BuildScripts/nuget/Boxstarter.Chocolatey.nuspec +++ b/BuildScripts/nuget/Boxstarter.Chocolatey.nuspec @@ -43,6 +43,8 @@ + + \ No newline at end of file diff --git a/BuildScripts/nuget/Boxstarter.nuspec b/BuildScripts/nuget/Boxstarter.nuspec index fce83296..b5a7ef81 100644 --- a/BuildScripts/nuget/Boxstarter.nuspec +++ b/BuildScripts/nuget/Boxstarter.nuspec @@ -38,4 +38,7 @@ - Add ability to configure a VHD to open it to WMI so that Boxstarter Installs canenable remoting. + + + \ No newline at end of file diff --git a/BuildScripts/setup.ps1 b/BuildScripts/setup.ps1 index e548e7ea..747b1eaa 100644 --- a/BuildScripts/setup.ps1 +++ b/BuildScripts/setup.ps1 @@ -17,8 +17,8 @@ function Install-Boxstarter($here, $ModuleName) { PersistBoxStarterPathToEnvironmentVariable "PSModulePath" PersistBoxStarterPathToEnvironmentVariable "Path" + $binPath = Join-Path $env:ChocolateyInstall bin Import-Module "$boxstarterPath\$ModuleName" -DisableNameChecking -Force -ErrorAction SilentlyContinue - write-host "Boxstarter is now ready. You can type 'Boxstarter' from any command line at any path." $successMsg = @" The $ModuleName Module has been copied to $boxstarterPath and added to your Module path. You will need to open a new console for the path to be visible. @@ -32,9 +32,55 @@ PS:>Import-Module $ModuleName PS:>Get-Help Boxstarter "@ Write-BoxstarterMessage $successMsg + + if($ModuleName -eq "Boxstarter.Chocolatey") { + $desktop = $([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::DesktopDirectory)) + $startMenu=$("$env:appdata\Microsoft\Windows\Start Menu\Programs\Boxstarter") + if(!(Test-Path $startMenu)){ + mkdir $startMenu + } + $target="powershell.exe" + $targetArgs="-ExecutionPolicy bypass -NoExit -Command &$boxstarterPath\BoxstarterShell.ps1" + + $link = Join-Path $desktop "Boxstarter Shell.lnk" + Create-Shortcut $link $target $targetArgs $boxstarterPath + + $link = Join-Path $startMenu "Boxstarter Shell.lnk" + Create-Shortcut $link $target $targetArgs $boxstarterPath + + Add-Content -Path "$binPath\BoxstarterShell.bat" -Force -Value "$target $TargetArgs" + } + } +function Create-Shortcut($location, $target, $targetArgs, $boxstarterPath) { + $wshshell = New-Object -ComObject WScript.Shell + $lnk = $wshshell.CreateShortcut($location) + $lnk.TargetPath = $target + $lnk.Arguments = "$targetArgs" + $lnk.WorkingDirectory = $boxstarterPath + $lnk.IconLocation="$boxstarterPath\BoxLogo.ico" + $lnk.Save() + $tempFile = "$env:temp\TempShortcut.lnk" + + $writer = new-object System.IO.FileStream $tempFile, ([System.IO.FileMode]::Create) + $reader = new-object System.IO.FileStream $location, ([System.IO.FileMode]::Open) + + while ($reader.Position -lt $reader.Length) + { + $byte = $reader.ReadByte() + if ($reader.Position -eq 22) { + $byte = 34 + } + $writer.WriteByte($byte) + } + + $reader.Close() + $writer.Close() + + Move-Item -Path $tempFile $location -Force +} function PersistBoxStarterPathToEnvironmentVariable($variableName){ $value = [Environment]::GetEnvironmentVariable($variableName, 'User') if($value){ diff --git a/boxlogo.ico b/boxlogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..901d5cf45fe050d094b922beeb0682bf97131858 GIT binary patch literal 21662 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 R#QV#%{m&PPPj<@v{}1N*guMU& literal 0 HcmV?d00001