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 } }