O que é YUM?
YUM é uma ferramenta de gerenciamento que está disponível nas distros RedHat e CentOS Linux. YUM (Yellowdog Updater Modified) é dependente de pacotes RPM (Red Hat Package Manager) e foi criado para permitir o gerenciamento de pacotes como partes de um sistema maior de repositórios de software em vez de arquivos de pacotes individuais. YUM é um gerenciador de pacotes interativo que pode realizar automaticamente análises de dependências e atualizações do sistema, junto com a instalação de novos pacotes, remoção de pacotes antigos, realização de consultas em pacotes existentes, etc. Para saber mais sobre o YUM, clique aqui.
Neste artigo, veremos os métodos de acesso à funcionalidade do yum usando programas Python e descobriremos como isso pode ser útil. Para este tutorial, usaremos o CENTOS 7 executando python 2.7.xe assumiria alguma familiaridade com os recursos básicos do Python.
Programando com YUM
Vamos começar a aprender sobre a programação do yum usando python observando um script python simples que usa o yum para consultar e imprimir nomes de pacotes. Aqui está:
importar osimport sys
importar yum
yb = yum.YumBase ()
yb.setCacheDir ()
resultados = yb.pkgSack.returnNewestByNameArch (padrões = ["python", “perl”])
para pacote nos resultados:
imprimir "% s% s (% s) \ n \ t% s"% (pacote.nome, pacote.versão, pacote.arco, pacote.resumo)
Este script procura nos repositórios YUM por pacotes que correspondam ao nome “python” e imprime informações sobre o (s) pacote (s) correspondente (s). Vamos examinar este script linha por linha.
Para iniciar a programação com YUM, precisamos importar o pacote python 'yum' - instalado por padrão no CENTOS 7. Junto com 'yum' geralmente precisamos dos pacotes 'os' e 'sys' - então um programa python típico usando yum começaria com as seguintes 3 linhas.
importar osimport sys
importar yum
Em seguida, para criar uma instância do yum para trabalhar, inclua a linha abaixo.
yb = yum.YumBase ()Esta é quase a primeira linha de código funcional em qualquer programa Python usando yum. Isso porque YumBase é a classe base que abriga métodos e objetos necessários para executar todas as funções de gerenciamento de pacotes usando yum. Para a estrutura detalhada da classe YumBase, consulte sua documentação.
Examinando a configuração YUM
Assim que uma instância de YumBase estiver disponível, podemos usá-la para inspecionar a configuração do yum. Abaixo está uma tabela que lista os comandos populares para listar os detalhes de configuração.
Configuração | Uso |
imprimir yb.conf.config_file_path | Imprime o caminho do arquivo para o arquivo de configuração do yum. |
imprimir yb.conf.arquivo de log | Para imprimir o caminho do arquivo de log |
para eu em yb.conf.reposdir: print i | Para imprimir os diretórios e arquivos para os repositórios |
imprimir yb.conf.skip_broken | O valor geralmente é falso. Quando definido como verdadeiro, os comandos yum agirão como se o parâmetro -skip-broken fosse fornecido. |
imprimir yb.conf.nível de erro | Para definir o nível de erros que você gostaria de ver impresso na saída padrão. É um valor entre 0-10 onde 0 é apenas crítico, enquanto 10 é tudo inclui depuração. Por padrão, é definido como 2, mas você pode substituí-lo. Se você estiver executando em um script, é uma boa ideia definir isso como 0. Você pode definir isso para um valor maior como 3 quando estiver depurando o próprio script. |
Consultando pacotes
Voltando ao nosso script, vemos que a próxima linha de código está configurando um novo diretório de cache para o yum para que ele execute todas as tarefas como um usuário normal (e também como o usuário root até certo ponto - ainda não será capaz de alterar os dados no o yumdb ou rpmdb, por exemplo).
yb.setCacheDir ()Tendo criado um objeto yum real agora, podemos acessar os atributos pkgSack, rpmdb e repos. Isso nos permite realizar as seguintes funções:
yb.pkgSack - pode ser usado para realizar consultas em todos os repositórios habilitados
yb.rpmdb - pode ser usado para realizar consultas nos pacotes instalados
yb.repos - obtém um objeto RepositoryStorage que pode ser usado para definir configurações específicas para os repositórios e pode ser usado para habilitar ou desabilitar repositórios - e.g., yb.repos.enableRepo (), yb.repos.disableRepo () & yb.repos.listEnabled (). Mais sobre isso depois.
Por enquanto, vamos nos aprofundar nas propriedades pkgSack e rpmdb. Podemos pesquisar os repositórios YUM e os pacotes instalados localmente, respectivamente, chamando uma das várias funções fornecidas pelos atributos pkgSack e rpmdb. Essas funções retornam "objetos de pacote" que contêm informações sobre o pacote. Algumas funções úteis para obter os objetos do pacote são: returnPackages (), searchPrimaryFields (), seachNevra (), seachName (), returnNewestByNameArch (). Nosso script usa o método returnNewstByNameArch para obter os objetos do pacote correspondentes às strings de padrão “python” ou “perl”.
Observe que os nomes dos métodos são iguais para yb.rpmdb e yb.pkgSack. No entanto, eles realizam as consultas em domínios diferentes - o rpmdb pesquisa o banco de dados de pacotes RPM instalados localmente, enquanto o pkgSack pesquisa os repositórios YUM.
Poderíamos, da mesma forma, listar os grandes pacotes instalados (onde grande significa, digamos, o tamanho é> 10 MB). O código yum é:
plist = yb.rpmdb.returnPackages ()l_plist = [p para p em plist se p.tamanho> 1024 * 1024 * 10]
imprimir "Pacotes instalados com tamanho> 10 MB:"
para p em l_plist:
imprimir "% s:% sMB"% (pacote, pacote.tamanho / (1024 * 1024))
Essa é basicamente a essência de usar python para acessar o yum. No resto do artigo, vamos nos aprofundar nas nuances da API do módulo yum e experimentar mais algumas ações de complicação, como instalar / desinstalar pacotes ou configurar nosso próprio repositório.
Nevra, PRCO e Tuplas
Não há erro de digitação no título - esses são alguns termos específicos do yum que tornam a identificação de pacotes e dependências mais fácil, bem como a comunicação deles com outros usuários do yum, incluindo seus scripts python.
NEVRA significa Nome, Época, Versão, Lançamento, Arquitetura e é usado para identificar exclusivamente um sabor ou instância de um pacote - esses cinco parâmetros juntos apontam inequivocamente para uma instância única do pacote. Por exemplo, um pacote chamado “python” pode ter várias versões como 2.6, 2.7 etc., e cada versão pode ter vários lançamentos para diferentes arquiteturas e.g., x86_64, i386 (Observe que a palavra arquitetura aqui se refere à arquitetura da CPU - e.g., i386 é Intel de 32 bits). Juntos, esses cinco representam uma combinação única e são conhecidos como nevra.
PRCO significa Fornece / Requer / Conflitos / Obsoletos, que resume os metadados de gerenciamento de pacote para o objeto de pacote.
Certos métodos de API em pkgSack / rpmdb, como yb.pkgSack.simplePkgList (), yb.pkgSack.packagesByTuple () etc., retornar informações NEVRA ou PRCO como tuplas python em vez de pkgobjects
Listar e instalar pacotes
Semelhante ao comando “yum list”, podemos usar 'yb.doPackageLists () 'para listar todos os pacotes instalados / pacotes disponíveis para instalação / reinstalação.
plist = yb.doPackageLists (patterns = sys.argv [1:])Agora plist contém 3 listas de pacotes - uma para cada pacote instalado, pacote instalável e aqueles disponíveis para reinstalação. Podemos imprimir / instalar / reinstalar pacotes usando o código abaixo:
se pl.instalado:imprimir "Pacotes Instalados"
para pacote em classificado (pl.instalado):
imprimir pacote
se pl.acessível:
imprimir "Pacotes Disponíveis"
para pacote em classificado (pl.acessível):
imprimir pacote, pacote.repo
se pl.reinstalar_disponível:
imprimir "Reinstalar Pacotes Disponíveis"
para pacote em classificado (pl.reinstalar_disponível):
imprimir pacote, pacote.repo
Da mesma forma, para listar todos os pacotes instalados, podemos usar:
imprimir “\ n”.junte-se ([x.nome para x em yb.rpmdb.returnPackages ()])Instalando pacotes
Instalar pacotes envolve configurar e executar uma transação. Para realizar ações simples, como instalar / remover, usamos o 'yb.instalar 'ou' yb.remove 'respectivamente para configurar a transação. Em seguida, invocamos o 'yb.resolveDeps () 'para acionar a resolução de dependências e' yb.processTransaction () 'para instruir o YUM a prosseguir e executar a transação.
Todas as etapas, exceto a última, são preparatórias e apenas a chamada ao método processTransaction () realmente resulta na instalação / desinstalação. Abaixo está um snippet de código para instalação de pacote.
yb = yum.YumBase ()yb.instalar (nome = 'nomedopacote')
yb.resolveDeps ()
yb.processTransaction ()
Durante a execução de tais transações, o 'yb.O objeto tsInfo 'contém as informações sobre o status atual da transação até que seja confirmado. Você pode ler mais sobre isso em sua documentação.
Configure um repositório em um local arbitrário
O script abaixo ajuda você a configurar o yum para acessar um repositório em um local arbitrário. Ele espera que a URL do repositório seja passada como o argumento da linha de comando.
url = sys.argv [1]yb = yum.YumBase ()
se não yb.setCacheDir (force = True, reuse = False):
imprimir >> sys.stderr, "Não é possível criar um tmp. cachedir. "
sys.saída (1)
yb.repos.disableRepo ('*')
yb.add_enable_repo ('myrepo', [url])
Para executar o script
script python.url py: // to / my / repoResumo
Neste artigo, aprendemos como controlar o gerenciador de pacotes YUM usando sua API python. Vimos as opções de configuração, bem como as APIs de consulta / pesquisa nos pacotes disponíveis e instalados e, finalmente, as maneiras de realizar operações de gerenciamento de pacotes, como instalar / desinstalar / reinstalar pacotes.
Este artigo tem como objetivo servir como uma janela para o que é possível por meio da API do yum python. Embora a API não seja muito bem documentada, ela segue as convenções padrão e funciona de maneira previsível. Armado com o conhecimento das capacidades e habilidades do Python do YUM, é divertido explorar e aprender tudo o que pode fazer. Espero que você tenha gostado de ler até agora e que continue com sua exploração e aplicação do yum em seus projetos.