77from core .router import Router
88from core .client import WebSocketClient
99from core .i18n import locale
10+ from typing import List , Any
1011from aiohttp import web
1112from tqdm import tqdm
1213import toml
1617import hmac
1718import hashlib
1819import ssl
20+ import sys
1921import humanize
2022import io
2123
@@ -34,6 +36,7 @@ def __init__(self) -> None:
3436 self .secret = Config .get ("cluster.secret" )
3537 self .ttl = 0 # hours
3638 self .scheduler = None
39+ self .application = None
3740 if not self .id or not self .secret :
3841 raise ClusterIdNotSetError if not self .id else ClusterSecretNotSetError
3942
@@ -87,6 +90,7 @@ def __init__(self) -> None:
8790 self .router = None
8891 self .server = None
8992 self .failed_filelist = FileList (files = [])
93+ self .enabled = False
9094
9195 async def fetchFileList (self ) -> None :
9296 logger .tinfo ("cluster.info.filelist.fetching" )
@@ -238,27 +242,76 @@ async def downloadFile(
238242 logger .terror ("cluster.error.download_file.failed" , file = file .hash )
239243 self .failed_filelist .files .append (file )
240244
241- async def setupExpress (self , https : bool , port : int ) -> None :
245+ async def setupRouter (self ) -> None :
242246 logger .tinfo ("cluster.info.router.creating" )
243- app = web .Application ()
247+ self . application = web .Application ()
244248 try :
245- self .router = Router (app , self .storages )
249+ self .router = Router (self . application , self .storages )
246250 self .router .init ()
251+ logger .tsuccess ("cluster.success.router.created" )
252+
253+ except Exception as e :
254+ logger .terror ("cluster.error.router.exception" , e = e )
255+
256+ async def listen (self , https : bool , port : int ) -> None :
257+ try :
247258 ssl_context = None
248259 if https :
249260 ssl_context = ssl .create_default_context (ssl .Purpose .SERVER_AUTH )
250261 ssl_context .load_cert_chain (
251262 certfile = Config .get ("advanced.paths.cert" ),
252- keyfile = Config .get ("advanced.paths.key" )
263+ keyfile = Config .get ("advanced.paths.key" ),
253264 )
254- self .server = web .AppRunner (app )
255- logger .tsuccess ("cluster.success.router.created" )
265+ self .server = web .AppRunner (self .application )
256266 await self .server .setup ()
257- site = web .TCPSite (self .server , "0.0.0.0" , port , ssl_context = ssl_context )
267+ site = web .TCPSite (self .server , "0.0.0.0" , port )
258268 await site .start ()
259- logger .tsuccess ("cluster.success.site.start" )
269+ logger .tsuccess ("cluster.success.listen" , port = port )
270+
260271 except Exception as e :
261- logger .terror ("cluster.error.router.exception" , e = e )
272+ logger .terror ('cluster.error.listen' )
273+
274+ async def enable (self ) -> None :
275+ if self .enabled :
276+ return
277+ logger .tinfo ("cluster.info.enabling" )
278+ future = asyncio .Future ()
279+
280+ async def callback (data : List [Any ]):
281+ error , ack = data
282+ future .set_result ((error , ack ))
283+
284+ if not self .socket :
285+ logger .terror ("cluster.error.disconnected" )
286+ return
287+
288+ try :
289+ await self .socket .socket .emit (
290+ "enable" ,
291+ data = {
292+ "host" : Config .get ("cluster.host" ),
293+ "port" : Config .get ("cluster.public_port" ),
294+ "version" : API_VERSION ,
295+ "byoc" : Config .get ("cluster.byoc" ),
296+ "noFastEnable" : True ,
297+ "flavor" : {
298+ "runtime" : f"python/{ sys .version .split ()[0 ]} python-openbmclapi/{ VERSION } "
299+ },
300+ },
301+ callback = callback ,
302+ )
303+
304+ error , ack = await future
305+
306+ if error :
307+ if isinstance (error , dict ) and 'message' in error :
308+ logger .terror ('cluster.error.enable.error' , e = error ['message' ])
309+
310+ if ack is not True :
311+ logger .terror ('cluster.error.enable.failed' )
312+
313+ except Exception as e :
314+ logger .terror ('cluster.error.enable.exception' , e = e )
262315
263316 async def connect (self ) -> None :
264317 self .socket = WebSocketClient (self .token .token )
0 commit comments