Yum

Interagerar med YUM på CentOS med Python

Interagerar med YUM på CentOS med Python

Vad är YUM?

YUM är ett hanteringsverktyg som finns tillgängligt på Linux-distributioner i RedHat och CentOS.  YUM (Yellowdog Updater Modified) är beroende av RPM-paket (Red Hat Package Manager) och skapades för att möjliggöra hantering av paket som delar av ett större system med programvarulager istället för enskilda paketfiler. YUM är en interaktiv pakethanterare som automatiskt kan utföra beroendeanalys och systemuppdateringar, tillsammans med att installera nya paket, ta bort gamla paket, utföra frågor på befintliga paket, etc. Klicka på om du vill veta mer om YUM här.

I den här artikeln kommer vi att titta på metoder för att få tillgång till yum-funktionalitet med Python-program och ta reda på hur det kan vara användbart. För denna handledning använder vi CENTOS 7 som kör python 2.7.x och antar en viss bekantskap med grundläggande pythonfunktioner.

Programmering med YUM

Låt oss börja lära oss att programmera yum med python genom att titta på ett enkelt python-skript som använder yum för att fråga och skriva ut paketnamn. Här är det:

importera os
importera sys
importera yum
yb = yum.YumBase ()
yb.setCacheDir ()
resultat = yb.pkgSäck.returnNewestByNameArch (mönster = ["python", "perl"])
för pkg i resultat:
skriva ut "% s% s (% s) \ n \ t% s"% (pkg.namn, pkg.version, pkg.båge, pkg.sammanfattning)

Detta skript söker i YUM-förvaren efter paket som matchar namnet "python" och skriver ut information om det matchade paketet / paketen. Vi kommer att undersöka detta skript rad för rad.

För att börja programmera med YUM måste vi importera pytonpaketet 'yum' - detta är installerat som standard i CENTOS 7. Tillsammans med 'yum' behöver vi vanligtvis också 'os' och 'sys' -paketen - så ett typiskt pythonprogram med yum skulle börja med följande 3 rader.

importera os
importera sys
importera yum

Nästa, för att skapa en yum-instans att arbeta med, inkludera nedanstående rad.

yb = yum.YumBase ()

Detta är nästan den första raden av funktionskod i alla pythonprogram som använder yum. Det beror på att YumBase är basklassen som innehåller metoder och objekt som krävs för att utföra alla pakethanteringsfunktioner med yum. För den detaljerade strukturen för YumBase-klassen, se dess dokumentation.

Undersöker YUM-konfiguration

När en instans av YumBase är tillgänglig kan vi använda den för att inspektera yumkonfigurationen. Nedan finns en tabell med populära kommandon för att lista konfigurationsdetaljer.

Konfiguration Användande
skriv ut yb.konf.config_file_path Skriv ut filvägen för yums konfigurationsfil.
skriv ut yb.konf.loggfil För att skriva ut loggfilens sökväg
för jag i yb.konf.reposdir: skriv ut i Att skriva ut kataloger och filer för förvaren
skriv ut yb.konf.skip_broken Värdet är vanligtvis falskt. När det är satt till sant, kommer yum-kommandon att fungera som om parametern -skip-broken har levererats.
skriv ut yb.konf.felnivå För att ställa in felnivån som du vill se tryckt på standardutmatningen. Det är ett värde mellan 0-10 där 0 bara är kritiskt, medan 10 är allt inklusive felsökning. Som standard är den inställd på 2, men du kan åsidosätta den. Om du kör i ett skript är det en bra idé att ställa in detta till 0. Du kan ställa in detta till ett större värde som 3 när du felsöker själva skriptet.

Fråga efter paket

Återgå till vårt skript ser vi att nästa rad kod är att ställa in en ny Cache Directory för yum så att den utför alla uppgifter som en normal användare (och även som rootanvändare i viss utsträckning - det kommer fortfarande inte att kunna ändra data i yumdb eller rpmdb till exempel).

yb.setCacheDir ()

Efter att ha skapat ett riktigt yum-objekt nu kan vi komma åt attributen pkgSack, rpmdb och repos. Detta gör att vi kan utföra följande funktioner:

yb.pkgSack - kan användas för att utföra frågor på alla aktiverade arkiv

yb.rpmdb - kan användas för att utföra frågor på de installerade paketen

yb.repos - få ett RepositoryStorage-objekt som kan användas för att ställa in specifika konfigurationer för repos och kan användas för att aktivera eller inaktivera repositories - e.g., yb.repor.enableRepo (), yb.repor.disableRepo () & yb.repor.listEnabled (). Mer om detta senare.

För närvarande kommer vi att gräva i egenskaperna pkgSack och rpmdb. Vi kan söka i YUM-förvar och lokalt installerade paket genom att anropa en av de flera funktionerna som tillhandahålls av attributen pkgSack och rpmdb. Dessa funktioner returnerar "paketobjekt" som innehåller information om paketet. Några användbara funktioner för att hämta paketobjekten är: returnPackages (), searchPrimaryFields (), seachNevra (), seachName (), returnNewestByNameArch (). Vårt skript använder metoden returnNewstByNameArch för att få paketobjekten som matchar mönstersträngarna "python" eller "perl".

Observera att metodnamnen är desamma för båda yb.rpmdb och yb.pkgSäck. Men de utför frågorna på olika domäner - rpmdb söker i den lokala installerade RPM-paketdatabasen medan pkgSack söker i YUM-förvaren.

Vi kan på samma sätt lista de installerade stora paketen (där stora medel, säg storlek är> 10 MB). Yum-koden är:

plist = yb.rpmdb.returnPackages ()
l_plist = [p för p i plist om p.storlek> 1024 * 1024 * 10]
skriva ut "Installerade paket med storlek> 10 MB:"
för p i l_plist:
skriva ut "% s:% sMB"% (pkg, pkg.storlek / (1024 * 1024))

Det är i grunden kärnan i att använda python för att få tillgång till yum. I resten av artikeln kommer vi att gräva djupare in i nyanserna i yum module API och testa några mer komplikationsåtgärder som att installera / avinstallera paket eller skapa vårt eget arkiv.

Nevra, PRCO och Tuples

Det finns inget stavfel i rubriken - det här är några yumspecifika termer som gör det lättare att identifiera paket och beroenden samt att kommunicera dessa med andra användare av yum, inklusive dina pythonskript.

NEVRA står för Name, Epoch, Version, Release, Architecture och används för att identifiera en smak eller instans av ett paket unikt - dessa fem parametrar pekar entydigt på en unik instans av paketet. Till exempel kan ett paket som kallas "python" ha flera versioner som 2.6, 2.7 etc., och varje version kan ha flera versioner för olika arkitekturer e.g., x86_64, i386 (Observera att ordet arkitektur här hänvisar till CPU-arkitekturen - e.g., i386 är 32-bitars Intel). Tillsammans representerar dessa fem en unik kombination och kallas nevra.

PRCO står för Provides / Requires / Conflicts / Obsoletes som sammanfattar pakethanteringsmetadata för paketobjektet.

Vissa API-metoder i pkgSack / rpmdb, som yb.pkgSäck.simplePkgList (), yb.pkgSäck.packagesByTuple () osv., returnera NEVRA- eller PRCO-information som pythontubbar snarare än pkgobjects

Lista och installera paket

Liksom att använda kommandot "yum list" kan vi använda 'yb.doPackageLists () 'för att lista alla installerade paket / paket tillgängliga för installation / ominstallation.

plist = yb.doPackageLists (mönster = sys.argv [1:])

Nu innehåller plist 3 paketlistor - var och en för installerat paket, installerbart paket och de som är tillgängliga för ominstallation. Vi kan skriva ut / installera / installera om paket med koden nedan:

om pl.installerad:
skriva ut "Installerade paket"
för pkg i sorterad (pl.installerat):
tryck pkg
om pl.tillgängligt:
skriva ut "Tillgängliga paket"
för pkg i sorterad (pl.tillgängligt):
tryck pkg, pkg.repo
om pl.reinstall_available:
skriva ut "Installera om tillgängliga paket"
för pkg i sorterad (pl.reinstall_available):
tryck pkg, pkg.repo

På samma sätt listar vi alla installerade paket som vi kan använda:

skriva ut “\ n”.gå med ([x.namn för x i yb.rpmdb.returnPackages ()])

Installerar paket

Installera paket innebär att du skapar och genomför en transaktion. För att utföra enkla åtgärder som att installera / ta bort använder vi 'yb.installera 'eller' yb.ta bort respektive för att ställa in transaktionen. Sedan åberopar vi 'yb.resolutionDeps () 'för att utlösa upplösningen av beroenden och' yb.processTransaction () 'för att instruera YUM att fortsätta och genomföra transaktionen.

Alla steg, men den sista, är förberedande och endast anropet till processTransaction () -metoden resulterar faktiskt i att installationen / avinstallationen sker. Nedan följer ett kodavsnitt för installation av paket.

yb = yum.YumBase ()
yb.install (name = 'packagename')
yb.resolDeps ()
yb.processTransaction ()

När du utför sådana transaktioner är 'yb.tsInfo-objektet innehåller informationen om den aktuella statusen för transaktionen tills den begås. Du kan läsa mer om det i dess dokumentation.

Konfigurera ett arkiv på en godtycklig plats

Nedanstående skript hjälper dig att ställa in yum för att komma åt ett förråd på en godtycklig plats. Den förväntar sig att förvarets URL ska skickas in som kommandoradsargument.

url = sys.argv [1]
yb = yum.YumBase ()
om inte yb.setCacheDir (force = True, reuse = False):
skriva ut >> sys.stderr, "Kan inte skapa en tmp. cachedir. "
sys.utgång (1)
yb.repor.disableRepo ('*')
yb.add_enable_repo ('myrepo', [url])

För att köra skriptet

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

Sammanfattning

I den här artikeln lärde vi oss att styra YUM-pakethanteraren med dess python API. Vi tittade på konfigurationsalternativen samt frågor / sök-API: er på tillgängliga och installerade paket och slutligen på sätt att utföra pakethanteringsåtgärder som att installera / avinstallera / installera om paket.

Den här artikeln är avsedd att fungera som ett fönster till vad som är möjligt via yum python API. Även om API: et inte är väldokumenterat, följer det standardkonventioner och fungerar förutsägbart. Beväpnad med kunskapen om YUMs förmåga och python-färdigheter är det kul att utforska och lära sig allt det kan göra. Hoppas att du tyckte om att läsa hittills och att du fortsätter med din utforskning och tillämpning av yum i dina projekt.

Bästa Gamepad Mapping Apps för Linux
Om du gillar att spela spel på Linux med en gamepad istället för ett typiskt tangentbord och musinmatningssystem, finns det några användbara appar för...
Användbara verktyg för Linux-spelare
Om du gillar att spela spel på Linux är chansen att du kan ha använt appar och verktyg som Wine, Lutris och OBS Studio för att förbättra spelupplevels...
HD Remastered Games för Linux som aldrig tidigare hade en Linux-version
Många spelutvecklare och utgivare kommer med HD-remaster av gamla spel för att förlänga livstiden för franchisen, snälla fans som begär kompatibilitet...