Нм

Взаимодействие с YUM на CentOS с помощта на Python

Взаимодействие с YUM на CentOS с помощта на Python

Какво е YUM?

YUM е инструмент за управление, който се предлага в дистрибуциите RedHat и CentOS Linux.  YUM (Yellowdog Updater Modified) зависи от RPM (Red Hat Package Manager) пакети и е създаден, за да даде възможност за управление на пакети като части от по-голяма система от софтуерни хранилища вместо отделни файлове на пакети. YUM е интерактивен мениджър на пакети, който може автоматично да извършва анализ на зависимостите и системни актуализации, заедно с инсталиране на нови пакети, премахване на стари пакети, извършване на заявки за съществуващи пакети и т.н. За да научите повече за YUM, щракнете тук.

В тази статия ще разгледаме методите за достъп до yum функционалността с помощта на програмите на Python и ще разберем как тя може да бъде полезна. За този урок ще използваме CENTOS 7, работещ с python 2.7.x и би предположил известно запознаване с основните функции на python.

Програмиране с YUM

Нека започнем да учим за програмиране на yum с помощта на python, като разгледаме прост python скрипт, който използва yum за заявки и отпечатване на имена на пакети. Ето го:

внос os
импортиране на sys
внос ням
yb = yum.YumBase ()
yb.setCacheDir ()
резултати = yb.pkg Чанта.returnNewestByNameArch (шаблони = ["python", "perl"])
за pkg в резултатите:
отпечатай "% s% s (% s) \ n \ t% s"% (pkg.име, pkg.версия, pkg.арка, pkg.резюме)

Този скрипт търси в YUM хранилищата за пакети, съответстващи на името “python” и отпечатва информация за съответстващите пакети. Ще разгледаме този скрипт ред по ред.

За да започнем програмирането с YUM, трябва да импортираме Python пакета 'yum' - това е инсталирано по подразбиране в CENTOS 7. Заедно с 'yum' обикновено се нуждаем и от пакетите 'os' и 'sys' - така че типична програма на python, използваща yum, ще започне със следващите 3 реда.

внос os
импортиране на sys
внос ням

След това, за да създадете yum екземпляр, с който да работите, включете долния ред.

yb = yum.YumBase ()

Това е почти първият ред на функционален код във всяка програма на python, използваща yum. Това е така, защото YumBase е основният клас, който съхранява методи и обекти, необходими за изпълнение на всички функции за управление на пакети, използвайки yum. За подробна структура на класа YumBase вижте документацията му.

Проучване на YUM конфигурацията

След като е наличен екземпляр на YumBase, можем да го използваме за проверка на yum конфигурацията. По-долу има таблица с популярни команди за изброяване на подробностите за конфигурацията.

Конфигурация Употреба
печат yb.конф.config_file_path Отпечатайте пътя на файла за конфигурационния файл на yum.
печат yb.конф.регистрационен файл За да разпечатате пътя на регистрационния файл
за i в yb.конф.reposdir: печат i За да разпечатате директориите и файловете за хранилищата
печат yb.конф.skip_broken Стойността обикновено е невярна. Когато е зададено на true, yum командите ще действат така, сякаш е предоставен параметърът -skip-broken.
печат yb.конф.ниво на грешка За да зададете нивото на грешките, които искате да видите отпечатани на стандартния изход. Това е стойност между 0-10, където 0 е само критично, докато 10 е всичко, което включва отстраняване на грешки. По подразбиране е зададено на 2, но можете да го замените. Ако ще работите в скрипт, добре е да зададете това на 0. Можете да зададете това на по-голяма стойност като 3, когато отстранявате грешки в самия скрипт.

Заявки за пакети

Връщайки се към нашия скрипт, виждаме, че следващият ред код създава нова Cache Directory за yum, така че да изпълнява всички задачи като нормален потребител (а също и като root потребител до известна степен - все още няма да може да променя данните в yumdb или rpmdb например).

yb.setCacheDir ()

След като създадохме истински yum обект сега, можем да получим достъп до атрибутите pkgSack, rpmdb и repos. Това ни позволява да изпълняваме следните функции:

yb.pkgSack - може да се използва за извършване на заявки във всички активирани хранилища

yb.rpmdb - може да се използва за извършване на заявки за инсталираните пакети

yb.repos - вземете обект RepositoryStorage, който може да се използва за задаване на специфични конфигурации за репозиториите и може да се използва за активиране или деактивиране на хранилища - e.ж., yb.репо сделки.enableRepo (), yb.репо сделки.disableRepo () & yb.репо сделки.listEnabled (). Повече за това по-късно.

Засега ще се задълбочим в свойствата pkgSack и rpmdb. Можем да търсим YUM хранилищата и съответно локално инсталираните пакети, като извикаме една от няколкото функции, предоставени от атрибутите pkgSack и rpmdb. Тези функции връщат „обект на пакета“, които съдържат информация за пакета. Някои полезни функции за получаване на обектите на пакета са: returnPackages (), searchPrimaryFields (), seachNevra (), seachName (), returnNewestByNameArch (). Нашият скрипт използва метода returnNewstByNameArch, за да получи обектните пакети, съответстващи на низовете на шаблона “python” или “perl”.

Имайте предвид, че имената на методите са еднакви и за двата yb.rpmdb и yb.pkg Чанта. Те обаче изпълняват заявките на различни домейни - rpmdb търси локално инсталираната база данни на RPM пакети, докато pkgSack търси YUM хранилищата.

По подобен начин бихме могли да изброим инсталираните големи пакети (където големи означава, че размерът е> 10MB). Кодът на yum е:

plist = yb.rpmdb.returnPackages ()
l_plist = [p за p в plist, ако p.размер> 1024 * 1024 * 10]
print "Инсталирани пакети с размер> 10MB:"
за p в l_plist:
отпечатай "% s:% sMB"% (pkg, pkg.размер / (1024 * 1024))

Това е основно същността на използването на python за достъп до yum. В останалата част на статията ще се задълбочим в нюансите на приложния програмен интерфейс на модула yum и ще изпробваме някои по-сложни действия като инсталиране / деинсталиране на пакети или настройка на нашето собствено хранилище.

Невра, PRCO и Tuples

В заглавието няма печатна грешка - това са някои специфични за yum термини, които улесняват идентифицирането на пакети и зависимости, както и при комуникацията им с други потребители на yum, включително вашите python скриптове.

NEVRA означава Име, Епоха, Версия, Издание, Архитектура и се използва за уникално идентифициране на вкус или екземпляр на пакет - тези пет параметъра заедно еднозначно сочат към един уникален екземпляр на пакета. Например, пакет, наречен "python", може да има множество версии като 2.6, 2.7 и т.н., и всяка версия може да има множество версии за различни архитектури e.ж., x86_64, i386 (Имайте предвид, че думата архитектура тук се отнася до архитектурата на процесора - напр.ж., i386 е 32-битов Intel). Заедно тези пет представляват уникална комбинация и се наричат ​​невра.

PRCO означава Предоставя / Изисква / Конфликти / Остаряла, които обобщават метаданните за управление на пакета за обекта на пакета.

Някои API методи в pkgSack / rpmdb, като yb.pkg Чанта.simplePkgList (), yb.pkg Чанта.пакетиByTuple () и т.н., връща информация за NEVRA или PRCO като python кортежи, а не pkgobjects

Избройте и инсталирайте пакети

Подобно на използването на команда „yum list“, можем да използваме „yb.doPackageLists () 'за изброяване на всички инсталирани пакети / пакети, налични за инсталиране / преинсталиране.

plist = yb.doPackageLists (модели = sys.argv [1:])

Сега plist съдържа 3 списъка с пакети - по един за инсталиран пакет, инсталируем пакет и налични за преинсталиране. Можем да отпечатваме / инсталираме / преинсталираме пакети, като използваме кода по-долу:

ако мн.инсталиран:
print "Инсталирани пакети"
за pkg в сортирано (мн.инсталиран):
печат pkg
ако мн.на разположение:
печат "Налични пакети"
за pkg в сортирано (мн.на разположение):
печат pkg, pkg.репо
ако мн.преинсталиране_достъпно:
print "Преинсталирайте наличните пакети"
за pkg в сортирано (мн.преинсталиране_достъпно):
печат pkg, pkg.репо

По същия начин, за да изброим всички инсталирани пакети, които можем да използваме:

отпечатайте „\ n“.присъединяване ([x.име за x в yb.rpmdb.returnPackages ()])

Инсталиране на пакети

Инсталирането на пакети включва настройка и изпълнение на транзакция. За да извършим прости действия като инсталиране / премахване, използваме 'yb.инсталирайте 'или' yb.премахнете 'съответно, за да настроите транзакцията. След това извикваме 'yb.resolDeps () 'за задействане на разрешаването на зависимости и' yb.processTransaction () ', за да инструктирате YUM да продължи и да изпълни транзакцията.

Всички стъпки, но последната, са подготвителни и само извикването на метода processTransaction () всъщност води до инсталация / деинсталация. По-долу е кодов фрагмент за инсталиране на пакети.

yb = yum.YumBase ()
yb.инсталиране (name = 'packagename')
yb.resolDeps ()
yb.processTransaction ()

Докато извършва такива транзакции, „yb.Обектът tsInfo 'съдържа информацията за текущото състояние на транзакцията, докато тя не бъде ангажирана. Можете да прочетете повече за него в неговата документация.

Настройте хранилище на произволно място

По-долу скриптът ви помага да настроите yum за достъп до хранилище на произволно място. Той очаква URL адресът на хранилището да бъде предаден като аргумент на командния ред.

url = sys.argv [1]
yb = yum.YumBase ()
ако не yb.setCacheDir (сила = True, повторна употреба = False):
print >> sys.stderr, "Не мога да създам tmp. cachedir. "
sys.изход (1)
yb.репо сделки.disableRepo ('*')
yb.add_enable_repo ('myrepo', [url])

За да стартирате скрипта

python скрипт.py url: // към / my / repo

Обобщение

В тази статия научихме как да контролираме YUM мениджъра на пакети, използвайки своя python API. Разгледахме опциите за конфигуриране, както и API за заявки / търсене в наличните и инсталирани пакети и накрая на начини за извършване на операции за управление на пакети като инсталиране / деинсталиране / преинсталиране на пакети.

Тази статия е предназначена да служи като прозорец към това, което е възможно чрез API на yum python. Въпреки че API не е много добре документиран, той следва стандартните конвенции и работи предсказуемо. Въоръжен със знанието за възможностите на YUM и уменията на питон, забавно е да изследвате и да научите всичко, което може да направи. Надявам се да ви е харесало да четете досега и да продължите с проучването и прилагането на yum във вашите проекти.

Полезни инструменти за геймърите на Linux
Ако искате да играете игри на Linux, има вероятност да сте използвали приложения и помощни програми като Wine, Lutris и OBS Studio, за да подобрите иг...
HD Remastered Games за Linux, които никога преди не са имали издание на Linux
Много разработчици и издатели на игри излизат с HD ремастер на стари игри, за да удължат живота на франчайза, моля феновете, които искат съвместимост ...
Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...