LINUX.ORG.RU

Пропатчить конфиг перед его установкой в систему

 ,


2

2

Всем привет

Давно лелеял эту идею, пора воплощать...

Gentoo, работа с конфигами при обновлении пакета, как я ее понимаю:
1. Скачиваются файлы пакета; проверки, распаковки, компиляция...
2. Установка в песочницу
3. На каком-то этапе формируется файл конфигурации (кстати, точное определение еще нужно дать - см. вопрос 2).
4. Догадываюсь, что на этом этапе куда-то записывается «образ» конфига (наверное это хеш или что-то еще - см. вопрос 3), чтобы в следующий раз можно было сделать проверку модифицирован ли файл пользователем (см. шаг 5).
5. Проверяется (каким-то образом) модифицирован существующий (уже установленный) файл конфига пользователем.
6. Если существующий файл не был модифицирован, то emerge заменит существующий файл новым (из песочницы).
7. Если существующий файл таки был модифицирован пользователем, то новый конфиг будет установлен как ._cfg0001_xxxxxxx.

Проблема: любая модификация конфигов пользователем приводит к размножению ._cfg* файлов при апдейте пакетов.

Задача: патчить конфиг перед его установкой.

Вопросы:
1. Как выполнить скрипт сразу после шага 3 и желательно без модификации ebuild'ов? (Именно скрипт, так как простой patch в общем случае здесь не подходит)
2. Догадываюсь, что описанный механизм работы с конфигами работает не со всеми файлами. Например, если модифицирую /bin/mount, оно ж мне не создаст при обновлении ._cfg0001_mount? Где/как определяется что есть конфиг?
3. Расскажите, всё-таки, как происходит проверка конфигов? Где и на каком этапе записывается образ/хеш для сравнения?
4. На что еще имеет смысл обратить внимание для выполнения поставленной задачи?

Спасибо

Cast Pinkbyte

★★★★★

Ну для начала на часть вопросов ответит вот эта статья: https://devmanual.gentoo.org/general-concepts/config-protect/index.html

тл;др - есть набор директорий, которые emerge запрещает перезаписывать при обновлении, в таких директориях как раз плодятся ._cfg0001_xxxx

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

то есть в общем случае если хотите иметь свой конфиг в процессе сборки - создавайте локальный оверлей, подменяйте исходный конфиг своим.

l0stparadise ★★★★★
()

/var/db/pkg - здесь лежит информация о установленых пакетах, в том числе и список файлов с их чексумами (включая конфиги).

Для обновления конфигов после апдейта системы есть тулзы etc-update dispatch-conf

zaz ★★★★
()

1. Как выполнить скрипт сразу после шага 3 и желательно без модификации ebuild'ов?

/etc/portage/env + post_src_install()

viewizard ★★
()
Ответ на: комментарий от l0stparadise

Ну для начала на часть вопросов ответит вот эта статья: https://devmanual.gentoo.org/general-concepts/config-protect/index.html

Отвечает на вопрос 2.

то есть в общем случае если хотите иметь свой конфиг в процессе сборки - создавайте локальный оверлей, подменяйте исходный конфиг своим.

И тогда апдейт системы превратится в ад, так как для каждой новой версии пакетов нужно будет создавать близнеца в локальном оверлее.

Нет, хочется надеяться что есть какая-то система аналогичная /etc/portage/patches.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от zaz

/var/db/pkg - здесь лежит информация о установленых пакетах, в том числе и список файлов с их чексумами (включая конфиги).

Да, забюл про него. Скорее всего.

Для обновления конфигов после апдейта системы есть тулзы etc-update dispatch-conf

Это не то.
Я хочу чтобы в /var/db/pkg конфиг попадал после того как я его пропатчу скриптом. Тогда и ._cfg* файлов не будет.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от viewizard

/etc/portage/env + post_src_install()

Каким образом мне поможет /etc/portage/env ? Это ж аналог make.conf, то есть то, что выполняется еще до того как пакет начал скачиваться (до шага 1 в алгоритме выше).

post_src_install()

Имеется ввиду модификация ebuild'ов? Как раз от этого хочу уйти.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Попробуйте добавить hook и в нем пропатчить конфиг

# echo 'echo "!!!!!!! In bash RC with [${EBUILD_PHASE}] !!!!!!!!!!!"' >> /etc/portage/bashrc

zaz ★★★★
()

Как уже сказали, используй хуки.

Paludis это позволяет делать довольно просто, насчёт Portage не знаю.

anonymous
()
Ответ на: комментарий от Kroz

Хорошо, например, я не хочу, чтобы ярлык офиса отсвечивался в меню Education. Есть 3 варианта - изменить ebuild офиса, внести изменения патчем в скрипт установки офиса или создать файл /etc/portage/env/app-office/libreoffice, который выполнит баш скрипт в нужное мне время:

post_src_install() {

sed -i -e 's/Education;//' "${ED}"/usr/lib64/libreoffice/share/xdg/math.desktop || die

} 

Вы можете через /etc/portage/env взаимодействовать с ebuild'ом без его модификации, задавая/меняя(перекрывая) необходимые функции ebuild'а, а не только переменные среды. В частности, функция post_src_install() будет выполнена после src_install() (шаг 3 в вашем алгоритме).

viewizard ★★
()
Ответ на: комментарий от Kroz

zaz viewizard
Спасибо

Релизовал через хук post_src_install() в файле /etc/portage/env/category/package .

Kroz ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.