Skip to content

Commit dfd272a

Browse files
committed
Release version 2.3.5
1 parent 5f303eb commit dfd272a

File tree

9 files changed

+722
-414
lines changed

9 files changed

+722
-414
lines changed

ftp_server.spec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ a = Analysis(
1212
runtime_hooks=[],
1313
excludes=[],
1414
noarchive=False,
15-
optimize=0,
1615
)
1716
pyz = PYZ(a.pure)
1817

src/ftp_server.py

Lines changed: 52 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -7,109 +7,85 @@
77
from ftp_server_console import run_console_mode
88
from ftp_server_types import LoggerProtocol
99

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-
5110
def main():
5211
try:
5312
# Парсинг аргументов командной строки
5413
parser = argparse.ArgumentParser(description='FTP Server для сканирования с МФУ')
5514
parser.add_argument('--service-stop', action='store_true', help='Остановить работающий сервис')
5615
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='Внутренний аргумент для рабочего процесса (путь к рабочему каталогу)')
5817
parser.add_argument('--console', action='store_true', help='Запустить в консольном режиме')
5918
args = parser.parse_args()
6019

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)
6346

6447
# Обработка команды остановки сервиса
6548
if args.service_stop:
66-
service_manager = ServiceManager(config_manager, logger)
49+
logger.is_service = True
50+
logger("Остановка сервиса...")
6751
if service_manager.stop_service():
6852
sys.exit(0)
6953
else:
7054
sys.exit(1)
7155

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)
8157

82-
# Проверка, не запущен ли уже сервис
83-
service_manager = ServiceManager(config_manager, logger)
58+
# Определяем режим работы
59+
service_mode = False
8460

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
9071

91-
72+
# Проверяем, не запущен ли уже сервис
9273
if service_manager.is_service_running() and not args.console:
93-
print("Сервис уже запущен. Используйте --console для принудительного запуска в консольном режиме.")
74+
logger("Сервис уже запущен. Используйте --console для принудительного запуска в консольном режиме.")
9475
sys.exit(1)
9576

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("Запуск в режиме сервиса...")
10680
if service_manager.run_service_mode():
107-
sys.exit(0) # Немедленное завершение родительского процесса
81+
logger("Сервис запущен успешно")
82+
sys.exit(0)
10883
else:
84+
logger("Ошибка запуска сервиса")
10985
sys.exit(1)
11086
else:
111-
# Режим из конфига - консоль
112-
run_console_mode(config_manager, logger)
87+
logger("Запуск в консольном режиме")
88+
run_console_mode(config_manager)
11389

11490
except Exception as e:
11591
error_msg = f"Критическая ошибка в главной функции: {e}\n"

0 commit comments

Comments
 (0)