Преобразование пакетов RPM для Debian не выполняется «из-за метасимволов оболочки»

Я пытаюсь преобразовать RPM-пакеты MegaRAID Storage Manager в пакеты debian dep. Для этого я использую пакет Alien, как описано здесь:

https://hosting-tutorials.co.uk/tutorials/linux/installing-megaraid-storage-manager-on-debian

Это пакет, который я пытаюсь преобразовать:https://docs.broadcom.com/docs-and-downloads/17.05.06.00_MSM_Linux-x64.zip

Пакет «lib-utils2_1.00-12_all» нормально преобразуется в .deb, но «MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm» — нет:

      # alien --scripts *.rpm
lib-utils2_1.00-12_all.deb generated

Package build failed. Here's the log:
dh binary
   dh_update_autotools_config
   dh_autoreconf
   create-stamp debian/debhelper-build-stamp
   dh_testroot
   dh_prep
   debian/rules override_dh_auto_install
make[1]: Entering directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
mkdir -p debian/megaraid-storage-manager
# Copy the packages's files.
find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \
        sed -e s#'./'##g | \
        xargs -0 -r -i cp -a ./{} debian/megaraid-storage-manager/{}
make[1]: Leaving directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
   dh_installdocs
   dh_installchangelogs
   dh_perl
   dh_usrlocal
dh_usrlocal: error: Cannot generate a correct shell script for /usr/local/MegaRAID Storage Manager due to shell metacharacters
make: *** [debian/rules:7: binary] Error 25

Я не знаю, как исправить ошибку «Невозможно создать правильный сценарий оболочки для /usr/local/MegaRAIDStorageManager из-за метасимволов оболочки», и буду признателен за любую помощь.

Я пробовал хосты Debian 10 и Debian 11, все Arch amd64 и запущенную оболочку «bash». Я также попробовал оболочку «sh».

2 ответа

TL;DR: пробелы и другие метасимволы не поддерживаются для каталогов, которые будут находиться в файлах .

содержит пробелы. Очевидно, что этот пакет не соответствует передовой практике в мире *nix (вина в этом LSI/Broadcom).

Вместо этого вы можете конвертировать чужеродный файл в tar или извлечь его напрямую, используяrpm2cpio, выяснить, как используются и подходят сценарии установки, чтобы увидеть, как их повторно использовать, при необходимости посмотреть, можно ли переименовать каталог с пробелами, если любую ссылку на него также можно легко заменить, и напрямую собрать двоичный пакет, используяdpkg-deb -bкоторый не будет затронут такой проблемой, но создаст пакет, не соответствующий политике Debian.

пояснения ниже...


Политика Debian требует, чтобы пакет не устанавливал ничего, кроме некоторых каталогов, косвенным методом:

9.1.2. Программы для конкретного сайта

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

Однако пакет может создавать пустые каталоги ниже , чтобы системный администратор знал, где размещать файлы, специфичные для сайта. Это не каталоги в , а дочерние каталоги в . Эти каталоги (/usr/local/*/dir/) следует удалять при удалении пакета, если они пусты.

Обратите внимание, что это относится только к каталогам ниже , а не к каталогам .

[...]

Таким образом, этот пакет в любом случае не может быть совместимым, например файл/usr/local/MegaRAID Storage Manager/startmonitorhelp.shне соответствует требованиям: это файл, упакованный где-то в/usr/local.

alienиспользуетпомощник сборки для автоматического преобразования (по-прежнему совместимых) каталогов для добавления в сценарии сопровождающего (т. е. в Debianpreinst,postinstи т. д. скрипты, которые заархивированы отдельно в архиве .deb ar и будут храниться в/var/lib/dpkg/info/позже), который затем выполнит несколькоmkdirкоманды при установке:

dh_usrlocal— это программа debhelper, которую можно использовать для сборки пакетов, которые при установке предоставляют подкаталог в /usr/local .

Он находит подкаталоги usr/local в каталоге сборки пакета и удаляет их, заменяя фрагментами сценариев сопровождающего (если только-nиспользуется) для создания каталогов во время установки и удаления их при удалении пакета в соответствии с политикой Debian. Эти фрагменты вставляются в сценарии сопровождающегоdh_installdeb.

Содержание/usr/bin/dh_usrlocalPerl-скрипт включает в себя:

                 # Detect some obvious cases of "this will not end
          # well".  We rely on what "while read dir ... ; do"
          # can handle for correctness.
          if ($fn =~ m{[\s!'"\$()*#;<>?@\[\]\\`|]}) {
                  error("Cannot generate a correct shell script for $fn due to shell metacharacters");
          }

\sэто означает, что любой пробел в PCRE является частью запрещенных метасимволов и вызывает ошибку при синтаксическом анализе./usr/local/MegaRAID Storage Manager.

Потратив слишком много времени на попытки обойти вышеуказанные проблемы, понял, что существует

rpmпакет, который можно установить

Потом просто побежал:
rpm -i MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm --nodeps
/etc/init.d/vivaldiframeworkd start

Вроде работает, в системном журнале появилось как минимум два сообщения:

      Jan 10 21:03:21 Xba MR_MONITOR[214454]: <MRMON044> Controller ID:  0   Time established since power on:   Time   2023-01-08, 05:11:32      33  Seconds
Jan 10 21:03:51 Xba MR_MONITOR[214454]: <MRMON044> Controller ID:  0   Time established since power on:   Time   2023-01-10, 21:03:51      255169  Seconds

Теперь нужно установить xterm и xpra, чтобы я мог попробовать запуститьsu -c /usr/local/MegaRAID Storage Manager/startupui.sh... вы все тоже так делаете?

Ну, я не смог запустить его с последней установленной версией Java 17, поэтому я установил Java 11 и добился немного большего успеха... Вам нужно добавить следующее в:

      JRE_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
export JRE_HOME

Окно MSM откроется, но сеанс X завершится, как только я войду в систему... это могут быть проблемы с моей стороны с моими библиотеками GTK или что-то в этом роде. Я постараюсь получить больше журналов позже. Я также попробовал использовать старую версию Java 8 от Adoptium. В этом случае я использовал:

      JRE_HOME="/usr/lib/jvm/jdk8u352-b08-jre"
export JRE_HOME

но это не помогло. Теперь, когда я бегуstartupui.shЯ просто вижу черное окно, попробовал перезапустить платформу Vivaldi (на самом деле это требуется каждый раз, когда вы меняете версию Java, поскольку она использует/etc/init.d/msm_profileдля запуска).

Надеюсь, вам повезет больше, чем мне, дайте нам знать, как все прошло!

Другие вопросы по тегам