71 linhas
2,7 KiB
Python
71 linhas
2,7 KiB
Python
# Импортируем нужные классы из библиотек
|
|
from fastapi import FastAPI
|
|
from fastapi.responses import HTMLResponse, JSONResponse
|
|
import subprocess
|
|
import psutil
|
|
|
|
# Создаём объект приложения
|
|
app = FastAPI()
|
|
|
|
# Обработчик GET-запросов по адресу / (корневой каталог)
|
|
@app.get('/', response_class=HTMLResponse)
|
|
async def index():
|
|
return '<h1>MT5 Manager</h1>'
|
|
|
|
# Обработчик POST /start - запуск терминала
|
|
@app.post('/start')
|
|
async def start_instance():
|
|
result = start_mt5()
|
|
return JSONResponse(result)
|
|
|
|
# Обработчик POST /stop - остановка терминала
|
|
@app.post('/stop', response_class=JSONResponse)
|
|
async def stop_instance():
|
|
result = stop_mt5()
|
|
return JSONResponse(result)
|
|
|
|
# Путь к запускаемому файлу терминала
|
|
MT5_PATH = 'C:/Program Files/MetaTrader 5/terminal64.exe'
|
|
|
|
# Словарь для хранения информации о запущенном терминале
|
|
instances = {}
|
|
|
|
# Запуск терминала
|
|
def start_mt5():
|
|
# Запускаем новый процесс
|
|
process = subprocess.Popen([MT5_PATH])
|
|
|
|
# Идентификатор запущенного процесса
|
|
pid = process.pid
|
|
|
|
# Запоминаем идентификатор и статус процесса
|
|
instances['default'] = {'pid': pid, 'status': 'running'}
|
|
|
|
# Возвращаем результат - успешный запуск
|
|
return {'instance': 'default', 'pid': pid}
|
|
|
|
# Остановка терминала
|
|
def stop_mt5():
|
|
# Если ранее терминал был запущен
|
|
if 'default' in instances:
|
|
# Берём идентификатор его процесса
|
|
pid = instances['default']['pid']
|
|
try:
|
|
# Получаем объект процесса терминала
|
|
p = psutil.Process(pid)
|
|
|
|
# Останавливаем процесс
|
|
p.terminate()
|
|
|
|
# Удаляем информацию о запущенном ранее процессе
|
|
del instances['default']
|
|
|
|
# Возвращаем результат - успешная остановка
|
|
return {'status': 'stopped', 'instance': 'default'}
|
|
except psutil.NoSuchProcess:
|
|
# Если процесс не найден, то
|
|
# удаляем информацию о запущенном ранее процессе
|
|
del instances['default']
|
|
|
|
# Возвращаем результат - процесс не найден
|
|
return {'status': 'not found', 'instance': 'default'}
|