|
7 | 7 | from ftp_server_console import run_console_mode |
8 | 8 | from ftp_server_types import LoggerProtocol |
9 | 9 |
|
10 | | -def get_absolute_path(filename): |
11 | | - """Возвращает абсолютный путь к файлу""" |
12 | | - if getattr(sys, 'frozen', False): |
13 | | - base_dir = os.path.dirname(sys.executable) |
14 | | - # Берем базовое имя EXE файла без расширения |
15 | | - exe_name = os.path.splitext(os.path.basename(sys.executable))[0] |
16 | | - else: |
17 | | - base_dir = os.path.dirname(os.path.abspath(__file__)) |
18 | | - exe_name = 'ftp_server' |
19 | | - |
20 | | - # Используем имя EXE файла как основу |
21 | | - base_filename = f"{exe_name}.{filename.split('.')[-1]}" |
22 | | - return os.path.join(base_dir, base_filename) |
23 | | - |
24 | | -# Используем динамические имена файлов |
25 | | -CONFIG_FILENAME = get_absolute_path('ftp_server.cfg') |
26 | | -LOG_FILENAME = get_absolute_path('ftp_server.log') |
27 | | -PID_FILENAME = get_absolute_path('ftp_server.pid') |
28 | | - |
29 | | -class ServiceLogger: |
30 | | - """Логгер для режима сервиса""" |
31 | | - def __init__(self, log_file: str): |
32 | | - self.log_file = log_file |
33 | | - self.is_service = False |
34 | | - |
35 | | - def __call__(self, message: str, log_to_file: bool = True): |
36 | | - import time |
37 | | - timestamp = time.strftime('%Y-%m-%d %H:%M:%S') |
38 | | - |
39 | | - if self.is_service and log_to_file: |
40 | | - # В режиме сервиса пишем в файл с timestamp |
41 | | - log_message = f"[{timestamp}] {message}\n" |
42 | | - try: |
43 | | - with open(self.log_file, 'a', encoding='utf-8') as f: |
44 | | - f.write(log_message) |
45 | | - except Exception as e: |
46 | | - print(f"Ошибка записи в лог: {e}") |
47 | | - else: |
48 | | - # В консольном режиме или без логирования в файл - просто выводим |
49 | | - print(message) |
50 | | - |
51 | 10 | def main(): |
52 | 11 | try: |
53 | 12 | # Парсинг аргументов командной строки |
54 | 13 | parser = argparse.ArgumentParser(description='FTP Server для сканирования с МФУ') |
55 | 14 | parser.add_argument('--service-stop', action='store_true', help='Остановить работающий сервис') |
56 | 15 | parser.add_argument('--service-start', action='store_true', help='Запустить в режиме сервиса') |
57 | | - parser.add_argument('--service-worker', action='store_true', help='Внутренний аргумент для рабочего процесса') |
| 16 | + parser.add_argument('--service-worker', nargs='?', const='', help='Внутренний аргумент для рабочего процесса (путь к рабочему каталогу)') |
58 | 17 | parser.add_argument('--console', action='store_true', help='Запустить в консольном режиме') |
59 | 18 | args = parser.parse_args() |
60 | 19 |
|
61 | | - logger = ServiceLogger(LOG_FILENAME) |
62 | | - config_manager = ConfigManager() |
| 20 | + logger: Optional[LoggerProtocol] = None # ServiceLogger() |
| 21 | + config_manager: Optional[ConfigManager] = None |
| 22 | + |
| 23 | + # ВАЖНО: Проверяем --service-worker ПЕРВЫМ делом |
| 24 | + if args.service_worker is not None: |
| 25 | + |
| 26 | + # Если передан путь - используем его |
| 27 | + working_dir = args.service_worker if (args.service_worker and os.path.exists(args.service_worker)) else None |
| 28 | + config_manager = ConfigManager(base_dir=working_dir) |
| 29 | + logger = config_manager.get_logger() |
| 30 | + logger.is_service = True |
| 31 | + if working_dir is not None: |
| 32 | + os.chdir(working_dir) |
| 33 | + logger(f"Сервисный рабочий процесс. Каталог: {working_dir}") |
| 34 | + else: |
| 35 | + logger(f"Сервисный рабочий процесс. Каталог не передан.") |
| 36 | + # НЕМЕДЛЕННО запускаем сервисный рабочий процесс |
| 37 | + service_manager = ServiceManager(config_manager) |
| 38 | + service_manager.run_service_worker() |
| 39 | + sys.exit(0) # Этот код выполнится только если run_service_worker завершится |
| 40 | + |
| 41 | + # Если config_manager еще не создан |
| 42 | + if config_manager is None: |
| 43 | + config_manager = ConfigManager() |
| 44 | + logger = config_manager.get_logger() |
| 45 | + service_manager = ServiceManager(config_manager) |
63 | 46 |
|
64 | 47 | # Обработка команды остановки сервиса |
65 | 48 | if args.service_stop: |
66 | | - service_manager = ServiceManager(config_manager, logger) |
| 49 | + logger.is_service = True |
| 50 | + logger("Остановка сервиса...") |
67 | 51 | if service_manager.stop_service(): |
68 | 52 | sys.exit(0) |
69 | 53 | else: |
70 | 54 | sys.exit(1) |
71 | 55 |
|
72 | | - # Загрузка конфигурации |
73 | | - try: |
74 | | - config_data = config_manager.load_config() |
75 | | - service_mode = config_manager.server_config.service_mode |
76 | | - except Exception as e: |
77 | | - error_msg = f"Ошибка загрузки конфигурации: {e}\n" |
78 | | - error_msg += f"Traceback: {traceback.format_exc()}" |
79 | | - print(error_msg) |
80 | | - sys.exit(1) |
| 56 | + logger(f"Рабочий каталог: {config_manager.get_base_dir()}", False) |
81 | 57 |
|
82 | | - # Проверка, не запущен ли уже сервис |
83 | | - service_manager = ServiceManager(config_manager, logger) |
| 58 | + # Определяем режим работы |
| 59 | + service_mode = False |
84 | 60 |
|
85 | | - # Запуск рабочего процесса сервиса |
86 | | - if args.service_worker: |
87 | | - logger.is_service = True |
88 | | - service_manager.run_service_worker() |
89 | | - sys.exit(0) |
| 61 | + if args.service_start: |
| 62 | + logger.is_service = service_mode = True |
| 63 | + elif args.console: |
| 64 | + logger.is_service = service_mode = False |
| 65 | + else: |
| 66 | + try: |
| 67 | + service_mode = config_manager.quick_load_service_mode() |
| 68 | + except Exception as e: |
| 69 | + logger(f"Предупреждение при быстрой проверке конфига: {e}") |
| 70 | + logger.is_service = service_mode = False |
90 | 71 |
|
91 | | - |
| 72 | + # Проверяем, не запущен ли уже сервис |
92 | 73 | if service_manager.is_service_running() and not args.console: |
93 | | - print("Сервис уже запущен. Используйте --console для принудительного запуска в консольном режиме.") |
| 74 | + logger("Сервис уже запущен. Используйте --console для принудительного запуска в консольном режиме.") |
94 | 75 | sys.exit(1) |
95 | 76 |
|
96 | | - # Определение режима работы |
97 | | - if args.service_start: |
98 | | - # Принудительный запуск в режиме сервиса |
99 | | - service_manager.run_service_mode() |
100 | | - sys.exit(0) # Завершаем родительский процесс |
101 | | - elif args.console: |
102 | | - # Принудительный запуск в консольном режиме |
103 | | - run_console_mode(config_manager, logger) |
104 | | - elif service_mode: |
105 | | - # Режим из конфига - сервис |
| 77 | + # Запуск в выбранном режиме |
| 78 | + if service_mode: |
| 79 | + logger("Запуск в режиме сервиса...") |
106 | 80 | if service_manager.run_service_mode(): |
107 | | - sys.exit(0) # Немедленное завершение родительского процесса |
| 81 | + logger("Сервис запущен успешно") |
| 82 | + sys.exit(0) |
108 | 83 | else: |
| 84 | + logger("Ошибка запуска сервиса") |
109 | 85 | sys.exit(1) |
110 | 86 | else: |
111 | | - # Режим из конфига - консоль |
112 | | - run_console_mode(config_manager, logger) |
| 87 | + logger("Запуск в консольном режиме") |
| 88 | + run_console_mode(config_manager) |
113 | 89 |
|
114 | 90 | except Exception as e: |
115 | 91 | error_msg = f"Критическая ошибка в главной функции: {e}\n" |
|
0 commit comments