Почему создание собственного RPM-пакета nginx / ModSecurity приведет к нарушению зависимостей Perl? - PullRequest
0 голосов
/ 15 мая 2018

Я хочу предоставить пользовательский 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 отклоняет установку:

Как это исправить? Откуда пришли требуемые пакеты?

Ответы [ 2 ]

0 голосов
/ 05 августа 2019

Если быть точным, rpmbuild смотрит на шебанги (например, #!/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 найти правильную зависимость от библиотеки, а не «жестко записывать» ее.

Дляdate Модуль ModSecurity nginx, а также библиотечные зависимости и модули Perl, ссылаются на этот репозиторий (как в: не нужно ничего упаковывать, уже сделано).

0 голосов
/ 17 мая 2018

rpmbuild просматривает файлы в% файлах, и если любой из них содержит use Data::Types, то rpmbuild автоматически добавит Requires: perl(Data::Types)

Извлеките ваш RPM-файл:

rpmdev-extract nginx.rpm

И найдите этот модульload:

grep -r 'Data::Types' .

Я думаю, что будет какой-то файл с этой строкой.

...