synapse 2.185.0__py311-none-any.whl → 2.186.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.

synapse/cortex.py CHANGED
@@ -2056,9 +2056,10 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
2056
2056
  continue
2057
2057
 
2058
2058
  if not regex.fullmatch(regx[i], parts[i]):
2059
- return False
2059
+ mesg = f'Tag part ({parts[i]}) of tag ({tagname}) does not match the tag model regex: [{regx[i]}]'
2060
+ return (False, mesg)
2060
2061
 
2061
- return True
2062
+ return (True, None)
2062
2063
 
2063
2064
  async def getTagPrune(self, tagname):
2064
2065
  return self.tagprune.get(tagname)
synapse/exc.py CHANGED
@@ -141,6 +141,8 @@ class BadTag(SynErr): pass
141
141
  class BadTime(SynErr): pass
142
142
  class BadUrl(SynErr): pass
143
143
 
144
+ class TypeMismatch(SynErr): pass
145
+
144
146
  class CantDelCmd(SynErr): pass
145
147
  class CantDelNode(SynErr): pass
146
148
  class CantDelForm(SynErr): pass
synapse/lib/ast.py CHANGED
@@ -4579,7 +4579,7 @@ class EditTagAdd(Edit):
4579
4579
  else:
4580
4580
  oper_offset = 0
4581
4581
 
4582
- excignore = (s_exc.BadTypeValu, s_exc.BadTag) if oper_offset == 1 else ()
4582
+ excignore = (s_exc.BadTypeValu,) if oper_offset == 1 else ()
4583
4583
 
4584
4584
  hasval = len(self.kids) > 2 + oper_offset
4585
4585
 
synapse/lib/cell.py CHANGED
@@ -35,6 +35,7 @@ import synapse.lib.boss as s_boss
35
35
  import synapse.lib.coro as s_coro
36
36
  import synapse.lib.hive as s_hive
37
37
  import synapse.lib.link as s_link
38
+ import synapse.lib.task as s_task
38
39
  import synapse.lib.cache as s_cache
39
40
  import synapse.lib.const as s_const
40
41
  import synapse.lib.drive as s_drive
@@ -206,6 +207,14 @@ class CellApi(s_base.Base):
206
207
  async def initCellApi(self):
207
208
  pass
208
209
 
210
+ @adminapi(log=True)
211
+ async def freeze(self, timeout=30):
212
+ return await self.cell.freeze(timeout=timeout)
213
+
214
+ @adminapi(log=True)
215
+ async def resume(self):
216
+ return await self.cell.resume()
217
+
209
218
  async def allowed(self, perm, default=None):
210
219
  '''
211
220
  Check if the user has the requested permission.
@@ -1102,6 +1111,7 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
1102
1111
  self.auth = None
1103
1112
  self.cellparent = parent
1104
1113
  self.sessions = {}
1114
+ self.paused = False
1105
1115
  self.isactive = False
1106
1116
  self.activebase = None
1107
1117
  self.inaugural = False
@@ -1767,8 +1777,11 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
1767
1777
 
1768
1778
  return await self.drive.addItemInfo(info, path=path, reldir=reldir)
1769
1779
 
1770
- async def getDriveInfo(self, iden):
1771
- return self.drive.getItemInfo(iden)
1780
+ async def getDriveInfo(self, iden, typename=None):
1781
+ return self.drive.getItemInfo(iden, typename=typename)
1782
+
1783
+ def reqDriveInfo(self, iden, typename=None):
1784
+ return self.drive.reqItemInfo(iden, typename=typename)
1772
1785
 
1773
1786
  async def getDrivePath(self, path, reldir=s_drive.rootdir):
1774
1787
  '''
@@ -4461,6 +4474,7 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
4461
4474
  'run': await self.getCellRunId(),
4462
4475
  'type': self.getCellType(),
4463
4476
  'iden': self.getCellIden(),
4477
+ 'paused': self.paused,
4464
4478
  'active': self.isactive,
4465
4479
  'started': self.startms,
4466
4480
  'ready': self.nexsroot.ready.is_set(),
@@ -4932,3 +4946,52 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
4932
4946
 
4933
4947
  key = tuple(sorted(opts.items()))
4934
4948
  return self._sslctx_cache.get(key)
4949
+
4950
+ async def freeze(self, timeout=30):
4951
+
4952
+ if self.paused:
4953
+ mesg = 'The service is already frozen.'
4954
+ raise s_exc.BadState(mesg=mesg)
4955
+
4956
+ logger.warning(f'Freezing service for volume snapshot.')
4957
+
4958
+ logger.warning('...acquiring nexus lock to prevent edits.')
4959
+
4960
+ try:
4961
+ await asyncio.wait_for(self.nexslock.acquire(), timeout=timeout)
4962
+
4963
+ except asyncio.TimeoutError:
4964
+ logger.warning('...nexus lock acquire timed out!')
4965
+ logger.warning('Aborting freeze and resuming normal operation.')
4966
+
4967
+ mesg = 'Nexus lock acquire timed out.'
4968
+ raise s_exc.TimeOut(mesg=mesg)
4969
+
4970
+ self.paused = True
4971
+
4972
+ try:
4973
+
4974
+ logger.warning('...committing pending transactions.')
4975
+ await self.slab.syncLoopOnce()
4976
+
4977
+ logger.warning('...flushing dirty buffers to disk.')
4978
+ await s_task.executor(os.sync)
4979
+
4980
+ logger.warning('...done!')
4981
+
4982
+ except Exception:
4983
+ self.paused = False
4984
+ self.nexslock.release()
4985
+ logger.exception('Failed to freeze. Resuming normal operation.')
4986
+ raise
4987
+
4988
+ async def resume(self):
4989
+
4990
+ if not self.paused:
4991
+ mesg = 'The service is not frozen.'
4992
+ raise s_exc.BadState(mesg=mesg)
4993
+
4994
+ logger.warning('Resuming normal operations from a freeze.')
4995
+
4996
+ self.paused = False
4997
+ self.nexslock.release()
synapse/lib/drive.py CHANGED
@@ -22,6 +22,7 @@ LKEY_INFO = b'\x02' # <bidn> = <info>
22
22
  LKEY_DATA = b'\x03' # <bidn> <vers> = <data>
23
23
  LKEY_VERS = b'\x04' # <bidn> <vers> = <versinfo>
24
24
  LKEY_INFO_BYTYPE = b'\x05' # <type> 00 <bidn> = 01
25
+ LKEY_TYPE_VERS = b'\x06' # <type> = <uint64>
25
26
 
26
27
  rootdir = '00000000000000000000000000000000'
27
28
 
@@ -60,24 +61,36 @@ class Drive(s_base.Base):
60
61
 
61
62
  return [reqValidName(p.strip().lower()) for p in path]
62
63
 
63
- def getItemInfo(self, iden):
64
- return self._getItemInfo(s_common.uhex(iden))
64
+ def _reqInfoType(self, info, typename):
65
+ infotype = info.get('type')
66
+ if infotype != typename:
67
+ mesg = f'Drive item has the wrong type. Expected: {typename} got {infotype}.'
68
+ raise s_exc.TypeMismatch(mesg=mesg, expected=typename, got=infotype)
69
+
70
+ def getItemInfo(self, iden, typename=None):
71
+ info = self._getItemInfo(s_common.uhex(iden))
72
+ if typename is not None:
73
+ self._reqInfoType(info, typename)
74
+ return info
65
75
 
66
76
  def _getItemInfo(self, bidn):
67
77
  byts = self.slab.get(LKEY_INFO + bidn, db=self.dbname)
68
78
  if byts is not None:
69
79
  return s_msgpack.un(byts)
70
80
 
71
- def reqItemInfo(self, iden):
72
- return self._reqItemInfo(s_common.uhex(iden))
81
+ def reqItemInfo(self, iden, typename=None):
82
+ return self._reqItemInfo(s_common.uhex(iden), typename=typename)
73
83
 
74
- def _reqItemInfo(self, bidn):
84
+ def _reqItemInfo(self, bidn, typename=None):
75
85
  info = self._getItemInfo(bidn)
76
- if info is not None:
77
- return info
86
+ if info is None:
87
+ mesg = f'No drive item with ID {s_common.ehex(bidn)}.'
88
+ raise s_exc.NoSuchIden(mesg=mesg)
78
89
 
79
- mesg = f'No drive item with ID {s_common.ehex(bidn)}.'
80
- raise s_exc.NoSuchIden(mesg=mesg)
90
+ if typename is not None:
91
+ self._reqInfoType(info, typename)
92
+
93
+ return info
81
94
 
82
95
  async def setItemPath(self, iden, path):
83
96
  '''
@@ -494,10 +507,27 @@ class Drive(s_base.Base):
494
507
  if byts is not None:
495
508
  return s_msgpack.un(byts)
496
509
 
497
- async def setTypeSchema(self, typename, schema, callback=None):
510
+ def getTypeSchemaVersion(self, typename):
511
+ verskey = LKEY_TYPE_VERS + typename.encode()
512
+ byts = self.slab.get(verskey, db=self.dbname)
513
+ if byts is not None:
514
+ return s_msgpack.un(byts)
515
+
516
+ async def setTypeSchema(self, typename, schema, callback=None, vers=None):
498
517
 
499
518
  reqValidName(typename)
500
519
 
520
+ if vers is not None:
521
+ vers = int(vers)
522
+ curv = self.getTypeSchemaVersion(typename)
523
+ if curv is not None:
524
+ if vers == curv:
525
+ return False
526
+
527
+ if vers < curv:
528
+ mesg = f'Cannot downgrade drive schema version for type {typename}.'
529
+ raise s_exc.BadVersion(mesg=mesg)
530
+
501
531
  vtor = s_config.getJsValidator(schema)
502
532
 
503
533
  self.validators[typename] = vtor
@@ -506,6 +536,10 @@ class Drive(s_base.Base):
506
536
 
507
537
  self.slab.put(lkey, s_msgpack.en(schema), db=self.dbname)
508
538
 
539
+ if vers is not None:
540
+ verskey = LKEY_TYPE_VERS + typename.encode()
541
+ self.slab.put(verskey, s_msgpack.en(vers), db=self.dbname)
542
+
509
543
  if callback is not None:
510
544
  async for info in self.getItemsByType(typename):
511
545
  bidn = s_common.uhex(info.get('iden'))
@@ -516,6 +550,7 @@ class Drive(s_base.Base):
516
550
  vtor(data)
517
551
  self.slab.put(LKEY_DATA + bidn + versindx, s_msgpack.en(data), db=self.dbname)
518
552
  await asyncio.sleep(0)
553
+ return True
519
554
 
520
555
  async def getItemsByType(self, typename):
521
556
  tkey = typename.encode() + b'\x00'
synapse/lib/snap.py CHANGED
@@ -1559,12 +1559,6 @@ class Snap(s_base.Base):
1559
1559
  return await self.tagnorms.aget(tagname)
1560
1560
 
1561
1561
  async def _getTagNorm(self, tagname):
1562
-
1563
- if not self.core.isTagValid(tagname):
1564
- mesg = f'The tag ({tagname}) does not meet the regex for the tree.'
1565
- await self._raiseOnStrict(s_exc.BadTag, mesg)
1566
- return None
1567
-
1568
1562
  try:
1569
1563
  return self.core.model.type('syn:tag').norm(tagname)
1570
1564
  except s_exc.BadTypeValu as e:
synapse/lib/types.py CHANGED
@@ -1903,6 +1903,12 @@ class Tag(Str):
1903
1903
  mesg = f'Tag does not match tagre: [{s_grammar.tagre.pattern}]'
1904
1904
  raise s_exc.BadTypeValu(valu=norm, name=self.name, mesg=mesg)
1905
1905
 
1906
+ core = self.modl.core
1907
+ if core is not None:
1908
+ (ok, mesg) = core.isTagValid(norm)
1909
+ if not ok:
1910
+ raise s_exc.BadTypeValu(valu=norm, name=self.name, mesg=mesg)
1911
+
1906
1912
  return norm, {'subs': subs, 'toks': toks}
1907
1913
 
1908
1914
  def _normPyStr(self, text):
synapse/lib/version.py CHANGED
@@ -223,6 +223,6 @@ def reqVersion(valu, reqver,
223
223
  ##############################################################################
224
224
  # The following are touched during the release process by bumpversion.
225
225
  # Do not modify these directly.
226
- version = (2, 185, 0)
226
+ version = (2, 186, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = 'c2ef0eded02f8ac5f34704a117947f44095f41f4'
228
+ commit = 'ffa4abc52513d4b8ac592496322227eed9e07dc5'
synapse/models/risk.py CHANGED
@@ -351,6 +351,9 @@ class RiskModule(s_module.CoreModule):
351
351
  ('mitre:attack:software', ('it:mitre:attack:software', {}), {
352
352
  'doc': 'A mapping to a MITRE ATT&CK software if applicable.'}),
353
353
 
354
+ ('id', ('str', {'strip': True}), {
355
+ 'doc': 'An ID for the tool.'}),
356
+
354
357
  )),
355
358
  ('risk:mitigation:type:taxonomy', {}, ()),
356
359
  ('risk:mitigation', {}, (
@@ -7202,16 +7202,16 @@ class CortexBasicTest(s_t_utils.SynTest):
7202
7202
 
7203
7203
  nodes = await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.2021.12345 ]')
7204
7204
 
7205
- with self.raises(s_exc.BadTag):
7205
+ with self.raises(s_exc.BadTypeValu):
7206
7206
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.foo ]')
7207
7207
 
7208
- with self.raises(s_exc.BadTag):
7208
+ with self.raises(s_exc.BadTypeValu):
7209
7209
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.2021.hehe ]')
7210
7210
 
7211
- with self.raises(s_exc.BadTag):
7211
+ with self.raises(s_exc.BadTypeValu):
7212
7212
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.2021.123456 ]')
7213
7213
 
7214
- with self.raises(s_exc.BadTag):
7214
+ with self.raises(s_exc.BadTypeValu):
7215
7215
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.12345 ]')
7216
7216
 
7217
7217
  nodes = await core.nodes('[ test:str=beep +?#cno.cve.12345 ]')
@@ -7229,9 +7229,14 @@ class CortexBasicTest(s_t_utils.SynTest):
7229
7229
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.2021.hehe ]')
7230
7230
 
7231
7231
  await core.setTagModel('cno.cve', 'regex', (None, None, '[0-9]{4}', '[0-9]{5}'))
7232
- with self.raises(s_exc.BadTag):
7232
+ with self.raises(s_exc.BadTypeValu):
7233
7233
  await core.nodes('[ inet:ipv4=1.2.3.4 +#cno.cve.2021.haha ]')
7234
7234
 
7235
+ self.eq((False, None), await core.callStorm('return($lib.trycast(syn:tag, cno.cve.2021.haha))'))
7236
+
7237
+ with self.raises(s_exc.BadTypeValu):
7238
+ await core.callStorm('return($lib.cast(syn:tag, cno.cve.2021.haha))')
7239
+
7235
7240
  self.none(await core.callStorm('$lib.model.tags.del(cno.cve)'))
7236
7241
  self.none(await core.callStorm('return($lib.model.tags.get(cno.cve))'))
7237
7242
 
@@ -378,7 +378,7 @@ class BaseTest(s_t_utils.SynTest):
378
378
  proc = ctx.Process(target=block_processing, args=(evt1,))
379
379
  proc.start()
380
380
 
381
- self.true(evt1.wait(timeout=10))
381
+ self.true(evt1.wait(timeout=30))
382
382
  os.kill(proc.pid, signal.SIGTERM)
383
383
  proc.join(timeout=10)
384
384
  self.eq(proc.exitcode, 137)
@@ -396,7 +396,7 @@ class BaseTest(s_t_utils.SynTest):
396
396
  proc = ctx.Process(target=block_processing, args=(evt1,))
397
397
  proc.start()
398
398
 
399
- self.true(evt1.wait(timeout=10))
399
+ self.true(evt1.wait(timeout=30))
400
400
  os.kill(proc.pid, signal.SIGINT)
401
401
 
402
402
  proc.join(timeout=10)
@@ -208,7 +208,12 @@ class CellTest(s_t_utils.SynTest):
208
208
 
209
209
  # TODO how to handle iden match with additional property mismatch
210
210
 
211
- await cell.drive.setTypeSchema('woot', testDataSchema_v0)
211
+ self.true(await cell.drive.setTypeSchema('woot', testDataSchema_v0, vers=0))
212
+ self.true(await cell.drive.setTypeSchema('woot', testDataSchema_v0, vers=1))
213
+ self.false(await cell.drive.setTypeSchema('woot', testDataSchema_v0, vers=1))
214
+
215
+ with self.raises(s_exc.BadVersion):
216
+ await cell.drive.setTypeSchema('woot', testDataSchema_v0, vers=0)
212
217
 
213
218
  info = {'name': 'win32k.sys', 'type': 'woot'}
214
219
  info = await cell.addDriveItem(info, reldir=rootdir)
@@ -284,6 +289,12 @@ class CellTest(s_t_utils.SynTest):
284
289
  versinfo, data = await cell.getDriveData(iden, vers=(1, 1, 0))
285
290
  self.eq('woot', data.get('woot'))
286
291
 
292
+ with self.raises(s_exc.NoSuchIden):
293
+ await cell.reqDriveInfo('d7d6107b200e2c039540fc627bc5537d')
294
+
295
+ with self.raises(s_exc.TypeMismatch):
296
+ await cell.getDriveInfo(iden, typename='newp')
297
+
287
298
  self.nn(await cell.getDriveInfo(iden))
288
299
  self.len(2, [vers async for vers in cell.getDriveDataVersions(iden)])
289
300
 
@@ -1899,7 +1910,7 @@ class CellTest(s_t_utils.SynTest):
1899
1910
  proc = ctx.Process(target=lock_target, args=(dirn, evt1,))
1900
1911
  proc.start()
1901
1912
 
1902
- self.true(evt1.wait(timeout=10))
1913
+ self.true(evt1.wait(timeout=30))
1903
1914
 
1904
1915
  with self.raises(s_exc.FatalErr) as cm:
1905
1916
  async with await s_cell.Cell.anit(dirn) as cell:
@@ -2600,7 +2611,7 @@ class CellTest(s_t_utils.SynTest):
2600
2611
  proc = ctx.Process(target=reload_target, args=(dirn, evt1, evt2))
2601
2612
  proc.start()
2602
2613
 
2603
- self.true(evt1.wait(timeout=10))
2614
+ self.true(evt1.wait(timeout=30))
2604
2615
 
2605
2616
  async with await s_telepath.openurl(f'cell://{dirn}') as prox:
2606
2617
  cnfo = await prox.getCellInfo()
@@ -3016,7 +3027,7 @@ class CellTest(s_t_utils.SynTest):
3016
3027
  self.eq(users, s_t_utils.deguidify(json.dumps(await core.callStorm('return($lib.auth.users.list())'))))
3017
3028
  self.eq(gates, s_t_utils.deguidify(json.dumps(await core.callStorm('return($lib.auth.gates.list())'))))
3018
3029
 
3019
- with self.raises(s_exc.BadTag):
3030
+ with self.raises(s_exc.BadTypeValu):
3020
3031
  await core.nodes('[ it:dev:str=foo +#test.newp ]')
3021
3032
 
3022
3033
  stream.seek(0)
@@ -577,6 +577,7 @@ class RiskModelTest(s_t_utils.SynTest):
577
577
  :techniques=(*,)
578
578
  :tag=cno.mal.cobaltstrike
579
579
  :mitre:attack:software=S0001
580
+ :id=" AAAbbb123 "
580
581
 
581
582
  :sophistication=high
582
583
  :availability=public
@@ -593,6 +594,7 @@ class RiskModelTest(s_t_utils.SynTest):
593
594
  self.eq(1643673600000, nodes[0].get('reporter:discovered'))
594
595
  self.eq(1675209600000, nodes[0].get('reporter:published'))
595
596
  self.eq('S0001', nodes[0].get('mitre:attack:software'))
597
+ self.eq('AAAbbb123', nodes[0].get('id'))
596
598
 
597
599
  self.eq('cobaltstrike', nodes[0].get('soft:name'))
598
600
  self.eq(('beacon',), nodes[0].get('soft:names'))
@@ -0,0 +1,47 @@
1
+ from unittest import mock
2
+
3
+ import synapse.lib.output as s_output
4
+ import synapse.tools.snapshot as s_tools_snapshot
5
+
6
+ import synapse.tests.utils as s_t_utils
7
+
8
+ class PromoteToolTest(s_t_utils.SynTest):
9
+
10
+ async def test_tool_snapshot(self):
11
+
12
+ async with self.getTestCore() as core:
13
+
14
+ lurl = core.getLocalUrl()
15
+
16
+ self.eq(0, await s_tools_snapshot.main(('freeze', '--svcurl', lurl)))
17
+ self.true(core.paused)
18
+
19
+ outp = s_output.OutPutStr()
20
+ self.eq(1, await s_tools_snapshot.main(('freeze', '--svcurl', lurl), outp=outp))
21
+ self.isin('ERROR BadState', str(outp))
22
+
23
+ self.eq(0, await s_tools_snapshot.main(('resume', '--svcurl', lurl)))
24
+ self.false(core.paused)
25
+
26
+ outp = s_output.OutPutStr()
27
+ self.eq(1, await s_tools_snapshot.main(('resume', '--svcurl', lurl), outp=outp))
28
+ self.isin('ERROR BadState', str(outp))
29
+
30
+ outp = s_output.OutPutStr()
31
+ async with core.nexslock:
32
+ argv = ('freeze', '--svcurl', lurl, '--timeout', '1')
33
+ self.eq(1, await s_tools_snapshot.main(argv, outp=outp))
34
+ self.isin('ERROR TimeOut', str(outp))
35
+
36
+ def boom():
37
+ raise Exception('boom')
38
+
39
+ outp = s_output.OutPutStr()
40
+ with mock.patch('os.sync', boom):
41
+ self.eq(1, await s_tools_snapshot.main(('freeze', '--svcurl', lurl), outp=outp))
42
+ self.false(core.paused)
43
+ self.isin('ERROR SynErr: boom', str(outp))
44
+
45
+ outp = s_output.OutPutStr()
46
+ self.eq(1, await s_tools_snapshot.main(('freeze', '--svcurl', 'newp://newp'), outp=outp))
47
+ self.isin('ERROR BadUrl', str(outp))
@@ -18,7 +18,9 @@ Examples:
18
18
 
19
19
  async def main(argv, outp=s_output.stdout):
20
20
 
21
- pars = argparse.ArgumentParser(prog='synapse.tools.aha.clone', description=descr)
21
+ pars = argparse.ArgumentParser(prog='synapse.tools.aha.clone', description=descr,
22
+ formatter_class=argparse.RawDescriptionHelpFormatter)
23
+
22
24
  pars.add_argument('dnsname', help='The DNS name of the new AHA server.')
23
25
  pars.add_argument('--port', type=int, default=27492, help='The port that the new AHA server should listen on.')
24
26
  pars.add_argument('--url', default='cell:///vertex/storage', help='The telepath URL to connect to the AHA service.')
@@ -51,7 +51,7 @@ async def _main(argv, outp):
51
51
 
52
52
  def getArgParser():
53
53
  desc = 'CLI tool to generate simple x509 certificates from an Aha server.'
54
- pars = argparse.ArgumentParser(prog='aha.easycert', description=desc)
54
+ pars = argparse.ArgumentParser(prog='synapse.tools.aha.easycert', description=desc)
55
55
 
56
56
  pars.add_argument('-a', '--aha', required=True, # type=str,
57
57
  help='Aha server to connect too.')
@@ -21,7 +21,9 @@ Examples:
21
21
 
22
22
  async def main(argv, outp=s_output.stdout):
23
23
 
24
- pars = argparse.ArgumentParser(prog='provision', description=descr)
24
+ pars = argparse.ArgumentParser(prog='synapse.tools.aha.enroll', description=descr,
25
+ formatter_class=argparse.RawDescriptionHelpFormatter)
26
+
25
27
  pars.add_argument('onceurl', help='The one-time use AHA user enrollment URL.')
26
28
  opts = pars.parse_args(argv)
27
29
 
@@ -23,7 +23,9 @@ Examples:
23
23
 
24
24
  async def main(argv, outp=s_output.stdout):
25
25
 
26
- pars = argparse.ArgumentParser(prog='synapse.tools.aha.provision.service', description=descr)
26
+ pars = argparse.ArgumentParser(prog='synapse.tools.aha.provision.service', description=descr,
27
+ formatter_class=argparse.RawDescriptionHelpFormatter)
28
+
27
29
  pars.add_argument('--url', default='cell:///vertex/storage', help='The telepath URL to connect to the AHA service.')
28
30
  pars.add_argument('--user', help='Provision the new service with the username.')
29
31
  pars.add_argument('--cellyaml', help='Specify the path to a YAML file containing config options for the service.')
@@ -22,7 +22,9 @@ Examples:
22
22
 
23
23
  async def main(argv, outp=s_output.stdout):
24
24
 
25
- pars = argparse.ArgumentParser(prog='synapse.tools.aha.provision.user', description=descr)
25
+ pars = argparse.ArgumentParser(prog='synapse.tools.aha.provision.user', description=descr,
26
+ formatter_class=argparse.RawDescriptionHelpFormatter)
27
+
26
28
  pars.add_argument('--url', default='cell:///vertex/storage', help='The telepath URL to connect to the AHA service.')
27
29
  pars.add_argument('--again', default=False, action='store_true', help='Generate a new enroll URL for an existing user.')
28
30
  pars.add_argument('--only-url', help='Only output the URL upon successful execution',
@@ -20,7 +20,9 @@ Examples:
20
20
 
21
21
  async def main(argv, outp=s_output.stdout):
22
22
 
23
- pars = argparse.ArgumentParser(prog='livebackup', description=descr)
23
+ pars = argparse.ArgumentParser(prog='synapse.tools.livebackup', description=descr,
24
+ formatter_class=argparse.RawDescriptionHelpFormatter)
25
+
24
26
  pars.add_argument('--url', default='cell:///vertex/storage', help='The telepath URL of the Synapse service.')
25
27
  pars.add_argument('--name', default=None, help='Specify a name for the backup. Defaults to an automatically generated timestamp.')
26
28
 
synapse/tools/promote.py CHANGED
@@ -18,9 +18,15 @@ Example (being run from a Cortex mirror docker container):
18
18
 
19
19
  async def main(argv, outp=s_output.stdout):
20
20
 
21
- pars = argparse.ArgumentParser(prog='provision', description=descr)
22
- pars.add_argument('--svcurl', default='cell:///vertex/storage', help='The telepath URL of the Synapse service.')
23
- pars.add_argument('--failure', default=False, action='store_true', help='Promotion is due to leader being offline. Graceful handoff is not possible.')
21
+ pars = argparse.ArgumentParser(prog='synapse.tools.promote', description=descr,
22
+ formatter_class=argparse.RawDescriptionHelpFormatter)
23
+
24
+ pars.add_argument('--svcurl', default='cell:///vertex/storage',
25
+ help='The telepath URL of the Synapse service.')
26
+
27
+ pars.add_argument('--failure', default=False, action='store_true',
28
+ help='Promotion is due to leader being offline. Graceful handoff is not possible.')
29
+
24
30
  # TODO pars.add_argument('--timeout', type=float, default=30.0, help='The maximum timeout to wait for the mirror to catch up.')
25
31
 
26
32
  opts = pars.parse_args(argv)
@@ -0,0 +1,69 @@
1
+ import sys
2
+ import asyncio
3
+ import logging
4
+ import argparse
5
+
6
+ import synapse.exc as s_exc
7
+ import synapse.telepath as s_telepath
8
+
9
+ import synapse.lib.output as s_output
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ desc = '''
14
+ Command line tool to freeze/resume service operations to allow
15
+ system admins to generate a transactionally consistent volume
16
+ snapshot using 3rd party tools.
17
+
18
+ The use pattern should be::
19
+
20
+ python -m synapse.tools.snapshot freeze
21
+
22
+ <generate volume snapshot using 3rd party tools>
23
+
24
+ python -m synapse.tools.snapshot resume
25
+
26
+ The tool will set the process exit code to 0 on success.
27
+ '''
28
+
29
+ async def main(argv, outp=s_output.stdout):
30
+
31
+ pars = argparse.ArgumentParser('synapse.tools.snapshot',
32
+ description=desc,
33
+ formatter_class=argparse.RawDescriptionHelpFormatter)
34
+
35
+ subs = pars.add_subparsers(required=True, title='commands', dest='cmd')
36
+
37
+ freeze = subs.add_parser('freeze', help='Suspend edits and sync changes to disk.')
38
+ freeze.add_argument('--timeout', type=int, default=120,
39
+ help='Maximum time to wait for the nexus lock.')
40
+
41
+ freeze.add_argument('--svcurl', default='cell:///vertex/storage',
42
+ help='The telepath URL of the Synapse service.')
43
+
44
+ resume = subs.add_parser('resume', help='Resume edits and continue normal operation.')
45
+ resume.add_argument('--svcurl', default='cell:///vertex/storage',
46
+ help='The telepath URL of the Synapse service.')
47
+
48
+ opts = pars.parse_args(argv)
49
+
50
+ try:
51
+ async with s_telepath.withTeleEnv():
52
+
53
+ async with await s_telepath.openurl(opts.svcurl) as proxy:
54
+
55
+ if opts.cmd == 'freeze':
56
+ await proxy.freeze(timeout=opts.timeout)
57
+ return 0
58
+
59
+ if opts.cmd == 'resume':
60
+ await proxy.resume()
61
+ return 0
62
+
63
+ except s_exc.SynErr as e:
64
+ mesg = e.errinfo.get('mesg')
65
+ outp.printf(f'ERROR {e.__class__.__name__}: {mesg}')
66
+ return 1
67
+
68
+ if __name__ == '__main__': # pragma: no cover
69
+ sys.exit(asyncio.run(main(sys.argv[1:])))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: synapse
3
- Version: 2.185.0
3
+ Version: 2.186.0
4
4
  Summary: Synapse Intelligence Analysis Framework
5
5
  Author-email: The Vertex Project LLC <root@vertex.link>
6
6
  License: Apache License 2.0
@@ -2,11 +2,11 @@ synapse/__init__.py,sha256=R2kOXlF5j-8m6G0JkHuN7rXRPg_tHLmbMxr__94mHQk,1145
2
2
  synapse/axon.py,sha256=DQu_Ps4BDRDnmdHmqCbpd3W_91yzhdo7AzAk-wtQC3s,61520
3
3
  synapse/cells.py,sha256=eNvdglfAoTURVhGOLGcgMXCGpfsIX1a02SQnyiklo3E,308
4
4
  synapse/common.py,sha256=JRGiA6FCkCZP2pBc3s_H7MsQGwc9jU_vkJFQP3XpVLs,36523
5
- synapse/cortex.py,sha256=xbJ31GZfSIBZKlbroe3tOTXSZxuNPbk4iRcZzxZH7Bk,254590
5
+ synapse/cortex.py,sha256=ia3lMZWkOlu1zpVI2z83RWDjWAdkQ6I396dpC8qmc0g,254725
6
6
  synapse/cryotank.py,sha256=oTbAOKq-q8WqAkYmY46Mc8hy85W3ZcQMxmP2EJDFyZ0,12124
7
7
  synapse/daemon.py,sha256=-xy6EnmD5CodWQs_S-v7apKILECmn5EEYBpEPG-MDns,16986
8
8
  synapse/datamodel.py,sha256=QvIXNLpARXQwKCkz5SmXmQYv9V0pfp51G0cQ9h-omSo,38837
9
- synapse/exc.py,sha256=0D9kI8RCDBdaMEtMW6XDPuknJAikavwFskbYpq7Pr_Y,9056
9
+ synapse/exc.py,sha256=TCSS6ODXNKTxEfo_PT0keumTOAONGJXbTZ4ph_HrWF0,9090
10
10
  synapse/glob.py,sha256=tb6NPtK6Jp6YES9sB1AQi26HP6f-BcEiHrZz2yEyZ90,3210
11
11
  synapse/mindmeld.py,sha256=TiijGH7wX2zdXIFSBUlN40CPOvYaFlw6Wxi66XZuB_M,26
12
12
  synapse/telepath.py,sha256=HlsxX5akFRf7VCJxztnqjAelc2YMOPyCoDsYAAiWQnc,44395
@@ -87,13 +87,13 @@ synapse/data/jsonschemas/raw.githubusercontent.com/oasis-open/cti-stix2-json-sch
87
87
  synapse/lib/__init__.py,sha256=qLS7nt8-Iot8jnD2Xss_6wZi5lJoyv2rqxF9kkektT0,129
88
88
  synapse/lib/agenda.py,sha256=ddr6FrbDY5YslJS3vdBqUUcoh32XwiEj1OkomFg-NAg,33107
89
89
  synapse/lib/aha.py,sha256=vUFzh_s4VYSYXb73C3GYVcQRIaQow_0PSrSYOvz5wis,50308
90
- synapse/lib/ast.py,sha256=tH2OzmHozA4vZtkCl8O9cRSgpuALLNgNBjahnTJ0qBY,157272
90
+ synapse/lib/ast.py,sha256=sUvoukgeJpsefcjas1Fb5NpJkRL7e9NNMW-UvTTO_rY,157259
91
91
  synapse/lib/auth.py,sha256=kPi5Gn5YHCAZHiJhSC9YGNdNW6jk94gSXtSQRe8fNg4,52800
92
92
  synapse/lib/autodoc.py,sha256=eTwyKM0msJFmLmZR1OxKFVAb8wcMgJ2q72Ccphsi-u8,23226
93
93
  synapse/lib/base.py,sha256=FfS6k30ZcS1CVfHPa5LNKog1f48rJ0xE14PI89vW7tM,23634
94
94
  synapse/lib/boss.py,sha256=rYu4jkHJ3Y5GLX23Hlrwe9H17LF27LZ0BkK_A_9Aqh0,2056
95
95
  synapse/lib/cache.py,sha256=N8BoNFQXOaYQU33LLYQcVkdV6IYjSNaUoaKue55y7H0,6275
96
- synapse/lib/cell.py,sha256=LLJq9DN4vOhhu9DF8CLOFWUIJV92KcKdW8XGWXIEXmE,176853
96
+ synapse/lib/cell.py,sha256=uamPIh1SsO7fJyoPF3_KDqIyw3c0SZQzPIOr6okJSe4,178746
97
97
  synapse/lib/certdir.py,sha256=laGLxgx0gVxXvoaLKKemBQv71OZr9mDaqlAatdESV1A,56176
98
98
  synapse/lib/chop.py,sha256=F0RRLlJ6NlpLW7sBWPNZV9Xw4w6HVbQbxPZPE6VhwVQ,9404
99
99
  synapse/lib/cli.py,sha256=rwaO4SbJIzOhwxB9B7NHXpyegQeRsUQ1gULVwgnNCfg,14580
@@ -103,7 +103,7 @@ synapse/lib/config.py,sha256=2EBZcxXFVLBA7x1rtPNGmK91jqcJR-iOVU8rDzKokHQ,15830
103
103
  synapse/lib/const.py,sha256=uf-_iCXcNo85IIZss-yKTkbIe6fBAJ4n5v4Ntf0J104,1274
104
104
  synapse/lib/coro.py,sha256=o-ZrlfJALlCB30PrXOKT_ojjJ51QIezCm0vmDERSqic,11402
105
105
  synapse/lib/datfile.py,sha256=vKqSp7GTMUCYTbthbZ1EaGD8l73LYft6y7hKRuH3T74,620
106
- synapse/lib/drive.py,sha256=gfERzX8VwTI5KHSCjOLFF1HgIlXxLPe-V3bKYiP9bPE,16998
106
+ synapse/lib/drive.py,sha256=j9Z-WVAIXmabT-Y38ofKsJwOBkT83qcXkGMTMD7fNxc,18370
107
107
  synapse/lib/dyndeps.py,sha256=JKN_H3ZiJ831TT59Hdt9Zsif34UteYAfNJAJ0pax5zQ,2168
108
108
  synapse/lib/encoding.py,sha256=sxe1VADjsLJtM0vAKEIb4gHhvnOKI4xr_29da0mQMCM,6015
109
109
  synapse/lib/gis.py,sha256=Roq4dZ35yNyE3sixL-B0yB32GS3Y9sQZdWr2lDLstKQ,2684
@@ -140,7 +140,7 @@ synapse/lib/scrape.py,sha256=nsGpH2UIsBebe5aU7iDRUyLKrjHjAgwxhSoka9RYomw,25056
140
140
  synapse/lib/share.py,sha256=HDQR7nb4IOleHB1kIFe6prZQVW7PjPAivSAkPuhNn5A,663
141
141
  synapse/lib/slaboffs.py,sha256=Fd0RrIRBMjh159aQz5y1ONmzw0NvV040kVX_jZjQW6I,815
142
142
  synapse/lib/slabseqn.py,sha256=LJ2SZEsZlROBAD3mdS-3JxNVVPXXkBW8GIJXsW0OGG8,10287
143
- synapse/lib/snap.py,sha256=k0AXqEq5zc2gEsqwCVCK5zfoMQYHmyEtp4aI81TT-N8,60090
143
+ synapse/lib/snap.py,sha256=QfNtFHV_76ABrm7Zf7WR5kVBB-MvuZmdmDfy0n1Whlo,59880
144
144
  synapse/lib/spooled.py,sha256=00x_RS1TiJkfuTXwwdUcYifuECGYgC8B1tX-sX7nb_k,5385
145
145
  synapse/lib/storm.lark,sha256=ItEIPItfrCT5VmaoS1vm8FWD8Wv7b7B6ZWucCJCdO6s,26517
146
146
  synapse/lib/storm.py,sha256=JEnudiRl4CItc6c-w86j87jAyMSDHiIAhkG3c0eWGyM,214663
@@ -157,9 +157,9 @@ synapse/lib/thisplat.py,sha256=kQhj9Iy97zKHCnaxFSBoSnKabfza9vjpg9m6V7w-Xt4,417
157
157
  synapse/lib/threads.py,sha256=TSsC7ryXm_CbM0LQMsvk1vYV4iyvarzWzH59TrUzKuo,164
158
158
  synapse/lib/time.py,sha256=FKTYwpdvpuAj8p8sSodRjOxoA7Vu67CIbbXz55gtghk,9231
159
159
  synapse/lib/trigger.py,sha256=mnfkoBHB88JfqPoxb5oflvAaBKZpNvYdxP247YS53fE,20697
160
- synapse/lib/types.py,sha256=er9Jj4Mb3qh8YY4mUukyM7C164eIjO_fJeZvVJmSHFE,69500
160
+ synapse/lib/types.py,sha256=u89ukW38oDziRzeA6IWrPwwPD0Ds75u-gwJSXsQ4loY,69708
161
161
  synapse/lib/urlhelp.py,sha256=j-DvWGi-xH0TcO0NbCuwG7guUuiV8wxIxfMyJOzDygo,2523
162
- synapse/lib/version.py,sha256=w3ZSszkTRRBqjxSDmcAQdXEItgwyAcM7dggBZl3rDVA,7162
162
+ synapse/lib/version.py,sha256=Dld1dWe3pQfHR_FImCFYIRPUewChfkbSUnTv5RzGtEI,7162
163
163
  synapse/lib/view.py,sha256=bP1lMl8Wm0yaMIlc4cfwobm5ojNzMsWguPFnPUkKhoM,60567
164
164
  synapse/lib/crypto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
165
  synapse/lib/crypto/coin.py,sha256=_dhlkzIrHT8BvHdJOWK7PDThz3sK3dDRnWAUqjRpZJc,4910
@@ -248,7 +248,7 @@ synapse/models/orgs.py,sha256=1HtWF9WzQfmoeYQ7soEd5KV_kX1nLd_hRxILWA9F-g4,67702
248
248
  synapse/models/person.py,sha256=-YJh_KgEvL4a0ArdBX1xirMQy_8YZGyaA04Mq7Hg_VQ,27193
249
249
  synapse/models/planning.py,sha256=vmrY4d3WRxizrNU1YBe36NGZTuuu4lhGS8KI5lCZ5yQ,7302
250
250
  synapse/models/proj.py,sha256=rf4LdyBJV1c1I_dR9zF-jOmmgj7ZKi9g25HVF9uStFk,10031
251
- synapse/models/risk.py,sha256=xOjRe0Rp-2uKRjpK8zrSaZQOzIrpj9KfS-4yQVCC35g,52570
251
+ synapse/models/risk.py,sha256=B9NwNA1mpT5vlZa09Xz5BsSAIbuocoWtbArEahLGG1E,52682
252
252
  synapse/models/science.py,sha256=oSkKbjmVncYcVkVgx8rhM08XtcsgDgjf3mpunz5kL30,4329
253
253
  synapse/models/syn.py,sha256=oY6NTeDNUw0fv7wku8ieB1PqoZ-3qac0Chmdm8kk5Ds,13565
254
254
  synapse/models/telco.py,sha256=1BdnFr6Cyb1ZPtekIXaoUuRjISfJnIerTklQUEk_MzE,15273
@@ -273,7 +273,7 @@ synapse/tests/test_cmds_boss.py,sha256=SdBwM2qJHFzzfrjWYiZOLBKeye8uru7KeJ3NU_YSk
273
273
  synapse/tests/test_cmds_cortex.py,sha256=LWFz8HyuvsIGjtz2DqXYh-R-5QbiQWzLlQKqew7gabY,17157
274
274
  synapse/tests/test_cmds_hive.py,sha256=aRH_Gh8oF_1BsfpmffyhDDNIqnTqsuF2cavdtGke1-0,5912
275
275
  synapse/tests/test_common.py,sha256=2SAJ4M2iLdZuPPV-j16QVwE073VrikyW75cYTPRMjWI,16940
276
- synapse/tests/test_cortex.py,sha256=fLan-mhiKIoOOGQ24jOEpYbzZbZM_FXt9CkAHns5Di0,353780
276
+ synapse/tests/test_cortex.py,sha256=3U1fIh-eNtlQ3PEWZR6hw-EbibUQChXfVaHogVyIrd0,354051
277
277
  synapse/tests/test_cryotank.py,sha256=ms2VkL0aUskMi-LArTzRt8LUYw0z_y8nQfOOBDiCkvI,12027
278
278
  synapse/tests/test_daemon.py,sha256=QqKELhm1HF0q_8Kbk0Uf9fnUg3K5nLQ7MocGIyuKKIw,7715
279
279
  synapse/tests/test_data.py,sha256=f8L-q6kpMq8XPG3hq1jwlyaFRQEinSBf7ZlsRFeCuoM,196
@@ -286,10 +286,10 @@ synapse/tests/test_lib_aha.py,sha256=nRHs14-LtnsSRi-C7nRu24g3ENN-R3S-0Uk8Oq2LVy4
286
286
  synapse/tests/test_lib_ast.py,sha256=il-g_TeEkfTSNbw70Ep9aWmuu9jMAesHceRz6sKekFw,180194
287
287
  synapse/tests/test_lib_auth.py,sha256=NnRMiGfVm4SQmDEBTSs1aJ1g7TKmFs3Vi8udOKJ3GaM,37815
288
288
  synapse/tests/test_lib_autodoc.py,sha256=H2XO2_d8FmsHUd-cn7M-LjTX-078xLhMiOGiGGk5Oj0,8381
289
- synapse/tests/test_lib_base.py,sha256=yhGOfA-OgZrdhISTXwSl6l6YGqN5nqO3pcDes6oICPg,14550
289
+ synapse/tests/test_lib_base.py,sha256=0XUGNaXmfDW896gpBTYYd7ovADUD8cyDLkGTefqn1FM,14550
290
290
  synapse/tests/test_lib_boss.py,sha256=gZEuJnMO99Fu9gQ7Ct0g67umBW5XFCs8vcwInB5qr14,1598
291
291
  synapse/tests/test_lib_cache.py,sha256=oQgEBhm8pZFCEvMfcD3znTDQgl8Gv91fEOB-3eb2IIg,8594
292
- synapse/tests/test_lib_cell.py,sha256=Kl3oIstweKDNucY0JaD_7MM2znDGhL5D4VkfSIQCjKg,142478
292
+ synapse/tests/test_lib_cell.py,sha256=I13EPvkc7l-QolBnpSRnQPHmHRKIhrUI3ifefB0e6FQ,143051
293
293
  synapse/tests/test_lib_certdir.py,sha256=d5X1lvp0DnBRigXYLbofZAXakZp440-bjaMH30PlGsI,42728
294
294
  synapse/tests/test_lib_chop.py,sha256=LkrM_pQU_KS88aVRPD4DI97qSdhxmw6EUA_jb-UJpww,6238
295
295
  synapse/tests/test_lib_cli.py,sha256=B8qGx9KtTWp31RlCMtfFMzhJ0TzaaO9ph7RCK2jHtx4,9283
@@ -413,7 +413,7 @@ synapse/tests/test_model_orgs.py,sha256=x_pnxhOS2IkGTMB-BMM8CeeizlecBEiHyE9cprd2
413
413
  synapse/tests/test_model_person.py,sha256=6Zj_dnOyY4axLvl7VKCEYGtwVlnEYqKSg5kOi3Brp9s,17322
414
414
  synapse/tests/test_model_planning.py,sha256=U2kkE0uBO6CqtTfy7wlnhEIu_NFdSri4I_I5b-mRjBE,5615
415
415
  synapse/tests/test_model_proj.py,sha256=bBPNzvcbd1jZReeJ7X-AQdH7F7ZMugZVgaCTvS-QNFM,22849
416
- synapse/tests/test_model_risk.py,sha256=dym9_hxZYhCoftMjMDJSPuvJIyYbqN207MD4dVct-SU,28161
416
+ synapse/tests/test_model_risk.py,sha256=uDeGAoSFXJArTv3zDf5_qk6giqYAb0Beda8oVr4h75I,28253
417
417
  synapse/tests/test_model_science.py,sha256=2T9VxdzpltDufgjkUB95q97TQP9AxH2-T_sBbHfPDRk,2450
418
418
  synapse/tests/test_model_syn.py,sha256=9yWzWRSBI3rjv7hu3MUE9KuE00n4GxxlQmxDvQJj6gw,23028
419
419
  synapse/tests/test_model_telco.py,sha256=5ToiRhCX7faiDx4lDMV6b7E9WteN3PcBlznYF6GA2co,13166
@@ -450,6 +450,7 @@ synapse/tests/test_tools_pullfile.py,sha256=BloDoe1iBUlUSGQBU3TXFXU8sPFI3wRJHEp_
450
450
  synapse/tests/test_tools_pushfile.py,sha256=evX1aPxWvmhoS4ZmB0q6jMqIPYzQ9nqWB1XAJRipOcw,5611
451
451
  synapse/tests/test_tools_reload.py,sha256=IlVj84EM-T35pdE5s9XvMhD6rWPIlc2BSDUgHhw28D4,1830
452
452
  synapse/tests/test_tools_rstorm.py,sha256=-bIvNCY9Vx702LsNb2vwunZBT6fyXHse28Av6Hfgx1s,2078
453
+ synapse/tests/test_tools_snapshot.py,sha256=MfMq8ij4Ztxrn0D_iVYXRGSHI1_rQzEybexjlraeSaQ,1750
453
454
  synapse/tests/test_tools_storm.py,sha256=QkyPX4HS67n1q4LbmsCGF9yUSyMLHK4BjNRX3JCgy1w,18437
454
455
  synapse/tests/test_utils.py,sha256=sI-uDhUpkVQHSKHa2-czmWNvyXL2QTsCojtPAV2jueI,8688
455
456
  synapse/tests/test_utils_getrefs.py,sha256=bBV7yZ9tnOXmjqpsU1YKV5pw0behoKpzpwHJDxLjmLs,2304
@@ -533,23 +534,24 @@ synapse/tools/genpkg.py,sha256=THmrgT9inhECQEbK_08suOdFSwOp6auKo2XQe4mIVmg,9924
533
534
  synapse/tools/guid.py,sha256=UCBFqUSBdXt5WJYcoP0Vme_oOUXU040DZJEpay4uZHk,300
534
535
  synapse/tools/healthcheck.py,sha256=sps01sVTVb3kb--vRNotn7HkkZVZ5wSu6VeiOuK_l-g,3314
535
536
  synapse/tools/json2mpk.py,sha256=KEfNOY7m9lTBj2g2fYfe6OpqC1D0a7kvI0orl_ZGp_0,1360
536
- synapse/tools/livebackup.py,sha256=rscss-hYp8A0DRqHoPtl6WSpD9vOo2HyjeNIs9bDUW4,1129
537
+ synapse/tools/livebackup.py,sha256=BNgXTYtU6EewonG5vgewF0RDEISiD9XLYn3SLgybnWM,1222
537
538
  synapse/tools/modrole.py,sha256=q8BDlOaqKVj2c0AJVSd7hL3RoJlUFJLuEkL1bfrk6Fg,4748
538
539
  synapse/tools/moduser.py,sha256=ydk9Lf7zm0MysP1tgM1rh53fkpulIiNeyuOLFrDW0bU,7834
539
- synapse/tools/promote.py,sha256=9zBOEyWgxm8LBDVJjY_RfKftwYfzMxFYO2yD_mqxurY,1632
540
+ synapse/tools/promote.py,sha256=J1wRkYHFUaXha92hrQ9RqG-cHdH1u-QrMvax50YSRjE,1769
540
541
  synapse/tools/pullfile.py,sha256=QAwejVke8d2zvkyNT6-HyAkRy4wF5FE3FYZAryaFHXI,2042
541
542
  synapse/tools/pushfile.py,sha256=0y9IKfkiRXkFpvHk9hX4CEey-HEpdXWE_b056w1ijKI,4202
542
543
  synapse/tools/reload.py,sha256=Jr5j-kSxWX6S-cUv1AnQMfukohLPCH9EjN4Pv-uMO-E,2724
543
544
  synapse/tools/rstorm.py,sha256=E6ggQYlsD7j4VqwunrVBVRfsLJpVcTBCigZfu3PWJqA,1057
545
+ synapse/tools/snapshot.py,sha256=L3nMTYM0iGY-37Js7NHDy2IctRd0uwQDA2CRuylfVRk,2154
544
546
  synapse/tools/storm.py,sha256=TUmxM0YH0WsD4Haab5TEUZtq-zfywMDjoRPpGo-HUBo,20758
545
547
  synapse/tools/aha/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
546
- synapse/tools/aha/clone.py,sha256=lOnKtUvb2HsvKUKWRBWyCyxFXRQxDH_QVPvfulylQaI,1610
547
- synapse/tools/aha/easycert.py,sha256=vlhc1SEgavBWkobuL7GC5LmTwj33dzpxphWCbai2hRw,3064
548
- synapse/tools/aha/enroll.py,sha256=xCeJcSXb39yN6QhOa7-yQjV5WZ8uHC5zA1qaLSUOLmk,3182
548
+ synapse/tools/aha/clone.py,sha256=-K-p1J5Ay5SAm80VZy9ysYvqwq6jnFGHeCewGxyKbHM,1689
549
+ synapse/tools/aha/easycert.py,sha256=GlVVLc1TS_vMhNTrgiBylOfzfc8Y96isFRQg-8r8xn4,3078
550
+ synapse/tools/aha/enroll.py,sha256=oGdbWj1yQVfeXYopI-VtJW5CBsZhKv9B41hje4cK7fw,3276
549
551
  synapse/tools/aha/list.py,sha256=feeYRnsfEEHlkqI4xZXKSLmUrpXq_nb0AHE22RJ8eZc,2709
550
552
  synapse/tools/aha/provision/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
551
- synapse/tools/aha/provision/service.py,sha256=zEvJ8Yx-d0YDKgYL9XfLjAxufcdT4IdDgdkC7K0WtfQ,3183
552
- synapse/tools/aha/provision/user.py,sha256=jkeSqvOtmt3TaaTlzwiQ4164s5lK8ilwsiBQQ8Sn95I,1816
553
+ synapse/tools/aha/provision/service.py,sha256=fhyQELilvABzzwEoZvRU6hGdLon6f10_kWM5MSMkG6I,3262
554
+ synapse/tools/aha/provision/user.py,sha256=nDGA7TiZCvik9GCnMhioGpuCi8eV0fW67Yr_axhblQA,1895
553
555
  synapse/tools/cryo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
554
556
  synapse/tools/cryo/cat.py,sha256=ELok5rGIQE8mUCN8NXbwlQJFLQcMSqdSZiV_8f4JUuw,2702
555
557
  synapse/tools/cryo/list.py,sha256=Xhxm50WFFCkDFCtNnks3xt5-VzrdYvzaGqN8PPHqf3g,843
@@ -603,8 +605,8 @@ synapse/vendor/xrpl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
603
605
  synapse/vendor/xrpl/tests/test_codec.py,sha256=Zwq6A5uZUK_FWDL3BA932c5b-rL3hnC6efobWHSLC4o,6651
604
606
  synapse/vendor/xrpl/tests/test_main.py,sha256=kZQwWk7I6HrP-PMvLdsUUN4POvWD9I-iXDHOwdeF090,4299
605
607
  synapse/vendor/xrpl/tests/test_main_test_cases.py,sha256=vTlUM4hJD2Hd2wCIdd9rfsvcMZZZQmNHWdCTTFeGz2Y,4221
606
- synapse-2.185.0.dist-info/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
607
- synapse-2.185.0.dist-info/METADATA,sha256=UWiHlwbiXyzJatEinADYhCMW89aO8iluXCYEKt9ldlU,4598
608
- synapse-2.185.0.dist-info/WHEEL,sha256=SrTdYlP5_vE84QjjtlalV7U4zA9dssr1tS8MY2C6kns,93
609
- synapse-2.185.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
610
- synapse-2.185.0.dist-info/RECORD,,
608
+ synapse-2.186.0.dist-info/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
609
+ synapse-2.186.0.dist-info/METADATA,sha256=izqsaDDiRiviakBijFcSuonm0YcwFrc-xW7uz_tOWxA,4598
610
+ synapse-2.186.0.dist-info/WHEEL,sha256=V9njg5PXytSyv_DtLjFqv-lPwlYJ-pVdrLhmVh7fan0,93
611
+ synapse-2.186.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
612
+ synapse-2.186.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py311-none-any
5
5