Извлечение сценариев оболочки из файла спецификации 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.