Yum

Interagerer med YUM på CentOS ved hjælp af Python

Interagerer med YUM på CentOS ved hjælp af Python

Hvad er YUM?

YUM er et styringsværktøj, der er tilgængeligt på RedHat og CentOS Linux distroer.  YUM (Yellowdog Updater Modified) er afhængig af RPM-pakker (Red Hat Package Manager) og blev oprettet for at muliggøre styring af pakker som dele af et større system af softwarelagre i stedet for individuelle pakkefiler. YUM er en interaktiv pakkehåndtering, der automatisk kan udføre afhængighedsanalyse og systemopdateringer sammen med installation af nye pakker, fjernelse af gamle pakker, udførelse af forespørgsler på eksisterende pakker osv. Hvis du vil vide mere om YUM, skal du klikke på her.

I denne artikel vil vi se på metoder til at få adgang til yum-funktionalitet ved hjælp af Python-programmer og finde ud af, hvordan det kan være nyttigt. Til denne vejledning bruger vi CENTOS 7, der kører python 2.7.x og antager en vis fortrolighed med grundlæggende python-funktioner.

Programmering med YUM

Lad os begynde at lære om programmering af yum ved hjælp af python ved at se på et simpelt python-script, der bruger yum til at forespørge og udskrive pakkenavne. Her er det:

importer os
importer sys
importere yum
yb = yum.YumBase ()
yb.setCacheDir ()
resultater = yb.pkgSæk.returnNewestByNameArch (mønstre = ["python", "perl"])
for pkg i resultater:
udskriv "% s% s (% s) \ n \ t% s"% (pkg.navn, pkg.version, pkg.bue, pkg.Resumé)

Dette scripts søger i YUM-arkiverne efter pakker, der matcher navnet "python" og udskriver information om den / de matchede pakke (r). Vi vil undersøge dette script linje for linje.

For at starte programmering med YUM skal vi importere 'yum' python-pakken - dette er installeret som standard i CENTOS 7. Sammen med 'yum' har vi normalt også brug for 'os' og 'sys' pakkerne - så et typisk pythonprogram ved hjælp af yum ville begynde med de følgende 3 linjer.

importer os
importer sys
importere yum

Dernæst skal du oprette en yum-instans til at arbejde med, herunder nedenstående linje.

yb = yum.YumBase ()

Dette er næsten den første linje med funktionel kode i ethvert pythonprogram, der bruger yum. Det skyldes, at YumBase er basisklassen, der indeholder metoder og objekter, der kræves for at udføre alle pakkehåndteringsfunktioner ved hjælp af yum. For den detaljerede struktur af YumBase-klassen henvises til dens dokumentation.

Undersøgelse af YUM-konfiguration

Når en forekomst af YumBase er tilgængelig, kan vi bruge det til at inspicere yum-konfigurationen. Nedenfor er en tabel, der viser populære kommandoer til liste over konfigurationsoplysningerne.

Konfiguration Anvendelse
udskriv yb.konf.config_file_path Udskriv filstien til yums konfigurationsfil.
udskriv yb.konf.logfil Sådan udskrives logfilens sti
for jeg i yb.konf.reposdir: udskriv i At udskrive mapper og filer til arkiverne
udskriv yb.konf.skip_broken Værdien er normalt falsk. Når de er indstillet til sande, fungerer yum-kommandoer, som om -skibets brudte parameter blev leveret.
udskriv yb.konf.fejlniveau For at indstille niveauet for fejl, som du gerne vil have vist på standardoutput. Det er en værdi mellem 0-10, hvor 0 kun er kritisk, mens 10 er alt inklusive debug. Som standard er det indstillet til 2, men du kan tilsidesætte det. Hvis du kører i et script, er det en god ide at indstille dette til 0. Du kan indstille dette til en større værdi som 3, når du debugger selve scriptet.

Forespørgsel efter pakker

Når vi vender tilbage til vores script, ser vi, at den næste linje kode er at oprette en ny Cache Directory til yum, så den udfører alle opgaver som en normal bruger (og også som rootbruger til en vis grad - det vil stadig ikke være i stand til at ændre data i yumdb eller rpmdb for eksempel).

yb.setCacheDir ()

Efter at have oprettet et rigtigt yum-objekt nu kan vi få adgang til attributterne pkgSack, rpmdb og repos. Dette giver os mulighed for at udføre følgende funktioner:

yb.pkgSack - kan bruges til at udføre forespørgsler på alle de aktiverede arkiver

yb.rpmdb - kan bruges til at udføre forespørgsler på de installerede pakker

yb.repos - få et RepositoryStorage-objekt, der kan bruges til at indstille specifikke konfigurationer for repos og kan bruges til at aktivere eller deaktivere repositories - e.g., yb.repos.enableRepo (), yb.repos.deaktiverRepo () & yb.repos.listEnabled (). Mere om dette senere.

For nu vil vi dykke ned i egenskaberne pkgSack og rpmdb. Vi kan søge i henholdsvis YUM-arkiver og lokalt installerede pakker ved at kalde en af ​​de mange funktioner, der leveres af attributterne pkgSack og rpmdb. Disse funktioner returnerer "pakkeobjekter", der indeholder information om pakken. Nogle nyttige funktioner til at hente pakkeobjekterne er: returnPackages (), searchPrimaryFields (), seachNevra (), seachName (), returnNewestByNameArch (). Vores script bruger returnNewstByNameArch-metoden til at få pakkeobjekterne, der matcher mønsterstrengene "python" eller "perl".

Bemærk, at metodens navne er ens for begge yb.rpmdb og yb.pkgSæk. De udfører dog forespørgslerne på forskellige domæner - rpmdb søger i den lokale installerede RPM-pakkedatabase, mens pkgSack søger i YUM-arkiverne.

Vi kunne på samme måde liste de installerede store pakker (hvor store betyder, siger størrelse er> 10 MB). Yum-koden er:

plist = yb.rpmdb.returnPackages ()
l_plist = [p for p i plist hvis p.størrelse> 1024 * 1024 * 10]
udskriv "Installerede pakker med størrelse> 10 MB:"
til p i l_plist:
udskriv "% s:% sMB"% (pkg, pkg.størrelse / (1024 * 1024))

Det er dybest set essensen af ​​at bruge python til at få adgang til yum. I resten af ​​artiklen vil vi gå dybere ned i nuancerne i yum-modulets API og prøve nogle flere komplikationshandlinger som at installere / afinstallere pakker eller oprette vores eget lager.

Nevra, PRCO og Tuples

Der er ingen skrivefejl i overskriften - dette er nogle yumspecifikke udtryk, der gør det lettere at identificere pakker og afhængigheder såvel som i kommunikation med andre brugere af yum, inklusive dine python-scripts.

NEVRA står for Name, Epoch, Version, Release, Architecture og bruges til entydigt at identificere en smag eller forekomst af en pakke - disse fem parametre peger entydigt på en unik forekomst af pakken. For eksempel kan en pakke kaldet "python" have flere versioner som 2.6, 2.7 osv., og hver version kunne have flere udgivelser til forskellige arkitekturer e.g., x86_64, i386 (Bemærk, at ordet arkitektur her henviser til CPU-arkitekturen - f.eks.g., i386 er 32-bit Intel). Tilsammen repræsenterer disse fem en unik kombination og kaldes nevra.

PRCO står for Provides / Requires / Conflicts / Obsoletes, der opsummerer pakkehåndteringsmetadata for pakkeobjektet.

Visse API-metoder i pkgSack / rpmdb, som yb.pkgSæk.simplePkgList (), yb.pkgSæk.packagesByTuple () osv., returnere NEVRA- eller PRCO-oplysninger som pythontubler snarere end pkgobjects

Liste og installere pakker

I lighed med at bruge kommandoen “yum list” kan vi bruge 'yb.doPackageLists () 'for at vise alle de installerede pakker / pakker, der er tilgængelige til installation / geninstallation.

plist = yb.doPackageLists (mønstre = sys.argv [1:])

Nu indeholder plist 3 pakkelister - en hver til installeret pakke, installerbar pakke og dem, der er tilgængelige til geninstallation. Vi kan udskrive / installere / geninstallere pakker ved hjælp af nedenstående kode:

hvis pl.installeret:
udskriv "Installerede pakker"
for pkg sorteret (pl.installeret):
udskriv pkg
hvis pl.ledig:
udskriv "Tilgængelige pakker"
for pkg sorteret (pl.ledig):
udskriv pkg, pkg.repo
hvis pl.reinstall_available:
udskriv "Geninstaller tilgængelige pakker"
for pkg sorteret (pl.reinstall_available):
udskriv pkg, pkg.repo

Tilsvarende for at liste alle de installerede pakker, vi kan bruge:

udskriv “\ n”.join ([x.navn til x i yb.rpmdb.returnPackages ()])

Installation af pakker

Installation af pakker indebærer opsætning og udførelse af en transaktion. For at udføre enkle handlinger som installation / fjernelse bruger vi 'yb.installer 'eller' yb.Fjern henholdsvis for at opsætte transaktionen. Så påberåber vi os 'yb.resolDeps () 'for at udløse løsningen på afhængigheder og' yb.processTransaction () 'for at instruere YUM om at fortsætte og udføre transaktionen.

Alle trin, men den sidste, er forberedende, og kun opkaldet til processTransaction () -metoden resulterer faktisk i installation / afinstallation. Nedenfor er et kodestykke til pakkeinstallation.

yb = yum.YumBase ()
yb.installer (navn = 'pakkenavn')
yb.resolDeps ()
yb.processTransaction ()

Under udførelsen af ​​sådanne transaktioner er 'yb.tsInfo 'objekt indeholder oplysningerne om den aktuelle status for transaktionen, indtil den er begået. Du kan læse mere om det i dokumentationen.

Opsæt et lager på et vilkårligt sted

Nedenstående script hjælper dig med at konfigurere yum til at få adgang til et lager på en vilkårlig placering. Det forventer, at URL'en til arkivet skal sendes ind som kommandolinjeargumentet.

url = sys.argv [1]
yb = yum.YumBase ()
hvis ikke yb.setCacheDir (kraft = sand, genbrug = falsk):
udskriv >> sys.stderr, "Kan ikke oprette en tmp. cachedir. "
sys.udgang (1)
yb.repos.deaktiverRepo ('*')
yb.add_enable_repo ('myrepo', [url])

At køre scriptet

python-script.py url: // til / min / repo

Resumé

I denne artikel lærte vi, hvordan du styrer YUM-pakkehåndtering ved hjælp af dens python API. Vi kiggede på konfigurationsindstillingerne såvel som forespørgsel / søgning-API'erne på de tilgængelige og installerede pakker og endelig på måder at udføre pakkehåndteringshandlinger såsom installation / afinstallation / geninstallation af pakker.

Denne artikel er beregnet til at fungere som et vindue i, hvad der er muligt via yum python API. Selvom API'en ikke er meget veldokumenteret, følger den standardkonventioner og fungerer forudsigeligt. Bevæbnet med viden om YUMs evner og python-færdigheder er det sjovt at udforske og lære alt, hvad det kan gøre. Håber du har haft læsning indtil videre, og at du fortsætter med din udforskning og anvendelse af yum i dine projekter.

Sådan downloades og afspilles Sid Meiers Civilization VI på Linux
Introduktion til spillet Civilization 6 er et moderne udtryk for det klassiske koncept, der blev introduceret i serien af ​​Age of Empires-spil. Ideen...
Sådan installeres og afspilles Doom på Linux
Introduktion til undergang Doom-serien opstod i 90'erne efter frigivelsen af ​​den originale Doom. Det var et øjeblikkeligt hit, og fra den tid af har...
Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...