#!/bin/sh # Пути по умолчанию DEFAULT_CFGPATH="/etc/pfsdn.json" DEFAULT_LIBRARY="/var/lib/pfsdn" DEFAULT_REPO_URL="https://repo.kirillius.ru/apps/pf/" # Функция для извлечения значений из аргументов get_arg_value() { local arg_name="$1" local default_value="$2" local value="$default_value" # Ищем аргумент в формате -arg=value или --arg=value for arg in "${@:3}"; do case "$arg" in -$arg_name=*|--$arg_name=*) value="${arg#*=}" break ;; esac done echo "$value" } # Получаем пути из аргументов или используем значения по умолчанию CFGPATH=$(get_arg_value "c" "$DEFAULT_CFGPATH" "$@") LIBRARY=$(get_arg_value "l" "$DEFAULT_LIBRARY" "$@") REPO_URL=$(get_arg_value "r" "$DEFAULT_REPO_URL" "$@") # Выводим рабочие каталоги echo "Config path: $CFGPATH" echo "Library path: $LIBRARY" echo "Repository URL: $REPO_URL" # Проверяем наличие Java в системе и версию if ! command -v java >/dev/null 2>&1; then echo "Java not found. Please install java, openjdk or JRE" >&2 exit 1 fi # Проверяем версию Java (должна быть >= 21) check_java_version() { local java_version java_version=$(java -version 2>&1 | head -n 1 | sed 's/.*"\([0-9]*\)\.[0-9]*\.[0-9]*".*/\1/') if [ -z "$java_version" ] || [ "$java_version" -lt 21 ]; then echo "Java version 21 or higher is required. Found version: $java_version" >&2 return 1 fi echo "Java version check passed: $java_version" return 0 } if ! check_java_version; then exit 1 fi # Проверяем и создаем директорию LIBRARY если не существует if [ ! -d "$LIBRARY" ]; then echo "Library directory not found: $LIBRARY" echo "Creating directory: $LIBRARY" if ! mkdir -p "$LIBRARY"; then echo "Failed to create library directory: $LIBRARY" >&2 exit 1 fi echo "Directory created successfully" fi # Функция для поиска последней версии в директории find_local_version() { find "$LIBRARY" -maxdepth 1 -name "*.pfapp" -type f | grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.pfapp' | sort -V | tail -n 1 } # Функция для скачивания версии с веб-страницы download_latest_version() { local repo_url="$REPO_URL" echo "Searching for latest version on $repo_url..." # Получаем HTML страницу и извлекаем ссылки на .pfapp файлы local latest_file=$(curl -s "$repo_url" | grep -oE 'href="[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.pfapp"' | sed 's/href="//g' | sed 's/"//g' | sort -V | tail -n 1) if [ -z "$latest_file" ]; then echo "No .pfapp files found on the repository" >&2 return 1 fi local download_url="${repo_url}${latest_file}" local local_path="$LIBRARY/$latest_file" echo "Downloading version: $latest_file" echo "From: $download_url" echo "To: $local_path" # Скачиваем файл if curl -s -o "$local_path" "$download_url"; then echo "Successfully downloaded $latest_file" # Возвращаем ТОЛЬКО путь к файлу, без дополнительных сообщений echo "$local_path" else echo "Failed to download $latest_file" >&2 return 1 fi } cleanup() { echo "Received signal, stopping child process..." kill $CPID 2>/dev/null wait $CPID 2>/dev/null exit 0 } trap cleanup TERM INT while true; do # Находим последнюю версию файла VER_FILE=$(find_local_version) # Если не нашли файлы локально, скачиваем с веб-страницы if [ -z "$VER_FILE" ]; then echo "No local .pfapp files found, downloading from repository..." # Сохраняем вывод функции в временную переменную, чтобы показать сообщения DOWNLOAD_OUTPUT=$(download_latest_version) if [ $? -ne 0 ]; then echo "Failed to download application file" >&2 exit 1 fi # Извлекаем последнюю строку (путь к файлу) из вывода VER_FILE=$(echo "$DOWNLOAD_OUTPUT" | tail -n 1) # Выводим все сообщения кроме последней строки echo "$DOWNLOAD_OUTPUT" | head -n -1 else # Выводим информацию о найденной локальной версии VER=$(basename "$VER_FILE") VER="${VER%.pfapp}" echo "Using local version: $VER" fi # Извлекаем только имя файла (без пути) VER=$(basename "$VER_FILE") # Убираем расширение .pfapp чтобы получить чистую версию VER="${VER%.pfapp}" # Выводим финальную информацию о версии echo "Starting application version: $VER" # Функция для запуска Java run_java() { java -Xmx256m -jar "$LIBRARY/$VER.pfapp" -c="$CFGPATH" -l="$LIBRARY" -r="$REPO_URL" & CPID=$! wait $CPID } # Запускаем Java с возможностью перезапуска при коде возврата 42 run_java EXIT_CODE=$? if [ $EXIT_CODE -eq 42 ]; then echo "Restarting application (exit code 42)..." continue else exit $EXIT_CODE fi done