Files
ngx_http_apache_rewrite_module/extract_nginx_args.py
2026-06-23 00:12:18 +03:00

149 lines
5.5 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Extract nginx configure arguments from `nginx -V` output.
Correctly handles quoted arguments with balanced single quotes.
Returns the parsed command line for use in package_preparer.sh.
"""
import subprocess
import sys
def parse_args(text):
"""
Разбить строку аргументов на список, корректно обрабатывая одинарные кавычки.
Пример:
--with-cc-opt='-O2 -g' --with-ld-opt='...'
должно разобиться на два элемента, а не на несколько битых строк.
"""
args = []
current = ""
in_single_quotes = False
for char in text:
if char == "'":
# Переходим в режим одинарных кавычек или выходим из него,
# и добавляем кавычку в текущий аргумент
in_single_quotes = not in_single_quotes
current += char
continue
if char == " " and not in_single_quotes:
# Пробел вне кавычек - конец аргумента
if current.strip():
args.append(current.strip())
current = ""
else:
# Добавляем символ в текущий аргумент
current += char
# Последний аргумент, если остался
if current.strip():
args.append(current.strip())
return args
def main(nginx_src_dir="."):
"""
Запустить nginx -V и извлечь аргументы конфигурации.
Args:
nginx_src_dir: каталог с исходниками nginx (обычно ./nginx-VER)
Returns:
0 на успех, 1 на ошибку. Вывод аргументов в stderr для использования bash скриптом.
"""
# Запускаем nginx -V через PATH, вывод идёт в stderr!
print(f"Running nginx -V...", file=sys.stderr)
try:
result = subprocess.run(["nginx", "-V"], capture_output=True, text=True)
except FileNotFoundError as e:
print(f"Error: Could not find 'nginx' in PATH: {e}", file=sys.stderr)
print("Make sure nginx is installed and added to PATH.", file=sys.stderr)
return 1
# Используем stderr вместо stdout!
output = result.stderr
if not output:
print(
f"Error: empty output from nginx -V. Return code: {result.returncode}",
file=sys.stderr,
)
return 1
# Ищем строку с configure arguments
for line in output.split("\n"):
if "configure arguments:" in line:
# Извлекаем всё после "configure arguments:"
config_line = line.split("configure arguments:", 1)[1]
# Парсим аргументы с учётом кавычек
args_list = parse_args(config_line)
print(f"Found configure arguments.", file=sys.stderr)
print(f"Parsed {len(args_list)} arguments.", file=sys.stderr)
for arg in args_list:
print(arg, file=sys.stderr)
# Удаляем параметры --add-dynamic-module, --with-ld-opt и все --with-*module
args_to_remove = ["--add-dynamic-module", "--with-ld-opt"]
filtered_args = []
for arg in args_list:
should_skip = False
for remove_arg in args_to_remove:
if arg.startswith(remove_arg):
should_skip = True
break
# Проверка на паттерн --with-*module
if not should_skip and arg.startswith("--with-"):
suffix = arg[7:] # Убираем "--with-"
if any(suffix.endswith(m) for m in ["module", "=dynamic"]):
should_skip = True
if not should_skip:
filtered_args.append(arg)
args_list = filtered_args
# Добавляем наш модуль в конец
args_list.append("--add-dynamic-module=../modules/mod_rewrite")
print(f"Added --add-dynamic-module=../modules/mod_rewrite", file=sys.stderr)
# Формируем команду configure и выводим в stderr
cmd_line = "./configure " + " ".join(args_list)
print("=== GENERATED CONFIGURE COMMAND ===", file=sys.stderr)
print(cmd_line, file=sys.stdout)
# Execute the generated configure command
result = subprocess.run(
cmd_line, shell=True, capture_output=True, text=True
)
# Print stdout and stderr of the configure command
if result.stdout:
print(result.stdout, file=sys.stdout)
if result.stderr:
print(result.stderr, file=sys.stderr)
if result.returncode != 0:
print(
f"Error: configure command failed with return code {result.returncode}",
file=sys.stderr,
)
return 1
return 0
print("Error: configure arguments line not found in nginx output", file=sys.stderr)
return 1
if __name__ == "__main__":
nginx_src_dir = "."
if len(sys.argv) > 1:
nginx_src_dir = sys.argv[1]
exit_code = main(nginx_src_dir)
sys.exit(exit_code)