Como posso (de) ativar um PPA a partir da linha de comando com um único comando?

2

O Ubuntu oferece uma interface gráfica fácil que permite editar , (des) ativar e remover os PPAs.

Mas passar por todos os diálogos e menus da GUI às vezes pode ser entediante, especialmente se você tiver muitos PPAs adicionados ao seu sistema.

É por isso que eu queria saber se havia uma maneira de desativar (e ativar) um PPA na linha de comando.

Observação : não estou falando sobre adicionar / remover o PPA (isso é muito fácil de fazer: sudo add-apt-repository ppa / sudo add-apt-repository --remove ppa ). O que estou procurando é uma maneira de desativar temporariamente um PPA e reativá-lo à vontade - tudo de dentro do CLI.

Editar:

As respostas de Sushantp606 e Davidson Chua foram um bom ponto de partida e me fizeram mudar o escopo da minha pergunta. Certamente é bom saber que os repositórios podem ser gerenciados com os arquivos sources.list , mas isso ainda parece uma tarefa muito tediosa para mim. Eu adoraria saber se existe uma maneira de automatizar isso da mesma maneira que a janela Propriedades do Software.

Idealmente, gostaria de encontrar um comando que permita ativar e desativar rapidamente um PPA pelo endereço PPA, por exemplo:

ppa_activate ppa:synapse-core/ppa

e

ppa_deactivate ppa:synapse-core/ppa
    
por Glutanimate 29.11.2013 / 04:42

4 respostas

4

Até mesmo um script mais simples para alternar entre ativar ou desativar um determinado ppa. Salve o código abaixo em um arquivo, por exemplo toggle_ppa.sh .

#!/bin/bash
#
# toggle_ppa.sh
#
# created by souravc (https://askubuntu.com/users/127327/)
# modified by Glutanimate (https://askubuntu.com/users/81372/)
#
# originally released at https://askubuntu.com/q/383605/81372
#
# DESCRIPTION:  Detects if a PPA is active/inactive and deactivates/activates it
#               on user confirmation.
#
# USAGE:        toggle_ppa.sh ppa:launchpaduser/ppaname

### VARIABLES

SOURCEDIRECTORY=/etc/apt/sources.list.d
PPA="$1"

### USAGE CHECKS

## Arguments

if [ -z "$PPA" ]
then
    echo "Error: Please provide a PPA name to toggle between activation/deactivation"
    echo "The PPA name should be formatted as it appears on launchpad, e.g.:
"$0" ppa:webupd8team/y-ppa-manager"
    exit 1
fi

## Root privileges

if [ "$(whoami)" != "root" ]; then
  echo "Error: This script needs root privileges. Restarting..."
  sudo "$0" "$1"
  exit
fi

### MAIN

SOURCELIST_NOPFX="${PPA#*:}" #remove 'ppa:' prefix
SOURCELIST="${SOURCELIST_NOPFX////-}"-$(lsb_release -cs) #replace all slashes with dashes, include release
SOURCEFILE="$SOURCEDIRECTORY"/"$SOURCELIST".list #compose sources list path

if [ -e "$SOURCEFILE" ]
then
    echo "Processing $SOURCEFILE..."
    SOURCE_COMMENTED=$(grep "^\#deb\ " "$SOURCEFILE") #check if sources line is commented
    if [ -z "$SOURCE_COMMENTED" ]
    then
        echo "$PPA is active. Going to deactivate. Proceed? [ y/n ]"
        read ANSWER
        if [ $ANSWER == "y" ]
        then
            sed -i "s/^deb\-src/\#deb\-src/" $SOURCEFILE
            sed -i "s/^deb\ http/\#deb\ http/" $SOURCEFILE
            echo "Updating package index files..."
            sudo apt-get update
            echo "Done."
        else
            echo "Aborted."
            exit 0
        fi
    else
        echo "$PPA is inactive. Going to activate. Proceed? [ y/n ]"
        read ANSWER
        if [ $ANSWER == "y" ]
        then
            sed -i "s/^\#deb\-src/deb\-src/" $SOURCEFILE
            sed -i "s/^\#deb\ http/deb\ http/" $SOURCEFILE
            echo "Updating package index files..."
            sudo apt-get update
            echo "Done."
        else
            echo "Aborted."
            exit 0
        fi
    fi
else
    echo "Error: Source file at $SOURCEFILE for $PPA does not exist. Please check PPA name."
    exit 0
fi

Siga o procedimento dado na outra resposta para manter o arquivo no PATH e torná-lo executável.

Uso

sudo toggle_ppa.sh <full-ppa-name>

Exemplo

sudo toggle_ppa.sh ppa:webupd8team/java

Como funciona

O princípio de funcionamento deste código é o mesmo que na minha outra resposta . O código age de uma maneira muito interativa. Quando alguém executa isso junto com o nome do ppa como seu argumento, ele exibirá o status atual do PPA e o que o código fará na execução bem-sucedida. Então pedirá permissão do usuário. Somente se o usuário inserir 'y' para confirmar que o código alterará o status do PPA e o ativará / desativará. Ele será imediatamente cancelado se o usuário colocar um 'n' para não.

    
por souravc 29.11.2013 / 16:01
7

As informações do ppa são salvas em arquivos separados em /etc/apt/sources.list . Aqui está o código que fará a ação desejada para desativar ou ativar o repo desejado. Salve o código abaixo em um arquivo, digamos mod-ppa

#!/bin/bash
mydir=/etc/apt/sources.list.d
function getlist(){
    echo -e "\n\tchose one of the following lists"
    echo -e "\t================================"
    for itm in 'seq 1 $1'
    do
        echo -e "\t'echo $2 | awk -v x=$itm '{print $x}' | awk -F/ '{print $NF}''"
    done
}

if [ $# -lt 1 ]
then
    echo "E: mod_ppa: missing operand"
    echo "Try 'mod_ppa --help' for more information."
    exit 0
elif [ $# -lt 2 ]
then
    echo -e "E: syntax error,\nTry 'mod_ppa --help' for more information."
    exit 0
fi

case "$1" in
    -d )
        ppa='ls $mydir/$2*.list'
        num='echo $ppa | wc -w'
        if [ 'echo $num' -gt 1 ]
        then
            getlist "$num" "$ppa"
        else
            if [ -e $mydir/$2*.list ]
            then
                sed -i "s/^deb\-src/\#deb\-src/" $ppa
                sed -i "s/^deb\ http/\#deb\ http/" $ppa
            else
                echo "E: ppa does not exist/check ppa name"
            fi
        fi
        ;;
    -a )
        ppa='ls $mydir/$2*.list'
        num='echo $ppa | wc -w'
        if [ 'echo $num' -gt 1 ]
        then
            getlist "$num" "$ppa"
        else
            if [ -e $mydir/$2*.list ]
            then
                sed -i "s/^\#deb\-src/deb\-src/" $ppa
                sed -i "s/^\#deb\ http/deb\ http/" $ppa
            else
                echo "E: ppa does not exist/check ppa name"
            fi
        fi
        ;;
    --help)
        echo "Usage: mod_ppa [OPTION] [PPA NAME'S INITIAL PART]"
        echo "Mandatory argument options."
        echo "-a       Activate certain ppa"
        echo "-d       Deactivate certain ppa"
        ;;
    * ) 
        echo "mod_ppa: invalid option '$1'"
        echo "Try 'mod_ppa --help' for more information."
        ;;
esac

salve o script em /home/<username>/bin/ , que geralmente está no PATH. Para verificar a gravação no terminal

echo $PATH

Se não, adicione /home/<username>/bin/ ao PATH adicionando a linha a seguir a .bash_profile ou .bashrc , o que for conveniente,

export PATH=$PATH:$HOME/bin

Em seguida, fonte do arquivo, escreva no terminal

source .bash_profile [or source .bashrc]

Conceda a permissão de execução mod_ppa , escreva no terminal

chmod +x mod_ppa

Uso

Para desativar um uso de ppa

sudo mod_ppa -d <ppa_name's_initial_part>

Por exemplo, para desativar ppa:webupd8team/java use

sudo mod_ppa -d webupd8team

Para ativar um uso de ppa

sudo mod_ppa -a <ppa_name's_initial_part>

Por exemplo, para ativar ppa:synapse-core use

sudo mod_ppa -a synapse-core

ajuda

mod_ppa --help

Presumi que você não estaria interessado em desativar os ppa (s) básicos e padrão listados em /etc/apt/sources.list . De qualquer forma, há apenas alguns, você pode desativá-los à mão, se você quiser. A resposta de Sushantp606 foi bastante útil.

Como funciona

Quando qualquer repositório ppa é desativado usando o Centro de software (GUI), ele coloca um # na frente de todas as linhas dentro do arquivo ppa .list correspondente em /etc/apt/sources.list.d/ . Geralmente, a maioria dos arquivos .list contém duas linhas que começam com deb http e deb-src , e algumas têm apenas uma. O script acima está fazendo a mesma coisa usando sed . Primeiro verifica se o ppa .list (entrada pelo usuário) está presente ou não. Em seguida, coloque ou remova um # na frente das linhas de acordo.

Como o script deve lidar com alguma parte sensível do sistema operacional, tentei codificá-lo defensivamente. Mantido verifica quais argumentos estão sendo passados para o script e definir algumas mensagens de erro em conformidade. Também é adicionado um pequeno help . Essa parte aumenta o tamanho do código.

    
por souravc 29.11.2013 / 13:01
3

Editando

/etc/apt/sources.list

arquivo a partir da linha de comando, podemos adicionar, remover ou desativar temporariamente os repositórios de software. Basta comentar repositório indesejado via terminal.

Eu não posso fazer o comando, é só uma ideia. deixe-me saber se você poderia conectá-lo via comando do terminal como -

O comando para comentar os repositórios fonte em /etc/apt/sources.list é:

sudo sed -i 's/^deb\-src/\#deb\-src/' /etc/apt/sources.list

e para comentar, use

sudo sed -i 's/^\#deb\-src/deb\-src/' /etc/apt/sources.list

use o repositório que você deseja desabilitar / comentar em vez de s/^\#deb\-src/deb\-src/ e antes de fazer qualquer alteração, faça um arquivo de lista de fontes de backup como abaixo -

sudo cp -v /etc/apt/sources.list /etc/apt/sources.list.backup
    
por Sukupa91 29.11.2013 / 05:21
2

Dê uma olhada em Como desabilitar um PPA em particular? . Embora a primeira resposta do qeoh use o frontend do GTK, a segunda resposta do minimec sugere comentar o ppa em /etc/apt/sources.list . Não tenho certeza se é isso que você está procurando, mas esse é um método possível.

    
por Davidson Chua 29.11.2013 / 05:07