dynamic
parent
f1d4a2401b
commit
c3583d93ea
25
app.py
25
app.py
|
|
@ -91,6 +91,7 @@ class InstallData(BaseModel):
|
||||||
folder_id: int | None = None
|
folder_id: int | None = None
|
||||||
protocol: str | None = 'rustdesk'
|
protocol: str | None = 'rustdesk'
|
||||||
note: str | None = ''
|
note: str | None = ''
|
||||||
|
last_seen: str | None = None # Добавлено для поддержки обновлений статуса
|
||||||
|
|
||||||
# Функция форматирования времени
|
# Функция форматирования времени
|
||||||
def format_time(time_str):
|
def format_time(time_str):
|
||||||
|
|
@ -202,7 +203,7 @@ async def add_install(data: InstallData):
|
||||||
folder_id = data.folder_id if data.folder_id is not None else unsorted_folder_id
|
folder_id = data.folder_id if data.folder_id is not None else unsorted_folder_id
|
||||||
protocol = data.protocol or 'rustdesk'
|
protocol = data.protocol or 'rustdesk'
|
||||||
note = data.note or ''
|
note = data.note or ''
|
||||||
last_seen = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
last_seen = data.last_seen or datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
cursor.execute("SELECT id FROM installs WHERE rust_id = ?", (rust_id,))
|
cursor.execute("SELECT id FROM installs WHERE rust_id = ?", (rust_id,))
|
||||||
existing = cursor.fetchone()
|
existing = cursor.fetchone()
|
||||||
|
|
@ -219,9 +220,25 @@ async def add_install(data: InstallData):
|
||||||
""", (rust_id, computer_name, install_time, folder_id, protocol, note, last_seen))
|
""", (rust_id, computer_name, install_time, folder_id, protocol, note, last_seen))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
# Отправка обновления через WebSocket
|
# Получаем обновленную запись
|
||||||
installs = get_installs()
|
cursor.execute("""
|
||||||
await manager.broadcast(json.dumps(installs))
|
SELECT id, rust_id, computer_name, install_time, folder_id, protocol, note, last_seen
|
||||||
|
FROM installs WHERE rust_id = ?
|
||||||
|
""", (rust_id,))
|
||||||
|
updated_install = cursor.fetchone()
|
||||||
|
install_data = {
|
||||||
|
"id": updated_install[0],
|
||||||
|
"rust_id": updated_install[1],
|
||||||
|
"computer_name": updated_install[2],
|
||||||
|
"install_time": format_time(updated_install[3]),
|
||||||
|
"folder_id": updated_install[4],
|
||||||
|
"protocol": updated_install[5],
|
||||||
|
"note": updated_install[6],
|
||||||
|
"last_seen": updated_install[7]
|
||||||
|
}
|
||||||
|
# Отправляем только обновленную запись через WebSocket
|
||||||
|
await manager.broadcast(json.dumps({"type": "update", "data": install_data}))
|
||||||
|
|
||||||
return {"status": "success"}
|
return {"status": "success"}
|
||||||
|
|
||||||
@api_app.put("/api/install/{install_id}")
|
@api_app.put("/api/install/{install_id}")
|
||||||
|
|
|
||||||
|
|
@ -601,18 +601,43 @@
|
||||||
if (ws) {
|
if (ws) {
|
||||||
ws.close();
|
ws.close();
|
||||||
}
|
}
|
||||||
// Используем wss для соответствия HTTPS
|
|
||||||
ws = new WebSocket(`wss://${window.location.host}/ws`);
|
ws = new WebSocket(`wss://${window.location.host}/ws`);
|
||||||
ws.onmessage = function(event) {
|
ws.onmessage = function(event) {
|
||||||
allInstalls = JSON.parse(event.data);
|
const data = JSON.parse(event.data);
|
||||||
displayInstalls(allInstalls.filter(i => !selectedFolderId || i.folder_id == selectedFolderId));
|
if (data.type === "update") {
|
||||||
|
const updatedInstall = data.data;
|
||||||
|
const index = allInstalls.findIndex(i => i.id === updatedInstall.id);
|
||||||
|
if (index !== -1) {
|
||||||
|
allInstalls[index] = updatedInstall;
|
||||||
|
} else {
|
||||||
|
allInstalls.push(updatedInstall);
|
||||||
|
alert(`Новое подключение добавлено: ${updatedInstall.computer_name} (ID: ${updatedInstall.rust_id})`);
|
||||||
|
}
|
||||||
|
displayInstalls(allInstalls.filter(i => !selectedFolderId || i.folder_id == selectedFolderId));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
ws.onerror = function(error) {
|
ws.onerror = function(error) {
|
||||||
console.error('WebSocket error:', error);
|
console.error('WebSocket error:', error);
|
||||||
};
|
};
|
||||||
ws.onclose = function() {
|
ws.onclose = function() {
|
||||||
console.log('WebSocket disconnected, retrying in 5 seconds...');
|
console.log('WebSocket disconnected, retrying...');
|
||||||
setTimeout(connectWebSocket, 5000);
|
let retryDelay = 1000; // Начальная задержка 1 секунда
|
||||||
|
const maxDelay = 30000; // Максимальная задержка 30 секунд
|
||||||
|
const maxAttempts = 10;
|
||||||
|
let attempts = 0;
|
||||||
|
|
||||||
|
function reconnect() {
|
||||||
|
if (attempts < maxAttempts) {
|
||||||
|
setTimeout(() => {
|
||||||
|
connectWebSocket();
|
||||||
|
retryDelay = Math.min(retryDelay * 2, maxDelay);
|
||||||
|
attempts++;
|
||||||
|
}, retryDelay);
|
||||||
|
} else {
|
||||||
|
console.error('Max reconnect attempts reached');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reconnect();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1162,6 +1187,19 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function startPeriodicSync() {
|
||||||
|
setInterval(() => {
|
||||||
|
$.getJSON(`${API_URL}/installs`, function (data) {
|
||||||
|
allInstalls = data;
|
||||||
|
displayInstalls(allInstalls.filter(i => !selectedFolderId || i.folder_id == selectedFolderId));
|
||||||
|
}).fail(function(jqxhr, textStatus, error) {
|
||||||
|
console.error("Error syncing installs:", textStatus, error);
|
||||||
|
});
|
||||||
|
}, 60000); // Каждые 60 секунд
|
||||||
|
}
|
||||||
|
|
||||||
|
startPeriodicSync();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Loading…
Reference in New Issue