Nam

Samhandler med YUM på CentOS ved hjelp av Python

Samhandler med YUM på CentOS ved hjelp av Python

Hva er YUM?

YUM er et styringsverktøy som er tilgjengelig på RedHat og CentOS Linux-distribusjoner.  YUM (Yellowdog Updater Modified) er avhengig av RPM (Red Hat Package Manager) -pakker, og ble opprettet for å muliggjøre administrasjon av pakker som deler av et større system med programvarelager i stedet for individuelle pakkefiler. YUM er en interaktiv pakkebehandling som automatisk kan utføre avhengighetsanalyse og systemoppdateringer, sammen med installering av nye pakker, fjerning av gamle pakker, utføring av spørsmål på eksisterende pakker osv. For å vite mer om YUM, klikk her.

I denne artikkelen vil vi se på metoder for å få tilgang til yum-funksjonalitet ved hjelp av Python-programmer og finne ut hvordan det kan være nyttig. For denne opplæringen vil vi bruke CENTOS 7 som kjører python 2.7.x og vil anta litt kjennskap til grunnleggende python-funksjoner.

Programmering med YUM

La oss begynne å lære om programmering av yum ved hjelp av python ved å se på et enkelt python-skript som bruker yum til å spørre og skrive ut pakkenavn. Her er det:

importer os
importer sys
importere nam
yb = yum.YumBase ()
yb.setCacheDir ()
resultater = yb.pkgSekk.returnNewestByNameArch (mønstre = ["python", "perl"])
for pkg i resultater:
skriv ut "% s% s (% s) \ n \ t% s"% (pkg.navn, pkg.versjon, pkg.bue, pkg.sammendrag)

Dette skriptet søker i YUM-arkivene etter pakker som samsvarer med navnet “python” og skriver ut informasjon om den / de matchede pakken (e). Vi vil undersøke dette skriptet linje for linje.

For å begynne å programmere med YUM, må vi importere 'yum' python-pakken - dette er installert som standard i CENTOS 7. Sammen med 'yum' trenger vi vanligvis også 'os' og 'sys' -pakningene - så et typisk pythonprogram ved hjelp av yum vil begynne med de følgende tre linjene.

importer os
importer sys
importere nam

Deretter, for å lage en yum-forekomst å jobbe med, inkluderer du linjen nedenfor.

yb = yum.YumBase ()

Dette er nesten den første linjen med funksjonell kode i ethvert pythonprogram som bruker yum. Det er fordi YumBase er basisklassen som inneholder metoder og objekter som kreves for å utføre alle pakkehåndteringsfunksjonene ved hjelp av yum. For detaljert struktur for YumBase-klassen, se dokumentasjonen.

Undersøker YUM-konfigurasjon

Når en forekomst av YumBase er tilgjengelig, kan vi bruke den til å inspisere yum-konfigurasjonen. Nedenfor er en tabell med populære kommandoer for oppføring av konfigurasjonsdetaljer.

Konfigurasjon Bruk
skriv ut yb.konf.config_file_path Skriv ut filstien for yums konfigurasjonsfil.
skriv ut yb.konf.loggfil Å skrive ut loggfilens bane
for jeg i yb.konf.reposdir: skriv ut i Å skrive ut katalogene og filene til arkivene
skriv ut yb.konf.skip_broken Verdien er vanligvis falsk. Når satt til sant, vil yum-kommandoer fungere som om -skip-ødelagt parameter ble levert.
skriv ut yb.konf.feilnivå For å angi nivået på feil du vil se skrevet ut på standardutgangen. Det er en verdi mellom 0-10 hvor 0 bare er kritisk, mens 10 er alt inkluderer feilsøking. Som standard er den satt til 2, men du kan overstyre den. Hvis du kjører i et skript, er det lurt å sette dette til 0. Du kan sette dette til en større verdi som 3 når du feilsøker selve skriptet.

Spørring etter pakker

Når vi kommer tilbake til skriptet vårt, ser vi at neste linje med kode er å sette opp en ny Cache Directory for yum, slik at den utfører alle oppgaver som en vanlig bruker (og også som rotbruker til en viss grad - den vil fortsatt ikke kunne endre data i yumdb eller rpmdb for eksempel).

yb.setCacheDir ()

Etter å ha opprettet et ekte yum-objekt nå, kan vi få tilgang til attributtene pkgSack, rpmdb og repos. Dette lar oss utføre følgende funksjoner:

yb.pkgSack - kan brukes til å utføre spørsmål på alle aktiverte lagringssteder

yb.rpmdb - kan brukes til å utføre spørsmål på de installerte pakkene

yb.repos - få et RepositoryStorage-objekt som kan brukes til å angi spesifikke konfigurasjoner for repos og som kan brukes til å aktivere eller deaktivere repositories - e.g., yb.repoer.enableRepo (), yb.repoer.disableRepo () og yb.repoer.listEnabled (). Mer om dette senere.

For nå vil vi fordype oss i egenskapene pkgSack og rpmdb. Vi kan søke i henholdsvis YUM-arkiver og lokalt installerte pakker ved å ringe til en av de mange funksjonene som tilbys av attributtene pkgSack og rpmdb. Disse funksjonene returnerer "pakkeobjekter" som inneholder informasjon om pakken. Noen nyttige funksjoner for å hente pakkeobjektene er: returnPackages (), searchPrimaryFields (), seachNevra (), seachName (), returnNewestByNameArch (). Skriptet vårt bruker returnNewstByNameArch-metoden for å få pakkeobjektene som samsvarer med mønsterstrengene "python" eller "perl".

Merk at metodenavnene er like for begge yb.rpmdb og yb.pkgSekk. Imidlertid utfører de spørringene på forskjellige domener - rpmdb søker i den lokale installerte RPM-pakkedatabasen mens pkgSack søker i YUM-repositoriene.

Vi kan på samme måte liste opp de store installerte pakkene (hvor store betyr, si størrelsen er> 10 MB). Yum-koden er:

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

Det er egentlig essensen av å bruke python for å få tilgang til yum. I resten av artikkelen vil vi dykke dypere inn i nyansene til yum module API og prøve noen flere komplikasjonshandlinger som å installere / avinstallere pakker eller sette opp vårt eget depot.

Nevra, PRCO og Tuples

Det er ingen skrivefeil i overskriften - dette er noen yum-spesifikke termer som gjør det lettere å identifisere pakker og avhengigheter, samt å kommunisere disse med andre brukere av yum, inkludert python-skriptene dine.

NEVRA står for Name, Epoch, Version, Release, Architecture og brukes til å identifisere en smak eller forekomst av en pakke - disse fem parametrene tilsier entydig å peke på en unik forekomst av pakken. For eksempel kan en pakke kalt “python” ha flere versjoner som 2.6, 2.7 osv., og hver versjon kan ha flere utgivelser for forskjellige arkitekturer e.g., x86_64, i386 (Merk at ordet arkitektur her refererer til CPU-arkitekturen - e.g., i386 er 32-biters Intel). Sammen representerer disse fem en unik kombinasjon og blir referert til som nevra.

PRCO står for Tilbyder / Krever / Konflikter / Foreldelser som oppsummerer pakkehåndteringsmetadata for pakkeobjektet.

Visse API-metoder i pkgSack / rpmdb, som yb.pkgSekk.simplePkgList (), yb.pkgSekk.PackagesByTuple () osv., returnere NEVRA- eller PRCO-informasjon som pythontuppler i stedet for pkgobjekter

Liste og installer pakker

I likhet med å bruke "yum list" -kommandoen, kan vi bruke 'yb.doPackageLists () 'for å vise alle installerte pakker / pakker som er tilgjengelige for installasjon / reinstallering.

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

Nå inneholder plist 3 pakkelister - en hver for installert pakke, installerbar pakke og de som er tilgjengelig for reinstallering. Vi kan skrive ut / installere / installere pakker på nytt ved hjelp av koden nedenfor:

hvis pl.installert:
skriv ut "Installerte pakker"
for pkg i sortert (pl.installert):
trykk pkg
hvis pl.tilgjengelig:
skriv "Tilgjengelige pakker"
for pkg i sortert (pl.tilgjengelig):
trykk pkg, pkg.repo
hvis pl.reinstall_available:
skriv "Installer tilgjengelige pakker på nytt"
for pkg i sortert (pl.reinstall_available):
trykk pkg, pkg.repo

Tilsvarende for å liste opp alle installerte pakker vi kan bruke:

skriv ut “\ n”.bli med ([x.navn for x i yb.rpmdb.returnPackages ()])

Installere pakker

Installering av pakker innebærer å sette opp og utføre en transaksjon. For å utføre enkle handlinger som installere / fjerne bruker vi 'yb.installer 'eller' yb.fjerne henholdsvis for å sette opp transaksjonen. Så påkaller vi 'yb.resolDeps () 'for å utløse oppløsningen av avhengigheter og' yb.processTransaction () 'for å instruere YUM om å fortsette og utføre transaksjonen.

Alle trinn, men den siste, er forberedende, og bare anropet til metoden processTransaction () fører faktisk til at installasjonen / avinstallasjonen skjer. Nedenfor er et kodebit for installasjon av pakken.

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

Mens du utfører slike transaksjoner, blir 'yb.tsInfo 'objekt holder informasjonen om gjeldende status for transaksjonen til den er begått. Du kan lese mer om det i dokumentasjonen.

Sett opp et depot på et vilkårlig sted

Skriptet nedenfor hjelper deg med å konfigurere yum for å få tilgang til et depot på et vilkårlig sted. Den forventer at URL-en til depotet skal sendes inn som kommandolinjeargumentet.

url = sys.argv [1]
yb = yum.YumBase ()
hvis ikke yb.setCacheDir (force = True, reuse = False):
skriv ut >> sys.stderr, "Kan ikke opprette en tmp. cachedir. "
sys.utgang (1)
yb.repoer.disableRepo ('*')
yb.add_enable_repo ('myrepo', [url])

Å kjøre skriptet

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

Sammendrag

I denne artikkelen lærte vi hvordan du styrer YUM-pakkebehandleren ved hjelp av python API. Vi så på konfigurasjonsalternativene, samt søk / API-er for søk på tilgjengelige og installerte pakker og til slutt på måter å utføre pakkehåndteringsoperasjoner på, for eksempel installering / avinstallering / installering av pakker.

Denne artikkelen er ment å fungere som et vindu til hva som er mulig via yum python API. Selv om API ikke er veldig godt dokumentert, følger det standardkonvensjoner og fungerer forutsigbart. Bevæpnet med kunnskapen om YUMs evner og pythonferdigheter er det morsomt å utforske og lære alt det kan gjøre. Håper du likte å lese så langt, og at du fortsetter med din utforskning og anvendelse av yum i prosjektene dine.

Nyttige verktøy for Linux-spillere
Hvis du liker å spille spill på Linux, er sjansen stor for at du har brukt apper og verktøy som Wine, Lutris og OBS Studio for å forbedre spilloppleve...
HD Remastered Games for Linux som aldri hadde en Linux-utgave tidligere
Mange spillutviklere og utgivere kommer med HD-remaster av gamle spill for å forlenge franchisetiden, vennligst fans som ber om kompatibilitet med mod...
Hvordan bruke AutoKey til å automatisere Linux-spill
AutoKey er et desktopautomatiseringsverktøy for Linux og X11, programmert i Python 3, GTK og Qt. Ved å bruke skript og MACRO-funksjonalitet kan du aut...