synapse 2.209.0__py311-none-any.whl → 2.211.0__py311-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.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

Files changed (68) hide show
  1. synapse/lib/base.py +2 -3
  2. synapse/lib/cell.py +14 -4
  3. synapse/lib/coro.py +5 -0
  4. synapse/lib/json.py +48 -22
  5. synapse/lib/nexus.py +6 -0
  6. synapse/lib/node.py +1 -1
  7. synapse/lib/schemas.py +10 -1
  8. synapse/lib/share.py +0 -3
  9. synapse/lib/snap.py +3 -0
  10. synapse/lib/storm.py +10 -2
  11. synapse/lib/stormlib/auth.py +6 -0
  12. synapse/lib/stormlib/notifications.py +12 -2
  13. synapse/lib/stormtypes.py +2 -2
  14. synapse/lib/version.py +2 -2
  15. synapse/models/entity.py +26 -0
  16. synapse/models/inet.py +55 -0
  17. synapse/models/orgs.py +0 -1
  18. synapse/models/person.py +9 -2
  19. synapse/tests/test_cortex.py +3 -3
  20. synapse/tests/test_lib_aha.py +1 -1
  21. synapse/tests/test_lib_base.py +5 -0
  22. synapse/tests/test_lib_cell.py +28 -8
  23. synapse/tests/test_lib_coro.py +23 -0
  24. synapse/tests/test_lib_json.py +41 -16
  25. synapse/tests/test_lib_storm.py +20 -0
  26. synapse/tests/test_lib_stormtypes.py +16 -18
  27. synapse/tests/test_lib_view.py +14 -0
  28. synapse/tests/test_model_entity.py +21 -0
  29. synapse/tests/test_model_gov_intl.py +2 -2
  30. synapse/tests/test_model_inet.py +30 -0
  31. synapse/tests/test_model_media.py +1 -0
  32. synapse/tests/test_model_orgs.py +18 -2
  33. synapse/tests/test_model_person.py +12 -0
  34. synapse/tests/test_telepath.py +52 -41
  35. synapse/tests/test_tools_aha.py +7 -8
  36. synapse/tests/test_tools_genpkg.py +9 -0
  37. synapse/tests/utils.py +1 -1
  38. synapse/tools/aha/clone.py +7 -1
  39. synapse/tools/aha/easycert.py +37 -42
  40. synapse/tools/aha/enroll.py +7 -1
  41. synapse/tools/aha/list.py +60 -65
  42. synapse/tools/aha/mirror.py +7 -1
  43. synapse/tools/aha/provision/service.py +7 -1
  44. synapse/tools/aha/provision/user.py +7 -1
  45. synapse/tools/apikey.py +8 -1
  46. synapse/tools/autodoc.py +8 -2
  47. synapse/tools/axon2axon.py +7 -1
  48. synapse/tools/cellauth.py +6 -5
  49. synapse/tools/cmdr.py +2 -1
  50. synapse/tools/csvtool.py +7 -2
  51. synapse/tools/feed.py +8 -2
  52. synapse/tools/genpkg.py +16 -3
  53. synapse/tools/healthcheck.py +7 -1
  54. synapse/tools/livebackup.py +7 -3
  55. synapse/tools/modrole.py +7 -1
  56. synapse/tools/moduser.py +7 -2
  57. synapse/tools/promote.py +7 -3
  58. synapse/tools/pullfile.py +6 -1
  59. synapse/tools/pushfile.py +7 -1
  60. synapse/tools/reload.py +7 -4
  61. synapse/tools/rstorm.py +8 -2
  62. synapse/tools/snapshot.py +7 -1
  63. synapse/tools/storm.py +7 -1
  64. {synapse-2.209.0.dist-info → synapse-2.211.0.dist-info}/METADATA +2 -2
  65. {synapse-2.209.0.dist-info → synapse-2.211.0.dist-info}/RECORD +68 -67
  66. {synapse-2.209.0.dist-info → synapse-2.211.0.dist-info}/WHEEL +1 -1
  67. {synapse-2.209.0.dist-info → synapse-2.211.0.dist-info}/licenses/LICENSE +0 -0
  68. {synapse-2.209.0.dist-info → synapse-2.211.0.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,16 @@
1
1
  import os
2
2
  import ssl
3
+ import sys
3
4
  import socket
4
5
  import asyncio
5
6
  import logging
6
- import threading
7
+ import multiprocessing
7
8
 
8
9
  from unittest import mock
9
10
 
10
11
  import cryptography.hazmat.primitives.hashes as c_hashes
11
12
 
12
13
  import synapse.exc as s_exc
13
- import synapse.glob as s_glob
14
14
  import synapse.common as s_common
15
15
  import synapse.daemon as s_daemon
16
16
  import synapse.telepath as s_telepath
@@ -189,6 +189,40 @@ class TeleAuth(s_telepath.Aware):
189
189
  def getFooBar(self, x, y):
190
190
  return x + y
191
191
 
192
+ def run_telepath_sync_genr_break(url: str,
193
+ evt1: multiprocessing.Event,
194
+ evt2: multiprocessing.Event,):
195
+ '''
196
+ This is a Process target.
197
+ '''
198
+ with s_telepath.openurl(url) as prox:
199
+ form = 'test:int'
200
+
201
+ q = '[' + ' '.join([f'{form}={i}' for i in range(10)]) + ' ]'
202
+
203
+ # This puts a link into the link pool
204
+ emesg = 12
205
+ msgs = list(prox.storm(q, opts={'show': ('node', 'nodeedits')}))
206
+ assert len(msgs) == emesg, f'Got {len(msgs)} messages, expected {emesg}'
207
+
208
+ # Get the link from the pool, add the fini callback and put it back
209
+ # This involves reaching into the proxy internals to do so.
210
+ link = prox.links.popleft()
211
+ link.onfini(evt1.set)
212
+ prox.links.append(link)
213
+
214
+ # Break from the generator right away, causing a
215
+ # GeneratorExit in the GenrHelp object __iter__ method.
216
+ mesg = None
217
+ for mesg in prox.storm(q):
218
+ break
219
+ # Ensure the query did yield an object
220
+ assert mesg is not None, 'mesg was not recieved!'
221
+ assert link.isfini is True, 'link.fini was not set to true'
222
+
223
+ evt2.set()
224
+ sys.exit(137)
225
+
192
226
  class TeleTest(s_t_utils.SynTest):
193
227
 
194
228
  async def test_telepath_basics(self):
@@ -296,47 +330,20 @@ class TeleTest(s_t_utils.SynTest):
296
330
  async with await s_telepath.openurl('tcp://127.0.0.1/foo', port=dmon.addr[1]) as prox:
297
331
  self.eq((10, 20, 30), await s_coro.executor(sync))
298
332
 
299
- def test_telepath_sync_genr_break(self):
300
-
301
- try:
302
- acm = self.getTestCoreAndProxy()
303
- core, proxy = s_glob.sync(acm.__aenter__())
304
-
305
- form = 'test:int'
306
-
307
- q = '[' + ' '.join([f'{form}={i}' for i in range(10)]) + ' ]'
308
-
309
- # This puts a link into the link pool
310
- msgs = list(proxy.storm(q, opts={'show': ('node',)}))
311
- self.len(12, msgs)
333
+ async def test_telepath_sync_genr_break(self):
334
+ async with self.getTestCore() as core:
335
+ url = core.getLocalUrl()
312
336
 
313
- evt = threading.Event()
337
+ ctx = multiprocessing.get_context('spawn')
338
+ evt1 = ctx.Event()
339
+ evt2 = ctx.Event()
340
+ proc = ctx.Process(target=run_telepath_sync_genr_break, args=(url, evt1, evt2))
341
+ proc.start()
314
342
 
315
- # Get the link from the pool, add the fini callback and put it back
316
- link = s_glob.sync(proxy.getPoolLink())
317
- link.onfini(evt.set)
318
- s_glob.sync(proxy._putPoolLink(link))
319
-
320
- # Grab the fresh link from the pool so our original link is up next again
321
- link2 = s_glob.sync(proxy.getPoolLink())
322
- s_glob.sync(proxy._putPoolLink(link2))
323
-
324
- q = f'{form} | sleep 0.1'
325
-
326
- # Break from the generator right away, causing a
327
- # GeneratorExit in the GenrHelp object __iter__ method.
328
- mesg = None
329
- for mesg in proxy.storm(q):
330
- break
331
- # Ensure the query did yield an object
332
- self.nn(mesg)
333
-
334
- # Ensure the link we have a reference too was torn down
335
- self.true(evt.wait(4))
336
- self.true(link.isfini)
337
-
338
- finally:
339
- s_glob.sync(acm.__aexit__(None, None, None))
343
+ self.true(await s_coro.executor(evt1.wait, timeout=30))
344
+ self.true(await s_coro.executor(evt2.wait, timeout=30))
345
+ proc.join(timeout=30)
346
+ self.eq(proc.exitcode, 137)
340
347
 
341
348
  async def test_telepath_no_sess(self):
342
349
 
@@ -1016,6 +1023,10 @@ class TeleTest(s_t_utils.SynTest):
1016
1023
  self.len(1, await wait.wait(timeout=5))
1017
1024
  self.len(12, prox.links)
1018
1025
 
1026
+ # Cleanup our global state
1027
+ prox2._all_proxies.remove(prox2)
1028
+ await prox.fini()
1029
+
1019
1030
  async def test_link_fini_breaking_tasks(self):
1020
1031
  foo = Foo()
1021
1032
 
@@ -38,7 +38,7 @@ class AhaToolsTest(s_t_utils.SynTest):
38
38
  self.true(await waiter.wait(timeout=6))
39
39
 
40
40
  argv = [ahaurl]
41
- retn, outp = await self.execToolMain(s_a_list._main, argv)
41
+ retn, outp = await self.execToolMain(s_a_list.main, argv)
42
42
  self.eq(retn, 0)
43
43
 
44
44
  outp.expect('''
@@ -48,7 +48,7 @@ class AhaToolsTest(s_t_utils.SynTest):
48
48
  ''', whitespace=False)
49
49
 
50
50
  argv = [ahaurl, 'demo.net']
51
- retn, outp = await self.execToolMain(s_a_list._main, argv)
51
+ retn, outp = await self.execToolMain(s_a_list.main, argv)
52
52
  self.eq(retn, 0)
53
53
  outp.expect('Service network', whitespace=False)
54
54
  outp.expect('cell0 demo.net', whitespace=False)
@@ -56,7 +56,7 @@ class AhaToolsTest(s_t_utils.SynTest):
56
56
  async with self.getTestCore() as core:
57
57
  curl = core.getLocalUrl()
58
58
  argv = [curl]
59
- retn, outp = await self.execToolMain(s_a_list._main, argv)
59
+ retn, outp = await self.execToolMain(s_a_list.main, argv)
60
60
  self.eq(1, retn)
61
61
  outp.expect(f'Service at {curl} is not an Aha server')
62
62
 
@@ -67,18 +67,17 @@ class AhaToolsTest(s_t_utils.SynTest):
67
67
  'dmon:listen': ephemeral_address}) as aha:
68
68
  _, port = aha.sockaddr
69
69
  ahaurl = f'tcp://root:root@127.0.0.1:{port}'
70
-
71
- with self.getTestDir() as dirn:
70
+ with self.getTestSynDir() as syndir, self.getTestDir() as dirn:
72
71
  argvbase = ['-a', ahaurl, '--certdir', dirn]
73
72
  argv = argvbase + ['--ca', 'demo.net']
74
- retn, outp = await self.execToolMain(s_a_easycert._main, argv)
73
+ retn, outp = await self.execToolMain(s_a_easycert.main, argv)
75
74
  self.eq(retn, 0)
76
75
  outp.expect('Saved CA cert')
77
76
  outp.expect('cas/demo.net.crt')
78
77
 
79
78
  argv = argvbase + ['--server', '--server-sans', 'DNS:beeper.demo.net,DNS:booper.demo.net',
80
79
  '--network', 'demo.net', 'beep.demo.net']
81
- retn, outp = await self.execToolMain(s_a_easycert._main, argv)
80
+ retn, outp = await self.execToolMain(s_a_easycert.main, argv)
82
81
  self.eq(retn, 0)
83
82
  outp.expect('key saved')
84
83
  outp.expect('hosts/beep.demo.net.key')
@@ -86,7 +85,7 @@ class AhaToolsTest(s_t_utils.SynTest):
86
85
  outp.expect('hosts/beep.demo.net.crt')
87
86
 
88
87
  argv = argvbase + ['--network', 'demo.net', 'mallory@demo.net']
89
- retn, outp = await self.execToolMain(s_a_easycert._main, argv)
88
+ retn, outp = await self.execToolMain(s_a_easycert.main, argv)
90
89
  self.eq(retn, 0)
91
90
  outp.expect('key saved')
92
91
  outp.expect('users/mallory@demo.net.key')
@@ -3,6 +3,9 @@ import stat
3
3
 
4
4
  import synapse.exc as s_exc
5
5
  import synapse.common as s_common
6
+
7
+ import synapse.lib.version as s_version
8
+
6
9
  import synapse.tests.utils as s_test
7
10
  import synapse.tests.files as s_files
8
11
 
@@ -159,6 +162,12 @@ class GenPkgTest(s_test.SynTest):
159
162
  wflow = pdef['optic']['workflows']['testpkg-baz']
160
163
  self.eq(wflow, {'name': 'real-baz', 'desc': 'this is the real baz desc'})
161
164
 
165
+ build = pdef.get('build')
166
+ self.nn(build)
167
+ self.nn(build.get('time'))
168
+ self.eq(build.get('synapse:version'), s_version.verstring)
169
+ self.eq(build.get('synapse:commit'), s_version.commit)
170
+
162
171
  # nodocs
163
172
  nodocspath = s_common.genpath(core.dirn, 'testpkg_nodocs.json')
164
173
  argv = ('--no-docs', '--save', nodocspath, ymlpath)
synapse/tests/utils.py CHANGED
@@ -864,7 +864,7 @@ class HttpReflector(s_httpapi.Handler):
864
864
  for k, items in self.request.arguments.items():
865
865
  for v in items:
866
866
  d[k].append(v.decode())
867
- return d
867
+ return dict(d)
868
868
 
869
869
  async def get(self):
870
870
  resp = {}
@@ -5,6 +5,7 @@ import argparse
5
5
  import synapse.exc as s_exc
6
6
  import synapse.telepath as s_telepath
7
7
 
8
+ import synapse.lib.coro as s_coro
8
9
  import synapse.lib.output as s_output
9
10
 
10
11
  descr = '''
@@ -48,5 +49,10 @@ async def main(argv, outp=s_output.stdout):
48
49
  outp.printf(f'ERROR: {mesg}')
49
50
  return 1
50
51
 
52
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
53
+ ret = await main(argv, outp=outp)
54
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
55
+ return ret
56
+
51
57
  if __name__ == '__main__': # pragma: no cover
52
- sys.exit(asyncio.run(main(sys.argv[1:])))
58
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
@@ -8,13 +8,14 @@ import cryptography.x509 as c_x509
8
8
  import synapse.common as s_common
9
9
  import synapse.telepath as s_telepath
10
10
 
11
+ import synapse.lib.coro as s_coro
11
12
  import synapse.lib.output as s_output
12
13
  import synapse.lib.certdir as s_certdir
13
14
 
14
15
 
15
16
  logger = logging.getLogger(__name__)
16
17
 
17
- async def _main(argv, outp):
18
+ async def main(argv, outp=s_output.stdout):
18
19
  pars = getArgParser()
19
20
  opts = pars.parse_args(argv)
20
21
 
@@ -22,36 +23,36 @@ async def _main(argv, outp):
22
23
  s_common.deprecated('--network option.', curv='v2.206.0')
23
24
 
24
25
  cdir = s_certdir.CertDir(path=opts.certdir)
25
-
26
- async with await s_telepath.openurl(opts.aha) as prox:
27
-
28
- name = opts.name
29
-
30
- if opts.ca:
31
- # A User may only have get permissions; so try get first
32
- # before attempting to generate a new CA.
33
- certbyts = await prox.getCaCert(name)
34
- if not certbyts:
35
- s_common.deprecated('AHA CA certificate generation.', curv='v2.206.0')
36
- certbyts = await prox.genCaCert(name)
37
- cert = c_x509.load_pem_x509_certificate(certbyts.encode())
38
- path = cdir._saveCertTo(cert, 'cas', f'{name}.crt')
39
- outp.printf(f'Saved CA cert to {path}')
40
- return 0
41
- elif opts.server:
42
- csr = cdir.genHostCsr(name, outp=outp)
43
- certbyts = await prox.signHostCsr(csr.decode(), signas=opts.network, sans=opts.server_sans)
44
- cert = c_x509.load_pem_x509_certificate(certbyts.encode())
45
- path = cdir._saveCertTo(cert, 'hosts', f'{name}.crt')
46
- outp.printf(f'crt saved: {path}')
47
- return 0
48
- else:
49
- csr = cdir.genUserCsr(name, outp=outp)
50
- certbyts = await prox.signUserCsr(csr.decode(), signas=opts.network)
51
- cert = c_x509.load_pem_x509_certificate(certbyts.encode())
52
- path = cdir._saveCertTo(cert, 'users', f'{name}.crt')
53
- outp.printf(f'crt saved: {path}')
54
- return 0
26
+ async with s_telepath.withTeleEnv():
27
+ async with await s_telepath.openurl(opts.aha) as prox:
28
+
29
+ name = opts.name
30
+
31
+ if opts.ca:
32
+ # A User may only have get permissions; so try get first
33
+ # before attempting to generate a new CA.
34
+ certbyts = await prox.getCaCert(name)
35
+ if not certbyts:
36
+ s_common.deprecated('AHA CA certificate generation.', curv='v2.206.0')
37
+ certbyts = await prox.genCaCert(name)
38
+ cert = c_x509.load_pem_x509_certificate(certbyts.encode())
39
+ path = cdir._saveCertTo(cert, 'cas', f'{name}.crt')
40
+ outp.printf(f'Saved CA cert to {path}')
41
+ return 0
42
+ elif opts.server:
43
+ csr = cdir.genHostCsr(name, outp=outp)
44
+ certbyts = await prox.signHostCsr(csr.decode(), signas=opts.network, sans=opts.server_sans)
45
+ cert = c_x509.load_pem_x509_certificate(certbyts.encode())
46
+ path = cdir._saveCertTo(cert, 'hosts', f'{name}.crt')
47
+ outp.printf(f'crt saved: {path}')
48
+ return 0
49
+ else:
50
+ csr = cdir.genUserCsr(name, outp=outp)
51
+ certbyts = await prox.signUserCsr(csr.decode(), signas=opts.network)
52
+ cert = c_x509.load_pem_x509_certificate(certbyts.encode())
53
+ path = cdir._saveCertTo(cert, 'users', f'{name}.crt')
54
+ outp.printf(f'crt saved: {path}')
55
+ return 0
55
56
 
56
57
  def getArgParser():
57
58
  desc = 'CLI tool to generate simple x509 certificates from an Aha server.'
@@ -74,17 +75,11 @@ def getArgParser():
74
75
 
75
76
  return pars
76
77
 
77
- async def main(argv, outp=None): # pragma: no cover
78
-
79
- if outp is None:
80
- outp = s_output.stdout
81
-
78
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
82
79
  s_common.setlogging(logger, 'WARNING')
83
-
84
- async with s_telepath.withTeleEnv():
85
- await _main(argv, outp)
86
-
87
- return 0
80
+ ret = await main(argv, outp=outp)
81
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
82
+ return ret
88
83
 
89
84
  if __name__ == '__main__': # pragma: no cover
90
- sys.exit(asyncio.run(main(sys.argv[1:])))
85
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
@@ -6,6 +6,7 @@ import argparse
6
6
  import synapse.common as s_common
7
7
  import synapse.telepath as s_telepath
8
8
 
9
+ import synapse.lib.coro as s_coro
9
10
  import synapse.lib.output as s_output
10
11
  import synapse.lib.certdir as s_certdir
11
12
  import synapse.lib.msgpack as s_msgpack
@@ -99,5 +100,10 @@ async def main(argv, outp=s_output.stdout):
99
100
 
100
101
  return 0
101
102
 
103
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
104
+ ret = await main(argv, outp=outp)
105
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
106
+ return ret
107
+
102
108
  if __name__ == '__main__': # pragma: no cover
103
- sys.exit(asyncio.run(main(sys.argv[1:])))
109
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
synapse/tools/aha/list.py CHANGED
@@ -1,12 +1,12 @@
1
1
  import sys
2
2
  import asyncio
3
3
  import logging
4
- import contextlib
5
4
 
6
5
  import synapse.exc as s_exc
7
6
  import synapse.common as s_common
8
7
  import synapse.telepath as s_telepath
9
8
 
9
+ import synapse.lib.coro as s_coro
10
10
  import synapse.lib.output as s_output
11
11
  import synapse.lib.version as s_version
12
12
 
@@ -14,76 +14,71 @@ logger = logging.getLogger(__name__)
14
14
 
15
15
  reqver = '>=2.11.0,<3.0.0'
16
16
 
17
- async def _main(argv, outp):
18
-
19
- async with await s_telepath.openurl(argv[0]) as prox:
20
- try:
21
- s_version.reqVersion(prox._getSynVers(), reqver)
22
- except s_exc.BadVersion as e: # pragma: no cover
23
- valu = s_version.fmtVersion(*e.get('valu'))
24
- outp.printf(f'Proxy version {valu} is outside of the aha supported range ({reqver}).')
25
- return 1
26
- classes = prox._getClasses()
27
- if 'synapse.lib.aha.AhaApi' not in classes:
28
- outp.printf(f'Service at {argv[0]} is not an Aha server')
29
- return 1
30
-
31
- try:
32
- network = argv[1]
33
- except IndexError:
34
- network = None
35
-
36
- mesg = f"{'Service':<20s} {'network':<30s} {'leader':<6} {'online':<6} {'scheme':<6} {'host':<20} {'port':<5} connection opts"
37
- outp.printf(mesg)
38
-
39
- svcs = []
40
- ldrs = set()
41
- async for svc in prox.getAhaSvcs(network):
42
- svcinfo = svc.get('svcinfo')
43
- if svcinfo and svc.get('svcname') == svcinfo.get('leader'):
44
- ldrs.add(svcinfo.get('run'))
45
- svcs.append(svc)
46
-
47
- for svc in svcs:
48
- svcname = svc.pop('svcname')
49
- svcnetw = svc.pop('svcnetw')
50
-
51
- svcinfo = svc.pop('svcinfo')
52
- urlinfo = svcinfo.pop('urlinfo')
53
- online = str(bool(svcinfo.pop('online', False)))
54
- host = urlinfo.pop('host')
55
- port = str(urlinfo.pop('port'))
56
- scheme = urlinfo.pop('scheme')
57
-
58
- leader = 'None'
59
- if svcinfo.get('leader') is not None:
60
- if svcinfo.get('run') in ldrs:
61
- leader = 'True'
62
- else:
63
- leader = 'False'
64
-
65
- mesg = f'{svcname:<20s} {svcnetw:<30s} {leader:<6} {online:<6} {scheme:<6} {host:<20} {port:<5}'
66
- if svc:
67
- mesg = f'{mesg} {svc}'
68
-
69
- outp.printf(mesg)
70
- return 0
71
-
72
- async def main(argv, outp=None): # pragma: no cover
73
-
74
- if outp is None:
75
- outp = s_output.stdout
17
+ async def main(argv, outp=s_output.stdout):
76
18
 
77
19
  if len(argv) not in (1, 2):
78
20
  outp.printf('usage: python -m synapse.tools.aha.list <url> [network name]')
79
21
  return 1
80
22
 
81
- s_common.setlogging(logger, 'WARNING')
82
-
83
23
  async with s_telepath.withTeleEnv():
84
- await _main(argv, outp)
24
+ async with await s_telepath.openurl(argv[0]) as prox:
25
+ try:
26
+ s_version.reqVersion(prox._getSynVers(), reqver)
27
+ except s_exc.BadVersion as e: # pragma: no cover
28
+ valu = s_version.fmtVersion(*e.get('valu'))
29
+ outp.printf(f'Proxy version {valu} is outside of the aha supported range ({reqver}).')
30
+ return 1
31
+ classes = prox._getClasses()
32
+ if 'synapse.lib.aha.AhaApi' not in classes:
33
+ outp.printf(f'Service at {argv[0]} is not an Aha server')
34
+ return 1
35
+
36
+ try:
37
+ network = argv[1]
38
+ except IndexError:
39
+ network = None
40
+
41
+ mesg = f"{'Service':<20s} {'network':<30s} {'leader':<6} {'online':<6} {'scheme':<6} {'host':<20} {'port':<5} connection opts"
42
+ outp.printf(mesg)
85
43
 
86
- return 0
44
+ svcs = []
45
+ ldrs = set()
46
+ async for svc in prox.getAhaSvcs(network):
47
+ svcinfo = svc.get('svcinfo')
48
+ if svcinfo and svc.get('svcname') == svcinfo.get('leader'):
49
+ ldrs.add(svcinfo.get('run'))
50
+ svcs.append(svc)
51
+
52
+ for svc in svcs:
53
+ svcname = svc.pop('svcname')
54
+ svcnetw = svc.pop('svcnetw')
55
+
56
+ svcinfo = svc.pop('svcinfo')
57
+ urlinfo = svcinfo.pop('urlinfo')
58
+ online = str(bool(svcinfo.pop('online', False)))
59
+ host = urlinfo.pop('host')
60
+ port = str(urlinfo.pop('port'))
61
+ scheme = urlinfo.pop('scheme')
62
+
63
+ leader = 'None'
64
+ if svcinfo.get('leader') is not None:
65
+ if svcinfo.get('run') in ldrs:
66
+ leader = 'True'
67
+ else:
68
+ leader = 'False'
69
+
70
+ mesg = f'{svcname:<20s} {svcnetw:<30s} {leader:<6} {online:<6} {scheme:<6} {host:<20} {port:<5}'
71
+ if svc:
72
+ mesg = f'{mesg} {svc}'
73
+
74
+ outp.printf(mesg)
75
+ return 0
76
+
77
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
78
+ s_common.setlogging(logger, 'WARNING')
79
+ ret = await main(argv, outp=outp)
80
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
81
+ return ret
87
82
 
88
83
  if __name__ == '__main__': # pragma: no cover
89
- sys.exit(asyncio.run(main(sys.argv[1:])))
84
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
@@ -6,6 +6,7 @@ import synapse.exc as s_exc
6
6
  import synapse.common as s_common
7
7
  import synapse.telepath as s_telepath
8
8
 
9
+ import synapse.lib.coro as s_coro
9
10
  import synapse.lib.output as s_output
10
11
  import synapse.lib.version as s_version
11
12
 
@@ -191,5 +192,10 @@ async def main(argv, outp=s_output.stdout):
191
192
  outp.printf(f'ERROR: {mesg}')
192
193
  return 1
193
194
 
195
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
196
+ ret = await main(argv, outp=outp)
197
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
198
+ return ret
199
+
194
200
  if __name__ == '__main__': # pragma: no cover
195
- sys.exit(asyncio.run(main(sys.argv[1:])))
201
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
@@ -6,6 +6,7 @@ import synapse.exc as s_exc
6
6
  import synapse.common as s_common
7
7
  import synapse.telepath as s_telepath
8
8
 
9
+ import synapse.lib.coro as s_coro
9
10
  import synapse.lib.output as s_output
10
11
 
11
12
  descr = '''
@@ -78,5 +79,10 @@ async def main(argv, outp=s_output.stdout):
78
79
  outp.printf(f'ERROR: {mesg}')
79
80
  return 1
80
81
 
82
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
83
+ ret = await main(argv, outp=outp)
84
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
85
+ return ret
86
+
81
87
  if __name__ == '__main__': # pragma: no cover
82
- sys.exit(asyncio.run(main(sys.argv[1:])))
88
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
@@ -5,6 +5,7 @@ import argparse
5
5
  import synapse.exc as s_exc
6
6
  import synapse.telepath as s_telepath
7
7
 
8
+ import synapse.lib.coro as s_coro
8
9
  import synapse.lib.output as s_output
9
10
 
10
11
  descr = '''
@@ -49,5 +50,10 @@ async def main(argv, outp=s_output.stdout):
49
50
  outp.printf(f'ERROR: {mesg}')
50
51
  return 1
51
52
 
53
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
54
+ ret = await main(argv, outp=outp)
55
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
56
+ return ret
57
+
52
58
  if __name__ == '__main__': # pragma: no cover
53
- sys.exit(asyncio.run(main(sys.argv[1:])))
59
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
synapse/tools/apikey.py CHANGED
@@ -5,6 +5,7 @@ import argparse
5
5
  import synapse.exc as s_exc
6
6
  import synapse.telepath as s_telepath
7
7
 
8
+ import synapse.lib.coro as s_coro
8
9
  import synapse.lib.time as s_time
9
10
  import synapse.lib.output as s_output
10
11
 
@@ -89,5 +90,11 @@ async def main(argv, outp=s_output.stdout):
89
90
 
90
91
  return 0
91
92
 
93
+
94
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
95
+ ret = await main(argv, outp=outp)
96
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
97
+ return ret
98
+
92
99
  if __name__ == '__main__': # pragma: no cover
93
- sys.exit(asyncio.run(main(sys.argv[1:])))
100
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
synapse/tools/autodoc.py CHANGED
@@ -12,6 +12,7 @@ import synapse.common as s_common
12
12
  import synapse.cortex as s_cortex
13
13
  import synapse.telepath as s_telepath
14
14
 
15
+ import synapse.lib.coro as s_coro
15
16
  import synapse.lib.json as s_json
16
17
  import synapse.lib.storm as s_storm
17
18
  import synapse.lib.config as s_config
@@ -1041,6 +1042,11 @@ def makeargparser():
1041
1042
 
1042
1043
  return pars
1043
1044
 
1044
- if __name__ == '__main__': # pragma: no cover
1045
+ async def _main(argv, outp=None): # pragma: no cover
1045
1046
  s_common.setlogging(logger, 'DEBUG')
1046
- asyncio.run(main(sys.argv[1:]))
1047
+ ret = await main(argv, outp=outp)
1048
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
1049
+ return ret
1050
+
1051
+ if __name__ == '__main__': # pragma: no cover
1052
+ asyncio.run(_main(sys.argv[1:]))
@@ -8,6 +8,7 @@ import synapse.telepath as s_telepath
8
8
  import synapse.exc as s_exc
9
9
  import synapse.lib.cmd as s_cmd
10
10
  import synapse.lib.base as s_base
11
+ import synapse.lib.coro as s_coro
11
12
  import synapse.lib.output as s_output
12
13
 
13
14
  logger = logging.getLogger(__name__)
@@ -42,5 +43,10 @@ async def main(argv, outp=s_output.stdout):
42
43
  await fd.save()
43
44
  return 0
44
45
 
46
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
47
+ ret = await main(argv, outp=outp)
48
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
49
+ return ret
50
+
45
51
  if __name__ == '__main__': # pragma: no cover
46
- sys.exit(asyncio.run(main(sys.argv[1:])))
52
+ sys.exit(asyncio.run(_main(sys.argv[1:])))
synapse/tools/cellauth.py CHANGED
@@ -1,4 +1,3 @@
1
- import os
2
1
  import sys
3
2
  import asyncio
4
3
  import logging
@@ -7,10 +6,10 @@ import traceback
7
6
  import synapse.exc as s_exc
8
7
  import synapse.common as s_common
9
8
 
10
- import synapse.glob as s_glob
11
9
  import synapse.telepath as s_telepath
12
10
 
13
11
  import synapse.lib.cmd as s_cmd
12
+ import synapse.lib.coro as s_coro
14
13
  import synapse.lib.output as s_output
15
14
  import synapse.lib.version as s_version
16
15
 
@@ -338,9 +337,11 @@ def makeargparser():
338
337
  pars_mod.set_defaults(func=handleModify)
339
338
  return pars
340
339
 
341
- async def _main(): # pragma: no cover
340
+ async def _main(argv, outp=s_output.stdout): # pragma: no cover
342
341
  s_common.setlogging(logger, 'DEBUG')
343
- return await main(sys.argv[1:])
342
+ ret = await main(argv, outprint=outp)
343
+ await asyncio.wait_for(s_coro.await_bg_tasks(), timeout=60)
344
+ return ret
344
345
 
345
346
  if __name__ == '__main__': # pragma: no cover
346
- sys.exit(s_glob.sync(_main()))
347
+ sys.exit(asyncio.run(_main(sys.argv[1:])))