Почему создание собственного RPM-пакета nginx/ModSecurity приведет к нарушению зависимостей Perl?
Я хочу предоставить пользовательский RPM-пакет nginx/ModSecurity/ сторонних модулей, который можно установить на внутренние серверы (без интернета) через собственный RPM-репозиторий.
Для этого я создал файл спецификации RPM (ниже приведены фрагменты исходной спецификации):
Name: nginx
Version: 1.14.0
Release: 1
Group: System Environment/Daemons
License: BSD
URL: http://nginx.net/
Source0: http://nginx.org/download/nginx-%{version}.tar.gz
BuildRequires: pcre-devel
BuildRequires: openssl-devel
BuildRequires: zlib-devel
BuildRequires: libxslt-devel
BuildRequires: gd-devel
BuildRequires: GeoIP-devel
BuildRequires: pam-devel
BuildRequires: libmodsecurity-devel
Requires: pcre
Requires: openssl
Requires: zlib
Requires: libxslt
Requires: gd
Requires: GeoIP
Requires: pam
Requires: libmodsecurity
Полная спецификация RPM с дополнительными файлами rpmbuild доступна здесь: https://gist.github.com/soerenkornetzki/3731113644ab1084ed9549795b5987d6
Проблема в том, что когда я пытаюсь установить RPM, я сталкиваюсь с ошибками сломанной зависимости:
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
Requires: perl(Data::Types)
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
Requires: /opt/local/bin/perl
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
Requires: perl(Acme::Comment)
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
Requires: perl(Data::Validate::URI)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
Я знаю, что nginx имеет модуль Perl, но я не включаю его в аргументы компиляции (см. Полную спецификацию с Gist).
У меня нет требуемых (любых) модулей Perl с BuildRequires
или же Requires
,
Я ожидаю, что ни один из сторонних модулей также не использует Perl. Это может быть ложным предположением, но я не проверял это, так как необходимые модули не установлены в системе сборки, и двоичный файл работает на ней (не требуется установка RPM, просто выполняется двоичный файл nginx).
Обороты для CentOS 7, который не поставляется с perl-Data-Types
(назвать один пример). Был perl-Data-Types
со старой CentOS 6 (EPEL), но она больше недоступна для CentOS 7 и выше (как показано на rpmfind.net).
Поскольку бинарный файл nginx работает просто отлично, и только установщик RPM отклоняет установку:
Как это исправить? Откуда пришли требуемые пакеты?
1 ответ
rpmbuild просматривает файлы в%files и, если есть, содержит use Data::Types
тогда rpmbuild автоматически добавит Requires: perl(Data::Types)
Извлеките свой rpm-файл:
rpmdev-extract nginx.rpm
И посмотрите на загрузку этого модуля:
grep -r 'Data::Types' .
Я думаю, что будет какой-то файл с этой строкой.
Точнее, rpmbuild
смотрит на shebangs (например, #!/usr/bin/perl
), и если он обнаружит то, что выглядит как сценарий Perl, и если ваша система сборки поставляется сperl-generators
, тогда он автоматически сгенерирует Requires
а также Provides
для файлов Perl, установленных вашим пакетом.
Например, если ваш пакет устанавливает файл Perl с такими операторами, как use Data::Validate::URI
, вы в конечном итоге Requires: perl(Data::Validate::URI)
в вашем файле RPM.
Упаковать отсутствующие модули Perl легко с помощью cpanspec
полезность.
Помимо этого ваш Requires: libmodsecurity
неверно - вы должны позволить RPM найти правильную зависимость библиотеки вместо того, чтобы "фиксировать" ее.
Для получения обновленного модуля ModSecurity nginx, а также зависимостей библиотек и модулей Perl обратитесь к этому репозиторию (например, не нужно ничего упаковывать, это уже было сделано).