removed loadInitialState()

This commit is contained in:
Devaev Maxim
2018-11-24 06:30:08 +03:00
parent d060125cd3
commit c168e73805
6 changed files with 55 additions and 85 deletions

View File

@@ -4,6 +4,6 @@
# will be displayed in the web interface. # will be displayed in the web interface.
server: server:
host: localhost host: localhost.localdomain
kvm: {} kvm: {}

View File

@@ -4,6 +4,8 @@ import asyncio
import json import json
import time import time
from enum import Enum
from typing import List from typing import List
from typing import Dict from typing import Dict
from typing import Set from typing import Set
@@ -100,6 +102,13 @@ def _wrap_exceptions_for_web(msg: str) -> Callable:
return make_wrapper return make_wrapper
class _Events(Enum):
INFO_STATE = "info_state"
STREAMER_STATE = "streamer_state"
ATX_STATE = "atx_state"
MSD_STATE = "msd_state"
class Server: # pylint: disable=too-many-instance-attributes class Server: # pylint: disable=too-many-instance-attributes
def __init__( # pylint: disable=too-many-arguments def __init__( # pylint: disable=too-many-arguments
self, self,
@@ -179,10 +188,8 @@ class Server: # pylint: disable=too-many-instance-attributes
aiohttp.web.run_app(app, host=host, port=port, print=self.__run_app_print) aiohttp.web.run_app(app, host=host, port=port, print=self.__run_app_print)
# ===== SYSTEM async def __make_info(self) -> Dict:
return {
async def __info_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response:
return _json({
"version": { "version": {
"kvmd": __version__, "kvmd": __version__,
"streamer": await self.__streamer.get_version(), "streamer": await self.__streamer.get_version(),
@@ -190,7 +197,12 @@ class Server: # pylint: disable=too-many-instance-attributes
"streamer": self.__streamer.get_app(), "streamer": self.__streamer.get_app(),
"meta": await self.__info_manager.get_meta(), "meta": await self.__info_manager.get_meta(),
"extras": await self.__info_manager.get_extras(), "extras": await self.__info_manager.get_extras(),
}) }
# ===== SYSTEM
async def __info_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response:
return _json(await self.__make_info())
@_wrap_exceptions_for_web("Log error") @_wrap_exceptions_for_web("Log error")
async def __log_handler(self, request: aiohttp.web.Request) -> aiohttp.web.StreamResponse: async def __log_handler(self, request: aiohttp.web.Request) -> aiohttp.web.StreamResponse:
@@ -213,6 +225,12 @@ class Server: # pylint: disable=too-many-instance-attributes
ws = aiohttp.web.WebSocketResponse(heartbeat=self.__heartbeat) ws = aiohttp.web.WebSocketResponse(heartbeat=self.__heartbeat)
await ws.prepare(request) await ws.prepare(request)
await self.__register_socket(ws) await self.__register_socket(ws)
await asyncio.gather(*[
self.__broadcast_event(_Events.INFO_STATE, (await self.__make_info())),
self.__broadcast_event(_Events.STREAMER_STATE, (await self.__streamer.get_state())),
self.__broadcast_event(_Events.ATX_STATE, self.__atx.get_state()),
self.__broadcast_event(_Events.MSD_STATE, self.__msd.get_state()),
])
async for msg in ws: async for msg in ws:
if msg.type == aiohttp.web.WSMsgType.TEXT: if msg.type == aiohttp.web.WSMsgType.TEXT:
try: try:
@@ -285,9 +303,9 @@ class Server: # pylint: disable=too-many-instance-attributes
}.get(button) }.get(button)
if not clicker: if not clicker:
raise BadRequest("Invalid param 'button'") raise BadRequest("Invalid param 'button'")
await self.__broadcast_event("atx_click", button=button) # type: ignore await self.__broadcast_event(_Events.ATX_STATE, self.__atx.get_state())
await clicker() await clicker()
await self.__broadcast_event("atx_click", button=None) # type: ignore await self.__broadcast_event(_Events.ATX_STATE, self.__atx.get_state())
return _json({"clicked": button}) return _json({"clicked": button})
# ===== MSD # ===== MSD
@@ -301,11 +319,11 @@ class Server: # pylint: disable=too-many-instance-attributes
if to == "kvm": if to == "kvm":
await self.__msd.connect_to_kvm() await self.__msd.connect_to_kvm()
state = self.__msd.get_state() state = self.__msd.get_state()
await self.__broadcast_event("msd_state", **state) await self.__broadcast_event(_Events.MSD_STATE, state)
elif to == "server": elif to == "server":
await self.__msd.connect_to_pc() await self.__msd.connect_to_pc()
state = self.__msd.get_state() state = self.__msd.get_state()
await self.__broadcast_event("msd_state", **state) await self.__broadcast_event(_Events.MSD_STATE, state)
else: else:
raise BadRequest("Invalid param 'to'") raise BadRequest("Invalid param 'to'")
return _json(state) return _json(state)
@@ -326,7 +344,7 @@ class Server: # pylint: disable=too-many-instance-attributes
raise BadRequest("Missing 'image_data' field") raise BadRequest("Missing 'image_data' field")
async with self.__msd: async with self.__msd:
await self.__broadcast_event("msd_state", **self.__msd.get_state()) await self.__broadcast_event(_Events.MSD_STATE, self.__msd.get_state())
logger.info("Writing image %r to mass-storage device ...", image_name) logger.info("Writing image %r to mass-storage device ...", image_name)
await self.__msd.write_image_info(image_name, False) await self.__msd.write_image_info(image_name, False)
while True: while True:
@@ -336,7 +354,7 @@ class Server: # pylint: disable=too-many-instance-attributes
written = await self.__msd.write_image_chunk(chunk) written = await self.__msd.write_image_chunk(chunk)
await self.__msd.write_image_info(image_name, True) await self.__msd.write_image_info(image_name, True)
finally: finally:
await self.__broadcast_event("msd_state", **self.__msd.get_state()) await self.__broadcast_event(_Events.MSD_STATE, self.__msd.get_state())
if written != 0: if written != 0:
logger.info("Written %d bytes to mass-storage device", written) logger.info("Written %d bytes to mass-storage device", written)
return _json({"written": written}) return _json({"written": written})
@@ -433,21 +451,21 @@ class Server: # pylint: disable=too-many-instance-attributes
async def __poll_atx_state(self) -> None: async def __poll_atx_state(self) -> None:
async for state in self.__atx.poll_state(): async for state in self.__atx.poll_state():
if self.__sockets: if self.__sockets:
await self.__broadcast_event("atx_state", **state) await self.__broadcast_event(_Events.ATX_STATE, state)
@_system_task @_system_task
async def __poll_streamer_state(self) -> None: async def __poll_streamer_state(self) -> None:
async for state in self.__streamer.poll_state(): async for state in self.__streamer.poll_state():
if self.__sockets: if self.__sockets:
await self.__broadcast_event("streamer_state", **state) await self.__broadcast_event(_Events.STREAMER_STATE, state)
async def __broadcast_event(self, event: str, **kwargs: Dict) -> None: async def __broadcast_event(self, event_type: _Events, event_attrs: Dict) -> None:
await asyncio.gather(*[ await asyncio.gather(*[
ws.send_str(json.dumps({ ws.send_str(json.dumps({
"msg_type": "event", "msg_type": "event",
"msg": { "msg": {
"event": event, "event": event_type.value,
"event_attrs": kwargs, "event_attrs": event_attrs,
}, },
})) }))
for ws in list(self.__sockets) for ws in list(self.__sockets)

View File

@@ -14,18 +14,6 @@ function Atx() {
/********************************************************************************/ /********************************************************************************/
self.loadInitialState = function() {
var http = tools.makeRequest("GET", "/kvmd/atx", function() {
if (http.readyState === 4) {
if (http.status === 200) {
__setButtonsBusy(JSON.parse(http.responseText).result.busy);
} else {
setTimeout(self.loadInitialState, 1000);
}
}
});
};
self.setState = function(state) { self.setState = function(state) {
__setButtonsBusy(state.busy); __setButtonsBusy(state.busy);
$("atx-power-led").className = (state.leds.power ? "led-green" : "led-gray"); $("atx-power-led").className = (state.leds.power ? "led-green" : "led-gray");

View File

@@ -24,18 +24,6 @@ function Msd() {
/********************************************************************************/ /********************************************************************************/
self.loadInitialState = function() {
var http = tools.makeRequest("GET", "/kvmd/msd", function() {
if (http.readyState === 4) {
if (http.status === 200) {
self.setState(JSON.parse(http.responseText).result);
} else {
setTimeout(self.loadInitialState, 1000);
}
}
});
};
self.setState = function(state) { self.setState = function(state) {
__state = state; __state = state;
__applyState(); __applyState();

View File

@@ -15,39 +15,29 @@ function Session() {
var __init__ = function() { var __init__ = function() {
$("link-led").title = "Not connected yet..."; $("link-led").title = "Not connected yet...";
__loadKvmdInfo();
__startPoller(); __startPoller();
}; };
/********************************************************************************/ /********************************************************************************/
var __loadKvmdInfo = function() { var __setKvmdInfo = function(state) {
var http = tools.makeRequest("GET", "/kvmd/info", function() { if (state.meta) {
if (http.readyState === 4) { var text = JSON.stringify(state.meta, undefined, 4).replace(/ /g, "&nbsp;").replace(/\n/g, "<br>");
if (http.status === 200) { $("about-meta").innerHTML = `
var info = JSON.parse(http.responseText).result; <span class="code-comment">// The Pi-KVM metadata.<br>
if (info.meta) { // You can get this json using handle <a target="_blank" href="/kvmd/info">/kvmd/info</a>.<br>
var text = JSON.stringify(info.meta, undefined, 4).replace(/ /g, "&nbsp;").replace(/\n/g, "<br>"); // In the standard configuration this data<br>
$("about-meta").innerHTML = ` // is specified in the file /etc/kvmd/meta.yaml.</span><br>
<span class="code-comment">// The Pi-KVM metadata.<br> <br>
// You can get this json using handle /kvmd/info.<br> ${text}
// In the standard configuration this data<br> `;
// is specified in the file /etc/kvmd/meta.yaml.</span><br> if (state.meta.server && state.meta.server.host) {
<br> document.title = "Pi-KVM Session - " + state.meta.server.host;
${text} $("kvmd-meta-server-host").innerHTML = "Server: " + state.meta.server.host;
`;
if (info.meta.server && info.meta.server.host) {
document.title = "Pi-KVM Session - " + info.meta.server.host;
$("kvmd-meta-server-host").innerHTML = "Server: " + info.meta.server.host;
}
}
$("about-version-kvmd").innerHTML = info.version.kvmd;
$("about-version-streamer").innerHTML = `${info.version.streamer} (${info.streamer})`;
} else {
setTimeout(__loadKvmdInfo, 1000);
}
} }
}); }
$("about-version-kvmd").innerHTML = state.version.kvmd;
$("about-version-streamer").innerHTML = `${state.version.streamer} (${state.streamer})`;
}; };
var __startPoller = function() { var __startPoller = function() {
@@ -73,9 +63,6 @@ function Session() {
$("link-led").className = "led-green"; $("link-led").className = "led-green";
$("link-led").title = "Connected"; $("link-led").title = "Connected";
tools.debug("Session: socket opened:", event); tools.debug("Session: socket opened:", event);
__streamer.loadInitialState();
__atx.loadInitialState();
__msd.loadInitialState();
__hid.setSocket(__ws); __hid.setSocket(__ws);
__missed_heartbeats = 0; __missed_heartbeats = 0;
__ping_timer = setInterval(__pingServer, 1000); __ping_timer = setInterval(__pingServer, 1000);
@@ -87,7 +74,9 @@ function Session() {
if (event.msg_type === "pong") { if (event.msg_type === "pong") {
__missed_heartbeats = 0; __missed_heartbeats = 0;
} else if (event.msg_type === "event") { } else if (event.msg_type === "event") {
if (event.msg.event === "streamer_state") { if (event.msg.event === "info_state") {
__setKvmdInfo(event.msg.event_attrs);
} else if (event.msg.event === "streamer_state") {
__streamer.setState(event.msg.event_attrs); __streamer.setState(event.msg.event_attrs);
} else if (event.msg.event === "atx_state") { } else if (event.msg.event === "atx_state") {
__atx.setState(event.msg.event_attrs); __atx.setState(event.msg.event_attrs);

View File

@@ -38,19 +38,6 @@ function Streamer() {
/********************************************************************************/ /********************************************************************************/
self.loadInitialState = function() {
var http = tools.makeRequest("GET", "/kvmd/streamer", function() {
if (http.readyState === 4) {
if (http.status === 200) {
self.setState(JSON.parse(http.responseText).result);
} else {
self.clearState();
setTimeout(self.loadInitialState, 1000);
}
}
});
};
self.setState = function(state) { self.setState = function(state) {
if (state.state) { if (state.state) {
var source = state.state.source; var source = state.state.source;