Извлечение сценариев оболочки из файла спецификации RPM для статического анализа

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

%setup -q
cat > ./example.sh << EOF
#!/bin/sh
echo "example"
EOF

Как и крючки,

%post
#!/bin/sh
echo "Hello"

Есть ли какой-нибудь способ программно извлечь эти фрагменты оболочки для запуска инструмента анализа скриптов, такого как ShellCheck? Как может быть rpmbuild --save-temps или какая-то концепция, как это? Или каждый скрипт должен быть связан известным текстом, чтобы я мог использовать инструмент потока (grep, awk, sed, так далее.)?

У меня есть большое количество spec-файлов, которые я бы предпочел не изменять. Например, чтобы проверить скрипты на предмет безопасности и т. Д., Не анализируя файл спецификации. В поисках bison + spec дает неверную концепцию, и я думаю, что вам нужно проанализировать макросы RPM и многие другие механизмы; а может грамматика проще чем я думаю?

1 ответ

Я думал о том, чтобы сделать это для некоторых из моих RPM также недавно.

Вы можете получить %prep, '%build', %installи т. д. разделы с python из самого spec-файла.

Код CentOS 5:

import rpm

ts = rpm.ts()

spec = ts.parseSpec("package.spec")

for section in ['build', 'clean', 'install', 'prep']:
    try:
        print '%s' % (getattr(s, section,)())
    except:
        pass

Код CentOS 6:

import rpm

spec = rpm.spec('package.spec')

for section in ['build', 'clean', 'install', 'prep']:
    if hasattr(spec, section):
        print '%s' % (getattr(spec, section),)

Кажется, нет способа (в CentOS 5 или 6) получить содержимое pre/post/etc. Скриплеты через Python, хотя.

Так что вам, вероятно, нужно просто вытащить их из встроенного RPM с rpm -qp --scripts а затем разбить этот вывод на временные файлы и запустить на них shellcheck.

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