# Скрипт: gper-db-install.ps1 # Описание: Установщик GPER-DB PowerShell Module (Firebird-хранилище) # Версия: 1.0.0 # Дата: 2026-06-05 # Запуск (текущий пользователь): # irm https://ps.gper.ru/gper-db-install.ps1 | iex # Запуск (все пользователи, нужен админ): # $env:GPERDB_ALLUSERS = '1'; irm https://ps.gper.ru/gper-db-install.ps1 | iex # Удаление: # $env:GPERDB_REMOVE = '1'; irm https://ps.gper.ru/gper-db-install.ps1 | iex # #Requires -Version 5.0 # ============================================ # КОНФИГУРАЦИЯ # ============================================ $MODULE_URL = 'https://ps.gper.ru/db/gper-db.psm1' $ALL_USERS = ($env:GPERDB_ALLUSERS -eq '1') $REMOVE_MODE = ($env:GPERDB_REMOVE -eq '1') $DEFAULT_DBHOST = '192.168.100.100' $DEFAULT_DBPORT = 3050 if ($ALL_USERS) { $LOCAL_DIR = Join-Path $env:ProgramData 'gper.ru' } else { $LOCAL_DIR = Join-Path $env:APPDATA 'gper.ru' } $LOCAL_PSM1 = Join-Path $LOCAL_DIR 'gper-db.psm1' # ============================================ # ИНИЦИАЛИЗАЦИЯ # ============================================ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force -ErrorAction SilentlyContinue # ============================================ # ВЫВОД # ============================================ function Write-Ok { param($m) Microsoft.PowerShell.Utility\Write-Host "[OK] $m" -ForegroundColor Green } function Write-Warn { param($m) Microsoft.PowerShell.Utility\Write-Host "[!] $m" -ForegroundColor Yellow } function Write-Err { param($m) Microsoft.PowerShell.Utility\Write-Host "[X] $m" -ForegroundColor Red } function Write-Info { param($m) Microsoft.PowerShell.Utility\Write-Host " $m" -ForegroundColor Gray } function Write-Step { param($m) Microsoft.PowerShell.Utility\Write-Host "--- $m" -ForegroundColor Cyan } # ============================================ # ЗАГОЛОВОК # ============================================ Microsoft.PowerShell.Utility\Write-Host '' Microsoft.PowerShell.Utility\Write-Host ' GPER-DB Module Setup' -ForegroundColor Cyan Microsoft.PowerShell.Utility\Write-Host ' https://ps.gper.ru/db/' -ForegroundColor DarkGray Microsoft.PowerShell.Utility\Write-Host '' # Проверка прав для AllUsers if ($ALL_USERS) { $isAdmin = ([Security.Principal.WindowsPrincipal] ` [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { Write-Err 'Для GPERDB_ALLUSERS=1 нужны права администратора.' exit 1 } } # ============================================ # РЕЖИМ УДАЛЕНИЯ # ============================================ if ($REMOVE_MODE) { Write-Step 'Удаление GPER-DB...' # Снять прописку из профилей $marker = '# === GPER-DB MODULE START ===' $endMrk = '# === GPER-DB MODULE END ===' $blockRegex = '(?s)' + [regex]::Escape($marker) + '.*?' + [regex]::Escape($endMrk) + '\s*' $utf8NoBom = New-Object System.Text.UTF8Encoding($false) if ($ALL_USERS) { $profiles = @( (Join-Path $env:windir 'System32\WindowsPowerShell\v1.0\profile.ps1'), (Join-Path $env:ProgramFiles 'PowerShell\7\profile.ps1') ) } else { $docs = [Environment]::GetFolderPath('MyDocuments') $profiles = @( (Join-Path $docs 'WindowsPowerShell\profile.ps1'), (Join-Path $docs 'PowerShell\profile.ps1') ) } foreach ($p in $profiles) { if (-not (Test-Path $p)) { continue } $existing = [System.IO.File]::ReadAllText($p, [System.Text.Encoding]::UTF8) $cleaned = [regex]::Replace($existing, $blockRegex, '') if ($cleaned -ceq $existing) { Write-Info "пропуск: $p" } else { [System.IO.File]::WriteAllText($p, $cleaned.TrimStart("`r","`n"), $utf8NoBom) Write-Ok "Очищен: $p" } } # Удалить psm1 + конфиг + lib foreach ($f in @($LOCAL_PSM1, (Join-Path $LOCAL_DIR 'gper-db.config.json'))) { if (Test-Path $f) { Remove-Item $f -Force; Write-Ok "Удалён: $f" } } Write-Ok 'Удаление завершено.' return } # ============================================ # ШАГ 1: Скачать gper-db.psm1 с UTF-8 BOM # ============================================ Write-Step 'Загрузка модуля...' if (-not (Test-Path $LOCAL_DIR)) { New-Item -ItemType Directory -Path $LOCAL_DIR -Force | Out-Null Write-Info "Создан каталог: $LOCAL_DIR" } try { $wc = New-Object System.Net.WebClient $bytes = $wc.DownloadData($MODULE_URL) # PS5 требует UTF-8 BOM для корректного отображения кириллицы в .psm1 if (-not ($bytes.Count -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF)) { $bytes = [byte[]](0xEF, 0xBB, 0xBF) + $bytes } # Бэкап старой версии if (Test-Path $LOCAL_PSM1) { $bak = $LOCAL_PSM1 -replace '\.psm1$', "_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').psm1" Copy-Item $LOCAL_PSM1 $bak -Force Write-Info "Бэкап: $(Split-Path $bak -Leaf)" } [System.IO.File]::WriteAllBytes($LOCAL_PSM1, $bytes) Write-Ok "Модуль сохранён: $LOCAL_PSM1" } catch { Write-Err "Не удалось скачать модуль: $_" exit 1 } # ============================================ # ШАГ 2: Загрузить модуль и прописать в профили # ============================================ Write-Step 'Импорт модуля...' try { Import-Module $LOCAL_PSM1 -Force -DisableNameChecking -Global -ErrorAction Stop Write-Ok 'Модуль загружен в текущий сеанс.' } catch { Write-Err "Не удалось загрузить модуль: $_" exit 1 } Write-Step 'Прописываю в PowerShell-профили (PS5 + PS7)...' try { if ($ALL_USERS) { Install-GperDbProfile -AllUsers } else { Install-GperDbProfile } } catch { Write-Err "Install-GperDbProfile: $_" } # ============================================ # ШАГ 3: Настройка подключения к центральной БД # ============================================ Write-Step "Конфиг подключения (host=$DEFAULT_DBHOST port=$DEFAULT_DBPORT)..." try { Set-GperDbConfig -FHost $DEFAULT_DBHOST -FPort $DEFAULT_DBPORT } catch { Write-Warn "Set-GperDbConfig: $_" } # ============================================ # ГОТОВО # ============================================ Microsoft.PowerShell.Utility\Write-Host '' Microsoft.PowerShell.Utility\Write-Host ' Установка завершена!' -ForegroundColor Green Microsoft.PowerShell.Utility\Write-Host '' Write-Info "Модуль: $LOCAL_PSM1" Write-Info 'Конфиг подключения изменить: Set-GperDbConfig -FHost -FPort ' Write-Info 'Команды: Get-Command -Module gper-db' Microsoft.PowerShell.Utility\Write-Host ''