PowerShell · 08.11.2024

Строго по Gost’у

Продолжение вот этого поста, но там я этого касался в общих чертах, а здесь оторвался на всю катушку. Речь идёт о ручном обновлении установщика и установке браузера Chromium-Gost (гит) для всех пользователей хоста.

Скрипт умеет определять разрядность системы и на основании этого скачивать нужный установщик браузера. Старые версии установщиков складываются в отдельную папку old.

Установка браузера осуществляется для всех пользователей компьютера, поэтому потребуются права администратора.

# Заголовок скрипта и протокол шифрования #
[System.Console]::Title = "Установка Chromium-GOST"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# Общие переменные #
$appname = "chromium.exe"
$tempname = "temp"
$path = "$PSScriptRoot\$appname"
$old = "$PSScriptRoot\old"
$newname = $(get-date -f yyyy-MM-dd) + "_chromium.old"

# Получение файла, исходя из разрядности системы #
function GetInstall($filename)
{
    $release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
    if ([Environment]::Is64BitOperatingSystem)
    {
        $link = Invoke-RestMethod -uri $release `
            | Select -ExpandProperty assets `
            | Select -ExpandProperty browser_download_url `
            | Select-String -Pattern "-windows-amd64-installer.exe"
    }
    else
    {
        $link = Invoke-RestMethod -uri $release `
            | Select -ExpandProperty assets `
            | Select -ExpandProperty browser_download_url `
            | Select-String -Pattern "-windows-386-installer.exe"
    }
    Start-BitsTransfer -Source $link -Destination $filename
}

# Функция обновления установщика #
function Download
{
    $exists = Test-Path -Path $path -PathType Leaf
    if ($exists)
    { 
        GetInstall($tempname)
        $hashexe = (Get-FileHash -Path $path -Algorithm SHA256).Hash
        $hashtemp = (Get-FileHash -Path $tempname -Algorithm SHA256).Hash
        if ($hashexe -ne $hashtemp)
        {
            New-Item -Path $old -ItemType Directory -Force -ErrorAction Ignore | Out-Null
            Move-Item -Path $path -Destination "$old\$newname" -Force
            Rename-Item -Path $tempname -NewName $appname -Force
        }
        else { Remove-Item -Path $tempname -Force }
    }
    else { GetInstall($appname) }
}

# Функция установки #
function Install
{
    $exists = Test-Path -Path $path -PathType Leaf
    if ($exists)
    { 
        Start-Process -FilePath $path -ArgumentList "--system-level --install" -NoNewWindow -Wait
    }
    else
    {
        Download
        Start-Process -FilePath $path -ArgumentList "--system-level --install" -NoNewWindow -Wait
    }
}

# Функция удаления установщика #
function Remove
{
    $exists = Test-Path -Path $old -PathType Container
    if ($exists)
    { 
        Remove-Item -Path $old -Force -Recurse -Verbose
    }
}

## Меню ##
while($true)
{
    ## Формирование меню скрипта ##
    Write-Host
    Write-Host "1. Только обновление/скачивание установочного пакета" -ForegroundColor Green
    Write-Host "2. Установка Chromium-GOST" -ForegroundColor Green
    Write-Host "3. Удалить старые установочные пакеты" -ForegroundColor Red
    Write-Host "4. Выход из скрипта" -ForegroundColor Yellow
    Write-Host

    ## Селектор ##
    $choice = Read-Host "Выберите вариант"
              Write-Host

    switch($choice)
    {
        ## Обновление установочного пакета ##
        1{ Download }

        ## Установка Chromium-GOST ##
        2{ Install }

        ## Удалить существующий установочный пакет ##
        3{ Remove }

        ## Выход ##
        4{ Exit }

        ## Неверный выбор ##
        default{ Write-Host "Неверный выбор!" -ForegroundColor Red; Write-Host }
    }
}

Если этот скрипт немного переработать и убрать из схемы действия пользователя — можно полностью автоматизировать процесс обновления установщика и саму установку браузера, но это уже совсем другая история…