wslink 1.12.2__py3-none-any.whl → 1.12.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,6 +15,8 @@ import aiohttp.web as aiohttp_web
15
15
  MAX_MSG_SIZE = int(os.environ.get("WSLINK_MAX_MSG_SIZE", 4194304))
16
16
  HEART_BEAT = int(os.environ.get("WSLINK_HEART_BEAT", 30)) # 30 seconds
17
17
 
18
+ logger = logging.getLogger(__name__)
19
+
18
20
  # -----------------------------------------------------------------------------
19
21
  # HTTP helpers
20
22
  # -----------------------------------------------------------------------------
@@ -98,20 +100,20 @@ class WebAppServer(AbstractWebApp):
98
100
  self.app, handle_signals=self.handle_signals
99
101
  )
100
102
 
101
- logging.info("awaiting runner setup")
103
+ logger.info("awaiting runner setup")
102
104
  await self._runner.setup()
103
105
 
104
106
  self._site = aiohttp_web.TCPSite(
105
107
  self._runner, self.host, self.port, ssl_context=self.ssl_context
106
108
  )
107
109
 
108
- logging.info("awaiting site startup")
110
+ logger.info("awaiting site startup")
109
111
  await self._site.start()
110
112
 
111
113
  if port_callback is not None:
112
114
  port_callback(self.get_port())
113
115
 
114
- logging.info(f"Print WSLINK_READY_MSG")
116
+ logger.info("Print WSLINK_READY_MSG")
115
117
  STARTUP_MSG = os.environ.get("WSLINK_READY_MSG", "wslink: Starting factory")
116
118
  if STARTUP_MSG:
117
119
  # Emit an expected log message so launcher.py knows we've started up.
@@ -119,10 +121,10 @@ class WebAppServer(AbstractWebApp):
119
121
  # We've seen some issues with stdout buffering - be conservative.
120
122
  sys.stdout.flush()
121
123
 
122
- logging.info(f"Schedule auto shutdown with timout {self.timeout}")
124
+ logger.info(f"Schedule auto shutdown with timout {self.timeout}")
123
125
  self.shutdown_schedule()
124
126
 
125
- logging.info("awaiting running future")
127
+ logger.info("awaiting running future")
126
128
  await self.completion
127
129
 
128
130
  async def stop(self):
@@ -133,12 +135,12 @@ class WebAppServer(AbstractWebApp):
133
135
  # Neither site.stop() nor runner.cleanup() actually stop the server
134
136
  # as documented, but at least runner.cleanup() results in the
135
137
  # "on_shutdown" signal getting sent.
136
- logging.info("Performing runner.cleanup()")
138
+ logger.info("Performing runner.cleanup()")
137
139
  await self.runner.cleanup()
138
140
 
139
141
  # So to actually stop the server, the workaround is just to resolve
140
142
  # the future we awaited in the start method.
141
- logging.info("Stopping server")
143
+ logger.info("Stopping server")
142
144
  self.completion.set_result(True)
143
145
 
144
146
 
@@ -163,7 +165,7 @@ class ReverseWebAppServer(AbstractWebApp):
163
165
 
164
166
  def create_webserver(server_config):
165
167
  if "logging_level" in server_config and server_config["logging_level"]:
166
- logging.basicConfig(level=server_config["logging_level"])
168
+ logging.getLogger("wslink").setLevel(server_config["logging_level"])
167
169
 
168
170
  # Shortcut for reverse connection
169
171
  if "reverse_url" in server_config:
@@ -184,10 +186,10 @@ def is_binary(msg):
184
186
 
185
187
  class AioHttpWsHandler(WslinkHandler):
186
188
  async def disconnectClients(self):
187
- logging.info("Closing client connections:")
189
+ logger.info("Closing client connections:")
188
190
  keys = list(self.connections.keys())
189
191
  for client_id in keys:
190
- logging.info(" {0}".format(client_id))
192
+ logger.info(" {0}".format(client_id))
191
193
  ws = self.connections[client_id]
192
194
  await ws.close(
193
195
  code=aiohttp.WSCloseCode.GOING_AWAY, message="Server shutdown"
@@ -202,7 +204,7 @@ class AioHttpWsHandler(WslinkHandler):
202
204
  )
203
205
  self.connections[client_id] = current_ws
204
206
 
205
- logging.info("client {0} connected".format(client_id))
207
+ logger.info("client {0} connected".format(client_id))
206
208
 
207
209
  self.web_app.shutdown_cancel()
208
210
 
@@ -217,31 +219,31 @@ class AioHttpWsHandler(WslinkHandler):
217
219
  del self.connections[client_id]
218
220
  self.authentified_client_ids.discard(client_id)
219
221
 
220
- logging.info("client {0} disconnected".format(client_id))
222
+ logger.info("client {0} disconnected".format(client_id))
221
223
 
222
224
  if not self.connections:
223
- logging.info("No more connections, scheduling shutdown")
225
+ logger.info("No more connections, scheduling shutdown")
224
226
  self.web_app.shutdown_schedule()
225
227
 
226
228
  return current_ws
227
229
 
228
230
  async def reverse_connect_to(self, url):
229
- logging.debug("reverse_connect_to: running with url %s", url)
231
+ logger.debug("reverse_connect_to: running with url %s", url)
230
232
  client_id = self.reverse_connection_client_id
231
233
  async with aiohttp.ClientSession() as session:
232
- logging.debug("reverse_connect_to: client session started")
234
+ logger.debug("reverse_connect_to: client session started")
233
235
  async with session.ws_connect(url) as current_ws:
234
- logging.debug("reverse_connect_to: ws started")
236
+ logger.debug("reverse_connect_to: ws started")
235
237
  self.connections[client_id] = current_ws
236
- logging.debug("reverse_connect_to: onConnect")
238
+ logger.debug("reverse_connect_to: onConnect")
237
239
  await self.onConnect(url, client_id)
238
240
 
239
241
  async for msg in current_ws:
240
242
  if not current_ws.closed:
241
243
  await self.onMessage(is_binary(msg), msg, client_id)
242
244
 
243
- logging.debug("reverse_connect_to: onClose")
245
+ logger.debug("reverse_connect_to: onClose")
244
246
  await self.onClose(client_id)
245
247
  del self.connections[client_id]
246
248
 
247
- logging.debug("reverse_connect_to: exited")
249
+ logger.debug("reverse_connect_to: exited")
@@ -23,6 +23,8 @@ from wslink.launcher import (
23
23
  STATUS_NOT_FOUND,
24
24
  )
25
25
 
26
+ logger = logging.getLogger(__name__)
27
+
26
28
  # ===========================================================================
27
29
  # Launcher ENV configuration
28
30
  # ===========================================================================
@@ -50,7 +52,7 @@ class LauncherResource(object):
50
52
  def __del__(self):
51
53
  try:
52
54
  # causes an exception when server is killed with Ctrl-C
53
- logging.warning("Server factory shutting down. Stopping all processes")
55
+ logger.warning("Server factory shutting down. Stopping all processes")
54
56
  except:
55
57
  pass
56
58
 
@@ -141,17 +143,17 @@ class LauncherResource(object):
141
143
 
142
144
  if not id:
143
145
  message = "id not provided in GET request"
144
- logging.error(message)
146
+ logger.error(message)
145
147
  return aiohttp_web.json_response(
146
148
  {"error": message}, status=STATUS_BAD_REQUEST
147
149
  )
148
150
 
149
- logging.info("GET request received for id: %s" % id)
151
+ logger.info("GET request received for id: %s" % id)
150
152
 
151
153
  session = self.session_manager.getSession(id)
152
154
  if not session:
153
155
  message = "No session with id: %s" % id
154
- logging.error(message)
156
+ logger.error(message)
155
157
  return aiohttp_web.json_response(
156
158
  {"error": message}, status=STATUS_BAD_REQUEST
157
159
  )
@@ -170,17 +172,17 @@ class LauncherResource(object):
170
172
 
171
173
  if not id:
172
174
  message = "id not provided in DELETE request"
173
- logging.error(message)
175
+ logger.error(message)
174
176
  return aiohttp_web.json_response(
175
177
  {"error": message}, status=STATUS_BAD_REQUEST
176
178
  )
177
179
 
178
- logging.info("DELETE request received for id: %s" % id)
180
+ logger.info("DELETE request received for id: %s" % id)
179
181
 
180
182
  session = self.session_manager.getSession(id)
181
183
  if not session:
182
184
  message = "No session with id: %s" % id
183
- logging.error(message)
185
+ logger.error(message)
184
186
  return aiohttp_web.json_response(
185
187
  {"error": message}, status=STATUS_NOT_FOUND
186
188
  )
@@ -190,7 +192,7 @@ class LauncherResource(object):
190
192
  self.process_manager.stopProcess(id)
191
193
 
192
194
  message = "Deleted session with id: %s" % id
193
- logging.info(message)
195
+ logger.info(message)
194
196
 
195
197
  return aiohttp_web.json_response(session, status=STATUS_OK)
196
198
 
@@ -213,15 +215,17 @@ def startWebServer(options, config):
213
215
  # Setup logging
214
216
  logFileName = log_dir + os.sep + "launcherLog.log"
215
217
  formatting = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
216
- logging.basicConfig(
217
- level=logging.DEBUG, filename=logFileName, filemode="w", format=formatting
218
- )
218
+ # create file handler which logs even debug messages
219
+ fh = logging.FileHandler(logFileName, mode="w")
220
+ fh.setLevel(logging.DEBUG)
221
+ fh.setFormatter(logging.Formatter(formatting))
222
+ logging.getLogger("wslink").addHandler(fh)
219
223
  if options.debug:
220
224
  console = logging.StreamHandler(sys.stdout)
221
225
  console.setLevel(logging.INFO)
222
226
  formatter = logging.Formatter(formatting)
223
227
  console.setFormatter(formatter)
224
- logging.getLogger("").addHandler(console)
228
+ logging.getLogger("wslink").addHandler(console)
225
229
 
226
230
  web_app = aiohttp_web.Application()
227
231
 
@@ -377,8 +377,6 @@ def main(host=None, port=None, www_path=None, proxy_route=None, mode=None):
377
377
  if proxy_route is None:
378
378
  proxy_route = args.proxy_route
379
379
 
380
- logging.basicConfig()
381
-
382
380
  # Manage routes
383
381
  routes = []
384
382
 
@@ -74,6 +74,7 @@ class GenericServer(AbstractWebApp):
74
74
  def __init__(self, server_config):
75
75
  AbstractWebApp.__init__(self, server_config)
76
76
  self._websockets = {}
77
+ self._stop_event = asyncio.Event()
77
78
 
78
79
  if "ws" in server_config:
79
80
  for route, server_protocol in server_config["ws"].items():
@@ -111,7 +112,11 @@ class GenericServer(AbstractWebApp):
111
112
  if port_callback is not None:
112
113
  port_callback(self.get_port())
113
114
 
114
- await asyncio.Event().wait()
115
+ self._stop_event.clear()
116
+ await self._stop_event.wait()
117
+
118
+ async def stop(self):
119
+ self._stop_event.set()
115
120
 
116
121
 
117
122
  def startWebServer(*args, **kwargs):
@@ -120,7 +125,7 @@ def startWebServer(*args, **kwargs):
120
125
 
121
126
  def create_webserver(server_config):
122
127
  if "logging_level" in server_config and server_config["logging_level"]:
123
- logging.basicConfig(level=server_config["logging_level"])
128
+ logging.getLogger("wslink").setLevel(server_config["logging_level"])
124
129
 
125
130
  # Reverse connection
126
131
  if "reverse_url" in server_config:
wslink/launcher.py CHANGED
@@ -16,6 +16,8 @@ from random import choice
16
16
 
17
17
  from wslink import backends
18
18
 
19
+ logger = logging.getLogger(__name__)
20
+
19
21
  STATUS_OK = 200
20
22
  STATUS_BAD_REQUEST = 400
21
23
  STATUS_NOT_FOUND = 404
@@ -205,7 +207,7 @@ def checkSanitize(key_pair, sanitize):
205
207
  value = key_pair[key]
206
208
  if checkItem["type"] == "inList":
207
209
  if not value in checkItem["list"]:
208
- logging.warning(
210
+ logger.warning(
209
211
  "key %s: sanitize %s with default" % (key, key_pair[key])
210
212
  )
211
213
  key_pair[key] = checkItem["default"]
@@ -214,7 +216,7 @@ def checkSanitize(key_pair, sanitize):
214
216
  # User is responsible to add begin- and end- string symbols, to make sure entire string is matched.
215
217
  checkItem["compiled"] = re.compile(checkItem["regexp"])
216
218
  if checkItem["compiled"].match(value) == None:
217
- logging.warning(
219
+ logger.warning(
218
220
  "key %s: sanitize %s with default" % (key, key_pair[key])
219
221
  )
220
222
  key_pair[key] = checkItem["default"]
@@ -232,7 +234,7 @@ def replaceVariables(template_str, variable_list, sanitize):
232
234
  template_str = item_template.safe_substitute(key_pair)
233
235
 
234
236
  if "$" in template_str:
235
- logging.error("Some properties could not be resolved: " + template_str)
237
+ logger.error("Some properties could not be resolved: " + template_str)
236
238
 
237
239
  return template_str
238
240
 
@@ -441,8 +443,8 @@ class ProcessManager(object):
441
443
  )
442
444
  self.processes[session["id"]] = proc
443
445
  except:
444
- logging.error("The command line failed")
445
- logging.error(" ".join(map(str, session["cmd"])))
446
+ logger.error("The command line failed")
447
+ logger.error(" ".join(map(str, session["cmd"])))
446
448
  return None
447
449
 
448
450
  return proc
wslink/protocol.py CHANGED
@@ -17,6 +17,8 @@ RESULT_SERIALIZE_ERROR = -32002
17
17
  # used in client JS code:
18
18
  CLIENT_ERROR = -32099
19
19
 
20
+ logger = logging.getLogger(__name__)
21
+
20
22
 
21
23
  class AbstractWebApp:
22
24
  def __init__(self, server_config):
@@ -108,7 +110,7 @@ class AbstractWebApp:
108
110
 
109
111
  def shutdown_cancel(self):
110
112
  if self._shutdown_task is not None:
111
- logging.info("Canceling shutdown task")
113
+ logger.info("Canceling shutdown task")
112
114
  self._shutdown_task.cancel()
113
115
  self._shutdown_task = None
114
116
 
@@ -252,7 +254,7 @@ class WslinkHandler(object):
252
254
  payload = payload.decode("utf-8")
253
255
 
254
256
  rpc = json.loads(payload)
255
- logging.debug("wslink incoming msg %s" % self.payloadWithSecretStripped(rpc))
257
+ logger.debug("wslink incoming msg %s", self.payloadWithSecretStripped(rpc))
256
258
  if "id" not in rpc:
257
259
  # should be a binary attachment header
258
260
  if rpc.get("method") == "wslink.binary.attachment":
@@ -340,9 +342,9 @@ class WslinkHandler(object):
340
342
  )
341
343
  except Exception as e_inst:
342
344
  captured_trace = traceback.format_exc()
343
- logging.error("Exception raised")
344
- logging.error(repr(e_inst))
345
- logging.error(captured_trace)
345
+ logger.error("Exception raised")
346
+ logger.error(repr(e_inst))
347
+ logger.error(captured_trace)
346
348
  await self.sendWrappedError(
347
349
  rpcid,
348
350
  EXCEPTION_ERROR,
wslink/websocket.py CHANGED
@@ -9,6 +9,8 @@ import logging
9
9
  from . import register as exportRpc
10
10
  from . import schedule_callback
11
11
 
12
+ logger = logging.getLogger(__name__)
13
+
12
14
 
13
15
  # =============================================================================
14
16
  #
@@ -114,7 +116,7 @@ class ServerProtocol(object):
114
116
  try:
115
117
  self.linkProtocols.remove(protocol)
116
118
  except ValueError as e:
117
- logging.error("Link protocol missing from registered list.")
119
+ logger.error("Link protocol missing from registered list.")
118
120
 
119
121
  def getLinkProtocols(self):
120
122
  return self.linkProtocols
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wslink
3
- Version: 1.12.2
3
+ Version: 1.12.4
4
4
  Summary: Python/JavaScript library for communicating over WebSocket
5
5
  Home-page: https://github.com/kitware/wslink
6
6
  Author: Kitware, Inc.
@@ -1,24 +1,24 @@
1
1
  wslink/LICENSE,sha256=I44UH7kDVqxDLnnlOWw_hFL2Fz7RjQ_4vPzZv9NYgTU,1483
2
2
  wslink/__init__.py,sha256=AbEm-sUSoGL-uLpnbK1rSSjHSvyW-bMsGHWie7FgMHw,2708
3
- wslink/launcher.py,sha256=4l_z3l2xkRSiH8hWbZzjtsIbBeujl-P8bTA0TBtJEEg,21137
4
- wslink/protocol.py,sha256=AXBlQ4BD2iB7e3WHPedIv0fzgd05eBuNLQpXjX74j5U,18132
3
+ wslink/launcher.py,sha256=8VMs3juObLkyGYQFNLjMoo4qFpKIcxWz0kS-af-DKO4,21170
4
+ wslink/protocol.py,sha256=lI_xPZl3DsEbqdeyHzvHIvdfK-AlpiUqzc5vN8t6Ak8,18164
5
5
  wslink/publish.py,sha256=6xLr7tGkvbq5LbXbAvPQ6OplEBbs192WR-uhiTJMPdg,2354
6
6
  wslink/relay.py,sha256=E8Lzu2Ay7KbOheN1-ArAZawo8lLqdDgJXOZSBuMknYs,86
7
7
  wslink/server.py,sha256=FKSJAKHDyfkNVM45-M-y1Zn8hh2TTYto1hTCIJx1pp8,9440
8
8
  wslink/ssl_context.py,sha256=hNOJJCdrStws1Qf6vPvY4vTk9Bf8J5d90W3fS0cRv8o,2290
9
9
  wslink/uri.py,sha256=woCQ4yChUqTMg9IT6YYDtUYeKmCg7OUCEgeBGA-19DY,384
10
- wslink/websocket.py,sha256=REYYyKB4WweMuDruvPBA0oPOfhddPF9G5WIGiK367KA,4574
10
+ wslink/websocket.py,sha256=pBiWqkL8Zn8LuSJ9nv3yA-KjEynbolOQ2gLHtQFJ2Ic,4611
11
11
  wslink/backends/__init__.py,sha256=cyJGjm-YyBSyOEX81owyTbJ3YnrA6dB7--B4LnsEtHI,1214
12
- wslink/backends/aiohttp/__init__.py,sha256=FUPMwi0Z1nuVVIJhY_sI0ZzRY5ne30tmUILi7JQTgP4,8433
13
- wslink/backends/aiohttp/launcher.py,sha256=Itblr2-lX_ZpAInvLlGkl1_XrNYjIn3w469BDZ5XyyQ,8737
14
- wslink/backends/aiohttp/relay.py,sha256=Nn1ELqGU1kwvst4DNwNqYWU4nYd08K3STAMQIhcangY,13338
12
+ wslink/backends/aiohttp/__init__.py,sha256=u2UxSnaMJPoiba1CL1fOeM8bTggyOw6znQ2iGd69qJI,8463
13
+ wslink/backends/aiohttp/launcher.py,sha256=gHNMvtgNHEwBN_QBRDSCrTp2B4K1PsfV81rKaHi7Cxo,8897
14
+ wslink/backends/aiohttp/relay.py,sha256=oZAzIQTpsQaObWXaa-_VtoTOUQALC_QLDd9UvWspYaU,13311
15
15
  wslink/backends/generic/__init__.py,sha256=Qu65gWsd2xCSsxybnDtEDI5vMjHN-F5jgPZOyNIxnGs,112
16
- wslink/backends/generic/core.py,sha256=2BJrdCEyMe3OmT_h-wLeyw7QzpVTnm4O8zSkJmnDKyM,4003
16
+ wslink/backends/generic/core.py,sha256=Gwo7nksgph96i7J77nYm4hB5NwysybQ23rRs86f0d6U,4149
17
17
  wslink/backends/jupyter/__init__.py,sha256=Qu65gWsd2xCSsxybnDtEDI5vMjHN-F5jgPZOyNIxnGs,112
18
18
  wslink/backends/jupyter/core.py,sha256=H73IEEHyom3TsbhkyI5O88bFBbUIDzHVuvqbIF6PAIM,3858
19
19
  wslink/backends/tornado/__init__.py,sha256=Qu65gWsd2xCSsxybnDtEDI5vMjHN-F5jgPZOyNIxnGs,112
20
20
  wslink/backends/tornado/core.py,sha256=tPMkkhWuO_ovkisVim0zcegwZKEAG4IRUdd_O_0a_R0,2157
21
- wslink-1.12.2.dist-info/METADATA,sha256=8-AFhHSf_0o7CyM1zd5NQwlZFDcNhIHC4Q6mRXwY5yw,3016
22
- wslink-1.12.2.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
23
- wslink-1.12.2.dist-info/top_level.txt,sha256=N0d8eqvhwhfW1p1yPTmvxlbzhjz7ZyhBfysNvaFqpQY,7
24
- wslink-1.12.2.dist-info/RECORD,,
21
+ wslink-1.12.4.dist-info/METADATA,sha256=nd9iR5_IF8-flORecGE1-Gwibs3no1fPwj_1qaLPkdE,3016
22
+ wslink-1.12.4.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
23
+ wslink-1.12.4.dist-info/top_level.txt,sha256=N0d8eqvhwhfW1p1yPTmvxlbzhjz7ZyhBfysNvaFqpQY,7
24
+ wslink-1.12.4.dist-info/RECORD,,