From 38c8055a61901155b569ec0c12be6d8d924882ac Mon Sep 17 00:00:00 2001 From: achi Date: Thu, 18 Jul 2024 11:47:35 +1000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=BD=D0=B0=20linux=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B1=D0=B8=D0=BD=D0=B0=D1=80=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linux/install.ps1 | 262 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 linux/install.ps1 diff --git a/linux/install.ps1 b/linux/install.ps1 new file mode 100644 index 0000000..a54263d --- /dev/null +++ b/linux/install.ps1 @@ -0,0 +1,262 @@ +param ([string]$version, [switch]$server, [switch]$pollservice, [switch]$force, [switch] $update) + +Set-StrictMode -Version 1 + + +################################### +# Вспомогательные функции +################################### + +# Запрашивает адрес сервера ЛЭРС +function Get-ServerAddress +{ + do + { + $serverAddress = Read-Host -Prompt "Введите адрес сервера ЛЭРС, к которому подключится служба опроса." + + # Проверяем, что это действительно сервер ЛЭРС + + try { + $response = Invoke-RestMethod -Method GET -Uri "$serverAddress/api/v1/serverInfo" + + if ($response.type -ne "LersServer") + { + throw "Неверный тип сервера" + } + + return $serverAddress + } + catch { + Write-Error "$serverAddress не является сервером ЛЭРС. $_" + } + } while ($true) +} + +################################### +# Константы +################################### + +$dotnetRuntimeVersion="8.0" +$lersUser = "lers" + +$lersDir = "/usr/LERS" +$dataDir = "/var/LERS" +$configDir = "/etc/LERS" + +$serverExecutable = "$lersDir/Server/Lers.Server.dll" +$pollServiceExecutable = "$lersDir/PollService/Lers.PollService.dll" + +$serverServiceName = "lers.server.service" +$pollserviceServiceName = "lers.pollservice.service" + +################################### +# Ресурсы +################################### + +$serverSystemd = @" +[Unit] +Description=ЛЭРС УЧЁТ - Сервер +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=1 +User=$lersUser +ExecStart=/usr/bin/dotnet $serverExecutable + +[Install] +WantedBy=multi-user.target +"@ + +$pollserviceSystemd = @" +[Unit] +Description=ЛЭРС УЧЁТ - Служба опроса +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=1 +User=$lersUser +ExecStart=/usr/bin/dotnet $pollServiceExecutable + +[Install] +WantedBy=multi-user.target +"@ + + +################################### +# Убедимся, что запущены от ROOT. +################################### + +if ($PSVersionTable.Platform -eq "Unix") { + if ( $(whoami) -ne "root") { + Write-Host "Запустите скрипт от имени root через sudo" + exit 1 + } +} + +# Определяем откуда будем качать. + +if ($version) +{ + $serverUrl = "https://update.lers.ru/v/$version/files/Server.zip" + $pollServiceUrl = "https://update.lers.ru/v/$version/files/PollService.zip" +} +else +{ + $serverUrl = "https://update.lers.ru/download/files/Server.zip" + $pollServiceUrl = "https://update.lers.ru/download/files/PollService.zip" +} + +$isServerInstalled = Test-Path -Path $serverExecutable +$isPollServiceInstalled = Test-Path -Path $pollServiceExecutable + + +## Останавливаем запущенные службы, если они есть + +if ($isServerInstalled) +{ + systemctl stop $serverServiceName +} + +if ($isPollServiceInstalled) +{ + systemctl stop $pollserviceServiceName +} + +if ($update) +{ + # В режиме обновления игнорируем ключи -server и -pollservice + # Вместо этого по наличию файлов определяем установлены ли сервер и служба опроса + + $server = $isServerInstalled + $pollservice = $isPollServiceInstalled +} +elseif (-not $server -and -not $pollservice) +{ + $server = $true + $pollservice = $true +} + +# Устанавливаем рантайм aspnet + +dnf install aspnetcore-runtime-$dotnetRuntimeVersion -y + +# Устанавливаем зависимости блока отчётов + +if ($server) +{ + Write-Host "Устанавливаются зависимости модуля отчётов сервера ЛЭРС" + dnf install libgdiplus -y +} + +# Создаём пользователя + +getent passwd $lersUser + +if($?) +{ + Write-Host "Пользователь $lersUser уже существует." +} +else +{ + Write-Host "Создаётся пользователь $lersUser" + useradd $lersUser +} + + +# Создаём папки для настроек и данных + +if ($force -and -not $update) +{ + Remove-Item -Path $configDir -Recurse -Force +} + +New-Item -ItemType Directory -Path $dataDir -Force +New-Item -ItemType Directory -Path $configDir -Force + +# Загружаем и распаковываем архивы с программой + +if ($server) +{ + wget $serverUrl -O Server.zip + Expand-Archive -LiteralPath 'Server.zip' -DestinationPath $lersDir -Force + Remove-Item -Path 'Server.zip' -Force +} + +if ($pollservice) +{ + wget $pollServiceUrl -O PollService.zip + Expand-Archive -LiteralPath 'PollService.zip' -DestinationPath $lersDir -Force + Remove-Item -Path 'PollService.zip' -Force +} + +# Настраиваем подключение службы опроса + +if (-not $update) +{ + if ($pollservice) + { + if ($server) + { + # Сервер установлен, обращаемся к адресу по умолчанию. + $serverAddress = "http://localhost:10000"; + } + else + { + # Сервер не установлен, запрашиваем. + $serverAddress = Get-ServerAddress; + } + + $templateConfig = "$lersDir/PollService/Lers.PollService.ini.template" + $config = "$lersDir/PollService/Lers.PollService.ini" + + (Get-Content $templateConfig).Replace("`$SERVER_ADDRESS`$:`$SERVER_PORT`$", $serverAddress) | Set-Content $config -Force + + Write-Host "Служба опроса настроена на подключение к серверу $serverAddress" + } + + if ($server) + { + # Запускаем конфигурацию сервера + dotnet $lersDir/Server.Bootstrapper/Lers.Setup.Bootstrapper.Cli.dll + } +} + +# Загружаем обновления для раздачи + +if ($server) +{ + dotnet $lersDir/Updater/Lers.UpdateService.dll update-dist + dotnet $lersDir/Updater/Lers.UpdateService.dll update-plugins +} + +# Устанавливаем пользователю разрешения на папки с данными. + +chown -R $lersUser $dataDir +chown -R $lersUser $configDir + + +if ($update) +{ + # Обновляем существующую БД + dotnet $serverExecutable cli db-update +} +else +{ + # Создаём службы systemd + + if ($server) + { + $serverSystemd | Set-Content /etc/systemd/system/$serverServiceName -Force + } + + if ($pollservice) + { + $pollserviceSystemd | Set-Content /etc/systemd/system/$pollserviceServiceName -Force + } +}