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 +3 -2
- synapse/exc.py +2 -0
- synapse/lib/ast.py +1 -1
- synapse/lib/cell.py +65 -2
- synapse/lib/drive.py +45 -10
- synapse/lib/snap.py +0 -6
- synapse/lib/types.py +6 -0
- synapse/lib/version.py +2 -2
- synapse/models/risk.py +3 -0
- synapse/tests/test_cortex.py +10 -5
- synapse/tests/test_lib_base.py +2 -2
- synapse/tests/test_lib_cell.py +15 -4
- synapse/tests/test_model_risk.py +2 -0
- synapse/tests/test_tools_snapshot.py +47 -0
- synapse/tools/aha/clone.py +3 -1
- synapse/tools/aha/easycert.py +1 -1
- synapse/tools/aha/enroll.py +3 -1
- synapse/tools/aha/provision/service.py +3 -1
- synapse/tools/aha/provision/user.py +3 -1
- synapse/tools/livebackup.py +3 -1
- synapse/tools/promote.py +9 -3
- synapse/tools/snapshot.py +69 -0
- {synapse-2.185.0.dist-info → synapse-2.186.0.dist-info}/METADATA +1 -1
- {synapse-2.185.0.dist-info → synapse-2.186.0.dist-info}/RECORD +27 -25
- {synapse-2.185.0.dist-info → synapse-2.186.0.dist-info}/WHEEL +1 -1
- {synapse-2.185.0.dist-info → synapse-2.186.0.dist-info}/LICENSE +0 -0
- {synapse-2.185.0.dist-info → synapse-2.186.0.dist-info}/top_level.txt +0 -0
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
|
-
|
|
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
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,
|
|
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
|
|
64
|
-
|
|
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
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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,
|
|
226
|
+
version = (2, 186, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
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', {}, (
|
synapse/tests/test_cortex.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
synapse/tests/test_lib_base.py
CHANGED
|
@@ -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=
|
|
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=
|
|
399
|
+
self.true(evt1.wait(timeout=30))
|
|
400
400
|
os.kill(proc.pid, signal.SIGINT)
|
|
401
401
|
|
|
402
402
|
proc.join(timeout=10)
|
synapse/tests/test_lib_cell.py
CHANGED
|
@@ -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=
|
|
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=
|
|
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.
|
|
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)
|
synapse/tests/test_model_risk.py
CHANGED
|
@@ -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))
|
synapse/tools/aha/clone.py
CHANGED
|
@@ -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.')
|
synapse/tools/aha/easycert.py
CHANGED
|
@@ -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.')
|
synapse/tools/aha/enroll.py
CHANGED
|
@@ -21,7 +21,9 @@ Examples:
|
|
|
21
21
|
|
|
22
22
|
async def main(argv, outp=s_output.stdout):
|
|
23
23
|
|
|
24
|
-
pars = argparse.ArgumentParser(prog='
|
|
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',
|
synapse/tools/livebackup.py
CHANGED
|
@@ -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='
|
|
22
|
-
|
|
23
|
-
|
|
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:])))
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
547
|
-
synapse/tools/aha/easycert.py,sha256=
|
|
548
|
-
synapse/tools/aha/enroll.py,sha256=
|
|
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=
|
|
552
|
-
synapse/tools/aha/provision/user.py,sha256=
|
|
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.
|
|
607
|
-
synapse-2.
|
|
608
|
-
synapse-2.
|
|
609
|
-
synapse-2.
|
|
610
|
-
synapse-2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|