Алексей Федорчук
Как неоднократно говорилось на этих страницах, утилита 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: добавление собственного функционала”»
Получилось, только как оказалось комментировать строки кириллицей, типа:
# Добавлена строка
нельзя (можно „# Added line“).
Хорошая штука.