/
renath
/
WebsiteMonitor
Обзор
Документация
Войти
/
renath
/
WebsiteMonitor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
build_linux.py
326 строк
11 KB
renath
update build_linux.py
28 ноя 2025, 07:36
28 ноя 2025, 07:36
80b705c
Код
Авторство
О чём код?
#!/usr/bin/env python3 # build_linux.py - Сборка для Linux Debian import PyInstaller.__main__ import os import sys import shutil import subprocess from PIL import Image, ImageDraw def build_complete(): print("=" * 60) print("СБОРКА WEBSITEMONITOR ДЛЯ LINUX DEBIAN") print("=" * 60) # Проверка ОС if not sys.platform.startswith('linux'): print("Этот скрипт предназначен для Linux!") return False # Шаг 1: Создаем иконку print("\n1. СОЗДАНИЕ ИКОНКИ...") if not create_icon(): print("Продолжаем сборку без иконки...") # Шаг 2: Создаем конфиг если нужно print("\n2. ПРОВЕРКА КОНФИГУРАЦИИ...") create_config_if_needed() # Шаг 3: Создаем .desktop файл print("\n3. СОЗДАНИЕ .DESKTOP ФАЙЛА...") create_desktop_file() # Шаг 4: Сборка с PyInstaller print("\n4. СБОРКА С PYINSTALLER...") if not build_with_pyinstaller(): print("Сборка прервана!") return False # Шаг 5: Копируем файлы print("\n5. КОПИРОВАНИЕ ФАЙЛОВ...") copy_files_to_dist() # Шаг 6: Устанавливаем права print("\n6. УСТАНОВКА ПРАВ...") set_permissions() # Шаг 7: Очистка print("\n7. ОЧИСТКА...") cleanup_temp_files() print("\n" + "=" * 60) print("СБОРКА ЗАВЕРШЕНА УСПЕШНО! 🎉") print("=" * 60) print("Готовые файлы в папке 'dist/':") print("WebsiteMonitor - исполняемый файл") print("config.ini - конфигурационный файл") print("WebsiteMonitor.desktop - файл для запуска из меню") print("website_monitor.png - иконка приложения") print("\nДля запуска:") print("./dist/WebsiteMonitor") print("\nДля установки в систему:") print("sudo cp dist/WebsiteMonitor /usr/local/bin/") print("sudo cp dist/WebsiteMonitor.desktop /usr/share/applications/") print("sudo cp dist/website_monitor.png /usr/share/pixmaps/") return True def create_icon(): """Создает иконку для программы (PNG для Linux)""" icon_path = "website_monitor.png" if os.path.exists(icon_path): print(f"Иконка уже существует: {icon_path}") return True try: from PIL import Image, ImageDraw print("Создаем иконку для Linux...") # Для Linux используем PNG 256x256 size = (256, 256) img = Image.new('RGBA', size, (0, 0, 0, 0)) draw = ImageDraw.Draw(img) # Цвета monitor_color = (70, 130, 180) # SteelBlue screen_color = (240, 248, 255) # AliceBlue accent_color = (30, 144, 255) # DodgerBlue # Размеры элементов margin = 16 monitor_height = size[1] - margin * 3 # Монитор draw.rectangle([margin, margin, size[0]-margin, monitor_height], fill=monitor_color, outline=accent_color, width=3) # Экран screen_margin = margin * 2 draw.rectangle([screen_margin, screen_margin, size[0]-screen_margin, monitor_height-screen_margin], fill=screen_color) # Подставка stand_width = size[0] // 4 stand_height = margin * 2 stand_x = (size[0] - stand_width) // 2 stand_y = monitor_height draw.rectangle([stand_x, stand_y, stand_x+stand_width, stand_y+stand_height], fill=monitor_color, outline=accent_color, width=2) # База base_width = stand_width + margin * 2 base_height = margin base_x = (size[0] - base_width) // 2 base_y = stand_y + stand_height draw.rectangle([base_x, base_y, base_x+base_width, base_y+base_height], fill=accent_color) # Текст try: from PIL import ImageFont font_size = 40 # Пробуем разные шрифты for font_name in ['DejaVuSans-Bold', 'LiberationSans-Bold', 'Arial']: try: font = ImageFont.truetype(font_name, font_size) break except: font = ImageFont.load_default() except: font = ImageFont.load_default() text = "WM" bbox = draw.textbbox((0, 0), text, font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1] text_x = (size[0] - text_width) // 2 text_y = (monitor_height - text_height) // 2 draw.text((text_x, text_y), text, fill=accent_color, font=font) # Сохраняем PNG img.save(icon_path, format='PNG') print(f"Иконка создана: {icon_path}") return True except ImportError: print("Pillow не установлен. Установите: pip install Pillow") return False except Exception as e: print(f"Ошибка создания иконки: {e}") return False def create_config_if_needed(): """Создает конфиг по умолчанию если его нет""" if not os.path.exists('config.ini'): config_content = """[Settings] pt_path = /usr/bin/notify-send check_interval = 30 max_retries = 2 retry_delay = 5 window_visible = true [Hosts] hosts = https://google.com, https://github.com, 8.8.8.8, 192.168.1.1 """ with open('config.ini', 'w', encoding='utf-8') as f: f.write(config_content) print("Создан config.ini") def create_desktop_file(): """Создает .desktop файл для Linux""" desktop_content = """[Desktop Entry] Version=1.0 Type=Application Name=WebsiteMonitor Comment=Website Monitoring Tool Exec=/usr/local/bin/WebsiteMonitor Icon=website_monitor Terminal=true StartupNotify=false Categories=Network;Monitor; Keywords=monitor;website;network; """ with open('WebsiteMonitor.desktop', 'w', encoding='utf-8') as f: f.write(desktop_content) print("Создан WebsiteMonitor.desktop") def build_with_pyinstaller(): """Сборка с PyInstaller для Linux""" # Параметры сборки для Linux params = [ 'website_monitor.py', '--name=WebsiteMonitor', '--onefile', '--console', '--add-data=config.ini:.', '--hidden-import=configparser', '--hidden-import=urllib3', '--hidden-import=requests', '--hidden-import=urllib3.packages.six', '--hidden-import=urllib3.packages.ssl_match_hostname', '--hidden-import=logging', '--clean', '--noconfirm' ] try: print("Запуск PyInstaller для Linux...") PyInstaller.__main__.run(params) print("Сборка PyInstaller завершена!") return True except Exception as e: print(f"Ошибка сборки: {e}") return False def copy_files_to_dist(): """Копирует файлы в папку dist""" files_to_copy = [ ('config.ini', 'config.ini'), ('website_monitor.png', 'website_monitor.png'), ('WebsiteMonitor.desktop', 'WebsiteMonitor.desktop') ] for src, dst in files_to_copy: if os.path.exists(src): dist_path = os.path.join('dist', dst) shutil.copy2(src, dist_path) print(f"Скопирован: {src} -> dist/{dst}") def set_permissions(): """Устанавливает права на исполнение""" executable_path = 'dist/WebsiteMonitor' if os.path.exists(executable_path): try: os.chmod(executable_path, 0o755) # rwxr-xr-x print("Права на исполнение установлены") except Exception as e: print(f"Не удалось установить права: {e}") def cleanup_temp_files(): """Очищает временные файлы""" temp_files = [ 'WebsiteMonitor.desktop', 'build_linux.py', # Этот скрипт удалит себя ] temp_folders = [ 'build', '__pycache__', ] # Удаляем файлы for file in temp_files: if os.path.exists(file): try: os.remove(file) print(f"Удален: {file}") except: pass # Удаляем папки for folder in temp_folders: if os.path.exists(folder): try: shutil.rmtree(folder) print(f"Удалена папка: {folder}") except: pass def check_dependencies(): """Проверяет зависимости для Linux""" print("Проверка зависимостей...") # Проверяем Python пакеты try: import requests import PyInstaller import urllib3 except ImportError as e: print(f"Не установлены Python зависимости: {e}") print("Установите: pip install -r requirements.txt") return False # Проверяем системные зависимости для PyInstaller try: result = subprocess.run(['which', 'objcopy'], capture_output=True, text=True) if result.returncode != 0: print("Рекомендуется установить binutils:") print("sudo apt-get install binutils") except: pass return True if __name__ == "__main__": # Проверяем что мы в Linux if not sys.platform.startswith('linux'): print("ЭТОТ СКРИПТ ДЛЯ LINUX!") print("Для Windows используйте build_windows.py") sys.exit(1) # Проверяем зависимости if not check_dependencies(): sys.exit(1) # Запускаем сборку success = build_complete() if success: print("\n СБОРКА ДЛЯ LINUX ЗАВЕРШЕНА!") print("\nКоманды для установки в систему:") print("sudo cp dist/WebsiteMonitor /usr/local/bin/") print("sudo cp dist/WebsiteMonitor.desktop /usr/share/applications/") print("sudo cp dist/website_monitor.png /usr/share/pixmaps/") print("\nИли запускайте напрямую:") print("./dist/WebsiteMonitor") else: print("\n Сборка завершена с ошибками") print("\nГотово!")