commit e460ab72b28b55a3e046f821d88c79f79c856ff9 Author: Dorian Niemiec Date: Wed Dec 4 21:01:52 2024 +0100 chore: init diff --git a/installer.ps1 b/installer.ps1 new file mode 100644 index 0000000..7e55f68 --- /dev/null +++ b/installer.ps1 @@ -0,0 +1,188 @@ +#Requires -RunAsAdministrator + +function ExitWithCode +{ + param + ( + $exitcode + ) + + $host.SetShouldExit($exitcode) + exit +} + +# Print the splash +Write-Host '***************************************' +Write-Host '**SVR.JS installer for Windows Server**' +Write-Host '***************************************' +Write-Host '' + +# Check the CPU architecture +$processor = Get-WmiObject -Class Win32_Processor +$architectureInt = $processor.AddressWidth + +if ($processor.Architecture -eq 5) { + $architecture = "arm64" +} elseif ($architectureInt -eq 64) { + $architecture = "x64" +} elseif ($architectureInt -eq 32) { + $architecture = "x86" +} else { + Write-Host "Invalid CPU architecture detected." + ExitWithCode -exitcode 1 +} + +# Select SVR.JS installation type +Write-Host 'Select your SVR.JS installation type. Valid SVR.JS installation types:' +Write-Host '0 - Latest stable version' +Write-Host '1 - Latest LTS version' +Write-Host '2 - Install and update manually' +$ITP = Read-Host 'Your SVR.JS installation type' + +switch ($ITP) { + 0 { $installType = 'stable' } + 1 { $installType = 'lts' } + 2 { $installType = 'manual' } + default { Write-Host 'Invalid SVR.JS installation type!'; ExitWithCode -exitcode 1 } +} + +# Create an SVR.JS installation directory +if (!(Test-Path -Path "$env:SYSTEMDRIVE\svrjs")) { + New-Item -Path "$env:SYSTEMDRIVE\" -Name "svrjs" -ItemType "directory" | Out-Null +} + +# Create subdirectories +if (!(Test-Path -Path "$env:SYSTEMDRIVE\svrjs\nodejs")) { + New-Item -Path "$env:SYSTEMDRIVE\svrjs" -Name "nodejs" -ItemType "directory" | Out-Null +} + +if (!(Test-Path -Path "$env:SYSTEMDRIVE\svrjs\svrjs")) { + New-Item -Path "$env:SYSTEMDRIVE\svrjs" -Name "svrjs" -ItemType "directory" | Out-Null +} + +if (!(Test-Path -Path "$env:SYSTEMDRIVE\svrjs\wwwroot")) { + New-Item -Path "$env:SYSTEMDRIVE\svrjs" -Name "wwwroot" -ItemType "directory" | Out-Null +} + +# Download SVR.JS zip archive +if ($installType -eq "manual") { + $svrjsZipArchive = Read-Host "Path to SVR.JS zip archive: " +} elseif ($INSTALLTYPE -eq "stable") { + $svrjsVersion = (Invoke-RestMethod -Uri "https://downloads.svrjs.org/latest.svrjs").Trim() + if (-not $svrjsVersion) { + Write-Host "There was a problem while determining latest SVR.JS version!" + ExitWithCode -exitcode 1 + } + $svrjsZipArchive = "$env:SYSTEMDRIVE\svrjs\svrjs.zip" + Invoke-WebRequest -Uri "https://downloads.svrjs.org/svr.js.$svrjsVersion.zip" -OutFile $svrjsZipArchive + if (-not (Test-Path $svrjsZipArchive)) { + Write-Host "There was a problem while downloading latest SVR.JS version!" + ExitWithCode -exitcode 1 + } +} elseif ($INSTALLTYPE -eq "lts") { + $svrjsVersion = (Invoke-RestMethod -Uri "https://downloads.svrjs.org/latest-lts.svrjs").Trim() + if (-not $svrjsVersion) { + Write-Host "There was a problem while determining latest LTS SVR.JS version!" + ExitWithCode -exitcode 1 + } + $svrjsZipArchive = "$env:SYSTEMDRIVE\svrjs\svrjs.zip" + Invoke-WebRequest -Uri "https://downloads.svrjs.org/svr.js.$svrjsVersion.zip" -OutFile $svrjsZipArchive + if (-not (Test-Path $svrjsZipArchive)) { + Write-Host "There was a problem while downloading latest LTS SVR.JS version!" + ExitWithCode -exitcode 1 + } +} else { + Write-Host "There was a problem determining SVR.JS installation type!" + ExitWithCode -exitcode 1 +} + +# Check if SVR.JS zip archive exists +if (!(Test-Path -Path $svrjsZipArchive)) { + Write-Host "Can't find SVR.JS archive! Make sure to download SVR.JS archive file from https://svrjs.org and rename it to 'svrjs.zip'." + ExitWithCode -exitcode 1 +} + +# Download Node.JS archive +$nodejsZipArchive = "$env:SYSTEMDRIVE\svrjs\nodejs.zip" +Invoke-WebRequest -Uri "https://nodejs.org/dist/latest-jod/node-latest-jod-win-$architecture.zip" -OutFile $nodejsZipArchive +if (!(Test-Path -Path $nodejsZipArchive)) { + Write-Host "Can't find Node.JS archive!" + ExitWithCode -exitcode 1 +} + +# Download WinSW +$winsw = "$env:SYSTEMDRIVE\svrjs\winsw.exe" +$winswUrl = "https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-$architecture.exe" +if ($architecture -eq 'arm64') { + $winswUrl = "https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW.NET4.exe" +} +Invoke-WebRequest -Uri $winswUrl -OutFile $winsw +if (!(Test-Path -Path $winsw)) { + Write-Host "Can't find WinSW executable!" + ExitWithCode -exitcode 1 +} + +# Extract Node.JS files +Write-Host "Extracting Node.JS files..." +Expand-Archive -Path $nodejsZipArchive -DestinationPath "$env:SYSTEMDRIVE\svrjs\nodejs" -Force +$nodejsDir = "$env:SYSTEMDRIVE\svrjs\nodejs\$((Get-ChildItem -Path "$env:SYSTEMDRIVE\svrjs\nodejs" -Directory | Where-Object { $_.Name -match "node-v\d+\.\d+\.\d+-win-.*" } | Sort-Object -Property LastWriteTime -Descending).Name)" +Remove-Item -Path $nodejsZipArchive + +# Extract SVR.JS files +Write-Host "Extracting SVR.JS files..." +Expand-Archive -Path $svrjsZipArchive -DestinationPath "$env:SYSTEMDRIVE\svrjs\svrjs" -Force +Remove-Item -Path $svrjsZipArchive +Push-Location +Set-Location -Path "$env:SYSTEMDRIVE\svrjs\svrjs" +Start-Process -FilePath "$nodejsDir\node.exe" -ArgumentList "$env:SYSTEMDRIVE\svrjs\svrjs\svr.js" -Wait +Pop-Location +Start-Process -FilePath "$nodejsDir\node.exe" -ArgumentList "-e `"var fs=require('fs'),config=JSON.parse(fs.readFileSync('$env:SYSTEMDRIVE\\svrjs\\svrjs\\config.json').toString());config.wwwroot='$env:SYSTEMDRIVE\\svrjs\\wwwroot',fs.writeFileSync('$env:SYSTEMDRIVE\\svrjs\\svrjs\\config.json',JSON.stringify(config));`"" -Wait +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\index.html" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\tests.html" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\licenses" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\testdir" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\serverSideScript.js" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\logo.png" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\powered.png" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +if (Test-Path -Path "$env:SYSTEMDRIVE\svrjs\svrjs\favicon.ico") { + Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\favicon.ico" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +} +if (Test-Path -Path "$env:SYSTEMDRIVE\svrjs\svrjs\views.txt") { + Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\views.txt" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +} +if (Test-Path -Path "$env:SYSTEMDRIVE\svrjs\svrjs\hviews.txt") { + Move-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\hviews.txt" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" +} +Copy-Item -Path "$env:SYSTEMDRIVE\svrjs\svrjs\.dirimages" -Destination "$env:SYSTEMDRIVE\svrjs\wwwroot" -Recurse + +# Generate WinSW Configuration +Write-Host "Generating WinSW configuration..." +$winswConfig = @" + + svrjs + SVR.JS + This service runs SVR.JS - a web server running on Node.JS. + $nodejsDir\node.exe + $env:SYSTEMDRIVE\svrjs\svrjs\svr.js + + +"@ + +$winswConfig | Out-File -FilePath "$env:SYSTEMDRIVE\svrjs\winsw.xml" -Encoding utf8 + +# Install the service +Write-Host "Installing the SVR.JS service using WinSW..." +Start-Process -FilePath $winsw -ArgumentList "install" -Wait +Start-Service -Name "svrjs" + +# Create the uninstallation batch file +$uninstallBat = @" +@echo off +sc stop svrjs +%SYSTEMDRIVE%\svrjs\winsw.exe uninstall +rd %SYSTEMDRIVE%\svrjs /s /q +"@ + +$uninstallBat | Out-File -FilePath "$env:SYSTEMDRIVE\uninstall_svrjs.bat" -Encoding utf8 + +echo "Done! SVR.JS is installed successfully!"