Miam

Interagir avec YUM sur CentOS en utilisant Python

Interagir avec YUM sur CentOS en utilisant Python

Qu'est-ce que YUM?

YUM est un outil de gestion disponible sur les distributions Linux RedHat et CentOS.  YUM (Yellowdog Updater Modified) dépend des packages RPM (Red Hat Package Manager) et a été créé pour permettre la gestion des packages dans le cadre d'un système plus vaste de référentiels de logiciels au lieu de fichiers de packages individuels. YUM est un gestionnaire de packages interactif qui peut effectuer automatiquement une analyse des dépendances et des mises à jour du système, ainsi que l'installation de nouveaux packages, la suppression d'anciens packages, l'exécution de requêtes sur des packages existants, etc. Pour en savoir plus sur YUM, cliquez sur ici.

Dans cet article, nous examinerons les méthodes d'accès à la fonctionnalité yum à l'aide de programmes Python et découvrirons comment cela peut être utile. Pour ce tutoriel, nous utiliserons CENTOS 7 sous python 2.7.x et supposerait une certaine familiarité avec les fonctionnalités de base de python.

Programmation avec YUM

Commençons par apprendre à programmer yum à l'aide de python en examinant un simple script python qui utilise yum pour interroger et imprimer les noms de packages. C'est ici:

importer le système d'exploitation
importer le système
importer miam
yb = miam.MiamBase()
yb.setCacheDir()
résultats = yb.pkgSack.returnNewestByNameArch(motifs=["python", "perl"])
pour le paquet dans les résultats :
print "%s %s (%s) \n\t%s" % (pkg.nom, paquet.version, paquet.arc, paquet.résumé)

Ce script recherche dans les référentiels YUM les packages correspondant au nom "python" et imprime des informations sur le ou les packages correspondants. Nous allons examiner ce script ligne par ligne.

Pour commencer à programmer avec YUM, nous devons importer le package python 'yum' - celui-ci est installé par défaut dans CENTOS 7. En plus de 'yum', nous avons généralement besoin des packages 'os' et 'sys' - donc un programme python typique utilisant yum commencerait par les 3 lignes suivantes.

importer le système d'exploitation
importer le système
importer miam

Ensuite, pour créer une instance yum avec laquelle travailler, incluez la ligne ci-dessous.

yb = miam.MiamBase()

C'est presque la première ligne de code fonctionnel dans n'importe quel programme python utilisant yum. En effet, YumBase est la classe de base qui héberge les méthodes et les objets nécessaires pour exécuter toutes les fonctions de gestion des packages à l'aide de yum. Pour la structure détaillée de la classe YumBase, reportez-vous à sa documentation.

Examen de la configuration YUM

Une fois qu'une instance de YumBase est disponible, nous pouvons l'utiliser pour inspecter la configuration yum. Vous trouverez ci-dessous un tableau répertoriant les commandes populaires pour répertorier les détails de configuration.

Configuration Usage
imprimer yb.conf.chemin_fichier_config Imprimer le chemin d'accès au fichier de configuration de yum.
imprimer yb.conf.fichier journal Pour imprimer le chemin du fichier journal
pour moi dans yb.conf.reposdir : imprimer i Pour imprimer les répertoires et fichiers des référentiels
imprimer yb.conf.sauter_cassé La valeur est généralement fausse. Lorsqu'elles sont définies sur true, les commandes yum agiront comme si le paramètre -skip-broken était fourni.
imprimer yb.conf.niveau d'erreur Pour définir le niveau d'erreurs que vous souhaitez voir imprimé sur la sortie standard. C'est une valeur comprise entre 0 et 10 où 0 n'est que critique, tandis que 10 est tout ce qui inclut le débogage. Par défaut, il est défini sur 2, mais vous pouvez le remplacer. Si vous utilisez un script, c'est une bonne idée de le définir sur 0. Vous pouvez définir cette valeur sur une valeur supérieure comme 3 lorsque vous déboguez le script lui-même.

Recherche de packages

En revenant à notre script, nous voyons que la ligne de code suivante configure un nouveau répertoire de cache pour yum afin qu'il exécute toutes les tâches en tant qu'utilisateur normal (et aussi en tant qu'utilisateur root dans une certaine mesure - il ne pourra toujours pas modifier les données dans le yumdb ou rpmdb par exemple).

yb.setCacheDir()

Ayant créé un véritable objet yum maintenant, nous pouvons accéder aux attributs pkgSack, rpmdb et repos. Cela nous permet d'effectuer les fonctions suivantes :

yb.pkgSack - peut être utilisé pour effectuer des requêtes sur tous les référentiels activés

yb.rpmdb - peut être utilisé pour effectuer des requêtes sur les packages installés

yb.repos - obtient un objet RepositoryStorage qui peut être utilisé pour définir des configurations spécifiques pour les référentiels et peut être utilisé pour activer ou désactiver les référentiels - e.g., yb.repos.enableRepo(), yb.repos.disableRepo() & yb.repos.listEnabled(). Plus à ce sujet plus tard.

Pour l'instant, nous allons nous plonger dans les propriétés pkgSack et rpmdb. Nous pouvons rechercher les référentiels YUM et les packages installés localement respectivement en appelant l'une des nombreuses fonctions fournies par les attributs pkgSack et rpmdb. Ces fonctions renvoient des « objets de package » qui contiennent des informations sur le package. Certaines fonctions utiles pour obtenir les objets du package sont : returnPackages(), searchPrimaryFields(), seachNevra(),  seachName() , returnNewestByNameArch(). Notre script utilise la méthode returnNewstByNameArch pour obtenir les objets du package correspondant aux chaînes de modèle "python" ou "perl".

Notez que les noms de méthode sont les mêmes pour les deux yb.rpmdb et yb.pkgSack. Cependant, ils effectuent les requêtes sur différents domaines - rpmdb recherche la base de données des packages RPM installés localement tandis que pkgSack recherche les référentiels YUM.

Nous pourrions, de la même manière, lister les gros packages installés (où gros signifie, disons que la taille est > 10 Mo). Le code miam est :

plist = yb.rpmdb.returnPackages()
l_plist = [p pour p dans plist si p.taille > 1024 * 1024 * 10]
print "Paquets installés avec une taille > 10 Mo :"
pour p dans l_plist :
imprimer "%s: %sMB" % (pkg, pkg.taille / (1024 * 1024))

C'est essentiellement l'essence de l'utilisation de python pour accéder à yum. Dans le reste de l'article, nous approfondirons les nuances de l'API du module yum et essaierons d'autres actions compliquées telles que l'installation / la désinstallation de packages ou la configuration de notre propre référentiel.

Nevra, PRCO et Tuples

Il n'y a pas de faute de frappe dans l'en-tête - ce sont des termes spécifiques à yum qui facilitent l'identification des packages et des dépendances ainsi que leur communication avec d'autres utilisateurs de yum, y compris vos scripts python.

NEVRA signifie Name, Epoch, Version, Release, Architecture et est utilisé pour identifier de manière unique une saveur ou une instance d'un package - ces cinq paramètres ensemble pointent sans ambiguïté vers une instance unique du package. Par exemple, un package appelé "python" peut avoir plusieurs versions comme 2.6, 2.7 etc., et chaque version pourrait avoir plusieurs versions pour différentes architectures e.g., x86_64, i386 (Notez que le mot architecture ici fait référence à l'architecture du processeur - e.g., i386 est Intel 32 bits). Ensemble, ces cinq représentent une combinaison unique et est appelé nevra.

PRCO signifie Provides/Requires/Conflicts/Obsoletes qui résume les métadonnées de gestion de package pour l'objet package.

Certaines méthodes API dans pkgSack/ rpmdb, comme yb.pkgSack.simplePkgList(), yb.pkgSack.packagesByTuple() etc., renvoie les informations NEVRA ou PRCO sous forme de tuples python plutôt que d'objets pkg

Lister et installer les packages

Semblable à l'utilisation de la commande "yum list", nous pouvons utiliser 'yb.doPackageLists()' pour répertorier tous les packages installés / packages disponibles pour l'installation / la réinstallation.

plist = yb.doPackageLists(motifs=sys.argv[1:])

Maintenant, plist contient 3 listes de packages - une pour chaque package installé, un package installable et ceux disponibles pour la réinstallation. Nous pouvons imprimer/installer/réinstaller des packages en utilisant le code ci-dessous :

si pl.installée:
imprimer "Paquets installés"
pour pkg dans trié(pl.installée):
paquet d'impression
si pl.disponible:
imprimer "Forfaits disponibles"
pour pkg dans trié(pl.disponible):
paquet d'impression, paquet.dépôt
si pl.reinstall_available :
print "Réinstaller les packages disponibles"
pour pkg dans trié(pl.reinstall_available):
paquet d'impression, paquet.dépôt

De même pour lister tous les packages installés que nous pouvons utiliser :

imprimer "\n".rejoindre([x.nom pour x dans yb.rpmdb.returnPackages()])

Installation de paquets

L'installation de packages implique la configuration et l'exécution d'une transaction. Pour effectuer des actions simples comme installer/supprimer, nous utilisons le 'yb.install' ou 'yb.remove' respectivement pour configurer la transaction. Ensuite, nous invoquons le 'yb.resolveDeps()' pour déclencher la résolution des dépendances et 'yb.processTransaction()' pour demander à YUM d'aller de l'avant et d'exécuter la transaction.

Toutes les étapes, sauf la dernière, sont préparatoires et seul l'appel à la méthode processTransaction() entraîne réellement l'installation/la désinstallation. Vous trouverez ci-dessous un extrait de code pour l'installation du package.

yb = miam.MiamBase()
yb.install(nom='nom du paquet')
yb.résoudreDeps()
yb.processusTransaction()

Lors de l'exécution de telles transactions, le 'yb.L'objet tsInfo contient les informations sur l'état actuel de la transaction jusqu'à ce qu'elle soit validée. Vous pouvez en savoir plus à ce sujet dans sa documentation.

Configurer un référentiel à un emplacement arbitraire

Le script ci-dessous vous aide à configurer yum pour accéder à un référentiel à un emplacement arbitraire. Il s'attend à ce que l'URL du référentiel soit transmise en tant qu'argument de ligne de commande.

URL = sys.argv[1]
yb = miam.MiamBase()
sinon yb.setCacheDir(force=True, reuse=False) :
imprimer >>sys.stderr, "Impossible de créer un tmp. cachedir. "
système.sortie(1)
yb.repos.disableRepo('*')
yb.add_enable_repo('myrepo', [url])

Pour exécuter le script

script python.py url://to/my/repo

Résumé

Dans cet article, nous avons appris à contrôler le gestionnaire de packages YUM à l'aide de son API python. Nous avons examiné les options de configuration ainsi que les API de requête/recherche sur les packages disponibles et installés et enfin les moyens d'effectuer des opérations de gestion de packages telles que l'installation / la désinstallation / la réinstallation de packages.

Cet article est destiné à servir de fenêtre sur ce qui est possible via l'API yum python. Bien que l'API ne soit pas très bien documentée, elle suit les conventions standard et fonctionne de manière prévisible. Armé de la connaissance des capacités de YUM et de ses compétences en python, il est amusant d'explorer et d'apprendre tout ce qu'il peut faire. J'espère que vous avez apprécié la lecture jusqu'à présent et que vous continuez votre exploration et application de miam dans vos projets.

Top 5 des cartes de capture de jeu
Nous avons tous vu et aimé des gameplays en streaming sur YouTube. PewDiePie, Jakesepticye et Markiplier ne sont que quelques-uns des meilleurs joueur...
Comment développer un jeu sur Linux
Il y a dix ans, peu d'utilisateurs de Linux prédisaient que leur système d'exploitation préféré serait un jour une plate-forme de jeu populaire pour l...
Ports Open Source des moteurs de jeux commerciaux
Les récréations de moteur de jeu gratuites, open source et multiplateformes peuvent être utilisées pour jouer à d'anciens ainsi qu'à certains des titr...