diff --git a/.github/workflows/ci-pipeline.yml b/.github/workflows/ci-pipeline.yml index 17341c5168..cc5b1d0156 100644 --- a/.github/workflows/ci-pipeline.yml +++ b/.github/workflows/ci-pipeline.yml @@ -240,10 +240,10 @@ jobs: ref: "refs/pull/${{ github.event.number }}/merge" - name: Build - run: dotnet build -c ${{ matrix.configuration }}NoFramework + run: dotnet build -c ${{ matrix.configuration }}NoWindows - name: Run Unit Tests - run: sudo dotnet test --no-build --logger GitHubActions --filter FullyQualifiedName!~TestLiveServer -c ${{ matrix.configuration }}NoFramework --collect:"XPlat Code Coverage" --settings build/coverlet.runsettings --results-directory ./TestResults tgstation-server.sln + run: sudo dotnet test --no-build --logger GitHubActions --filter FullyQualifiedName!~TestLiveServer -c ${{ matrix.configuration }}NoWindows --collect:"XPlat Code Coverage" --settings build/coverlet.runsettings --results-directory ./TestResults tgstation-server.sln - name: Store Code Coverage uses: actions/upload-artifact@v3 @@ -562,13 +562,13 @@ jobs: ref: "refs/pull/${{ github.event.number }}/merge" - name: Build - run: dotnet build -c ${{ matrix.configuration }}NoFramework tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj + run: dotnet build -c ${{ matrix.configuration }}NoWindows tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj - name: Run Live Tests run: | cd tests/Tgstation.Server.Tests sleep 10 - dotnet test -c ${{ matrix.configuration }}NoFramework --filter FullyQualifiedName~TestLiveServer --logger GitHubActions --no-build --collect:"XPlat Code Coverage" --settings ../../build/coverlet.runsettings --results-directory ../../TestResults + dotnet test -c ${{ matrix.configuration }}NoWindows --filter FullyQualifiedName~TestLiveServer --logger GitHubActions --no-build --collect:"XPlat Code Coverage" --settings ../../build/coverlet.runsettings --results-directory ../../TestResults - name: Store Code Coverage uses: actions/upload-artifact@v3 @@ -582,14 +582,14 @@ jobs: cd src/Tgstation.Server.Host.Console dotnet publish -c ${{ matrix.configuration }} -o ../../Artifacts/Console cd ../Tgstation.Server.Host - dotnet publish -c ${{ matrix.configuration }}NoFramework --no-build -o ../../Artifacts/Console/lib/Default + dotnet publish -c ${{ matrix.configuration }}NoWindows --no-build -o ../../Artifacts/Console/lib/Default mv ../../Artifacts/Console/lib/Default/appsettings.yml ../../Artifacts/Console/appsettings.yml - name: Package Server Update Package if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'System' && matrix.database-type == 'PostgresSql' }} run: | cd src/Tgstation.Server.Host - dotnet publish -c ${{ matrix.configuration }}NoFramework --no-build -o ../../Artifacts/ServerUpdate + dotnet publish -c ${{ matrix.configuration }}NoWindows --no-build -o ../../Artifacts/ServerUpdate rm ../../Artifacts/ServerUpdate/appsettings.yml - name: Store Server Console @@ -930,27 +930,24 @@ jobs: - name: Test Install run: | + sudo mkdir /etc/tgstation-server + sudo cp build/package/appsettings.GitHub.yml /etc/tgstation-server/appsettings.Production.yml sudo apt-get install -y ./tgstation-server_${{ env.TGS_VERSION }}-1_amd64.deb sudo ls -al /etc/tgstation-server sudo cat /etc/tgstation-server/appsettings.Production.yml ls -al /opt/tgstation-server - sudo cat /opt/tgstation-server/appsettings.Production.yml cat /opt/tgstation-server/appsettings.yml cat /opt/tgstation-server/lib/Default/Tgstation.Server.Host.deps.json cat /usr/bin/tgs-configure - name: Test Service run: | - set +e systemctl status tgstation-server - $EXIT_CODE=$? - set -e - if [ $EXIT_CODE != 0 ] && [ $EXIT_CODE != '3' ]; then - exit $EXIT_CODE - fi - - name: Test Uninstall + - name: Test Uninstall # Wait 10s for service to initialize + shell: bash run: | + sleep 10 sudo apt-get remove -y tgstation-server if [[ -d "/opt/tgstation-server" ]]; then ls -al /opt/tgstation-server @@ -967,21 +964,19 @@ jobs: path: tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz build-msi: - name: Build .msi Package + name: Build Windows Installer .exe needs: start-ci-run-gate runs-on: windows-latest if: "!(cancelled() || failure()) && needs.start-ci-run-gate.result == 'success'" steps: - - name: Setup VS Dev Environment - uses: seanmiddleditch/gha-setup-vsdevenv@v4 - - - name: Disable Out of Process Building - working-directory: C:/Program Files/Microsoft Visual Studio/2022/Enterprise/Common7/IDE/CommonExtensions/Microsoft/VSI/DisableOutOfProcBuild - run: ./DisableOutOfProcBuild.exe - - name: Install winget uses: Cyberboss/install-winget@v1 + - name: Setup dotnet + uses: actions/setup-dotnet@v2 + with: + dotnet-version: ${{ env.TGS_DOTNET_VERSION }} + - name: Checkout (Branch) uses: actions/checkout@v3 if: github.event_name == 'push' || github.event_name == 'schedule' @@ -995,16 +990,27 @@ jobs: - name: Validate winget Manifest run: winget validate --manifest build/package/winget/manifest - - name: Execute Build Script + - name: Build Service + run: dotnet build -c Release src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj + + - name: Prepare Artifacts shell: powershell - run: build/package/winget/build_msi.ps1 + run: build/package/winget/prepare_installer_input_artifacts.ps1 + + - name: Build Installer + run: | + cd build/package/winget + dotnet tool restore + dotnet build -c Release Tgstation.Server.Service.Wix.Bundle - name: Test Install # Sanity checks the .deps.json exists, which the installation is broken without shell: powershell # If it's missing, I found that in elements were the problem run: | - $file = [System.IO.Path]::GetFullPath("packaging/build/package/winget/Tgstation.Server.Host.Service.Msi/Release/tgstation-server.msi") + mkdir C:/ProgramData/tgstation-server + cp build/package/appsettings.GitHub.yml C:/ProgramData/tgstation-server/appsettings.Production.yml + $file = [System.IO.Path]::GetFullPath("build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin/x86/Release/tgstation-server-installer.exe") $log = [System.IO.Path]::GetFullPath("install.log") - $procMain = Start-Process "msiexec" "/i `"$file`" /qn /l*! `"$log`"" -NoNewWindow -PassThru -Wait + $procMain = Start-Process "$file" "/install /silent /log `"$log`"" -NoNewWindow -PassThru -Wait if (Test-Path -Path $log -PathType Leaf) { Get-Content $log } @@ -1016,6 +1022,9 @@ jobs: if (-Not (Test-Path -Path "C:/Program Files (x86)/tgstation-server/lib/Default/Tgstation.Server.Host.deps.json" -PathType Leaf)) { exit 2 } + if (-Not (Test-Path -Path "C:/ProgramData/tgstation-server/appsettings.Production.json" -PathType Leaf)) { + exit 4 + } - name: Test Service shell: powershell @@ -1024,13 +1033,16 @@ jobs: if ($service.Length -eq 0) { exit 3 } + if ($service[0].Status -ne "Running") { + exit 4 + } - name: Test Uninstall # Sanity checks the .deps.json exists, which the installation is broken without - shell: powershell # If it's missing, I found that in elements were the problem + shell: powershell run: | - $file = [System.IO.Path]::GetFullPath("packaging/build/package/winget/Tgstation.Server.Host.Service.Msi/Release/tgstation-server.msi") + $file = [System.IO.Path]::GetFullPath("build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin/x86/Release/tgstation-server-installer.exe") $log = [System.IO.Path]::GetFullPath("uninstall.log") - $procMain = Start-Process "msiexec" "/x `"$file`" /qn /l*! `"$log`"" -NoNewWindow -PassThru -Wait + $procMain = Start-Process "$file" "/install /silent /log `"$log`"" -NoNewWindow -PassThru -Wait if (Test-Path -Path $log -PathType Leaf) { Get-Content $log } @@ -1045,11 +1057,11 @@ jobs: exit 2 } - - name: Upload .msi + - name: Upload Installer .exe uses: actions/upload-artifact@v3 with: name: packaging-windows - path: packaging/build/package/winget/Tgstation.Server.Host.Service.Msi/Release/tgstation-server.msi + path: build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin/x86/Release/tgstation-server-installer.exe check-winget-pr-template: name: Check winget-pkgs Pull Request Template is up to date @@ -1078,8 +1090,11 @@ jobs: with: ref: "refs/pull/${{ github.event.number }}/merge" + - name: Build ReleaseNotes + run: dotnet build -c Release tools/ReleaseNotes/ReleaseNotes.csproj + - name: Run ReleaseNotes Check - run: dotnet run -c Release --project tools/ReleaseNotes --winget-template-check ${{ steps.get-sha.outputs.pr_template_sha }} + run: dotnet run -c Release --no-build --project tools/ReleaseNotes --winget-template-check ${{ steps.get-sha.outputs.pr_template_sha }} ci-completion-gate: # This job exists so there isn't a moving target for branch protections name: CI Completion Gate @@ -1236,8 +1251,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Build ReleaseNotes + run: dotnet build -c Release tools/ReleaseNotes/ReleaseNotes.csproj + - name: Run ReleaseNotes with --ensure-release - run: dotnet run -c Release --project tools/ReleaseNotes --ensure-release + run: dotnet run -c Release --no-build --project tools/ReleaseNotes --ensure-release deploy-tgs: name: Deploy TGS @@ -1253,6 +1271,9 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Build ReleaseNotes + run: dotnet build -c Release tools/ReleaseNotes/ReleaseNotes.csproj + - name: Parse TGS version shell: powershell run: | @@ -1290,7 +1311,7 @@ jobs: name: packaging-debian path: packaging-debian - - name: Retrieve .msi + - name: Retrieve Installer .exe uses: actions/download-artifact@v3 with: name: packaging-windows @@ -1306,7 +1327,7 @@ jobs: &"C:/Program Files/7-Zip/7z.exe" a ServerUpdatePackage.zip ./ServerUpdatePackage/* -tzip - name: Generate Release Notes - run: dotnet run -c Release --project tools/ReleaseNotes ${{ env.TGS_VERSION }} + run: dotnet run -c Release --no-build --project tools/ReleaseNotes ${{ env.TGS_VERSION }} - name: Create GitHub Release uses: actions/create-release@v1 @@ -1379,14 +1400,14 @@ jobs: asset_name: tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz asset_content_type: application/x-tar - - name: Upload .msi + - name: Upload Installer .exe uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.DEV_PUSH_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./packaging-windows/tgstation-server.msi - asset_name: tgstation-server.msi + asset_path: ./packaging-windows/tgstation-server-installer.exe + asset_name: tgstation-server-installer.exe asset_content_type: application/octet-stream deploy-docker: @@ -1458,7 +1479,7 @@ jobs: - name: Build ReleaseNotes run: dotnet build -c Release tools/ReleaseNotes - - name: Retrieve .msi + - name: Retrieve Installer .exe uses: actions/download-artifact@v3 with: name: packaging-windows @@ -1466,7 +1487,7 @@ jobs: - name: Execute Push Script shell: powershell - run: build/package/winget/push_manifest.ps1 -MsiPath packaging-windows/tgstation-server.msi + run: build/package/winget/push_manifest.ps1 -InstallerPath packaging-windows/tgstation-server-installer.exe - name: Run ReleaseNotes with --link-winget - run: dotnet run -c Release --project tools/ReleaseNotes --link-winget ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + run: dotnet run -c Release --no-build --project tools/ReleaseNotes --link-winget ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.github/workflows/code-scanning.yml b/.github/workflows/code-scanning.yml index 00cf4bb1cc..8e130eddf4 100644 --- a/.github/workflows/code-scanning.yml +++ b/.github/workflows/code-scanning.yml @@ -35,7 +35,7 @@ jobs: languages: csharp - name: Build - run: dotnet build -c ReleaseNoFramework + run: dotnet build -c ReleaseNoWindows - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 diff --git a/.gitignore b/.gitignore index df800dc16b..56aae9a8b9 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,3 @@ release_notes.md *nupkg *.sqlite3 packaging/ -build/package/winget/Tgstation.Server.Host.Service.Msi/Release/ diff --git a/build/Common.props b/build/Common.props index 95ade51555..89b88f109b 100644 --- a/build/Common.props +++ b/build/Common.props @@ -2,7 +2,7 @@ - net6.0 + net$(TgsNetMajorVersion).0 netstandard2.0 latest Full diff --git a/build/Version.props b/build/Version.props index f3102f5c76..f8038e8242 100644 --- a/build/Version.props +++ b/build/Version.props @@ -13,6 +13,10 @@ 5.6.1 1.3.0 1.2.1 - 1.0.1 + 1.0.2 + 6 + + + https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/6.0.19/dotnet-hosting-6.0.19-win.exe diff --git a/build/package/appsettings.GitHub.yml b/build/package/appsettings.GitHub.yml index e916396a95..610a2ccd76 100644 --- a/build/package/appsettings.GitHub.yml +++ b/build/package/appsettings.GitHub.yml @@ -1,3 +1,26 @@ +# Barebones config file used for testing service installs in GitHub actions Database: DatabaseType: Sqlite ConnectionString: Data Source=/tgs.sqlite3;Mode=ReadWriteCreate +General: + ConfigVersion: 4.6.0 + ApiPort: 5000 + GitHubAccessToken: + SetupWizardMode: Never + ByondTopicTimeout: 5000 + RestartTimeoutMinutes: 1 + ShutdownTimeoutMinutes: 300 + UseBasicWatchdog: false + HostApiDocumentation: true + SkipAddingByondFirewallException: false + DeploymentDirectoryCopyTasksPerCore: + MinimumPasswordLength: 15 + InstanceLimit: 10 + UserLimit: 100 + UserGroupLimit: 25 + ValidInstancePaths: +FileLogging: + Directory: + Disable: false + LogLevel: Trace + MicrosoftLogLevel: Warning diff --git a/build/package/appsettings.Initial.yml b/build/package/appsettings.Initial.yml index 575df3fd32..1996a8a881 100644 --- a/build/package/appsettings.Initial.yml +++ b/build/package/appsettings.Initial.yml @@ -1,2 +1,2 @@ # tgstation-server configuration file -# See /opt/tgstation-server/appsettings.yml for details on individual configuration options +# See appsettings.yml or README.md for details on individual configuration options diff --git a/build/package/deb/MakeInstall b/build/package/deb/MakeInstall index ddbb512673..f0d34e6963 100755 --- a/build/package/deb/MakeInstall +++ b/build/package/deb/MakeInstall @@ -3,5 +3,5 @@ install: build/package/deb/install_artifacts.sh "$(DESTDIR)" install -D build/package/appsettings.Initial.yml "$(DESTDIR)/etc/tgstation-server/appsettings.Production.yml" - install src/Tgstation.Server.Host/appsettings.yml "$(DESTDIR)/etc/tgstation-server/appsettings.ex.yml" + install src/Tgstation.Server.Host/appsettings.yml "$(DESTDIR)/etc/tgstation-server/appsettings.yml" install -D build/package/deb/tgs-configure "$(DESTDIR)/usr/bin/tgs-configure" diff --git a/build/package/deb/debian/links b/build/package/deb/debian/links deleted file mode 100644 index 8a960e0a76..0000000000 --- a/build/package/deb/debian/links +++ /dev/null @@ -1 +0,0 @@ -/etc/tgstation-server/appsettings.Production.yml /opt/tgstation-server/appsettings.Production.yml diff --git a/build/package/deb/debian/rules b/build/package/deb/debian/rules index 39506708ae..7fd8d564fa 100755 --- a/build/package/deb/debian/rules +++ b/build/package/deb/debian/rules @@ -7,13 +7,13 @@ export DH_VERBOSE = 1 override_dh_auto_clean: rm -rf artifacts - dotnet clean -c ReleaseNoFramework + dotnet clean -c ReleaseNoWindows override_dh_auto_build: dotnet restore cd src/Tgstation.Server.Host.Console && dotnet publish -c Release -o ../../artifacts cd src/Tgstation.Server.Host && dotnet publish -c Release -o ../../artifacts/lib/Default - mv artifacts/lib/Default/appsettings.yml artifacts/appsettings.yml + rm artifacts/lib/Default/appsettings.yml override_dh_auto_install: cp build/package/deb/MakeInstall ./Makefile diff --git a/build/package/winget/Tgstation.Server.Host.Service.Configure/Program.cs b/build/package/winget/Tgstation.Server.Host.Service.Configure/Program.cs deleted file mode 100644 index 4f36aa3890..0000000000 --- a/build/package/winget/Tgstation.Server.Host.Service.Configure/Program.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Security.AccessControl; -using System.Threading; -using System.Windows.Forms; - -using var process = new Process(); - -var installDir = Path.GetDirectoryName( - Path.GetDirectoryName( - Assembly.GetExecutingAssembly().Location))!; - -process.StartInfo.WorkingDirectory = installDir; -process.StartInfo.FileName = Path.Combine( - installDir, - "Tgstation.Server.Host.Service.exe"); - -/* -https://www.roelvanlisdonk.nl/2009/11/13/how-to-detect-unattended-installation-msiexec-quit-or-qn-in-youre-custom-action-with-c/ -msiUILevelNoChange 0 Does not change UI level. -msiUILevelDefault 1 Uses default UI level. -msiUILevelNone 2 Silent installation. -msiUILevelBasic 3 Simple progress and error handling. -msiUILevelReduced 4 Authored UI and wizard dialog boxes suppressed. -msiUILevelFull 5 Authored UI with wizards, progress, and errors. -msiUILevelHideCancel 32 If combined with the msiUILevelBasic value, the installer shows progress dialog boxes but does not display a Cancel button on the dialog box to prevent users from canceling the installation. -msiUILevelProgressOnly 64 If combined with the msiUILevelBasic value, the installer displays progress dialog boxes but does not display any modal dialog boxes or error dialog boxes. -msiUILevelEndDialog 128 If combined with any above value, the installer displays a modal dialog box at the end of a successful installation or if there has been an error. No dialog box is displayed if the user cancels. -*/ -var uiLevel = Int32.Parse(args[0]); - -// leave it to MS to overcomplicate things -var interactive = uiLevel switch -{ - 0 or 1 or 4 or 5 => true, - _ => false, -}; - -var silent = uiLevel == 2; - -var uninstall = args - .Any(arg => arg.Equals("--uninstall", StringComparison.OrdinalIgnoreCase)); - -var shortcut = uiLevel == 42069; - -bool restartService; -if (shortcut) -{ - var result = MessageBox.Show($"This program will configure tgstation-server. Would you like to restart the service after doing so?{Environment.NewLine}{Environment.NewLine}A restart is required to apply changes. It will not kill your DreamDaemon instances provided you are running a version >=5.13.0 (Always true if you've never downgraded)", "Restart TGS After Configuring?", MessageBoxButtons.YesNo); - restartService = result == DialogResult.Yes; -} -else - restartService = interactive; - -process.StartInfo.Arguments = uninstall - ? $"-u{(silent ? " -s" : String.Empty)}" - : $"-i -f -x{(restartService ? " -r" : String.Empty)}{((interactive || shortcut) ? " -c" : String.Empty)}{(silent ? " -s" : String.Empty)}"; - -process.Start(); - -await process.WaitForExitAsync(CancellationToken.None); // DCT: None available - -foreach (var installLogFile in Directory.EnumerateFiles(installDir, "*.log")) - File.Delete(installLogFile); - -if (uninstall) -{ - Directory.Delete( - Path.Combine(installDir, "lib"), - true); - - // returning non-zero can make the installation uninstallable, no thanks - return 0; -} - -// try and lockdown the appsettings file -var fileInfo = new FileInfo(Path.Combine(installDir, "appsettings.Production.yml")); - -//get security access -FileSecurity fs = fileInfo.GetAccessControl(); - -//remove inherited access -fs.SetAccessRuleProtection(true, false); - -// Explicitly grant admins and SYSTEM -fs.AddAccessRule(new FileSystemAccessRule("Administrators", FileSystemRights.FullControl, AccessControlType.Allow)); -fs.AddAccessRule(new FileSystemAccessRule("NT AUTHORITY\\SYSTEM", FileSystemRights.Read, AccessControlType.Allow)); - -fileInfo.SetAccessControl(fs); - -return process.ExitCode; diff --git a/build/package/winget/Tgstation.Server.Host.Service.Configure/Tgstation.Server.Host.Service.Configure.csproj b/build/package/winget/Tgstation.Server.Host.Service.Configure/Tgstation.Server.Host.Service.Configure.csproj deleted file mode 100644 index 2fabb8e117..0000000000 --- a/build/package/winget/Tgstation.Server.Host.Service.Configure/Tgstation.Server.Host.Service.Configure.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - WinExe - net6.0-windows - win-x86 - true - enable - ../../../uac_elevation_manifest.xml - ../../../tgs.ico - - - - - - - diff --git a/build/package/winget/Tgstation.Server.Host.Service.Msi/README.md b/build/package/winget/Tgstation.Server.Host.Service.Msi/README.md deleted file mode 100644 index a7d88b76cf..0000000000 --- a/build/package/winget/Tgstation.Server.Host.Service.Msi/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# .msi Installer Project - -Useful reference for variables: https://learn.microsoft.com/en-us/windows/win32/msi/property-reference?redirectedfrom=MSDN diff --git a/build/package/winget/Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj b/build/package/winget/Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj deleted file mode 100644 index db8383c96b..0000000000 --- a/build/package/winget/Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj +++ /dev/null @@ -1,1031 +0,0 @@ -"DeployProject" -{ -"VSVersion" = "3:800" -"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" -"IsWebType" = "8:FALSE" -"ProjectName" = "8:Tgstation.Server.Host.Service.Msi" -"LanguageId" = "3:1033" -"CodePage" = "3:1252" -"UILanguageId" = "3:1033" -"SccProjectName" = "8:" -"SccLocalPath" = "8:" -"SccAuxPath" = "8:" -"SccProvider" = "8:" - "Hierarchy" - { - "Entry" - { - "MsmKey" = "8:_11E0E9B45549402D92B039FCCD0783B8" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_137A5E0CCDBF4E4A9549C03C74D3988C" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_415514E8CEF94645B44E5665C5B9D8F5" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_B0A2BC595A554F188D336702686A821E" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_E3B62CFD59F3484BACCB88E834824355" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F78AE830495A499099776F774CAB3D6D" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - } - "Configurations" - { - "Release" - { - "DisplayName" = "8:Release" - "IsDebugOnly" = "11:FALSE" - "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\tgstation-server.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:3" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:FALSE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - } - } - } - } - "Deployable" - { - "CustomAction" - { - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_A53906ED15374112AC84662B6F2E8041" - { - "Name" = "8:Publish Items from Tgstation.Server.Host.Service.Configure (Active)" - "Condition" = "8:" - "Object" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "FileType" = "3:2" - "InstallAction" = "3:1" - "Arguments" = "8:[UILevel]" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_B09766E4_1B68_49DE_9726_68FD609D967B" - "InstallerClass" = "11:FALSE" - "CustomActionData" = "8:" - "Run64Bit" = "11:TRUE" - } - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_A953E29077C84B36ADF6660A83C8B004" - { - "Name" = "8:Publish Items from Tgstation.Server.Host.Service.Configure (Active)" - "Condition" = "8:" - "Object" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "FileType" = "3:2" - "InstallAction" = "3:4" - "Arguments" = "8:[UILevel] --uninstall" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_6B8510E1_5DAE_4023_AD93_B9DD1AC65C45" - "InstallerClass" = "11:FALSE" - "CustomActionData" = "8:" - "Run64Bit" = "11:TRUE" - } - } - "DefaultFeature" - { - "Name" = "8:DefaultFeature" - "Title" = "8:" - "Description" = "8:" - } - "ExternalPersistence" - { - "LaunchCondition" - { - "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_C5FA609714B64925A18859A195267F9F" - { - "Name" = "8:.NET Core" - "Message" = "8:[VSDNETCOREMSG]" - "AllowLaterVersions" = "11:FALSE" - "InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]" - "IsNETCore" = "11:TRUE" - "Architecture" = "2:0" - "Runtime" = "2:0" - } - } - } - "File" - { - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_137A5E0CCDBF4E4A9549C03C74D3988C" - { - "SourcePath" = "8:..\\..\\..\\..\\src\\Tgstation.Server.Host\\appsettings.yml" - "TargetName" = "8:appsettings.yml" - "Tag" = "8:" - "Folder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B0A2BC595A554F188D336702686A821E" - { - "SourcePath" = "8:..\\..\\..\\..\\LICENSE" - "TargetName" = "8:LICENSE" - "Tag" = "8:" - "Folder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:TRUE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E3B62CFD59F3484BACCB88E834824355" - { - "SourcePath" = "8:..\\..\\appsettings.Initial.yml" - "TargetName" = "8:appsettings.Production.yml" - "Tag" = "8:" - "Folder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F78AE830495A499099776F774CAB3D6D" - { - "SourcePath" = "8:..\\install_banner.jpg" - "TargetName" = "8:install_banner.jpg" - "Tag" = "8:" - "Folder" = "8:_EB2DCEE6D3F74230A9827AC9B6F47F53" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - } - "FileType" - { - } - "Folder" - { - "{1525181F-901A-416C-8A58-119130FE478E}:_758C42B61089428A950F84AD33260664" - { - "Name" = "8:#1921" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:StartMenuFolder" - "Folders" - { - } - } - "{3C67513D-01DD-4637-8A68-80971EB9504F}:_B28C4FD80D0245E08AEDCFEECACB6493" - { - "DefaultLocation" = "8:[ProgramFilesFolder][ProductName]" - "Name" = "8:#1925" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:TARGETDIR" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_0CFAD254CCC645209154DD4D85649AEA" - { - "Name" = "8:configure" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_21324B7571BE4E9E8B14F4D2BD470581" - "Folders" - { - } - } - "{9EF0B969-E518-4E46-987F-47570745A589}:_D8FD06A5721D4746BD1D087E6329F3CF" - { - "Name" = "8:lib" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_1760E07222D34C3ABECB83B8D17A7256" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_44E17B6EBB30432E9D4FBB976D7E029A" - { - "Name" = "8:Default" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_40C981E76FB44E748278A84D5E727464" - "Folders" - { - } - } - } - } - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_BD1E6451115645479FB57AD1F0BB6A8B" - { - "Name" = "8:#1916" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:DesktopFolder" - "Folders" - { - } - } - "{994432C3-9487-495D-8656-3E829A8DBDDE}:_EB2DCEE6D3F74230A9827AC9B6F47F53" - { - "DefaultLocation" = "8:[TARGETDIR]" - "Name" = "8:Install Resources" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:NEWPROPERTY1" - "Folders" - { - } - } - } - "LaunchCondition" - { - } - "Locator" - { - } - "MsiBootstrapper" - { - "LangId" = "3:1033" - "RequiresElevation" = "11:FALSE" - } - "Product" - { - "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:tgstation-server" - "ProductCode" = "8:{D24887FA-3228-4509-B5F3-4E07E349F278}" - "PackageCode" = "8:{D078B8A7-E5C3-48EE-85B0-56C355FCBB43}" - "UpgradeCode" = "8:{151FE9F8-72CF-48D5-8E55-B7FB6BA9693E}" - "AspNetVersion" = "8:4.0.30319.0" - "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:TRUE" - "DetectNewerInstalledVersion" = "11:TRUE" - "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:0.22.475" - "Manufacturer" = "8:tgstation" - "ARPHELPTELEPHONE" = "8:" - "ARPHELPLINK" = "8:https://github.com/tgstation/tgstation-server/discussions/categories/q-a" - "Title" = "8:tgstation-server" - "Subject" = "8:" - "ARPCONTACT" = "8:Dominon/Cyberboss" - "Keywords" = "8:" - "ARPCOMMENTS" = "8:Installer for tgstation-server" - "ARPURLINFOABOUT" = "8:https://github.com/tgstation/tgstation-server" - "ARPPRODUCTICON" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "ARPIconIndex" = "3:32512" - "SearchPath" = "8:" - "UseSystemSearchPath" = "11:TRUE" - "TargetPlatform" = "3:0" - "PreBuildEvent" = "8:" - "PostBuildEvent" = "8:" - "RunPostBuildEvent" = "3:0" - } - "Registry" - { - "HKLM" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BB4EE4F5EF8A4C1BA6BAA85FE34E56C4" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_05C235158E3A4664B285EA29511EF02D" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCU" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_0379B7F8F5504CDA9DB9B9D546DB606D" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6E60244E84834632A09C938ACAAC308D" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCR" - { - "Keys" - { - } - } - "HKU" - { - "Keys" - { - } - } - "HKPU" - { - "Keys" - { - } - } - } - "Sequences" - { - } - "Shortcut" - { - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_8033129B5D1D4BB0904586D539B32765" - { - "Name" = "8:Configure and Restart tgstation-server" - "Arguments" = "8:42069" - "Description" = "8:Runs the TGS setup wizard and optionally restarts the Windows service" - "ShowCmd" = "3:1" - "IconIndex" = "3:32512" - "Transitive" = "11:FALSE" - "Target" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "Folder" = "8:_758C42B61089428A950F84AD33260664" - "WorkingFolder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Icon" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "Feature" = "8:" - } - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_86C54A96871E40B6B517685DB09F223A" - { - "Name" = "8:Configure and Restart tgstation-server" - "Arguments" = "8:42069 " - "Description" = "8:Runs the TGS setup wizard and optionally restarts the Windows service" - "ShowCmd" = "3:1" - "IconIndex" = "3:32512" - "Transitive" = "11:FALSE" - "Target" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "Folder" = "8:_BD1E6451115645479FB57AD1F0BB6A8B" - "WorkingFolder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Icon" = "8:_E9F7402DCE77463F9B7319647D3C16F2" - "Feature" = "8:" - } - } - "UserInterface" - { - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_0E30589D83D5457EA1590BDA4DB93D03" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdBasicDialogs.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_109A5A97F789460AB73CDF166664A916" - { - "Name" = "8:#1902" - "Sequence" = "3:2" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_76284EF5FA104F46A0644EE9513C0A4D" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_278559DEB3E24BBCAA1C9B3F68673761" - { - "Name" = "8:#1900" - "Sequence" = "3:1" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7CD912AA05C244CB8A903FBFD33E29A8" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B3748469032C440CA8C833C645EF67F9" - { - "Sequence" = "3:100" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BE9B710186F946AC828F528A90F9B1CA" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "InstallAllUsersVisible" - { - "Name" = "8:InstallAllUsersVisible" - "DisplayName" = "8:#1059" - "Description" = "8:#1159" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2C7325D993884C978B1A4381E1143564" - { - "Name" = "8:#1901" - "Sequence" = "3:2" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FB014E47DC3540A2AA6B4B1B109BDA09" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_34AD1EE11A4C483C8F39A6F57C055D1C" - { - "Name" = "8:#1900" - "Sequence" = "3:2" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0C069DDECE324687A9F07480971F4EA1" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_566942A0B14E44D2ABECDB1CCA6B4229" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CDECB4E7DDE84A4DB72B528A15D01E47" - { - "Sequence" = "3:110" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C1FAAD9180D249AE930209CFFDE47E92" - { - "Name" = "8:#1902" - "Sequence" = "3:1" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F066076B6F3F439D9B70A2243DCC8D99" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "UpdateText" - { - "Name" = "8:UpdateText" - "DisplayName" = "8:#1058" - "Description" = "8:#1158" - "Type" = "3:15" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:You can now navigate to http://localhost: to manage your server." - "DefaultValue" = "8:#1258" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_CDC222C0F1734F22A35CE4BE55CD389D" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdUserInterface.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E2FF183010DC4AD5868B1B6BB4835C7F" - { - "Name" = "8:#1901" - "Sequence" = "3:1" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9C81E7707FD24FA98CE1C7DAAB793AB6" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_F78AE830495A499099776F774CAB3D6D" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - } - "MergeModule" - { - } - "ProjectOutput" - { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_11E0E9B45549402D92B039FCCD0783B8" - { - "SourcePath" = "8:" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_44E17B6EBB30432E9D4FBB976D7E029A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:PublishItems" - "OutputProjectGuid" = "8:{2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - "ExcludeFilter" = "8:appsettings.yml" - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_415514E8CEF94645B44E5665C5B9D8F5" - { - "SourcePath" = "8:..\\..\\..\\..\\src\\Tgstation.Server.Api\\bin\\Release\\netstandard2.0\\Tgstation.Server.Api.xml" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_44E17B6EBB30432E9D4FBB976D7E029A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Documentation" - "OutputProjectGuid" = "8:{8B4A208D-A48A-4A5D-8B94-E2661138865D}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5222E155071449818AC7AD899B0BD0EE" - { - "SourcePath" = "8:" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_44E17B6EBB30432E9D4FBB976D7E029A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:ContentFiles" - "OutputProjectGuid" = "8:{2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - "ExcludeFilter" = "8:appsettings.yml" - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B2B80DADC2EA4646A8E8E8E54F2AE2EE" - { - "SourcePath" = "8:..\\..\\..\\..\\src\\Tgstation.Server.Host.Service\\obj\\Release\\net6.0-windows\\apphost.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_B28C4FD80D0245E08AEDCFEECACB6493" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:TRUE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:PublishItems" - "OutputProjectGuid" = "8:{29927416-3B78-49A7-A560-5CCAA638B6B4}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E9F7402DCE77463F9B7319647D3C16F2" - { - "SourcePath" = "8:..\\Tgstation.Server.Host.Service.Configure\\obj\\Release\\net6.0-windows\\win-x86\\apphost.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_0CFAD254CCC645209154DD4D85649AEA" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:PublishItems" - "OutputProjectGuid" = "8:{6CC73878-8C37-4ACC-ADAA-A60EBDBC2315}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - } - } -} diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Bundle.wxs b/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Bundle.wxs new file mode 100644 index 0000000000..a6d7135340 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Bundle.wxs @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Tgstation.Server.Host.Service.Wix.Bundle.wixproj b/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Tgstation.Server.Host.Service.Wix.Bundle.wixproj new file mode 100644 index 0000000000..209dd92a13 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/Tgstation.Server.Host.Service.Wix.Bundle.wixproj @@ -0,0 +1,16 @@ + + + + ProductVersion=$(TgsCoreVersion);NetMajorVersion=$(TgsNetMajorVersion);AspNetRedistUrl=$(TgsRedistUrl) + Bundle + x86 + tgstation-server-installer + + + + + + + + + \ No newline at end of file diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/CustomAction.config b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/CustomAction.config new file mode 100644 index 0000000000..aa417a104d --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/CustomAction.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/InstallationExtensions.cs b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/InstallationExtensions.cs new file mode 100644 index 0000000000..02a90bdc43 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/InstallationExtensions.cs @@ -0,0 +1,76 @@ +namespace Tgstation.Server.Host.Service.Wix.SafeShutdown +{ + using System; + using System.ServiceProcess; + + using Tgstation.Server.Host.Common; + + using WixToolset.Dtf.WindowsInstaller; + + /// + /// Extension methods for the .msi installer. + /// + public static class InstallationExtensions + { + /// + /// Attempts to detach stop the existing tgstation-server service if it exists. + /// + /// The installer . + /// The of the custom action. + [CustomAction] + public static ActionResult DetachStopTgsServiceIfRunning(Session session) + { + if (session == null) + throw new ArgumentNullException(nameof(session)); + + try + { + session.Log("Begin DetachStopTgsServiceIfRunning"); + ServiceController serviceController = null; + + session.Log($"Searching for {Constants.CanonicalPackageName} service..."); + foreach (var controller in ServiceController.GetServices()) + if (controller.ServiceName == Constants.CanonicalPackageName) + { + serviceController = controller; + break; + } + else + controller.Dispose(); + + using (serviceController) + { + if (serviceController == null || serviceController.Status != ServiceControllerStatus.Running) + { + session.Log($"{Constants.CanonicalPackageName} service not found. Continuing."); + return ActionResult.Success; + } + + var commandId = PipeCommands.GetCommandId( + PipeCommands.CommandDetachingShutdown) + .Value; + + session.Log($"{Constants.CanonicalPackageName} service found. Sending command \"{PipeCommands.CommandDetachingShutdown}\" ({commandId})..."); + + serviceController.ExecuteCommand(commandId); + + session.Log($"Command sent. Waiting for {Constants.CanonicalPackageName} service to stop..."); + + serviceController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromMinutes(1)); + + var stopped = serviceController.Status == ServiceControllerStatus.Stopped; + session.Log($"{Constants.CanonicalPackageName} stopped {(stopped ? String.Empty : "un")}successfully."); + + return stopped + ? ActionResult.Success + : ActionResult.NotExecuted; + } + } + catch (Exception ex) + { + session.Log($"Exception in DetachStopTgsServiceIfRunning:{Environment.NewLine}{ex}"); + return ActionResult.Failure; + } + } + } +} diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/Tgstation.Server.Host.Service.Wix.Extensions.csproj b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/Tgstation.Server.Host.Service.Wix.Extensions.csproj new file mode 100644 index 0000000000..acadffcec1 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix.Extensions/Tgstation.Server.Host.Service.Wix.Extensions.csproj @@ -0,0 +1,27 @@ + + + + + net2.0 + $(TgsCoreVersion) + + + + + + + + + True + + + + + + + + + + + + diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.en-us.wxl b/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.en-us.wxl new file mode 100644 index 0000000000..b1675c9c30 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.en-us.wxl @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.wxs b/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.wxs new file mode 100644 index 0000000000..773225386a --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix/Package.wxs @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/package/winget/Tgstation.Server.Host.Service.Wix/Tgstation.Server.Host.Service.Wix.wixproj b/build/package/winget/Tgstation.Server.Host.Service.Wix/Tgstation.Server.Host.Service.Wix.wixproj new file mode 100644 index 0000000000..a3aa164719 --- /dev/null +++ b/build/package/winget/Tgstation.Server.Host.Service.Wix/Tgstation.Server.Host.Service.Wix.wixproj @@ -0,0 +1,34 @@ + + + + ProductVersion=$(TgsCoreVersion) + 5150;5151 + x86 + tgstation-server + + + + + + + + InitialHostComponentGroup + DefaultLibDirectory + true + true + true + + + ServiceHostWatchdogComponentGroup + ApplicationDirectory + true + + + + + + + + + + \ No newline at end of file diff --git a/build/package/winget/build_msi.ps1 b/build/package/winget/build_msi.ps1 deleted file mode 100644 index a1da7c23a5..0000000000 --- a/build/package/winget/build_msi.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -$currentCommit=git rev-parse HEAD - -Remove-Item -Recurse -Force -ErrorAction SilentlyContinue packaging - -git worktree remove -f packaging - -git worktree add -f packaging $currentCommit -cd packaging -Remove-Item -Recurse -Force .git - -dotnet restore - -[XML]$versionXML = Get-Content build/Version.props -ErrorAction Stop - -$tgsVersion = $versionXML.Project.PropertyGroup.TgsCoreVersion - -cd build/package/winget - -$devVersion = '0.22.475' - -(Get-Content Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj -ErrorAction Stop).Replace($devVersion, $tgsVersion) | Set-Content Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj -ErrorAction Stop - -# We make _some_ assumptions -DevEnv installer.sln /Project Tgstation.Server.Host.Service.Msi/Tgstation.Server.Host.Service.Msi.vdproj /build Release -if (-Not $?) { - exit $lastexitcode -} - -cd ../../../.. diff --git a/build/package/winget/installer.sln b/build/package/winget/installer.sln deleted file mode 100644 index 882fd39d42..0000000000 --- a/build/package/winget/installer.sln +++ /dev/null @@ -1,50 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33801.468 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Service.Configure", "Tgstation.Server.Host.Service.Configure\Tgstation.Server.Host.Service.Configure.csproj", "{6CC73878-8C37-4ACC-ADAA-A60EBDBC2315}" -EndProject -Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Tgstation.Server.Host.Service.Msi", "Tgstation.Server.Host.Service.Msi\Tgstation.Server.Host.Service.Msi.vdproj", "{C7BE7AC6-D020-4497-84DE-282C24BA575D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Api", "..\..\..\src\Tgstation.Server.Api\Tgstation.Server.Api.csproj", "{8B4A208D-A48A-4A5D-8B94-E2661138865D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Common", "..\..\..\src\Tgstation.Server.Common\Tgstation.Server.Common.csproj", "{70CD9A98-D31A-44A4-81D1-D02764CEEEFD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Common", "..\..\..\src\Tgstation.Server.Host.Common\Tgstation.Server.Host.Common.csproj", "{CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Service", "..\..\..\src\Tgstation.Server.Host.Service\Tgstation.Server.Host.Service.csproj", "{29927416-3B78-49A7-A560-5CCAA638B6B4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Watchdog", "..\..\..\src\Tgstation.Server.Host.Watchdog\Tgstation.Server.Host.Watchdog.csproj", "{5D2D682C-6BF0-439C-850B-6AB945BBEAEA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host", "..\..\..\src\Tgstation.Server.Host\Tgstation.Server.Host.csproj", "{2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6CC73878-8C37-4ACC-ADAA-A60EBDBC2315}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CC73878-8C37-4ACC-ADAA-A60EBDBC2315}.Release|Any CPU.Build.0 = Release|Any CPU - {C7BE7AC6-D020-4497-84DE-282C24BA575D}.Release|Any CPU.ActiveCfg = Release - {C7BE7AC6-D020-4497-84DE-282C24BA575D}.Release|Any CPU.Build.0 = Release - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Release|Any CPU.Build.0 = Release|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Release|Any CPU.Build.0 = Release|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Release|Any CPU.Build.0 = Release|Any CPU - {29927416-3B78-49A7-A560-5CCAA638B6B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29927416-3B78-49A7-A560-5CCAA638B6B4}.Release|Any CPU.Build.0 = Release|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Release|Any CPU.Build.0 = Release|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Release|Any CPU.ActiveCfg = Installer|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Release|Any CPU.Build.0 = Installer|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {EBC981CA-0309-468F-984F-067BA2A6DF99} - EndGlobalSection -EndGlobal diff --git a/build/package/winget/manifest/Tgstation.Server.installer.yaml b/build/package/winget/manifest/Tgstation.Server.installer.yaml index 31f2517b77..3aced46d72 100644 --- a/build/package/winget/manifest/Tgstation.Server.installer.yaml +++ b/build/package/winget/manifest/Tgstation.Server.installer.yaml @@ -4,18 +4,20 @@ PackageIdentifier: Tgstation.Server PackageVersion: 0.22.475 # Set before publish by push_manifest.ps1 Installers: -- InstallerUrl: https://github.com/tgstation/tgstation-server/releases/download/tgstation-server-v0.22.475/tgstation-server.msi # Set before publish by push_manifest.ps1 +- InstallerUrl: https://github.com/tgstation/tgstation-server/releases/download/tgstation-server-v0.22.475/tgstation-server-installer.exe # Set before publish by push_manifest.ps1 InstallerLocale: en-US Architecture: x86 - InstallerType: msi + InstallerType: exe Scope: machine - InstallerSha256: F749672C1BDBAC8CD8AEF7352B97E54C21CF389D798D0ED245CA75EC72521460 # Set before publish by push_manifest.ps1 + InstallerSha256: CF0D4D2FD042098D826A226A05A9DAA5C792318CF48FD334F7FC06AF6A8A23B1 # Set before publish by push_manifest.ps1 InstallModes: - interactive - silent + InstallerSwitches: + Silent: /silent + SilentWithProgress: /passive + Log: /log ProductCode: '{D24887FA-3228-4509-B5F3-4E07E349F278}' - RequireExplicitUpgrade: true - UpgradeBehavior: uninstallPrevious UnsupportedOSArchitectures: - arm - arm64 diff --git a/build/package/winget/prepare_installer_input_artifacts.ps1 b/build/package/winget/prepare_installer_input_artifacts.ps1 new file mode 100644 index 0000000000..a7acbe1597 --- /dev/null +++ b/build/package/winget/prepare_installer_input_artifacts.ps1 @@ -0,0 +1,43 @@ +# Note: This script requires that Tgstation.Server.Host and Tgstation.Server.Host.Service be built in Release configuration beforehand + +$ErrorActionPreference="stop" + +$startDirectory=$pwd +try +{ + Remove-Item -Recurse -Force artifacts -ErrorAction SilentlyContinue + Remove-Item -Recurse -Force build/package/winget/Tgstation.Server.Host.Service.Wix/bin -ErrorAction SilentlyContinue + Remove-Item -Recurse -Force build/package/winget/Tgstation.Server.Host.Service.Wix/obj -ErrorAction SilentlyContinue + Remove-Item -Recurse -Force build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin -ErrorAction SilentlyContinue + Remove-Item -Recurse -Force build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/obj -ErrorAction SilentlyContinue + + [XML]$versionXML = Get-Content build/Version.props -ErrorAction Stop + $redistUrl = $versionXML.Project.PropertyGroup.TgsRedistUrl + + mkdir artifacts + $previousProgressPreference = $ProgressPreference + $ProgressPreference = 'SilentlyContinue' + try + { + Invoke-WebRequest -Uri $redistUrl -OutFile artifacts/hosting-bundle.exe + } finally { + $ProgressPreference = $previousProgressPreference + } + + cd src/Tgstation.Server.Host + dotnet publish -c Release --no-build -o ../../artifacts/Tgstation.Server.Host + if (-Not $?) { + exit $lastexitcode + } + + cd ../Tgstation.Server.Host.Service + + dotnet publish -c Release --no-build -o ../../artifacts/Tgstation.Server.Host.Service + if (-Not $?) { + exit $lastexitcode + } + + mv ../../artifacts/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.exe ../../artifacts/ +} finally { + cd $startDirectory +} diff --git a/build/package/winget/push_manifest.ps1 b/build/package/winget/push_manifest.ps1 index f2a7154533..27cb64e46d 100644 --- a/build/package/winget/push_manifest.ps1 +++ b/build/package/winget/push_manifest.ps1 @@ -1,5 +1,5 @@ param( - [string]$MsiPath = 'packaging/build/package/winget/Tgstation.Server.Host.Service.Msi/Release/tgstation-server.msi' + [string]$MsiPath = 'packaging/build/package/winget/Tgstation.Server.Host.Service.Wix/Release/tgstation-server.msi' ) $ErrorActionPreference="Stop" diff --git a/build/tgstation-server.service b/build/tgstation-server.service index b09873cc99..4f6f9b81cd 100644 --- a/build/tgstation-server.service +++ b/build/tgstation-server.service @@ -10,7 +10,7 @@ After=mssql-server.service Type=notify-reload NotifyAccess=all WorkingDirectory=/opt/tgstation-server -ExecStart=/usr/bin/dotnet Tgstation.Server.Host.Console.dll --General:SetupWizardMode=Never --Internal:UsingSystemD=true +ExecStart=/usr/bin/dotnet Tgstation.Server.Host.Console.dll --appsettings-base-path=/etc/tgstation-server --General:SetupWizardMode=Never --Internal:UsingSystemD=true TimeoutStartSec=600 Restart=Always KillMode=process diff --git a/src/Tgstation.Server.Host.Common/Constants.cs b/src/Tgstation.Server.Host.Common/Constants.cs new file mode 100644 index 0000000000..9d0133bb0f --- /dev/null +++ b/src/Tgstation.Server.Host.Common/Constants.cs @@ -0,0 +1,13 @@ +namespace Tgstation.Server.Host.Common +{ + /// + /// Constant values. + /// + public static class Constants + { + /// + /// The name of the project. + /// + public const string CanonicalPackageName = "tgstation-server"; + } +} diff --git a/src/Tgstation.Server.Host.Common/PipeCommands.cs b/src/Tgstation.Server.Host.Common/PipeCommands.cs index 10390cbfbc..42a8525a46 100644 --- a/src/Tgstation.Server.Host.Common/PipeCommands.cs +++ b/src/Tgstation.Server.Host.Common/PipeCommands.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Tgstation.Server.Host.Common +namespace Tgstation.Server.Host.Common { /// /// Values able to be passed via the update file path. @@ -22,14 +20,30 @@ namespace Tgstation.Server.Host.Common /// public const string CommandDetachingShutdown = "detach"; +#if NET6_0_OR_GREATER /// - /// All of the represented as a . + /// All of the represented as a . /// - public static IReadOnlyList AllCommands { get; } = new[] + public static System.Collections.Generic.IReadOnlyList AllCommands { get; } = new[] { CommandStop, CommandGracefulShutdown, CommandDetachingShutdown, }; +#endif + + /// + /// Gets the value of a given . + /// + /// The . + /// The value of the command or if it was unrecognized. + public static int? GetCommandId(string command) + => command switch + { + CommandStop => 128, // Windows only allows commands 128-256: https://stackoverflow.com/a/62858106 + CommandGracefulShutdown => 129, + CommandDetachingShutdown => 130, + _ => null, + }; } } diff --git a/src/Tgstation.Server.Host.Common/Tgstation.Server.Host.Common.csproj b/src/Tgstation.Server.Host.Common/Tgstation.Server.Host.Common.csproj index 92e7dae859..90389d89a6 100644 --- a/src/Tgstation.Server.Host.Common/Tgstation.Server.Host.Common.csproj +++ b/src/Tgstation.Server.Host.Common/Tgstation.Server.Host.Common.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion);net2.0 $(TgsCoreVersion) false true diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index 71c3694644..0cdf6e82c5 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -3,7 +3,7 @@ Exe - $(TgsNetVersion) + $(TgsFrameworkVersion) $(TgsCoreVersion) false false diff --git a/src/Tgstation.Server.Host.Service/Program.cs b/src/Tgstation.Server.Host.Service/Program.cs index 7d365e7ad6..c0a9409ea1 100644 --- a/src/Tgstation.Server.Host.Service/Program.cs +++ b/src/Tgstation.Server.Host.Service/Program.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; +using Microsoft.Extensions.Hosting.WindowsServices; using Microsoft.Extensions.Logging; using Tgstation.Server.Host.Common; @@ -30,56 +31,50 @@ namespace Tgstation.Server.Host.Service /// /// The --uninstall or -u option. /// - [Option(ShortName = "u")] + [Option(ShortName = "u", Description = "Uninstalls ANY installed tgstation-server service >=v4.0.0")] public bool Uninstall { get; } /// /// The --detach or -x option. Valid only with . /// - [Option(ShortName = "x")] + [Option(ShortName = "x", Description = "If the service has to stop, detach any running DreamDaemon processes beforehand. Only supported on versions >=5.13.0")] public bool Detach { get; } /// /// The --restart or -r option. /// - [Option(ShortName = "r")] + [Option(ShortName = "r", Description = "Stop and restart the tgstation-server service")] public bool Restart { get; } /// /// The --install or -i option. /// - [Option(ShortName = "i")] + [Option(ShortName = "i", Description = "Installs this executable as the tgstation-server Windows service")] public bool Install { get; set; } /// /// The --force or -f option. /// - [Option(ShortName = "f")] + [Option(ShortName = "f", Description = "Automatically agree to uninstall prompts")] public bool Force { get; set; } /// /// The --silent or -s option. /// - [Option(ShortName = "s")] + [Option(ShortName = "s", Description = "Suppresses console output from the host watchdog")] public bool Silent { get; set; } /// /// The --configure or -c option. /// - [Option(ShortName = "c")] + [Option(ShortName = "c", Description = "Runs the TGS setup wizard")] public bool Configure { get; set; } /// - /// The --trace or -t option. Enables trace logs. + /// The --passthroughargs or -p option. /// - [Option(ShortName = "t")] - public bool Trace { get; set; } - - /// - /// The --debug or -d option. Enables debug logs. - /// - [Option(ShortName = "d")] - public bool Debug { get; set; } + [Option(ShortName = "p", Description = "Arguments passed to main host process")] + public string PassthroughArgs { get; set; } /// /// Entrypoint for the application. @@ -108,6 +103,7 @@ namespace Tgstation.Server.Host.Service process.StartInfo.Arguments = serviceToUninstall == null ? $"create tgstation-server binPath=\"{exePath}\" start=auto depend=Tcpip/Dhcp/Dnscache" : $"delete {serviceToUninstall}"; + process.StartInfo.CreateNoWindow = false; process.Start(); @@ -121,35 +117,53 @@ namespace Tgstation.Server.Host.Service public async Task OnExecuteAsync() { var standardRun = !Install && !Uninstall && !Configure; + if (standardRun) + if (!Silent && !WindowsServiceHelpers.IsWindowsService()) + { +#if NET7_0_OR_GREATER +#error Deprecated functionality, remove +#endif + var result = NativeMethods.MessageBox( + default, + "You are running the TGS windows service executable directly. It should only be run by the service control manager. Would you like to install and configure the service in this location? (Note: This functionality is deprecated and will be removed in a future version)", + "TGS Service", + NativeMethods.MessageBoxButtons.YesNo); - if (Environment.UserInteractive && standardRun) - { - var result = NativeMethods.MessageBox( - default, - "You are running the TGS windows service executable directly. It should only be run by the service control manager. Would you like to install and configure the service in this location?", - "TGS Service", - NativeMethods.MessageBoxButtons.YesNo); + if (result != NativeMethods.DialogResult.Yes) + return; - if (result != NativeMethods.DialogResult.Yes) - return; - - Install = true; - Configure = true; - } + Install = true; + Configure = true; + } + else + using (var service = new ServerService(WatchdogFactory, GetPassthroughArgs(), LogLevel.Trace)) + { + service.Run(); + return; + } if (Configure) - await RunConfigure(CancellationToken.None); // DCT: None available + await RunConfigure(CancellationToken.None); // DCT: None available bool stopped = false; if (Uninstall) { foreach (ServiceController sc in ServiceController.GetServices()) - if (sc.ServiceName == ServerService.Name) + { + bool match; + using (sc) + { + match = sc.ServiceName == ServerService.Name; + if (match) + RestartService(sc); + } + + if (match) { - RestartService(sc); await InvokeSC(ServerService.Name); break; } + } stopped = true; } @@ -157,22 +171,17 @@ namespace Tgstation.Server.Host.Service if (Install) stopped |= await RunServiceInstall(); - if (standardRun) - { - using var service = new ServerService(WatchdogFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information); - ServiceBase.Run(service); - } - if (Restart) foreach (ServiceController sc in ServiceController.GetServices()) - if (sc.ServiceName == ServerService.Name) - { - if (!stopped) - RestartService(sc); + using (sc) + if (sc.ServiceName == ServerService.Name) + { + if (!stopped) + RestartService(sc); - sc.Start(); - break; - } + sc.Start(); + break; + } } /// @@ -183,29 +192,30 @@ namespace Tgstation.Server.Host.Service { // First check if the service already exists bool serviceStopped = false; - if (Force || Environment.UserInteractive) + if (Force || !WindowsServiceHelpers.IsWindowsService()) foreach (ServiceController sc in ServiceController.GetServices()) - { - var serviceName = sc.ServiceName; - if (serviceName == ServerService.Name || serviceName == "tgstation-server-4") + using (sc) { - NativeMethods.DialogResult result = !Force - ? NativeMethods.MessageBox( - default, - $"You already have another TGS service installed ({sc.ServiceName}). Would you like to uninstall it now? Pressing \"No\" will cancel this install.", - "TGS Service", - NativeMethods.MessageBoxButtons.YesNo) - : NativeMethods.DialogResult.Yes; - if (result != NativeMethods.DialogResult.Yes) - return false; // is this needed after exit? + var serviceName = sc.ServiceName; + if (serviceName == ServerService.Name || serviceName == "tgstation-server-4") + { + NativeMethods.DialogResult result = !Force + ? NativeMethods.MessageBox( + default, + $"You already have another TGS service installed ({sc.ServiceName}). Would you like to uninstall it now? Pressing \"No\" will cancel this install.", + "TGS Service", + NativeMethods.MessageBoxButtons.YesNo) + : NativeMethods.DialogResult.Yes; + if (result != NativeMethods.DialogResult.Yes) + return false; // is this needed after exit? - // Stop it first to give it some cleanup time - RestartService(sc); + // Stop it first to give it some cleanup time + RestartService(sc); - // And remove it - await InvokeSC(sc.ServiceName); + // And remove it + await InvokeSC(sc.ServiceName); + } } - } await InvokeSC(null); @@ -225,7 +235,7 @@ namespace Tgstation.Server.Host.Service if (!stop) { serviceController.ExecuteCommand( - ServerService.GetCommand( + PipeCommands.GetCommandId( PipeCommands.CommandDetachingShutdown) .Value); serviceController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(30)); @@ -254,7 +264,13 @@ namespace Tgstation.Server.Host.Service }); var watchdog = WatchdogFactory.CreateWatchdog(new NoopSignalChecker(), loggerFactory); - await watchdog.RunAsync(true, Array.Empty(), cancellationToken); + await watchdog.RunAsync(true, GetPassthroughArgs(), cancellationToken); } + + /// + /// Format into an . + /// + /// formatted as a . + string[] GetPassthroughArgs() => PassthroughArgs?.Split(' ', StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty(); } } diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index c615bc592c..80b0fcfd79 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Pipes; @@ -24,7 +25,7 @@ namespace Tgstation.Server.Host.Service /// /// The canonical windows service name. /// - public const string Name = "tgstation-server"; + public const string Name = Constants.CanonicalPackageName; /// /// The for the . @@ -32,7 +33,12 @@ namespace Tgstation.Server.Host.Service readonly IWatchdogFactory watchdogFactory; /// - /// The minimum for the . + /// The of command line arguments the service was invoked with. + /// + readonly string[] commandLineArguments; + + /// + /// The minimum for the . /// readonly LogLevel minimumLogLevel; @@ -61,28 +67,16 @@ namespace Tgstation.Server.Host.Service /// AnonymousPipeServerStream pipeServer; - /// - /// Gets the value of a given . - /// - /// The . - /// The value of the command or if it was unrecognized. - public static int? GetCommand(string command) - => command switch - { - PipeCommands.CommandStop => 128, // Windows only allows commands 128-256: https://stackoverflow.com/a/62858106 - PipeCommands.CommandGracefulShutdown => 129, - PipeCommands.CommandDetachingShutdown => 130, - _ => null, - }; - /// /// Initializes a new instance of the class. /// /// The value of . - /// The minimum to record in the event log. - public ServerService(IWatchdogFactory watchdogFactory, LogLevel minimumLogLevel) + /// The value of . + /// The minimum to record in the event log. + public ServerService(IWatchdogFactory watchdogFactory, string[] commandLineArguments, LogLevel minimumLogLevel) { this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory)); + this.commandLineArguments = commandLineArguments ?? throw new ArgumentNullException(nameof(commandLineArguments)); this.minimumLogLevel = minimumLogLevel; ServiceName = Name; } @@ -98,6 +92,11 @@ namespace Tgstation.Server.Host.Service } } + /// + /// Executes the . + /// + public void Run() => Run(this); + /// protected override void Dispose(bool disposing) { @@ -117,7 +116,7 @@ namespace Tgstation.Server.Host.Service var commandsToCheck = PipeCommands.AllCommands; foreach (var stringCommand in commandsToCheck) { - var commandId = GetCommand(stringCommand); + var commandId = PipeCommands.GetCommandId(stringCommand); if (command == commandId) { SendCommandToUpdatePath(stringCommand); @@ -149,7 +148,15 @@ namespace Tgstation.Server.Host.Service cancellationTokenSource?.Dispose(); cancellationTokenSource = new CancellationTokenSource(); - watchdogTask = RunWatchdog(watchdog, args, cancellationTokenSource.Token); + var newArgs = new List(commandLineArguments.Length + args.Length + 1) + { + "--General:SetupWizardMode=Never", + }; + + newArgs.AddRange(commandLineArguments); + newArgs.AddRange(args); + + watchdogTask = RunWatchdog(watchdog, newArgs.ToArray(), cancellationTokenSource.Token); } /// diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index 8cbff0695e..0d5b8b429e 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -3,7 +3,7 @@ WinExe - $(TgsNetVersion)-windows + $(TgsFrameworkVersion)-windows $(TgsCoreVersion) true @@ -26,6 +26,7 @@ + @@ -48,5 +49,5 @@ - + diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 633515ec07..9a8d30a658 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) Full false $(TgsHostWatchdogVersion) diff --git a/src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs b/src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs index a4cefdfde1..48b08b5b48 100644 --- a/src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs +++ b/src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs @@ -75,7 +75,8 @@ namespace Tgstation.Server.Host.Configuration ? Directory : ioManager.ConcatPath( directoryToUse, - assemblyInformationProvider.VersionPrefix); + assemblyInformationProvider.VersionPrefix, + "logs"); } } } diff --git a/src/Tgstation.Server.Host/Configuration/InternalConfiguration.cs b/src/Tgstation.Server.Host/Configuration/InternalConfiguration.cs index d97c8a501c..0d54f24d73 100644 --- a/src/Tgstation.Server.Host/Configuration/InternalConfiguration.cs +++ b/src/Tgstation.Server.Host/Configuration/InternalConfiguration.cs @@ -19,5 +19,10 @@ /// If the server is running under SystemD. /// public bool UsingSystemD { get; set; } + + /// + /// The base path for the app settings configuration files. + /// + public string AppSettingsBasePath { get; set; } } } diff --git a/src/Tgstation.Server.Host/ServerFactory.cs b/src/Tgstation.Server.Host/ServerFactory.cs index 9dddebff23..3e14cdb5a9 100644 --- a/src/Tgstation.Server.Host/ServerFactory.cs +++ b/src/Tgstation.Server.Host/ServerFactory.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Core; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.IO; @@ -59,14 +60,27 @@ namespace Tgstation.Server.Host args[oldArgs.Length] = "--hostBuilder:reloadConfigOnChange=false"; } - var basePath = IOManager.ResolvePath(); + const string AppSettings = "appsettings"; + const string AppSettingsRelocationKey = $"--{AppSettings}-base-path="; + + var appsettingsRelativeBasePathArgument = args.FirstOrDefault(arg => arg.StartsWith(AppSettingsRelocationKey, StringComparison.Ordinal)); + string basePath; + if (appsettingsRelativeBasePathArgument != null) + basePath = IOManager.ResolvePath(appsettingsRelativeBasePathArgument[AppSettingsRelocationKey.Length..]); + else + basePath = IOManager.ResolvePath(); + + // this is a massive bloody hack but I don't know a better way to do it + // It's needed for the setup wizard + Environment.SetEnvironmentVariable($"{InternalConfiguration.Section}__{nameof(InternalConfiguration.AppSettingsBasePath)}", basePath); + IHostBuilder CreateDefaultBuilder() => Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { builder.SetBasePath(basePath); - builder.AddYamlFile("appsettings.yml", optional: true, reloadOnChange: false) - .AddYamlFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.yml", optional: true, reloadOnChange: false); + builder.AddYamlFile($"{AppSettings}.yml", optional: true, reloadOnChange: false) + .AddYamlFile($"{AppSettings}.{context.HostingEnvironment.EnvironmentName}.yml", optional: true, reloadOnChange: false); // reorganize the builder so our yaml configs don't override the env/cmdline configs // values obtained via debugger diff --git a/src/Tgstation.Server.Host/Setup/SetupWizard.cs b/src/Tgstation.Server.Host/Setup/SetupWizard.cs index c0fbbbb042..4b4654ca4b 100644 --- a/src/Tgstation.Server.Host/Setup/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Setup/SetupWizard.cs @@ -27,6 +27,7 @@ using Tgstation.Server.Host.Extensions.Converters; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.System; using Tgstation.Server.Host.Utils; + using YamlDotNet.Serialization; namespace Tgstation.Server.Host.Setup @@ -79,6 +80,11 @@ namespace Tgstation.Server.Host.Setup /// readonly GeneralConfiguration generalConfiguration; + /// + /// The for the . + /// + readonly InternalConfiguration internalConfiguration; + /// /// A that will complete when the is reloaded. /// @@ -97,6 +103,7 @@ namespace Tgstation.Server.Host.Setup /// The value of . /// The in use. /// The containing the value of . + /// The containing the value of . public SetupWizard( IIOManager ioManager, IConsole console, @@ -107,7 +114,8 @@ namespace Tgstation.Server.Host.Setup IAsyncDelayer asyncDelayer, IHostApplicationLifetime applicationLifetime, IConfiguration configuration, - IOptions generalConfigurationOptions) + IOptions generalConfigurationOptions, + IOptions internalConfigurationOptions) { this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); this.console = console ?? throw new ArgumentNullException(nameof(console)); @@ -120,6 +128,7 @@ namespace Tgstation.Server.Host.Setup ArgumentNullException.ThrowIfNull(configuration); generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions)); + internalConfiguration = internalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(internalConfigurationOptions)); configuration .GetReloadToken() @@ -297,7 +306,13 @@ namespace Tgstation.Server.Host.Setup /// A resulting in the SQLite database path to store in the configuration. async Task ValidateNonExistantSqliteDBName(string databaseName, CancellationToken cancellationToken) { - var resolvedPath = ioManager.ResolvePath(databaseName); + var dbPathIsRooted = Path.IsPathRooted(databaseName); + var resolvedPath = ioManager.ResolvePath( + dbPathIsRooted + ? databaseName + : ioManager.ConcatPath( + internalConfiguration.AppSettingsBasePath, + databaseName)); try { var directoryName = ioManager.GetDirectoryName(resolvedPath); @@ -319,9 +334,9 @@ namespace Tgstation.Server.Host.Setup return null; } - if (!Path.IsPathRooted(databaseName)) + if (!dbPathIsRooted) { - await console.WriteAsync("Note, this relative path (currently) resolves to the following:", true, cancellationToken); + await console.WriteAsync("Note, this relative path currently resolves to the following:", true, cancellationToken); await console.WriteAsync(resolvedPath, true, cancellationToken); bool writeResolved = await PromptYesNo( "Would you like to save the relative path in the configuration? If not, the full path will be saved.", @@ -355,8 +370,6 @@ namespace Tgstation.Server.Host.Setup "It is, however, the easiest option to get started with and will pose few if any problems in a single user scenario.", true, cancellationToken); - - await asyncDelayer.Delay(TimeSpan.FromSeconds(3), cancellationToken); } await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken); @@ -962,7 +975,10 @@ namespace Tgstation.Server.Host.Setup try { - await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken); + await ioManager.WriteAllBytes( + userConfigFileName, + configBytes, + cancellationToken); // Ensure the reload if (generalConfiguration.SetupWizardMode != SetupWizardMode.Only) @@ -1046,7 +1062,9 @@ namespace Tgstation.Server.Host.Setup return; } - var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.yml", hostingEnvironment.EnvironmentName); + var userConfigFileName = ioManager.ConcatPath( + internalConfiguration.AppSettingsBasePath, + String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.yml", hostingEnvironment.EnvironmentName)); async Task HandleSetupCancel() { diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index e7abd5846f..5673e4096d 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) $(TgsCoreVersion) true true diff --git a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj index 4cdf2fb2a0..8443db7356 100644 --- a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj +++ b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj index 6b82ba7671..0d2d877fe1 100644 --- a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj +++ b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj index 282b1742c7..e0d44a649e 100644 --- a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj +++ b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs index 13fb19381e..19d2f60d69 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs +++ b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs @@ -19,9 +19,10 @@ namespace Tgstation.Server.Host.Service.Tests [TestMethod] public void TestConstructionAndDisposal() { - Assert.ThrowsException(() => new ServerService(null, default)); + Assert.ThrowsException(() => new ServerService(null, null, default)); var mockWatchdogFactory = new Mock(); - new ServerService(mockWatchdogFactory.Object, default).Dispose(); + Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, default)); + new ServerService(mockWatchdogFactory.Object, Array.Empty(), default).Dispose(); } [TestMethod] @@ -38,7 +39,7 @@ namespace Tgstation.Server.Host.Service.Tests var mockWatchdogFactory = new Mock(); mockWatchdogFactory.Setup(x => x.CreateWatchdog(It.IsNotNull(), It.IsNotNull())).Returns(mockWatchdog.Object).Verifiable(); - using (var service = new ServerService(mockWatchdogFactory.Object, default)) + using (var service = new ServerService(mockWatchdogFactory.Object, Array.Empty(), default)) { onStart.Invoke(service, new object[] { args }); onStop.Invoke(service, Array.Empty()); diff --git a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj index ddd3745a96..54971a8c9f 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj +++ b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion)-windows + $(TgsFrameworkVersion)-windows diff --git a/tests/Tgstation.Server.Host.Tests.Signals/Tgstation.Server.Host.Tests.Signals.csproj b/tests/Tgstation.Server.Host.Tests.Signals/Tgstation.Server.Host.Tests.Signals.csproj index ce86279440..c67edb6003 100644 --- a/tests/Tgstation.Server.Host.Tests.Signals/Tgstation.Server.Host.Tests.Signals.csproj +++ b/tests/Tgstation.Server.Host.Tests.Signals/Tgstation.Server.Host.Tests.Signals.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) Exe diff --git a/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs b/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs index 4ee9dfd632..76e2e26ee0 100644 --- a/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs +++ b/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs @@ -27,26 +27,28 @@ namespace Tgstation.Server.Host.Setup.Tests [TestMethod] public void TestConstructionThrows() { - Assert.ThrowsException(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null, null)); var mockIOManager = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null, null)); var mockConsole = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null, null)); var mockHostingEnvironment = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null, null)); var mockAssemblyInfoProvider = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null, null)); var mockDBConnectionFactory = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null, null)); var mockPlatformIdentifier = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null, null)); var mockAsyncDelayer = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null, null)); var mockLifetime = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null, null)); var mockConfiguration = new Mock(); mockConfiguration.Setup(x => x.GetReloadToken()).Returns(Mock.Of()); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, null, null)); + var mockGeneralConfigurationOptions = Options.Create(new GeneralConfiguration()); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, mockGeneralConfigurationOptions, null)); } [TestMethod] @@ -59,6 +61,7 @@ namespace Tgstation.Server.Host.Setup.Tests var mockDBConnectionFactory = new Mock(); var mockLifetime = new Mock(); var mockGeneralConfigurationOptions = new Mock>(); + var mockInternalConfigurationOptions = new Mock>(); var mockPlatformIdentifier = new Mock(); var mockAsyncDelayer = new Mock(); var mockConfiguration = new Mock(); @@ -85,8 +88,24 @@ namespace Tgstation.Server.Host.Setup.Tests }; mockGeneralConfigurationOptions.SetupGet(x => x.Value).Returns(testGeneralConfig).Verifiable(); - var wizard = new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, mockGeneralConfigurationOptions.Object); + var testInternalConfig = new InternalConfiguration + { + AppSettingsBasePath = "asdfasdfasdf" + }; + mockInternalConfigurationOptions.SetupGet(x => x.Value).Returns(testInternalConfig).Verifiable(); + var wizard = new SetupWizard( + mockIOManager.Object, + mockConsole.Object, + mockHostingEnvironment.Object, + mockAssemblyInfoProvider.Object, + mockDBConnectionFactory.Object, + mockPlatformIdentifier.Object, + mockAsyncDelayer.Object, + mockLifetime.Object, + mockConfiguration.Object, + mockGeneralConfigurationOptions.Object, + mockInternalConfigurationOptions.Object); mockPlatformIdentifier.SetupGet(x => x.IsWindows).Returns(true).Verifiable(); mockAsyncDelayer.Setup(x => x.Delay(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); @@ -100,6 +119,11 @@ namespace Tgstation.Server.Host.Setup.Tests await Assert.ThrowsExceptionAsync(() => RunWizard()); mockConsole.SetupGet(x => x.Available).Returns(true).Verifiable(); + mockIOManager.Setup(x => x.ConcatPath(testInternalConfig.AppSettingsBasePath, It.IsNotNull())).Returns(paths => + { + Assert.AreEqual(2, paths.Length); + return $"{paths[0]}/{paths[1]}"; + }).Verifiable(); mockIOManager.Setup(x => x.FileExists(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(true)).Verifiable(); mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("less profane"))).Verifiable(); mockIOManager @@ -323,6 +347,7 @@ namespace Tgstation.Server.Host.Setup.Tests mockSuccessCommand.VerifyAll(); mockIOManager.VerifyAll(); mockGeneralConfigurationOptions.VerifyAll(); + mockInternalConfigurationOptions.VerifyAll(); mockConsole.VerifyAll(); mockGoodDbConnection.VerifyAll(); mockBadDbConnection.VerifyAll(); diff --git a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj index b5449c75c4..5f0701e388 100644 --- a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj +++ b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj index 21a8d65ba5..a3762c1162 100644 --- a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj +++ b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj index 7f3dd2a0aa..925be86ff4 100644 --- a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj +++ b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj @@ -2,7 +2,7 @@ - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tgstation-server.sln b/tgstation-server.sln index 00b15f676c..0eb2f3f898 100644 --- a/tgstation-server.sln +++ b/tgstation-server.sln @@ -222,7 +222,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "debian", "debian", "{08E7C6 build\package\deb\debian\control = build\package\deb\debian\control build\package\deb\debian\copyright = build\package\deb\debian\copyright build\package\deb\install_artifacts.sh = build\package\deb\install_artifacts.sh - build\package\deb\debian\links = build\package\deb\debian\links build\package\deb\debian\postinst = build\package\deb\debian\postinst build\package\deb\debian\prerm = build\package\deb\debian\prerm build\package\deb\debian\rules = build\package\deb\debian\rules @@ -235,9 +234,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "upstream", "upstream", "{B4 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "winget", "winget", "{506B9092-AF88-4DA2-84FD-C11646B695B0}" ProjectSection(SolutionItems) = preProject - build\package\winget\build_msi.ps1 = build\package\winget\build_msi.ps1 - build\package\winget\installer.sln = build\package\winget\installer.sln build\package\winget\install_banner.jpg = build\package\winget\install_banner.jpg + build\package\winget\prepare_installer_input_artifacts.ps1 = build\package\winget\prepare_installer_input_artifacts.ps1 build\package\winget\push_manifest.ps1 = build\package\winget\push_manifest.ps1 EndProjectSection EndProject @@ -248,174 +246,186 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "manifest", "manifest", "{3F build\package\winget\manifest\Tgstation.Server.yaml = build\package\winget\manifest\Tgstation.Server.yaml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tgstation.Server.Host.Service.Msi", "Tgstation.Server.Host.Service.Msi", "{F5B9D394-229B-44A1-AD12-D8C078F06814}" - ProjectSection(SolutionItems) = preProject - build\package\winget\Tgstation.Server.Host.Service.Msi\README.md = build\package\winget\Tgstation.Server.Host.Service.Msi\README.md - build\package\winget\Tgstation.Server.Host.Service.Msi\Tgstation.Server.Host.Service.Msi.vdproj = build\package\winget\Tgstation.Server.Host.Service.Msi\Tgstation.Server.Host.Service.Msi.vdproj - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Service.Wix.Extensions", "build\package\winget\Tgstation.Server.Host.Service.Wix.Extensions\Tgstation.Server.Host.Service.Wix.Extensions.csproj", "{28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tgstation.Server.Host.Service.Configure", "Tgstation.Server.Host.Service.Configure", "{5DDA72D5-DBFD-4FB2-9EAB-61D047145246}" - ProjectSection(SolutionItems) = preProject - build\package\winget\Tgstation.Server.Host.Service.Configure\Program.cs = build\package\winget\Tgstation.Server.Host.Service.Configure\Program.cs - build\package\winget\Tgstation.Server.Host.Service.Configure\Tgstation.Server.Host.Service.Configure.csproj = build\package\winget\Tgstation.Server.Host.Service.Configure\Tgstation.Server.Host.Service.Configure.csproj - EndProjectSection +Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "Tgstation.Server.Host.Service.Wix", "build\package\winget\Tgstation.Server.Host.Service.Wix\Tgstation.Server.Host.Service.Wix.wixproj", "{82996E9D-5E63-4CC5-8179-612C71B4F56C}" +EndProject +Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "Tgstation.Server.Host.Service.Wix.Bundle", "build\package\winget\Tgstation.Server.Host.Service.Wix.Bundle\Tgstation.Server.Host.Service.Wix.Bundle.wixproj", "{9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - DebugNoFramework|Any CPU = DebugNoFramework|Any CPU + DebugNoWindows|Any CPU = DebugNoWindows|Any CPU Release|Any CPU = Release|Any CPU - ReleaseNoFramework|Any CPU = ReleaseNoFramework|Any CPU + ReleaseNoWindows|Any CPU = ReleaseNoWindows|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.Release|Any CPU.Build.0 = Release|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.Release|Any CPU.ActiveCfg = Release|Any CPU {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.Release|Any CPU.Build.0 = Release|Any CPU - {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {A09C947F-4B9B-4AEE-AB50-47055EA05F18}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {D36B99C4-E771-42D6-A95F-1102B3E236DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D36B99C4-E771-42D6-A95F-1102B3E236DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D36B99C4-E771-42D6-A95F-1102B3E236DF}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {D36B99C4-E771-42D6-A95F-1102B3E236DF}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {D36B99C4-E771-42D6-A95F-1102B3E236DF}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {D36B99C4-E771-42D6-A95F-1102B3E236DF}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {D36B99C4-E771-42D6-A95F-1102B3E236DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {D36B99C4-E771-42D6-A95F-1102B3E236DF}.Release|Any CPU.Build.0 = Release|Any CPU - {D36B99C4-E771-42D6-A95F-1102B3E236DF}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {D36B99C4-E771-42D6-A95F-1102B3E236DF}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {D36B99C4-E771-42D6-A95F-1102B3E236DF}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {D36B99C4-E771-42D6-A95F-1102B3E236DF}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {8B4A208D-A48A-4A5D-8B94-E2661138865D}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {8B4A208D-A48A-4A5D-8B94-E2661138865D}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B4A208D-A48A-4A5D-8B94-E2661138865D}.Release|Any CPU.Build.0 = Release|Any CPU - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {8B4A208D-A48A-4A5D-8B94-E2661138865D}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {8B4A208D-A48A-4A5D-8B94-E2661138865D}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {8B4A208D-A48A-4A5D-8B94-E2661138865D}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {29927416-3B78-49A7-A560-5CCAA638B6B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29927416-3B78-49A7-A560-5CCAA638B6B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29927416-3B78-49A7-A560-5CCAA638B6B4}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU + {29927416-3B78-49A7-A560-5CCAA638B6B4}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU {29927416-3B78-49A7-A560-5CCAA638B6B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {29927416-3B78-49A7-A560-5CCAA638B6B4}.Release|Any CPU.Build.0 = Release|Any CPU - {29927416-3B78-49A7-A560-5CCAA638B6B4}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU + {29927416-3B78-49A7-A560-5CCAA638B6B4}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.Release|Any CPU.Build.0 = Release|Any CPU - {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {E0AC911F-7675-4A91-9499-D8A2E2390AAD}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.Release|Any CPU.ActiveCfg = Release|Any CPU {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.Release|Any CPU.Build.0 = Release|Any CPU - {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {BE0E8F49-334F-49D7-A04D-D82E9AB7AA36}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.Release|Any CPU.Build.0 = Release|Any CPU - {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {E5301AF1-4F74-4982-BF24-95F23CC5D5B2}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.Release|Any CPU.Build.0 = Release|Any CPU - {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {A3362FF6-550F-480F-859E-8EC1EB6EAB31}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.Release|Any CPU.Build.0 = Release|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {5D2D682C-6BF0-439C-850B-6AB945BBEAEA}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {7500F776-4384-4B5F-A8D8-22461CAD108B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7500F776-4384-4B5F-A8D8-22461CAD108B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7500F776-4384-4B5F-A8D8-22461CAD108B}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {7500F776-4384-4B5F-A8D8-22461CAD108B}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {7500F776-4384-4B5F-A8D8-22461CAD108B}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {7500F776-4384-4B5F-A8D8-22461CAD108B}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {7500F776-4384-4B5F-A8D8-22461CAD108B}.Release|Any CPU.ActiveCfg = Release|Any CPU {7500F776-4384-4B5F-A8D8-22461CAD108B}.Release|Any CPU.Build.0 = Release|Any CPU - {7500F776-4384-4B5F-A8D8-22461CAD108B}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {7500F776-4384-4B5F-A8D8-22461CAD108B}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {7500F776-4384-4B5F-A8D8-22461CAD108B}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {7500F776-4384-4B5F-A8D8-22461CAD108B}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU + {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.Release|Any CPU.Build.0 = Release|Any CPU - {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU + {AA80A190-52E2-4BE3-BFEB-1F148D9E9007}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU {09056964-1C74-445A-96EC-33F6DFC07916}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {09056964-1C74-445A-96EC-33F6DFC07916}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09056964-1C74-445A-96EC-33F6DFC07916}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {09056964-1C74-445A-96EC-33F6DFC07916}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {09056964-1C74-445A-96EC-33F6DFC07916}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {09056964-1C74-445A-96EC-33F6DFC07916}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {09056964-1C74-445A-96EC-33F6DFC07916}.Release|Any CPU.ActiveCfg = Release|Any CPU {09056964-1C74-445A-96EC-33F6DFC07916}.Release|Any CPU.Build.0 = Release|Any CPU - {09056964-1C74-445A-96EC-33F6DFC07916}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {09056964-1C74-445A-96EC-33F6DFC07916}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {09056964-1C74-445A-96EC-33F6DFC07916}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {09056964-1C74-445A-96EC-33F6DFC07916}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.Release|Any CPU.Build.0 = Release|Any CPU - {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {5CB51532-55F0-4255-B6E5-69ED5CCD14CD}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {5813CC33-B16C-485D-A74D-20204DDF6542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5813CC33-B16C-485D-A74D-20204DDF6542}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5813CC33-B16C-485D-A74D-20204DDF6542}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {5813CC33-B16C-485D-A74D-20204DDF6542}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {5813CC33-B16C-485D-A74D-20204DDF6542}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {5813CC33-B16C-485D-A74D-20204DDF6542}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {5813CC33-B16C-485D-A74D-20204DDF6542}.Release|Any CPU.ActiveCfg = Release|Any CPU {5813CC33-B16C-485D-A74D-20204DDF6542}.Release|Any CPU.Build.0 = Release|Any CPU - {5813CC33-B16C-485D-A74D-20204DDF6542}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {5813CC33-B16C-485D-A74D-20204DDF6542}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {5813CC33-B16C-485D-A74D-20204DDF6542}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {5813CC33-B16C-485D-A74D-20204DDF6542}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {CE499888-B22B-457C-891E-0EA9DC317228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE499888-B22B-457C-891E-0EA9DC317228}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE499888-B22B-457C-891E-0EA9DC317228}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {CE499888-B22B-457C-891E-0EA9DC317228}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {CE499888-B22B-457C-891E-0EA9DC317228}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {CE499888-B22B-457C-891E-0EA9DC317228}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {CE499888-B22B-457C-891E-0EA9DC317228}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE499888-B22B-457C-891E-0EA9DC317228}.Release|Any CPU.Build.0 = Release|Any CPU - {CE499888-B22B-457C-891E-0EA9DC317228}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {CE499888-B22B-457C-891E-0EA9DC317228}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {CE499888-B22B-457C-891E-0EA9DC317228}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {CE499888-B22B-457C-891E-0EA9DC317228}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.Release|Any CPU.Build.0 = Release|Any CPU - {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {07ED0FD5-E46B-4841-931D-BA2B673E16B2}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Release|Any CPU.ActiveCfg = Release|Any CPU {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.Release|Any CPU.Build.0 = Release|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.DebugNoFramework|Any CPU.ActiveCfg = Debug|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.DebugNoFramework|Any CPU.Build.0 = Debug|Any CPU + {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Release|Any CPU.ActiveCfg = Release|Any CPU {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.Release|Any CPU.Build.0 = Release|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.ReleaseNoFramework|Any CPU.ActiveCfg = Release|Any CPU - {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.ReleaseNoFramework|Any CPU.Build.0 = Release|Any CPU + {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {70CD9A98-D31A-44A4-81D1-D02764CEEEFD}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.Release|Any CPU.Build.0 = Release|Any CPU + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.Debug|Any CPU.ActiveCfg = Debug|x86 + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.Debug|Any CPU.Build.0 = Debug|x86 + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.DebugNoWindows|Any CPU.ActiveCfg = Debug|x86 + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.Release|Any CPU.ActiveCfg = Release|x86 + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.Release|Any CPU.Build.0 = Release|x86 + {82996E9D-5E63-4CC5-8179-612C71B4F56C}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.Debug|Any CPU.ActiveCfg = Debug|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.Debug|Any CPU.Build.0 = Debug|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.DebugNoWindows|Any CPU.ActiveCfg = Debug|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.Release|Any CPU.ActiveCfg = Release|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.Release|Any CPU.Build.0 = Release|x86 + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -450,8 +460,9 @@ Global {B4B5570C-8071-46DE-BB55-64C13480C606} = {08E7C650-A447-4DE2-974E-ED123B50F8D6} {506B9092-AF88-4DA2-84FD-C11646B695B0} = {2648A85F-61AE-428E-95E1-66D06C7A3768} {3F141E03-6ABB-46A8-AA24-1B4B6814E58F} = {506B9092-AF88-4DA2-84FD-C11646B695B0} - {F5B9D394-229B-44A1-AD12-D8C078F06814} = {506B9092-AF88-4DA2-84FD-C11646B695B0} - {5DDA72D5-DBFD-4FB2-9EAB-61D047145246} = {506B9092-AF88-4DA2-84FD-C11646B695B0} + {28669D98-E15D-4A62-B1D1-7C11D4CB1DE0} = {506B9092-AF88-4DA2-84FD-C11646B695B0} + {82996E9D-5E63-4CC5-8179-612C71B4F56C} = {506B9092-AF88-4DA2-84FD-C11646B695B0} + {9E66C6F1-E235-4979-83B5-C2B3FDAD6E01} = {506B9092-AF88-4DA2-84FD-C11646B695B0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DFD36C95-3E49-41C7-ACDB-86BAF5B18A79} diff --git a/tools/ReleaseNotes/ReleaseNotes.csproj b/tools/ReleaseNotes/ReleaseNotes.csproj index d2a5370e27..2f2e6ab506 100644 --- a/tools/ReleaseNotes/ReleaseNotes.csproj +++ b/tools/ReleaseNotes/ReleaseNotes.csproj @@ -3,7 +3,7 @@ Exe - $(TgsNetVersion) + $(TgsFrameworkVersion) diff --git a/tools/Tgstation.Server.Migrator/Program.cs b/tools/Tgstation.Server.Migrator/Program.cs index e0760c9d77..046a6c7308 100644 --- a/tools/Tgstation.Server.Migrator/Program.cs +++ b/tools/Tgstation.Server.Migrator/Program.cs @@ -22,6 +22,7 @@ using Octokit; using Tgstation.Server.Api; using Tgstation.Server.Client; using Tgstation.Server.Common.Http; +using Tgstation.Server.Host.Common; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.Setup; @@ -121,7 +122,7 @@ try Console.WriteLine("Checking for TGS3 service..."); const string OldServiceName = "TG Station Server"; - const string NewServiceName = "tgstation-server"; + const string NewServiceName = Constants.CanonicalPackageName; static ServiceController GetTgs3Service(bool checkNewOneIsntInstalled) { @@ -153,7 +154,7 @@ try return tgs3Service; } - var tgs3Service = GetTgs3Service(true); + using var tgs3Service = GetTgs3Service(true); if (tgs3Service.Status != ServiceControllerStatus.Running) { @@ -439,7 +440,7 @@ try installer.DisplayName = "/tg/station server"; installer.StartType = ServiceStartMode.Automatic; installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" }; - installer.ServiceName = "tgstation-server"; + installer.ServiceName = NewServiceName; installer.Parent = processInstaller; var state = new ListDictionary(); @@ -527,7 +528,6 @@ try managementObject.InvokeMethod("ChangeStartMode", new object[] { "Disabled" }); } - tgs3Service = GetTgs3Service(false); if(tgs3Service.StartType != ServiceStartMode.Disabled) Console.WriteLine("Failed to disable TGS3 service! This isn't critical, however."); diff --git a/tools/Tgstation.Server.Migrator/Tgstation.Server.Migrator.csproj b/tools/Tgstation.Server.Migrator/Tgstation.Server.Migrator.csproj index 550a5f0ac8..a74f718d7c 100644 --- a/tools/Tgstation.Server.Migrator/Tgstation.Server.Migrator.csproj +++ b/tools/Tgstation.Server.Migrator/Tgstation.Server.Migrator.csproj @@ -1,20 +1,20 @@  - + Exe - $(TgsNetVersion) + $(TgsFrameworkVersion) win-x86 $(TgsMigratorVersion) enable CA1416 false - + - +