#!/bin/bash
# XenForo Diagnostic & Fix Script v2
# С исправлением ошибки checkRequirements()
echo "========================================"
echo "XenForo Diagnostic & Fix Script v2"
echo "========================================"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Function to print status
print_status() {
if [ $1 -eq 0 ]; then
echo -e "${GREEN}✓ $2${NC}"
else
echo -e "${RED}✗ $2${NC}"
fi
}
# Function to check if we're in XF root
check_xf_root() {
if [ -f "src/XF.php" ] && [ -d "src/addons" ]; then
echo -e "${GREEN}✓ В папке XenForo${NC}"
return 0
else
echo -e "${RED}✗ Не в корне XenForo! Запустите в корневой папке XF${NC}"
exit 1
fi
}
# Function to fix test addon
fix_test_addon() {
echo -e "\n${YELLOW}Исправление тестового аддона...${NC}"
TEST_ADDON_DIR="src/addons/TestInstallCheck"
if [ -d "$TEST_ADDON_DIR" ]; then
# Create fixed Setup.php with checkRequirements method
cat > "$TEST_ADDON_DIR/Setup.php" << 'EOF'
<?php
namespace TestInstallCheck;
class Setup
{
public function install(\XF\AddOn\AbstractSetup $setup)
{
\XF::logError('Test addon installed successfully - installation works!');
return $setup;
}
public function uninstall(\XF\AddOn\AbstractSetup $setup)
{
\XF::logError('Test addon uninstalled');
return $setup;
}
public function upgrade(\XF\AddOn\AbstractSetup $setup)
{
return $setup;
}
public function checkRequirements(&$errors = [], &$warnings = [])
{
// No requirements for test addon
return true;
}
}
EOF
print_status 0 "Тестовый аддон исправлен (добавлен checkRequirements)"
# Also update addon.json to be compatible
cat > "$TEST_ADDON_DIR/addon.json" << 'EOF'
{
"title": "Test Install Check",
"description": "Temporary addon to check installation functionality",
"version_id": 1000010,
"version_string": "1.0.0",
"author": "Diagnostic Script",
"require": {
"XF": [2010010, "XenForo 2.1.0"]
}
}
EOF
print_status 0 "addon.json обновлен"
else
echo -e "${YELLOW}Тестовый аддон не существует. Создать новый? (y/n)${NC}"
read -r create_new
if [ "$create_new" = "y" ] || [ "$create_new" = "Y" ]; then
create_test_addon
fi
fi
}
# Function to create test addon for installation check
create_test_addon() {
echo -e "\n${YELLOW}Создание тестового аддона для проверки...${NC}"
TEST_ADDON_DIR="src/addons/TestInstallCheck"
if [ ! -d "$TEST_ADDON_DIR" ]; then
mkdir -p "$TEST_ADDON_DIR"
# Create addon.json
cat > "$TEST_ADDON_DIR/addon.json" << 'EOF'
{
"title": "Test Install Check",
"description": "Temporary addon to check installation functionality",
"version_id": 1000010,
"version_string": "1.0.0",
"author": "Diagnostic Script",
"require": {
"XF": [2010010, "XenForo 2.1.0"]
}
}
EOF
# Create Setup.php with all required methods
cat > "$TEST_ADDON_DIR/Setup.php" << 'EOF'
<?php
namespace TestInstallCheck;
class Setup
{
public function install(\XF\AddOn\AbstractSetup $setup)
{
\XF::logError('Test addon installed successfully - installation works!');
return $setup;
}
public function uninstall(\XF\AddOn\AbstractSetup $setup)
{
\XF::logError('Test addon uninstalled');
return $setup;
}
public function upgrade(\XF\AddOn\AbstractSetup $setup)
{
return $setup;
}
public function checkRequirements(&$errors = [], &$warnings = [])
{
// No requirements for test addon
return true;
}
}
EOF
print_status 0 "Тестовый аддон создан: $TEST_ADDON_DIR"
echo -e "${YELLOW}Попробуйте установить его через админ-панель${NC}"
echo -e "${YELLOW}После проверки удалите папку: $TEST_ADDON_DIR${NC}"
else
print_status 1 "Тестовый аддон уже существует"
fix_test_addon
fi
}
# Function to check problematic addons
check_problematic_addons() {
echo -e "\n${YELLOW}Поиск проблемных аддонов...${NC}"
for addon_dir in src/addons/*/; do
if [ -d "$addon_dir" ]; then
addon_name=$(basename "$addon_dir")
setup_file="$addon_dir/Setup.php"
if [ -f "$setup_file" ]; then
# Check if Setup.php has checkRequirements method
if ! grep -q "checkRequirements" "$setup_file"; then
echo -e "${RED}✗ $addon_name: отсутствует checkRequirements()${NC}"
# Offer to fix
echo -e "${YELLOW}Исправить этот аддон? (y/n)${NC}"
read -r fix_addon
if [ "$fix_addon" = "y" ] || [ "$fix_addon" = "Y" ]; then
backup_file="$setup_file.backup.$(date +%s)"
cp "$setup_file" "$backup_file"
echo -e "${YELLOW}Создан бэкап: $backup_file${NC}"
# Add checkRequirements method
cat >> "$setup_file" << 'EOF'
public function checkRequirements(&$errors = [], &$warnings = [])
{
return true;
}
}
EOF
# Fix the previous closing bracket
sed -i 's/^}$//g' "$setup_file"
print_status 0 "$addon_name исправлен"
fi
else
echo -e "${GREEN}✓ $addon_name: checkRequirements() присутствует${NC}"
fi
fi
fi
done
}
# Function to check file permissions
check_permissions() {
echo -e "\n${YELLOW}Проверка прав доступа...${NC}"
dirs=("data" "internal_data" "src/addons")
for dir in "${dirs[@]}"; do
if [ -d "$dir" ]; then
perms=$(stat -c "%a" "$dir" 2>/dev/null || stat -f "%A" "$dir")
if [ "$perms" -ge "755" ] || [ "$perms" -eq "777" ]; then
print_status 0 "Права $dir: $perms"
else
print_status 1 "Права $dir: $perms (должны быть 755/777)"
chmod 755 "$dir" 2>/dev/null && print_status 0 "Права исправлены" || print_status 1 "Не удалось исправить права"
fi
fi
done
}
# Function to clear caches
clear_caches() {
echo -e "\n${YELLOW}Очистка кешей...${NC}"
cache_dirs=("internal_data/cache" "data/cache")
for cache_dir in "${cache_dirs[@]}"; do
if [ -d "$cache_dir" ]; then
rm -rf "$cache_dir"/* 2>/dev/null
print_status 0 "Очищен $cache_dir"
fi
done
}
# Main execution
main() {
echo "Запуск диагностики XenForo..."
echo "Текущая папка: $(pwd)"
echo ""
check_xf_root
check_permissions
clear_caches
echo -e "\n${YELLOW}Выберите действие:${NC}"
echo "1) Исправить тестовый аддон"
echo "2) Создать новый тестовый аддон"
echo "3) Проверить все аддоны на проблемы"
echo "4) Выйти"
read -r choice
case $choice in
1)
fix_test_addon
;;
2)
create_test_addon
;;
3)
check_problematic_addons
;;
4)
exit 0
;;
*)
echo "Неверный выбор"
;;
esac
echo -e "\n${GREEN}Готово!${NC}"
echo -e "${YELLOW}Теперь попробуйте установить тестовый аддон через админ-панель${NC}"
}
# Run main function
main