Yum

Berinteraksi dengan YUM di CentOS menggunakan Python

Berinteraksi dengan YUM di CentOS menggunakan Python

Apa itu YUM?

YUM adalah alat manajemen yang tersedia di distro RedHat dan CentOS Linux.  YUM (Yellowdog Updater Modified) bergantung pada paket RPM (Red Hat Package Manager), dan dibuat untuk memungkinkan pengelolaan paket sebagai bagian dari sistem repositori perangkat lunak yang lebih besar daripada file paket individual. YUM adalah manajer paket interaktif yang dapat secara otomatis melakukan analisis ketergantungan dan pembaruan sistem, bersama dengan menginstal paket baru, menghapus paket lama, melakukan kueri pada paket yang ada, dll. Untuk mengetahui lebih banyak tentang YUM, klik sini.

Pada artikel ini kita akan melihat metode mengakses fungsionalitas yum menggunakan program Python dan mencari tahu bagaimana itu bisa berguna. Untuk tutorial ini, kita akan menggunakan CENTOS 7 yang menjalankan python 2.7.x dan akan menganggap beberapa keakraban dengan fitur dasar python.

Pemrograman dengan YUM

Mari kita mulai belajar tentang pemrograman yum menggunakan python dengan melihat skrip python sederhana yang menggunakan yum untuk meng-query dan mencetak nama paket. Ini dia:

impor os
sistem impor
impor yum
yb = enak.Pangkalan Yum()
yb.setCacheDir()
hasil = yb.pkgSack.returnNewestByNameArch(patterns=["python", “perl”])
untuk pkg dalam hasil:
print "%s %s (%s) \n\t%s" % (pkg.nama, pkg.versi, pkg.lengkungan, pkg.ringkasan)

Skrip ini mencari repositori YUM untuk paket yang cocok dengan nama "python" dan mencetak informasi tentang paket yang cocok. Kami akan memeriksa skrip ini baris demi baris.

Untuk memulai pemrograman dengan YUM, kita perlu mengimpor paket python 'yum' - ini diinstal secara default di CENTOS 7. Bersamaan dengan 'yum' kita biasanya membutuhkan paket 'os' dan 'sys' juga - jadi program python yang biasa menggunakan yum akan dimulai dengan 3 baris berikut.

impor os
sistem impor
impor yum

Selanjutnya, untuk membuat instance yum untuk digunakan, sertakan baris di bawah ini.

yb = enak.Pangkalan Yum()

Ini hampir merupakan baris pertama kode fungsional dalam program python apa pun yang menggunakan yum. Itu karena, YumBase adalah kelas dasar yang menampung metode dan objek yang diperlukan untuk melakukan semua fungsi manajemen paket menggunakan yum. Untuk detail struktur kelas YumBase, lihat dokumentasinya.

Memeriksa konfigurasi YUM

Setelah instance YumBase tersedia, kita dapat menggunakannya untuk memeriksa konfigurasi yum. Di bawah ini adalah tabel yang mencantumkan perintah populer untuk mencantumkan detail konfigurasi.

Konfigurasi Pemakaian
cetak yb.konf.config_file_path Cetak jalur file untuk file konfigurasi yum.
cetak yb.konf.file log Untuk mencetak jalur file log
untuk saya di yb.konf.repodir : print i Untuk mencetak direktori dan file untuk repositori
cetak yb.konf.skip_broken Nilainya biasanya salah. Ketika disetel ke true, perintah yum akan bertindak seolah-olah parameter -skip-broken diberikan.
cetak yb.konf.tingkat kesalahan Untuk mengatur tingkat kesalahan yang ingin Anda lihat dicetak pada keluaran standar. Ini adalah nilai antara 0-10 di mana 0 hanya kritis , sedangkan 10 adalah segalanya termasuk debug. Secara default diatur ke 2, tetapi Anda dapat menimpanya. Jika Anda akan menjalankan skrip, sebaiknya setel ini ke 0. Anda dapat mengatur ini ke nilai yang lebih besar seperti 3 saat Anda men-debug skrip itu sendiri.

Menanyakan paket

Kembali ke skrip kami, kami melihat baris kode berikutnya sedang menyiapkan Direktori Cache baru untuk yum sehingga melakukan semua tugas sebagai pengguna normal (dan juga sebagai pengguna root sampai batas tertentu - masih tidak dapat mengubah data di yumdb atau rpmdb misalnya).

yb.setCacheDir()

Setelah membuat objek yum nyata sekarang, kita dapat mengakses atribut pkgSack, rpmdb dan repos. Hal ini memungkinkan kita untuk melakukan fungsi-fungsi berikut:

yb.pkgSack - dapat digunakan untuk melakukan kueri pada semua repositori yang diaktifkan

yb.rpmdb - dapat digunakan untuk melakukan kueri pada paket yang diinstal

yb.repo - dapatkan objek RepositoryStorage yang dapat digunakan untuk mengatur konfigurasi khusus untuk repo dan dapat digunakan untuk mengaktifkan atau menonaktifkan repositori - e.g., yb.repo.aktifkanRepo(), yb.repo.nonaktifkanRepo() & yb.repo.daftarDiaktifkan(). Lebih lanjut tentang ini nanti.

Untuk saat ini kita akan mempelajari properti pkgSack dan rpmdb. Kita dapat mencari repositori YUM & paket yang diinstal secara lokal masing-masing dengan memanggil salah satu dari beberapa fungsi yang disediakan oleh atribut pkgSack dan rpmdb. Fungsi-fungsi ini mengembalikan "objek paket" yang berisi informasi tentang paket. Beberapa fungsi yang berguna untuk mendapatkan objek paket adalah: returnPackages(), searchPrimaryFields(), seachNevra(),  seachName() , returnNewestByNameArch(). Skrip kami menggunakan metode returnNewstByNameArch untuk mendapatkan objek paket yang cocok dengan string pola "python" atau "perl".

Perhatikan bahwa nama metodenya sama untuk kedua yb.rpmdb dan yb.pkgSack. Namun, mereka melakukan kueri pada domain yang berbeda - rpmdb mencari database paket RPM lokal yang diinstal sedangkan pkgSack mencari repositori YUM.

Kami juga dapat membuat daftar paket besar yang diinstal (di mana artinya besar, katakanlah ukurannya> 10MB). Kode yumnya adalah:

plist = yb.rpmdb.kembaliPaket()
l_plist = [p untuk p dalam daftar jika p.ukuran > 1024 * 1024 * 10]
print "Paket terinstal dengan ukuran > 10MB:"
untuk p di l_plist:
print "%s: %sMB" % (pkg, pkg.ukuran / (1024 * 1024))

Itu pada dasarnya adalah inti dari penggunaan python untuk mengakses yum. Di sisa artikel ini, kita akan mempelajari lebih dalam tentang nuansa modul yum API dan mencoba beberapa tindakan rumit lainnya seperti menginstal / menghapus instalan paket atau menyiapkan repositori kita sendiri.

Nevra, PRCO dan Tuples

Tidak ada kesalahan ketik pada judul - ini adalah beberapa istilah khusus yum yang membuat identifikasi paket dan dependensi lebih mudah serta dalam mengomunikasikannya dengan pengguna yum lainnya, termasuk skrip python Anda.

NEVRA adalah singkatan dari Name, Epoch, Version, Release, Architecture dan digunakan untuk mengidentifikasi secara unik rasa atau instance dari suatu paket - kelima parameter ini bersama-sama secara jelas menunjuk ke satu instance unik dari paket tersebut. Misalnya, paket yang disebut "python" mungkin memiliki beberapa versi seperti 2.6, 2.7 dll., dan setiap versi dapat memiliki beberapa rilis untuk arsitektur yang berbeda e.g., x86_64, i386 (Perhatikan bahwa kata arsitektur di sini mengacu pada arsitektur CPU - e.g., i386 adalah Intel 32-bit). Bersama-sama kelima ini mewakili kombinasi unik dan disebut sebagai nevra.

PRCO adalah singkatan dari Menyediakan/Memerlukan/Konflik/Usang yang merangkum metadata manajemen paket untuk objek paket.

Metode API tertentu di pkgSack/ rpmdb, seperti yb.pkgSack.simplePkgList(), yb.pkgSack.paketByTuple() dll., kembalikan informasi NEVRA atau PRCO sebagai tupel python daripada pkgobjects

Daftar dan instal paket

Mirip dengan menggunakan perintah “yum list”, kita dapat menggunakan 'yb.doPackageLists()' untuk membuat daftar semua paket yang diinstal/paket yang tersedia untuk diinstal/instal ulang.

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

Sekarang plist berisi 3 daftar paket - masing-masing untuk paket yang diinstal, paket yang dapat diinstal dan yang tersedia untuk diinstal ulang. Kami dapat mencetak/menginstal/menginstal ulang paket menggunakan kode di bawah ini:

jika saya.dipasang:
print "Paket Terinstal"
untuk pkg diurutkan(pl.terpasang):
cetak pkg
jika saya.tersedia:
print "Paket yang Tersedia"
untuk pkg diurutkan(pl.tersedia):
cetak pkg, pkg.repo
jika saya.instal ulang_tersedia:
print "Instal Ulang Paket yang Tersedia"
untuk pkg diurutkan(pl.instal ulang_tersedia):
cetak pkg, pkg.repo

Demikian pula untuk membuat daftar semua paket yang diinstal, kita dapat menggunakan:

cetak “\n”.bergabung([x.nama untuk x dalam yb.rpmdb.kembaliPaket()])

Menginstal paket

Menginstal paket melibatkan pengaturan dan pelaksanaan transaksi. Untuk melakukan tindakan sederhana seperti menginstal/menghapus, kami menggunakan 'yb.instal' atau 'yb.hapus' masing-masing untuk mengatur transaksi. Kemudian kita memanggil 'yb.resolveDeps()' untuk memicu resolusi dependensi dan 'yb.processTransaction()' untuk menginstruksikan YUM untuk melanjutkan dan menjalankan transaksi.

Semua langkah, tetapi yang terakhir, adalah persiapan dan hanya panggilan ke metode processTransaction() yang benar-benar menghasilkan instalasi/pencopotan pemasangan terjadi. Di bawah ini adalah cuplikan kode untuk instalasi paket.

yb = enak.Pangkalan Yum()
yb.instal (nama = 'nama paket')
yb.menyelesaikanDeps()
yb.prosesTransaksi()

Saat melakukan transaksi seperti itu, 'yb.objek tsInfo' menyimpan informasi tentang status transaksi saat ini hingga dilakukan. Anda dapat membaca lebih lanjut tentangnya di dokumentasinya.

Siapkan repositori di lokasi yang sewenang-wenang

Skrip di bawah ini membantu Anda mengatur yum untuk mengakses repositori di lokasi yang berubah-ubah. Ia mengharapkan URL repositori untuk diteruskan sebagai argumen baris perintah.

url = sys.argv[1]
yb = enak.Pangkalan Yum()
jika tidak yb.setCacheDir(force=True, reuse=False):
cetak >> sys.stderr, "Tidak dapat membuat tmp. cachedir. "
sistem.keluar(1)
yb.repo.nonaktifkanRepo('*')
yb.add_enable_repo('myrepo', [url])

Untuk menjalankan skrip

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

Ringkasan

Dalam artikel ini kami mempelajari cara mengontrol manajer paket YUM menggunakan python API-nya. Kami melihat opsi konfigurasi serta API kueri/pencarian pada paket yang tersedia dan terinstal dan akhirnya pada cara untuk melakukan operasi manajemen paket seperti menginstal/mencopot/menginstal ulang paket.

Artikel ini dimaksudkan sebagai jendela tentang apa yang mungkin melalui yum python API. Meskipun API tidak didokumentasikan dengan baik, ia mengikuti konvensi standar dan bekerja dengan baik. Berbekal pengetahuan tentang kemampuan YUM dan keterampilan python, sangat menyenangkan untuk menjelajahi dan mempelajari semua yang dapat dilakukannya. Semoga Anda menikmati membaca sejauh ini dan Anda melanjutkan eksplorasi & penerapan yum dalam proyek Anda.

Tutorial OpenTTD
OpenTTD adalah salah satu game simulasi bisnis paling populer di luar sana. Dalam game ini, Anda perlu membuat bisnis transportasi yang luar biasa. Na...
SuperTuxKart untuk Linux
SuperTuxKart adalah judul hebat yang dirancang untuk memberi Anda pengalaman Mario Kart gratis di sistem Linux Anda. Ini cukup menantang dan menyenang...
Pertempuran untuk Tutorial Westnoth
The Battle for Wesnoth adalah salah satu game strategi open source terpopuler yang bisa kamu mainkan saat ini. Tidak hanya game ini telah dikembangkan...