Mint-реализация утилиты apt: добавление собственного функционала

Алексей Федорчук

Как неоднократно говорилось на этих страницах, утилита apt проекта Mint объединяет в себе большую часть функционала таких средств манипулирования пакетами, как dpkg, apt-get, apt-cache и aptitude. Что и не удивительно, ибо она является интерирующей оболочкой, написанной на Python’е, из которой эти средства вызываются явным образом для выполнения тех или иных операций. Причём в рамках её окучена большая часть функций, требующихся широким массам применителей в их повседневной жизни.

Однако — не все. Мне, например, не хватает простого способа получения списка пакетов, в том числе разного статуса. Подобного тому, что можно получить субкомандой list общедебиановской утилиты /usr/bin/apt, данной в формах:

$ apt list

которая выводит список пакетов актуальных версий, имеющихся в подключённых репозиториях,

$ /usr/bin/apt list --all-versions

дающая аналогичный список, но для всех версий,

$ /usr/bin/apt list --installed

выводящая список инсталлированных пакетов, из которого с помощью конструкции

$ /usr/bin/apt list --installed | grep automatic

легко получить список пакетов, автоматически установленных. И очень не помешал бы способ маркирования последних, грутом или избирательно, как установленных вручную. А иногда — и выполнение обратной процедуры. Что можно сделать с помощью aptitude в командном режиме — на что в ней есть субкоманды markauto и nomarkauto. А ныне и в пакете APT есть утилила apt-mark, позволяющая выполнить те же (и некоторые другие) действия, однако…

…однако получается, что для выполнения нескольких повседневных действий с пакетами требуется использовать сопоставимое число утилит, каждая из которых имеет собственный формат команд, свои, хоть и похожие, внутренние команды и опции. А потому идея, изначально заложенная в apt для Mint’а, представляется очень здоровой. И хотчется довести её до логического завершения, дополнив некоторыми востребованными функциями.

Благо, поскольку, как уже было сказано, apt для Mint’а — это интерпретируемый сценарий на Pyton’е, сделать это не так трудно, даже не обладая программистским гением Ричи и Кернигана. Достаточно просто подключить в этот сценарий вызовы необходимых утилит из числа перечисленных, снабдив их опциями, необходимыми для выполнения недостающих действий. Чем и занялся на досуге автор этих строк.

Итак, для начала копирую оригинальный исполняемый файл для «отката»:

$ sudo cp -p /usr/local/bin/apt /usr/local/bin/apt.orig

А затем от лица администратора открываю «первоисточник» в текстовом редакторе, конкретнов Gedit’е. Не из любви к нему, а чтобы не мешались под руками многочисленные тексты, открытые в других редакторах. Собственно, редактор может быть любым, хоть nano, лишь бы поддерживалась подсветка синтаксиса Python’а, без этого легко допустить банальную ошибку, типа незакрытых кавычек.

Для обеспечения вывода списков пакетов репозиториев, пакетов инсталлированных и пакетов, доступных для обновления, вношу в него такие строки:

elif argcommand in ["list"]:
	aptcommand = "/usr/bin/apt"
	command = aptcommand + " " + argcommand + argoptions
elif argcommand in ["list-inst"]:
	aptcommand = "/usr/bin/apt"
	command = aptcommand + " list --installed"
elif argcommand in ["list-up"]:
	aptcommand = "/usr/bin/apt"
	command = aptcommand + " list --upgradable"

За вывод списков зафиксированных пакетов, пакетов, установленных автоматически или вручную, будут отвечать такие строки:

elif argcommand in ["showhold", "showauto", "showmanual"]:
	aptcommand = "apt-mark"
	command = aptcommand + " " + argcommand + argoptions

Фиксация и «раcфиксация» версий пакетов и изменение их статуса между «автоматическим» и «ручным» будут возможны благодаря таким строкам:

elif argcommand in ["auto", "manual", "hold", "unhold"]:
	aptcommand = "apt-mark"
	command = sudo + " " + aptcommand + " " + argcommand + argoptions

Некоторые из добавленных субкоманд (например, hold/unhold) совпадают с уже имевшимися, или имели аналоги с другим именем (например, субкоманда held делала то же самое, что и моя showhold). Такие «дубликаты» я, разумеется, удалял.

Далее, убедившись в работоспособности как новых субкоманд, так и тех, которые остались от исходной версии, я внёс изменения в блок def usage():, отвечающий за вывод экранной посказки по субкоманде help (или просто при вводе «голой» команды apt), удалив дубли и добавив такие строки (как это принято в оригинале, в алфавитном порядке):

	print "auto	   	- Mark packages as having been automatically installed"
…
  	print "hold		- Hold a package"
…
        print "list		- List packages based on package names"
	print "list-inst	- List of installed packages"
	print "list-up		- List of upgradable packages"
	print "manual   	- Mark packages as having been manually installed"
…
	print "showauto     	- Print the list of automatically installed packages"
	print "showhold     	- Print the list of package on hold"
	print "showmanual     	- Print the list of manually installed packages"
…
	print "unhold		- Unhold a package"
…

После этого остаётся только запомнить самопризобретёные имена новых субкоманд (а ещё лучше — придумать для них глобальные псевдонимы в конфиге Zsh) и выполнять все повседневные манипуляции с файлами посредством команды apt, не задумываясь о том, какую из многочисленных утилит надо использовать в каждом случае, и каким именно образом.

Предварительное оглавление

Mint-реализация утилиты apt: добавление собственного функционала: 1 комментарий

  1. Получилось, только как оказалось комментировать строки кириллицей, типа:
    # Добавлена строка
    нельзя (можно „# Added line“).
    Хорошая штука.

Добавить комментарий