155 lines
5.3 KiB
Bash
155 lines
5.3 KiB
Bash
#!/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
|
||
}
|
||
|
||
# Находим последнюю версию файла
|
||
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 -jar "$LIBRARY/$VER.pfapp" -c="$CFGPATH" -l="$LIBRARY" -r="$REPO_URL"
|
||
}
|
||
|
||
# Запускаем Java с возможностью перезапуска при коде возврата 303
|
||
while true; do
|
||
run_java
|
||
EXIT_CODE=$?
|
||
|
||
if [ $EXIT_CODE -eq 303 ]; then
|
||
echo "Restarting application (exit code 303)..."
|
||
continue
|
||
else
|
||
exit $EXIT_CODE
|
||
fi
|
||
done |