Instalar um programa automaticamente com terminal (que possui menus)

1

É possível instalar um programa automaticamente, que quando extraído e executado, abre um instalador de menu? (não parece que o instalador tenha quaisquer opções que eu possa passar em ambos).

Existe algum pacote lá fora que pode, talvez, automatizar o pressionamento dos botões nos menus?

Para os interessados, o programa em questão é CrossWorks for ARM .

    
por Rekovni 02.02.2018 / 12:07

1 resposta

1

Normalmente, pode-se tentar --quiet, -q --help , mas como você disse, isso não funcionará aqui. Temos que construir algo por conta própria.

Para uma instalação autônoma, acho útil deixar a instalação ser executada em um X-server virtual. Podemos enviar chaves para o servidor X e não vamos mexer com a tela atual. Portanto, precisamos de xvfb do projeto X.org. Eu também quero tirar screenshots durante a instalação para ver onde o processo está e se algum erro ocorrer. Precisamos de imagemagick para isso. Note que o imagemagick funcionará apenas em sessões X. Não há suporte para vias aéreas agora.

Primeiro baixe o instalador e descompacte-o.

cd ~/Downloads
wget http://cdn.rowleydownload.co.uk/arm/releases/arm_crossworks_4_1_0_linux_x64.tar.gz
tar xf arm_crossworks_4_1_0_linux_x64.tar.gz
cd ~/Downloads/arm_crossworks_4_1_linux_x64

execute este script da minha essência :

#!/bin/bash
#
# source: https://sobrelinux.info/questions/108826/install-a-program-automatically-with-terminal-which-has-menus"local" keyword is not POSIX.  Leave the next line commented in
    # the hope Debian Policy eventually changes to allow it in /bin/sh scripts
    # anyway.
    #local i

    i=$SERVERNUM
    while [ -f /tmp/.X$i-lock ]; do
        i=$(($i + 1))
    done
    echo $i
}

start_xvfb() {
    SERVERNUM=$(find_free_servernum)
    echo starting virtual DISPLAY at :$SERVERNUM
    export DISPLAY=:$SERVERNUM

    Xvfb $DISPLAY -screen 0 1280x800x16 &> /dev/null &
    XVFB_PID=$!
}

install_crossworks() {
    check_root
    if [ ! -e ./install_crossworks ]; then
        echo crossworks installation file not found
        exit 1
    fi
    timeout --kill-after=90s 90s sudo -n ./install_crossworks &
    CROSSWORKS_PID=$!

    crossworks_enter_keys &
    KEYS_PID=$!

    show_progress &
    PROGRESS_PID=$!

    if wait $CROSSWORKS_PID; then
        echo ok
    fi

    kill "$PROGRESS_PID" &> /dev/null
    kill "$KEYS_PID" &> /dev/null
}

crossworks_enter_keys() {
    # wait for archive to get checked for crc errors
    sleep 5
    # press next
    xdotool key KP_Enter
    sleep 1
    # accept license
    xdotool key Tab Tab Tab space Tab Tab KP_Enter
    sleep 1
    # select install directory
    xdotool key KP_Enter
    sleep 1
    # start installation
    xdotool key KP_Enter
    sleep 60
    # exit installation
    xdotool key KP_Enter
    sleep 1
}

show_progress() {
    while /bin/true; do
        take_screenshot
        echo -n .
        sleep 1
    done
}

take_screenshot() {
    import -window root $SCREENSHOT
    sudo chown $USER $SCREENSHOT
}

check_root() {
    if ! sudo -n /bin/true 2>/dev/null; then
        echo super user is required for installation.
        sudo /bin/true
    fi
}

check_installation() {
    if [ -e /usr/share/crossworks_for_arm_4.1/bin/crossstudio ]; then
        echo Crossworks installed.
        exit 0
    fi
}

cleanup() {
    kill "$PROGRESS_PID" &> /dev/null
    kill "$CROSSWORKS_PID" &> /dev/null
    kill "$XVFB_PID" &> /dev/null
    kill "$KEYS_PID" &> /dev/null
}

trap cleanup EXIT

check_installation
start_xvfb
install_crossworks
check_installation

Um grande problema foi que eu estava adivinhando o tempo que o instalador leva antes que a próxima entrada do usuário seja necessária. Isso pode variar dependendo da sua CPU.

Observe também que o script de instalação é válido apenas para instalar crossworks. O script não funcionará para atualização ou desinstalação .

Para desinstalar o crossworks novamente, execute

sudo /usr/share/crossworks_for_arm_4.1/bin/uninstall

se houver algum erro, tente dar uma olhada no status.png que é colocado no diretório de trabalho atual. É uma captura de tela do framebuffer X.

Será algo parecido com isto na instalação:

Veja também /usr/share/crossworks_for_arm_4.1/ . Às vezes, se a instalação for abortada, este diretório estará lá, mas não será completamente preenchido com todos os dados necessários.

Você pode tentar tornar o script mais avançado, ou seja, capturando imagens de status quando um pressionamento de tecla é necessário e comparando a soma de verificação de algumas somas de verificação já salvas para ver em qual status a instalação está.

    
por ukos 02.02.2018 / 21:17