synapse 2.201.0__py311-none-any.whl → 2.202.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 +30 -23
- synapse/lib/base.py +2 -12
- synapse/lib/cell.py +9 -13
- synapse/lib/parser.py +2 -1
- synapse/lib/storm.lark +5 -4
- synapse/lib/storm_format.py +2 -1
- synapse/lib/version.py +2 -2
- synapse/telepath.py +75 -16
- synapse/tests/test_cortex.py +23 -3
- synapse/tests/test_lib_cell.py +11 -0
- synapse/tests/test_lib_grammar.py +4 -0
- synapse/tests/test_lib_storm.py +6 -0
- synapse/tests/test_telepath.py +56 -34
- synapse/tests/test_utils_getrefs.py +35 -28
- synapse/utils/getrefs.py +4 -2
- {synapse-2.201.0.dist-info → synapse-2.202.0.dist-info}/METADATA +1 -1
- {synapse-2.201.0.dist-info → synapse-2.202.0.dist-info}/RECORD +20 -20
- {synapse-2.201.0.dist-info → synapse-2.202.0.dist-info}/LICENSE +0 -0
- {synapse-2.201.0.dist-info → synapse-2.202.0.dist-info}/WHEEL +0 -0
- {synapse-2.201.0.dist-info → synapse-2.202.0.dist-info}/top_level.txt +0 -0
synapse/cortex.py
CHANGED
|
@@ -5874,38 +5874,45 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
5874
5874
|
if self.stormpool is None: # pragma: no cover
|
|
5875
5875
|
return None
|
|
5876
5876
|
|
|
5877
|
-
|
|
5877
|
+
size = self.stormpool.size()
|
|
5878
|
+
if size == 0:
|
|
5878
5879
|
logger.warning('Storm query mirror pool is empty, running query locally.')
|
|
5879
5880
|
return None
|
|
5880
5881
|
|
|
5881
|
-
|
|
5882
|
+
for _ in range(size):
|
|
5882
5883
|
|
|
5883
|
-
|
|
5884
|
-
|
|
5885
|
-
|
|
5886
|
-
|
|
5887
|
-
|
|
5888
|
-
|
|
5889
|
-
|
|
5884
|
+
try:
|
|
5885
|
+
timeout = self.stormpoolopts.get('timeout:connection')
|
|
5886
|
+
proxy = await self.stormpool.proxy(timeout=timeout)
|
|
5887
|
+
proxyname = proxy._ahainfo.get('name')
|
|
5888
|
+
if proxyname is not None and proxyname == self.ahasvcname:
|
|
5889
|
+
# we are part of the pool and were selected. Convert to local use.
|
|
5890
|
+
return None
|
|
5891
|
+
|
|
5892
|
+
except TimeoutError:
|
|
5893
|
+
logger.warning('Timeout waiting for pool mirror proxy.')
|
|
5894
|
+
continue
|
|
5895
|
+
|
|
5896
|
+
try:
|
|
5897
|
+
|
|
5898
|
+
curoffs = opts.setdefault('nexsoffs', await self.getNexsIndx() - 1)
|
|
5899
|
+
miroffs = await s_common.wait_for(proxy.getNexsIndx(), timeout) - 1
|
|
5900
|
+
if (delta := curoffs - miroffs) <= MAX_NEXUS_DELTA:
|
|
5901
|
+
return proxy
|
|
5890
5902
|
|
|
5891
|
-
|
|
5892
|
-
miroffs = await s_common.wait_for(proxy.getNexsIndx(), timeout) - 1
|
|
5893
|
-
if (delta := curoffs - miroffs) > MAX_NEXUS_DELTA:
|
|
5894
|
-
mesg = (f'Pool mirror [{proxyname}] Nexus offset delta too large '
|
|
5895
|
-
f'({delta} > {MAX_NEXUS_DELTA}), running query locally.')
|
|
5903
|
+
mesg = f'Pool mirror [{proxyname}] is too far out of sync. Skipping.'
|
|
5896
5904
|
logger.warning(mesg, extra=await self.getLogExtra(delta=delta, mirror=proxyname, mirror_offset=miroffs))
|
|
5897
|
-
return None
|
|
5898
5905
|
|
|
5899
|
-
|
|
5906
|
+
except s_exc.IsFini:
|
|
5907
|
+
mesg = f'Proxy for pool mirror [{proxyname}] was shutdown. Skipping.'
|
|
5908
|
+
logger.warning(mesg, extra=await self.getLogExtra(mirror=proxyname))
|
|
5900
5909
|
|
|
5901
|
-
|
|
5902
|
-
|
|
5903
|
-
logger.warning('Timeout waiting for pool mirror, running query locally.')
|
|
5904
|
-
else:
|
|
5905
|
-
mesg = f'Timeout waiting for pool mirror [{proxyname}] Nexus offset, running query locally.'
|
|
5910
|
+
except TimeoutError:
|
|
5911
|
+
mesg = f'Timeout waiting for pool mirror [{proxyname}] Nexus offset.'
|
|
5906
5912
|
logger.warning(mesg, extra=await self.getLogExtra(mirror=proxyname))
|
|
5907
|
-
|
|
5908
|
-
|
|
5913
|
+
|
|
5914
|
+
logger.warning('Pool members exhausted. Running query locally.', extra=await self.getLogExtra())
|
|
5915
|
+
return None
|
|
5909
5916
|
|
|
5910
5917
|
async def storm(self, text, opts=None):
|
|
5911
5918
|
|
synapse/lib/base.py
CHANGED
|
@@ -128,7 +128,7 @@ class Base:
|
|
|
128
128
|
|
|
129
129
|
self.isfini = False
|
|
130
130
|
self.anitted = True # For assertion purposes
|
|
131
|
-
self.finievt =
|
|
131
|
+
self.finievt = asyncio.Event()
|
|
132
132
|
self.entered = False
|
|
133
133
|
|
|
134
134
|
# hold a weak ref to other bases we should fini if they
|
|
@@ -431,10 +431,7 @@ class Base:
|
|
|
431
431
|
self._syn_funcs.clear()
|
|
432
432
|
self._fini_funcs.clear()
|
|
433
433
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
if fevt is not None:
|
|
437
|
-
fevt.set()
|
|
434
|
+
self.finievt.set()
|
|
438
435
|
|
|
439
436
|
return 0
|
|
440
437
|
|
|
@@ -468,13 +465,6 @@ class Base:
|
|
|
468
465
|
base.waitfini(timeout=30)
|
|
469
466
|
|
|
470
467
|
'''
|
|
471
|
-
|
|
472
|
-
if self.isfini:
|
|
473
|
-
return True
|
|
474
|
-
|
|
475
|
-
if self.finievt is None:
|
|
476
|
-
self.finievt = asyncio.Event()
|
|
477
|
-
|
|
478
468
|
return await s_coro.event_wait(self.finievt, timeout)
|
|
479
469
|
|
|
480
470
|
def schedCoro(self, coro):
|
synapse/lib/cell.py
CHANGED
|
@@ -2711,6 +2711,12 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
|
|
|
2711
2711
|
raise s_exc.BadArg(mesg=mesg, arg='path', valu=path)
|
|
2712
2712
|
await self._streamBackupArchive(path, user, name)
|
|
2713
2713
|
|
|
2714
|
+
async def _removeStreamingBackup(self, path):
|
|
2715
|
+
logger.debug(f'Removing {path}')
|
|
2716
|
+
await s_coro.executor(shutil.rmtree, path, ignore_errors=True)
|
|
2717
|
+
logger.debug(f'Removed {path}')
|
|
2718
|
+
self.backupstreaming = False
|
|
2719
|
+
|
|
2714
2720
|
async def iterNewBackupArchive(self, user, name=None, remove=False):
|
|
2715
2721
|
|
|
2716
2722
|
if self.backupstreaming:
|
|
@@ -2728,23 +2734,13 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
|
|
|
2728
2734
|
mesg = 'Backup with name already exists'
|
|
2729
2735
|
raise s_exc.BadArg(mesg=mesg)
|
|
2730
2736
|
|
|
2731
|
-
|
|
2732
|
-
await self.runBackup(name)
|
|
2733
|
-
except Exception:
|
|
2734
|
-
if remove:
|
|
2735
|
-
logger.debug(f'Removing {path}')
|
|
2736
|
-
await s_coro.executor(shutil.rmtree, path, ignore_errors=True)
|
|
2737
|
-
logger.debug(f'Removed {path}')
|
|
2738
|
-
raise
|
|
2739
|
-
|
|
2737
|
+
await self.runBackup(name)
|
|
2740
2738
|
await self._streamBackupArchive(path, user, name)
|
|
2741
2739
|
|
|
2742
2740
|
finally:
|
|
2743
2741
|
if remove:
|
|
2744
|
-
|
|
2745
|
-
await
|
|
2746
|
-
logger.debug(f'Removed {path}')
|
|
2747
|
-
self.backupstreaming = False
|
|
2742
|
+
self.removetask = asyncio.create_task(self._removeStreamingBackup(path))
|
|
2743
|
+
await asyncio.shield(self.removetask)
|
|
2748
2744
|
|
|
2749
2745
|
async def isUserAllowed(self, iden, perm, gateiden=None, default=False):
|
|
2750
2746
|
user = self.auth.user(iden) # type: s_auth.User
|
synapse/lib/parser.py
CHANGED
|
@@ -75,7 +75,7 @@ terminalEnglishMap = {
|
|
|
75
75
|
'MODSET': '+= or -=',
|
|
76
76
|
'MODSETMULTI': '++= or --=',
|
|
77
77
|
'NONQUOTEWORD': 'unquoted value',
|
|
78
|
-
'
|
|
78
|
+
'NOTOP': 'not',
|
|
79
79
|
'NULL': 'null',
|
|
80
80
|
'NUMBER': 'number',
|
|
81
81
|
'OCTNUMBER': 'number',
|
|
@@ -134,6 +134,7 @@ terminalEnglishMap = {
|
|
|
134
134
|
'_LPARNOSPACE': '(',
|
|
135
135
|
'_MATCHHASH': '#',
|
|
136
136
|
'_MATCHHASHWILD': '#',
|
|
137
|
+
'_NOT': 'not',
|
|
137
138
|
'_RETURN': 'return',
|
|
138
139
|
'_REVERSE': 'reverse',
|
|
139
140
|
'_RIGHTJOIN': '-+>',
|
synapse/lib/storm.lark
CHANGED
|
@@ -437,7 +437,8 @@ _cond: notcond | "(" _condexpr ")"
|
|
|
437
437
|
| condsubq | arraycond
|
|
438
438
|
| _varvalu | _reqdollarexprs
|
|
439
439
|
|
|
440
|
-
|
|
440
|
+
_NOT: "not"
|
|
441
|
+
notcond: _NOT _cond
|
|
441
442
|
|
|
442
443
|
hasrelpropcond: relprop | univprop
|
|
443
444
|
relpropcond: relpropvalue _cmpr _valu
|
|
@@ -627,15 +628,15 @@ OCTNUMBER.1: /
|
|
|
627
628
|
/x
|
|
628
629
|
|
|
629
630
|
BOOL.2: /(true|false)(?=$|[\s\),\]}\|\=])/
|
|
630
|
-
NULL.2:
|
|
631
|
-
|
|
631
|
+
NULL.2: /null(?=$|[\s\),\]}\|\=])/
|
|
632
|
+
NOTOP.2: /not(?=$|[\s\),\]}\|\=])/
|
|
632
633
|
OR.2: "or"
|
|
633
634
|
AND.2: "and"
|
|
634
635
|
|
|
635
636
|
// $ expression rules in increasing order of precedence (modeled on Python's order)
|
|
636
637
|
?expror: exprand | expror OR exprand
|
|
637
638
|
?exprand: exprnot | exprand AND exprnot
|
|
638
|
-
?exprnot: exprcmp |
|
|
639
|
+
?exprnot: exprcmp | NOTOP exprcmp
|
|
639
640
|
?exprcmp: exprsum | exprcmp (CMPR | EQSPACE | EQNOSPACE) exprsum
|
|
640
641
|
?exprsum: exprproduct | exprsum (EXPRPLUS | EXPRMINUS) exprproduct
|
|
641
642
|
?exprproduct: exprunary | exprproduct (EXPRTIMES | EXPRDIVIDE | EXPRMODULO) exprunary
|
synapse/lib/storm_format.py
CHANGED
|
@@ -57,7 +57,7 @@ TerminalPygMap = {
|
|
|
57
57
|
'MODSET': p_t.Operator,
|
|
58
58
|
'MODSETMULTI': p_t.Operator,
|
|
59
59
|
'NONQUOTEWORD': p_t.Literal,
|
|
60
|
-
'
|
|
60
|
+
'NOTOP': p_t.Operator,
|
|
61
61
|
'NULL': p_t.Keyword,
|
|
62
62
|
'NUMBER': p_t.Literal.Number,
|
|
63
63
|
'OCTNUMBER': p_t.Literal.Number,
|
|
@@ -115,6 +115,7 @@ TerminalPygMap = {
|
|
|
115
115
|
'_LPARNOSPACE': p_t.Punctuation,
|
|
116
116
|
'_MATCHHASH': p_t.Punctuation,
|
|
117
117
|
'_MATCHHASHWILD': p_t.Punctuation,
|
|
118
|
+
'_NOT': p_t.Keyword,
|
|
118
119
|
'_RETURN': p_t.Keyword,
|
|
119
120
|
'_REVERSE': p_t.Keyword,
|
|
120
121
|
'_RIGHTJOIN': p_t.Punctuation,
|
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, 202, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
228
|
+
commit = '744d404357c48b663bd03528e35c6f0e186edb0e'
|
synapse/telepath.py
CHANGED
|
@@ -31,6 +31,8 @@ televers = (3, 0)
|
|
|
31
31
|
|
|
32
32
|
aha_clients = {}
|
|
33
33
|
|
|
34
|
+
LINK_CULL_INTERVAL = 10
|
|
35
|
+
|
|
34
36
|
async def addAhaUrl(url):
|
|
35
37
|
'''
|
|
36
38
|
Add (incref) an aha registry URL.
|
|
@@ -590,6 +592,10 @@ class Proxy(s_base.Base):
|
|
|
590
592
|
valu = proxy.getFooValu(x, y)
|
|
591
593
|
|
|
592
594
|
'''
|
|
595
|
+
_link_task = None
|
|
596
|
+
_link_event = asyncio.Event()
|
|
597
|
+
_all_proxies = set()
|
|
598
|
+
|
|
593
599
|
async def __anit__(self, link, name):
|
|
594
600
|
|
|
595
601
|
await s_base.Base.__anit__(self)
|
|
@@ -608,11 +614,15 @@ class Proxy(s_base.Base):
|
|
|
608
614
|
self.methinfo = {}
|
|
609
615
|
|
|
610
616
|
self.sess = None
|
|
617
|
+
|
|
611
618
|
self.links = collections.deque()
|
|
612
|
-
self.
|
|
619
|
+
self.alllinks = collections.deque()
|
|
620
|
+
|
|
621
|
+
self._link_add = 0 # counter for pending links being connected
|
|
622
|
+
self._links_min = 4 # low water mark for the link pool
|
|
623
|
+
self._links_max = 12 # high water mark for the link pool
|
|
613
624
|
|
|
614
625
|
self.synack = None
|
|
615
|
-
self.syndone = asyncio.Event()
|
|
616
626
|
|
|
617
627
|
self.handlers = {
|
|
618
628
|
'task:fini': self._onTaskFini,
|
|
@@ -626,19 +636,52 @@ class Proxy(s_base.Base):
|
|
|
626
636
|
await item.fini()
|
|
627
637
|
|
|
628
638
|
mesg = ('task:fini', {'retn': (False, ('IsFini', {}))})
|
|
629
|
-
for
|
|
639
|
+
for iden, task in list(self.tasks.items()): # pragma: no cover
|
|
630
640
|
task.reply(mesg)
|
|
631
|
-
del self.tasks[
|
|
641
|
+
del self.tasks[iden]
|
|
632
642
|
|
|
633
|
-
|
|
634
|
-
|
|
643
|
+
# fini all the links from a different task to prevent
|
|
644
|
+
# delaying the proxy shutdown...
|
|
645
|
+
s_coro.create_task(self._finiAllLinks())
|
|
635
646
|
|
|
636
|
-
|
|
637
|
-
|
|
647
|
+
if self in self._all_proxies:
|
|
648
|
+
self._all_proxies.remove(self)
|
|
649
|
+
|
|
650
|
+
if not Proxy._all_proxies and Proxy._link_task is not None:
|
|
651
|
+
Proxy._link_task.cancel()
|
|
652
|
+
Proxy._link_task = None
|
|
653
|
+
|
|
654
|
+
Proxy._all_proxies.add(self)
|
|
638
655
|
|
|
639
656
|
self.onfini(fini)
|
|
640
657
|
self.link.onfini(self.fini)
|
|
641
658
|
|
|
659
|
+
if Proxy._link_task is None:
|
|
660
|
+
Proxy._link_task = s_coro.create_task(Proxy._linkLoopTask())
|
|
661
|
+
|
|
662
|
+
@classmethod
|
|
663
|
+
async def _linkLoopTask(clas):
|
|
664
|
+
while True:
|
|
665
|
+
try:
|
|
666
|
+
await s_coro.event_wait(Proxy._link_event, timeout=LINK_CULL_INTERVAL)
|
|
667
|
+
|
|
668
|
+
for proxy in list(Proxy._all_proxies):
|
|
669
|
+
|
|
670
|
+
if proxy.isfini:
|
|
671
|
+
continue
|
|
672
|
+
|
|
673
|
+
# close one link per proxy per period if the number of
|
|
674
|
+
# available links is greater than _links_max...
|
|
675
|
+
if len(proxy.links) > proxy._links_max:
|
|
676
|
+
link = proxy.links.popleft()
|
|
677
|
+
await link.fini()
|
|
678
|
+
await proxy.fire('pool:link:fini', link=link)
|
|
679
|
+
|
|
680
|
+
Proxy._link_event.clear()
|
|
681
|
+
|
|
682
|
+
except Exception: # pragma: no cover
|
|
683
|
+
logger.exception('synapse.telepath.Proxy.linkLoopTask()')
|
|
684
|
+
|
|
642
685
|
def _hasTeleFeat(self, name, vers=1):
|
|
643
686
|
return self._features.get(name, 0) >= vers
|
|
644
687
|
|
|
@@ -692,6 +735,12 @@ class Proxy(s_base.Base):
|
|
|
692
735
|
|
|
693
736
|
link = self.links.popleft()
|
|
694
737
|
|
|
738
|
+
# fire a task to replace the link if we are
|
|
739
|
+
# below the low-water mark for link count.
|
|
740
|
+
if len(self.links) + self._link_add < self._links_min:
|
|
741
|
+
self._link_add += 1
|
|
742
|
+
self.schedCoro(self._addPoolLink())
|
|
743
|
+
|
|
695
744
|
if link.isfini:
|
|
696
745
|
continue
|
|
697
746
|
|
|
@@ -700,6 +749,11 @@ class Proxy(s_base.Base):
|
|
|
700
749
|
# we need a new one...
|
|
701
750
|
return await self._initPoolLink()
|
|
702
751
|
|
|
752
|
+
async def _addPoolLink(self):
|
|
753
|
+
link = await self._initPoolLink()
|
|
754
|
+
self.links.append(link)
|
|
755
|
+
self._link_add -= 1
|
|
756
|
+
|
|
703
757
|
async def getPipeline(self, genr, name=None):
|
|
704
758
|
'''
|
|
705
759
|
Construct a proxy API call pipeline in order to make
|
|
@@ -724,8 +778,6 @@ class Proxy(s_base.Base):
|
|
|
724
778
|
|
|
725
779
|
async def _initPoolLink(self):
|
|
726
780
|
|
|
727
|
-
# TODO loop / backoff
|
|
728
|
-
|
|
729
781
|
if self.link.get('unix'):
|
|
730
782
|
|
|
731
783
|
path = self.link.get('path')
|
|
@@ -739,19 +791,26 @@ class Proxy(s_base.Base):
|
|
|
739
791
|
|
|
740
792
|
link = await s_link.connect(host, port, ssl=ssl)
|
|
741
793
|
|
|
742
|
-
self.
|
|
794
|
+
self.alllinks.append(link)
|
|
795
|
+
async def fini():
|
|
796
|
+
self.alllinks.remove(link)
|
|
797
|
+
if link in self.links:
|
|
798
|
+
self.links.remove(link)
|
|
799
|
+
|
|
800
|
+
link.onfini(fini)
|
|
743
801
|
|
|
744
802
|
return link
|
|
745
803
|
|
|
804
|
+
async def _finiAllLinks(self):
|
|
805
|
+
for link in list(self.alllinks):
|
|
806
|
+
await link.fini()
|
|
807
|
+
await self.link.fini()
|
|
808
|
+
|
|
746
809
|
async def _putPoolLink(self, link):
|
|
747
810
|
|
|
748
811
|
if link.isfini:
|
|
749
812
|
return
|
|
750
813
|
|
|
751
|
-
# If we've exceeded our poolsize, discard the current link.
|
|
752
|
-
if len(self.links) >= self._link_poolsize:
|
|
753
|
-
return await link.fini()
|
|
754
|
-
|
|
755
814
|
self.links.append(link)
|
|
756
815
|
|
|
757
816
|
def __enter__(self):
|
|
@@ -862,6 +921,7 @@ class Proxy(s_base.Base):
|
|
|
862
921
|
|
|
863
922
|
except GeneratorExit:
|
|
864
923
|
# if they bail early on the genr, fini the link
|
|
924
|
+
# TODO: devise a tx/rx strategy to recover these links...
|
|
865
925
|
await link.fini()
|
|
866
926
|
|
|
867
927
|
return s_coro.GenrHelp(genrloop())
|
|
@@ -1321,7 +1381,6 @@ class Client(s_base.Base):
|
|
|
1321
1381
|
info.update(self._t_opts)
|
|
1322
1382
|
self._t_proxy = await openinfo(info)
|
|
1323
1383
|
self._t_methinfo = self._t_proxy.methinfo
|
|
1324
|
-
self._t_proxy._link_poolsize = self._t_conf.get('link_poolsize', 4)
|
|
1325
1384
|
|
|
1326
1385
|
async def fini():
|
|
1327
1386
|
if self._t_named_meths:
|
synapse/tests/test_cortex.py
CHANGED
|
@@ -8504,6 +8504,26 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
8504
8504
|
self.notin('Timeout waiting for pool mirror', data)
|
|
8505
8505
|
self.notin('Timeout waiting for query mirror', data)
|
|
8506
8506
|
|
|
8507
|
+
orig = s_telepath.ClientV2.proxy
|
|
8508
|
+
async def finidproxy(self, timeout=None):
|
|
8509
|
+
prox = await orig(self, timeout=timeout)
|
|
8510
|
+
await prox.fini()
|
|
8511
|
+
return prox
|
|
8512
|
+
|
|
8513
|
+
with patch('synapse.telepath.ClientV2.proxy', finidproxy):
|
|
8514
|
+
with self.getLoggerStream('synapse') as stream:
|
|
8515
|
+
msgs = await alist(core00.storm('inet:asn=0'))
|
|
8516
|
+
self.len(1, [m for m in msgs if m[0] == 'node'])
|
|
8517
|
+
|
|
8518
|
+
stream.seek(0)
|
|
8519
|
+
data = stream.read()
|
|
8520
|
+
self.isin('Proxy for pool mirror [01.core.synapse] was shutdown. Skipping.', data)
|
|
8521
|
+
|
|
8522
|
+
msgs = await core00.stormlist('cortex.storm.pool.set --connection-timeout 1 --sync-timeout 1 aha://pool00...')
|
|
8523
|
+
self.stormHasNoWarnErr(msgs)
|
|
8524
|
+
self.stormIsInPrint('Storm pool configuration set.', msgs)
|
|
8525
|
+
await core00.stormpool.waitready(timeout=12)
|
|
8526
|
+
|
|
8507
8527
|
core01.nexsroot.nexslog.indx = 0
|
|
8508
8528
|
|
|
8509
8529
|
with patch('synapse.cortex.MAX_NEXUS_DELTA', 1):
|
|
@@ -8516,8 +8536,7 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
8516
8536
|
|
|
8517
8537
|
stream.seek(0)
|
|
8518
8538
|
data = stream.read()
|
|
8519
|
-
explog = (
|
|
8520
|
-
f'({nexsoffs} > 1), running query locally')
|
|
8539
|
+
explog = ('Pool mirror [01.core.synapse] is too far out of sync. Skipping.')
|
|
8521
8540
|
self.isin(explog, data)
|
|
8522
8541
|
self.notin('Offloading Storm query', data)
|
|
8523
8542
|
|
|
@@ -8575,7 +8594,8 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
8575
8594
|
|
|
8576
8595
|
stream.seek(0)
|
|
8577
8596
|
data = stream.read()
|
|
8578
|
-
self.isin('Timeout waiting for pool mirror
|
|
8597
|
+
self.isin('Timeout waiting for pool mirror proxy.', data)
|
|
8598
|
+
self.isin('Pool members exhausted. Running query locally.', data)
|
|
8579
8599
|
|
|
8580
8600
|
await core01.fini()
|
|
8581
8601
|
|
synapse/tests/test_lib_cell.py
CHANGED
|
@@ -1817,8 +1817,16 @@ class CellTest(s_t_utils.SynTest):
|
|
|
1817
1817
|
|
|
1818
1818
|
with open(bkuppath3, 'wb') as bkup3:
|
|
1819
1819
|
async for msg in proxy.iterNewBackupArchive('bkup3', remove=True):
|
|
1820
|
+
self.true(core.backupstreaming)
|
|
1820
1821
|
bkup3.write(msg)
|
|
1821
1822
|
|
|
1823
|
+
async def streamdone():
|
|
1824
|
+
while core.backupstreaming:
|
|
1825
|
+
await asyncio.sleep(0)
|
|
1826
|
+
|
|
1827
|
+
task = core.schedCoro(streamdone())
|
|
1828
|
+
await asyncio.wait_for(task, 15)
|
|
1829
|
+
|
|
1822
1830
|
self.eq(('bkup', 'bkup2'), sorted(await proxy.getBackups()))
|
|
1823
1831
|
self.false(os.path.isdir(os.path.join(backdirn, 'bkup3')))
|
|
1824
1832
|
|
|
@@ -1830,6 +1838,9 @@ class CellTest(s_t_utils.SynTest):
|
|
|
1830
1838
|
async for msg in proxy.iterNewBackupArchive(remove=True):
|
|
1831
1839
|
bkup4.write(msg)
|
|
1832
1840
|
|
|
1841
|
+
task = core.schedCoro(streamdone())
|
|
1842
|
+
await asyncio.wait_for(task, 15)
|
|
1843
|
+
|
|
1833
1844
|
self.eq(('bkup', 'bkup2'), sorted(await proxy.getBackups()))
|
|
1834
1845
|
|
|
1835
1846
|
# Start another backup while one is already running
|
|
@@ -746,6 +746,8 @@ Queries = [
|
|
|
746
746
|
'[test:str=foo :bar--=(foo, bar)]',
|
|
747
747
|
'[test:str=foo :bar?++=$baz]',
|
|
748
748
|
'[test:str=foo :bar?--={[it:dev:str=foo]}]',
|
|
749
|
+
'$foo=(notime,)',
|
|
750
|
+
'$foo=(nulltime,)',
|
|
749
751
|
]
|
|
750
752
|
|
|
751
753
|
# Generated with print_parse_list below
|
|
@@ -1394,6 +1396,8 @@ _ParseResults = [
|
|
|
1394
1396
|
'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, Const: foo], EditPropSetMulti: [RelProp: [Const: bar], Const: --=, List: [Const: foo, Const: bar]]]',
|
|
1395
1397
|
'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, Const: foo], EditPropSetMulti: [RelProp: [Const: bar], Const: ?++=, VarValue: [Const: baz]]]',
|
|
1396
1398
|
'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, Const: foo], EditPropSetMulti: [RelProp: [Const: bar], Const: ?--=, SubQuery: [Query: [EditNodeAdd: [FormName: [Const: it:dev:str], Const: =, Const: foo]]]]]',
|
|
1399
|
+
'Query: [SetVarOper: [Const: foo, List: [Const: notime]]]',
|
|
1400
|
+
'Query: [SetVarOper: [Const: foo, List: [Const: nulltime]]]',
|
|
1397
1401
|
]
|
|
1398
1402
|
|
|
1399
1403
|
class GrammarTest(s_t_utils.SynTest):
|
synapse/tests/test_lib_storm.py
CHANGED
|
@@ -167,6 +167,12 @@ class StormTest(s_t_utils.SynTest):
|
|
|
167
167
|
self.len(1, await core.nodes('ou:org=({"name": "origname"}) [ :name=newname ]'))
|
|
168
168
|
self.len(0, await core.nodes('ou:org=({"name": "origname"})'))
|
|
169
169
|
|
|
170
|
+
nodes = await core.nodes('[ it:exec:proc=(notime,) ]')
|
|
171
|
+
self.len(1, nodes)
|
|
172
|
+
|
|
173
|
+
nodes = await core.nodes('[ it:exec:proc=(nulltime,) ]')
|
|
174
|
+
self.len(1, nodes)
|
|
175
|
+
|
|
170
176
|
async def test_lib_storm_jsonexpr(self):
|
|
171
177
|
async with self.getTestCore() as core:
|
|
172
178
|
|
synapse/tests/test_telepath.py
CHANGED
|
@@ -318,6 +318,10 @@ class TeleTest(s_t_utils.SynTest):
|
|
|
318
318
|
link.onfini(evt.set)
|
|
319
319
|
s_glob.sync(proxy._putPoolLink(link))
|
|
320
320
|
|
|
321
|
+
# Grab the fresh link from the pool so our original link is up next again
|
|
322
|
+
link2 = s_glob.sync(proxy.getPoolLink())
|
|
323
|
+
s_glob.sync(proxy._putPoolLink(link2))
|
|
324
|
+
|
|
321
325
|
q = f'{form} | sleep 0.1'
|
|
322
326
|
|
|
323
327
|
# Break from the generator right away, causing a
|
|
@@ -935,7 +939,6 @@ class TeleTest(s_t_utils.SynTest):
|
|
|
935
939
|
|
|
936
940
|
# Validate the Proxy behavior then the client override
|
|
937
941
|
prox = await s_telepath.openurl(url) # type: Foo
|
|
938
|
-
prox._link_poolsize = 2
|
|
939
942
|
|
|
940
943
|
# Start with no links
|
|
941
944
|
self.len(0, prox.links)
|
|
@@ -947,53 +950,72 @@ class TeleTest(s_t_utils.SynTest):
|
|
|
947
950
|
genr = await prox.genr() # type: s_coro.GenrHelp
|
|
948
951
|
self.eq(await genr.genr.__anext__(), 10)
|
|
949
952
|
|
|
950
|
-
#
|
|
951
|
-
self.len(0, prox.links)
|
|
952
|
-
|
|
953
|
-
# and upon exhuastion, that link is put back
|
|
954
|
-
self.eq(await genr.list(), (20, 30))
|
|
953
|
+
# A new link is in the pool
|
|
955
954
|
self.len(1, prox.links)
|
|
956
|
-
self.true(prox.links[0] is l0)
|
|
957
955
|
|
|
958
|
-
#
|
|
959
|
-
|
|
960
|
-
genr1 = await prox.genr()
|
|
961
|
-
genr2 = await prox.genr()
|
|
962
|
-
self.len(0, prox.links)
|
|
963
|
-
# Consume two of the three generators
|
|
964
|
-
self.eq(await genr2.list(), (10, 20, 30))
|
|
965
|
-
self.len(1, prox.links)
|
|
966
|
-
self.eq(await genr1.list(), (10, 20, 30))
|
|
956
|
+
# and upon exhuastion, the first link is put back
|
|
957
|
+
self.eq(await genr.list(), (20, 30))
|
|
967
958
|
self.len(2, prox.links)
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
959
|
+
self.true(prox.links[1] is l0)
|
|
960
|
+
|
|
961
|
+
# Grabbing a link will still spin up another since we are below low watermark
|
|
962
|
+
genr = await prox.genr() # type: s_coro.GenrHelp
|
|
963
|
+
self.eq(await genr.genr.__anext__(), 10)
|
|
964
|
+
|
|
971
965
|
self.len(2, prox.links)
|
|
972
|
-
|
|
973
|
-
self.
|
|
974
|
-
|
|
975
|
-
|
|
966
|
+
|
|
967
|
+
self.eq(await genr.list(), (20, 30))
|
|
968
|
+
self.len(3, prox.links)
|
|
969
|
+
|
|
970
|
+
# Fill up pool above low watermark
|
|
971
|
+
genrs = [await prox.genr() for _ in range(2)]
|
|
972
|
+
[await genr.list() for genr in genrs]
|
|
973
|
+
self.len(5, prox.links)
|
|
974
|
+
|
|
975
|
+
# Grabbing a link no longer spins up a replacement
|
|
976
|
+
genr = await prox.genr() # type: s_coro.GenrHelp
|
|
977
|
+
self.eq(await genr.genr.__anext__(), 10)
|
|
978
|
+
self.len(4, prox.links)
|
|
979
|
+
|
|
980
|
+
self.eq(await genr.list(), (20, 30))
|
|
981
|
+
self.len(5, prox.links)
|
|
976
982
|
|
|
977
983
|
# Tear down a link by hand and place it back
|
|
978
984
|
# into the pool - that will fail b/c the link
|
|
979
985
|
# has been down down.
|
|
980
986
|
l1 = await prox.getPoolLink()
|
|
981
|
-
self.len(
|
|
987
|
+
self.len(4, prox.links)
|
|
982
988
|
await l1.fini()
|
|
983
989
|
await prox._putPoolLink(l1)
|
|
984
|
-
self.len(
|
|
990
|
+
self.len(4, prox.links)
|
|
985
991
|
|
|
986
992
|
# And all our links are torn down on fini
|
|
987
993
|
await prox.fini()
|
|
988
|
-
self.len(
|
|
989
|
-
for link in prox.links:
|
|
990
|
-
self.true(link.
|
|
994
|
+
self.len(4, prox.links)
|
|
995
|
+
for link in list(prox.links):
|
|
996
|
+
self.true(await link.waitfini(1))
|
|
997
|
+
self.len(0, prox.links)
|
|
998
|
+
|
|
999
|
+
with mock.patch('synapse.telepath.LINK_CULL_INTERVAL', 1):
|
|
1000
|
+
async with self.getTestDmon() as dmon:
|
|
1001
|
+
dmon.share('foo', foo)
|
|
1002
|
+
url = f'tcp://127.0.0.1:{dmon.addr[1]}/foo'
|
|
1003
|
+
|
|
1004
|
+
prox = await s_telepath.openurl(url)
|
|
991
1005
|
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
1006
|
+
# Fill up pool above high watermark
|
|
1007
|
+
genrs = [await prox.genr() for _ in range(13)]
|
|
1008
|
+
[await genr.list() for genr in genrs]
|
|
1009
|
+
self.len(13, prox.links)
|
|
1010
|
+
|
|
1011
|
+
# Add a fini'd proxy for coverage
|
|
1012
|
+
prox2 = await s_telepath.openurl(url)
|
|
1013
|
+
await prox2.fini()
|
|
1014
|
+
prox2._all_proxies.add(prox2)
|
|
1015
|
+
|
|
1016
|
+
wait = prox.waiter(1, 'pool:link:fini')
|
|
1017
|
+
self.len(1, await wait.wait(timeout=5))
|
|
1018
|
+
self.len(12, prox.links)
|
|
997
1019
|
|
|
998
1020
|
async def test_link_fini_breaking_tasks(self):
|
|
999
1021
|
foo = Foo()
|
|
@@ -1062,7 +1084,7 @@ class TeleTest(s_t_utils.SynTest):
|
|
|
1062
1084
|
|
|
1063
1085
|
self.eq(vals, (40, 50, 60))
|
|
1064
1086
|
|
|
1065
|
-
self.eq(
|
|
1087
|
+
self.eq(2, len(proxy.links))
|
|
1066
1088
|
self.eq(160, await proxy.bar(80, 80))
|
|
1067
1089
|
|
|
1068
1090
|
async def boomgenr():
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import os
|
|
1
|
+
import os
|
|
2
2
|
import pathlib
|
|
3
3
|
|
|
4
4
|
import vcr
|
|
5
5
|
|
|
6
|
+
from unittest import mock
|
|
7
|
+
|
|
6
8
|
import synapse.exc as s_exc
|
|
7
9
|
import synapse.data as s_data
|
|
10
|
+
import synapse.common as s_common
|
|
8
11
|
|
|
9
12
|
import synapse.lib.config as s_config
|
|
10
13
|
|
|
@@ -45,30 +48,34 @@ class TestUtilsGetrefs(s_utils.SynTest):
|
|
|
45
48
|
with self.raises(s_exc.BadArg):
|
|
46
49
|
s_getrefs.download_refs_handler('http://raw.githubusercontent.com/../../attack-flow/attack-flow-schema-2.0.0.json')
|
|
47
50
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
51
|
+
with self.getTestDir(copyfrom=s_getrefs.BASEDIR) as dirn:
|
|
52
|
+
|
|
53
|
+
filename = pathlib.Path(s_common.genpath(
|
|
54
|
+
dirn,
|
|
55
|
+
'raw.githubusercontent.com',
|
|
56
|
+
'oasis-open',
|
|
57
|
+
'cti-stix2-json-schemas',
|
|
58
|
+
'stix2.1',
|
|
59
|
+
'schemas',
|
|
60
|
+
'common',
|
|
61
|
+
'core.json'
|
|
62
|
+
))
|
|
63
|
+
|
|
64
|
+
self.true(filename.exists())
|
|
65
|
+
filename.unlink()
|
|
66
|
+
self.false(filename.exists())
|
|
67
|
+
|
|
68
|
+
# Clear the cached validator funcs so the ref handlers in s_getrefs get called
|
|
69
|
+
s_config._JsValidators = {}
|
|
70
|
+
|
|
71
|
+
with self.getLoggerStream('synapse.utils.getrefs') as stream:
|
|
72
|
+
with mock.patch('synapse.utils.getrefs.BASEDIR', dirn):
|
|
73
|
+
with self.getVcr():
|
|
74
|
+
s_getrefs.main(args)
|
|
75
|
+
|
|
76
|
+
stream.seek(0)
|
|
77
|
+
mesgs = stream.read()
|
|
78
|
+
mesg = f'Downloading schema from {CORE_URL}.'
|
|
79
|
+
self.true(filename.exists())
|
|
80
|
+
self.isin(mesg, mesgs)
|
|
81
|
+
self.notin(f'Schema {CORE_URL} already exists in local cache, skipping.', mesgs)
|
synapse/utils/getrefs.py
CHANGED
|
@@ -16,6 +16,8 @@ import synapse.lib.config as s_config
|
|
|
16
16
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
|
+
BASEDIR = s_data.path('jsonschemas')
|
|
20
|
+
|
|
19
21
|
def download_refs_handler(uri):
|
|
20
22
|
'''
|
|
21
23
|
This function downloads the JSON schema at the given URI, parses the given
|
|
@@ -34,11 +36,11 @@ async def _download_refs_handler(uri):
|
|
|
34
36
|
except ValueError:
|
|
35
37
|
raise s_exc.BadUrl(mesg=f'Malformed URI: {uri}.') from None
|
|
36
38
|
|
|
37
|
-
filename =
|
|
39
|
+
filename = s_common.genpath(BASEDIR, parts.hostname, *parts.path.split('/'))
|
|
38
40
|
filepath = pathlib.Path(filename)
|
|
39
41
|
|
|
40
42
|
# Check for path traversal. Unlikely, but still check
|
|
41
|
-
if not str(filepath.absolute()).startswith(
|
|
43
|
+
if not str(filepath.absolute()).startswith(BASEDIR):
|
|
42
44
|
raise s_exc.BadArg(mesg=f'Path traversal in schema URL: {uri} ?')
|
|
43
45
|
|
|
44
46
|
# If we already have the file, return it
|
|
@@ -2,14 +2,14 @@ synapse/__init__.py,sha256=R2kOXlF5j-8m6G0JkHuN7rXRPg_tHLmbMxr__94mHQk,1145
|
|
|
2
2
|
synapse/axon.py,sha256=A7rL_-dsCXnh8r0mXrV-1WM3-s1BfhXbx3j1xLy1QQE,65813
|
|
3
3
|
synapse/cells.py,sha256=eNvdglfAoTURVhGOLGcgMXCGpfsIX1a02SQnyiklo3E,308
|
|
4
4
|
synapse/common.py,sha256=dY9zEDHkJyUH6DT1wPPBxJYzcgh03rzR2R0760F5eyM,37847
|
|
5
|
-
synapse/cortex.py,sha256=
|
|
5
|
+
synapse/cortex.py,sha256=i9jW7FjmfT0bhlL1PflXk3976PyXT5Q5DHfvIRfUkwk,261438
|
|
6
6
|
synapse/cryotank.py,sha256=2-MzdTZ1AofkBp2ew3ZrZLo33rHRtNVTlr4YlXEfdrc,12130
|
|
7
7
|
synapse/daemon.py,sha256=hSD0-sXPGwblcbnCKRvsx9DCd-2cplB89dLWIlAN4UU,17051
|
|
8
8
|
synapse/datamodel.py,sha256=Lc8PF4tapY6leXv35M1UZHNQ3nDLxEWbfwS4crGNTV0,40347
|
|
9
9
|
synapse/exc.py,sha256=JpxmJdYrbihGf7zShC5M1q0kI2JQ6QaMaa89Rjx4SvY,9627
|
|
10
10
|
synapse/glob.py,sha256=tb6NPtK6Jp6YES9sB1AQi26HP6f-BcEiHrZz2yEyZ90,3210
|
|
11
11
|
synapse/mindmeld.py,sha256=TiijGH7wX2zdXIFSBUlN40CPOvYaFlw6Wxi66XZuB_M,26
|
|
12
|
-
synapse/telepath.py,sha256=
|
|
12
|
+
synapse/telepath.py,sha256=Ai4lO2KVMixfobe79YnRYuKjp8h6yenheTKU5L1u5XY,46826
|
|
13
13
|
synapse/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
synapse/cmds/boss.py,sha256=anEKo72bmMV6xTQ1XM-Dz9HFYkNKUX7Ee6Q6jKtkml4,2920
|
|
15
15
|
synapse/cmds/cortex.py,sha256=l81zQjR0OWF-X_lOm-gPqwhVGJ4KcKe0JLA3T1NbuU4,15402
|
|
@@ -88,10 +88,10 @@ synapse/lib/aha.py,sha256=atfXvPg4fqhEBIdpMdV2ctS6gYvP6SBfcgOrq19Tn7s,55717
|
|
|
88
88
|
synapse/lib/ast.py,sha256=fLVJwGFTtRUZWdKcxzd2PPCErDHfzt47aLT1wALwUSI,166296
|
|
89
89
|
synapse/lib/auth.py,sha256=xa4f3TkFuoNLL0H14dPGTfqnHAXLEEPyrEqn__8ouSc,54305
|
|
90
90
|
synapse/lib/autodoc.py,sha256=eTwyKM0msJFmLmZR1OxKFVAb8wcMgJ2q72Ccphsi-u8,23226
|
|
91
|
-
synapse/lib/base.py,sha256=
|
|
91
|
+
synapse/lib/base.py,sha256=m6gQB_PhSg-7-GJlNVgBQQJNseGEEBCwiZesk62l5Kg,23464
|
|
92
92
|
synapse/lib/boss.py,sha256=rYu4jkHJ3Y5GLX23Hlrwe9H17LF27LZ0BkK_A_9Aqh0,2056
|
|
93
93
|
synapse/lib/cache.py,sha256=N8BoNFQXOaYQU33LLYQcVkdV6IYjSNaUoaKue55y7H0,6275
|
|
94
|
-
synapse/lib/cell.py,sha256=
|
|
94
|
+
synapse/lib/cell.py,sha256=I3Wej36JaKxBP-Eh2lBHqrqiTiLMkEXxPLZQ8ffacUs,183479
|
|
95
95
|
synapse/lib/certdir.py,sha256=laGLxgx0gVxXvoaLKKemBQv71OZr9mDaqlAatdESV1A,56176
|
|
96
96
|
synapse/lib/chop.py,sha256=F0RRLlJ6NlpLW7sBWPNZV9Xw4w6HVbQbxPZPE6VhwVQ,9404
|
|
97
97
|
synapse/lib/cli.py,sha256=pQgwVpDMGTNk45UDnrx7SJNEh5H7g10z7B9zoQsgxc4,15055
|
|
@@ -126,7 +126,7 @@ synapse/lib/nexus.py,sha256=ODhPuTtQnQwUZA8AkYXjWWkm_V5BJJN7piy7dMn79gU,23451
|
|
|
126
126
|
synapse/lib/node.py,sha256=C4oiRjaLAYEiv5eETOYAROwQGg-EqhhtJCAZUtRBkI0,31251
|
|
127
127
|
synapse/lib/oauth.py,sha256=Nmd7dnxq7aRdBR5HILYYQm-TpCjfrTOIZwkHPeLQApA,15094
|
|
128
128
|
synapse/lib/output.py,sha256=MARscREHja4h8PQN7GZxHGvF36RoOkUyw3vfhmFzMTk,890
|
|
129
|
-
synapse/lib/parser.py,sha256=
|
|
129
|
+
synapse/lib/parser.py,sha256=Tjk1aYa5ucQLzGGUf14dmNFpxfLiKu00ZWj8SgAf324,29471
|
|
130
130
|
synapse/lib/queue.py,sha256=omMtqD4HWg2mLOhhtIe4pA_evz234lJ9uhlAhC_xbW4,3879
|
|
131
131
|
synapse/lib/ratelimit.py,sha256=BIeFPZb9Bk5GFIVvhM43Uw1s0abY6z7NgTuBorVajz4,1124
|
|
132
132
|
synapse/lib/reflect.py,sha256=j7Y522UzAwNswUehyfi9kHFNkTxuHXsFuEKY4ATXWTQ,2783
|
|
@@ -139,9 +139,9 @@ synapse/lib/slaboffs.py,sha256=Fd0RrIRBMjh159aQz5y1ONmzw0NvV040kVX_jZjQW6I,815
|
|
|
139
139
|
synapse/lib/slabseqn.py,sha256=LJ2SZEsZlROBAD3mdS-3JxNVVPXXkBW8GIJXsW0OGG8,10287
|
|
140
140
|
synapse/lib/snap.py,sha256=VUzwMshj_nQkKMb6DnLgL-2JQ4J1ruRlnFDTEti2Cs0,63594
|
|
141
141
|
synapse/lib/spooled.py,sha256=pKPacX-fvZDUTUWPaKgyct_lk_3eoSsF9Ufh_cn_1fQ,5987
|
|
142
|
-
synapse/lib/storm.lark,sha256=
|
|
142
|
+
synapse/lib/storm.lark,sha256=bnDd0YOFYyib0gwZBjZVXCePZIdoNLJCG7bgm_m2WoE,27419
|
|
143
143
|
synapse/lib/storm.py,sha256=vVRHuNofQ4W50pC-MPO1beWqJstH4oHqwY2NAZIlhdc,205259
|
|
144
|
-
synapse/lib/storm_format.py,sha256=
|
|
144
|
+
synapse/lib/storm_format.py,sha256=9cE8WNPYTcqgRakIqkmIQzOr16Hqbj_sM1QabHug3i0,4908
|
|
145
145
|
synapse/lib/stormctrl.py,sha256=3UC2LOHClC17JwYNuo8NeyntuAvIXphjenXEzVP33mY,2523
|
|
146
146
|
synapse/lib/stormhttp.py,sha256=GwSmdKbY3yFe8tgNazkUAPhmEwP2U2PJTbByPkHAXmk,28846
|
|
147
147
|
synapse/lib/stormsvc.py,sha256=dKREBhzYAncOXBbI-FYLRy9VusGIbRyF0TaDDz7mMXw,7581
|
|
@@ -156,7 +156,7 @@ synapse/lib/time.py,sha256=FKTYwpdvpuAj8p8sSodRjOxoA7Vu67CIbbXz55gtghk,9231
|
|
|
156
156
|
synapse/lib/trigger.py,sha256=mnfkoBHB88JfqPoxb5oflvAaBKZpNvYdxP247YS53fE,20697
|
|
157
157
|
synapse/lib/types.py,sha256=u89ukW38oDziRzeA6IWrPwwPD0Ds75u-gwJSXsQ4loY,69708
|
|
158
158
|
synapse/lib/urlhelp.py,sha256=0B4a0Zzcq4mVsC4MqqU-PkftdRPZsG4Ey_-HzbBzqo0,2528
|
|
159
|
-
synapse/lib/version.py,sha256=
|
|
159
|
+
synapse/lib/version.py,sha256=MI3ruoV8OoR14E8si7Gi7EQ9Pp_Imzkr0AAgsUGi8dM,7162
|
|
160
160
|
synapse/lib/view.py,sha256=fKRyTCtG2hj0vYnN-ERWQ98euQcLs-n0nvniGG1q_oM,61882
|
|
161
161
|
synapse/lib/crypto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
162
162
|
synapse/lib/crypto/coin.py,sha256=_dhlkzIrHT8BvHdJOWK7PDThz3sK3dDRnWAUqjRpZJc,4910
|
|
@@ -271,7 +271,7 @@ synapse/tests/test_cmds_boss.py,sha256=SdBwM2qJHFzzfrjWYiZOLBKeye8uru7KeJ3NU_YSk
|
|
|
271
271
|
synapse/tests/test_cmds_cortex.py,sha256=LWFz8HyuvsIGjtz2DqXYh-R-5QbiQWzLlQKqew7gabY,17157
|
|
272
272
|
synapse/tests/test_cmds_hive.py,sha256=aRH_Gh8oF_1BsfpmffyhDDNIqnTqsuF2cavdtGke1-0,5912
|
|
273
273
|
synapse/tests/test_common.py,sha256=iNwXas9bvrZn5Tz5Ig21RI-c79m6QpwFfbcEYib9IKg,17664
|
|
274
|
-
synapse/tests/test_cortex.py,sha256=
|
|
274
|
+
synapse/tests/test_cortex.py,sha256=4wrxgo7s4gHz3LXSfmlmBlYoc6xt0ZRciLdUEE0Ruc8,368611
|
|
275
275
|
synapse/tests/test_cryotank.py,sha256=ms2VkL0aUskMi-LArTzRt8LUYw0z_y8nQfOOBDiCkvI,12027
|
|
276
276
|
synapse/tests/test_daemon.py,sha256=QqKELhm1HF0q_8Kbk0Uf9fnUg3K5nLQ7MocGIyuKKIw,7715
|
|
277
277
|
synapse/tests/test_data.py,sha256=f8L-q6kpMq8XPG3hq1jwlyaFRQEinSBf7ZlsRFeCuoM,196
|
|
@@ -287,7 +287,7 @@ synapse/tests/test_lib_autodoc.py,sha256=H2XO2_d8FmsHUd-cn7M-LjTX-078xLhMiOGiGGk
|
|
|
287
287
|
synapse/tests/test_lib_base.py,sha256=0XUGNaXmfDW896gpBTYYd7ovADUD8cyDLkGTefqn1FM,14550
|
|
288
288
|
synapse/tests/test_lib_boss.py,sha256=boeFTQqOU7UKXxFCaMZWLwK_2RvXpmVDSZgGpCVnIC4,1919
|
|
289
289
|
synapse/tests/test_lib_cache.py,sha256=oQgEBhm8pZFCEvMfcD3znTDQgl8Gv91fEOB-3eb2IIg,8594
|
|
290
|
-
synapse/tests/test_lib_cell.py,sha256=
|
|
290
|
+
synapse/tests/test_lib_cell.py,sha256=nEyXgkBRaAYRBwfhcGExbG2oKwB_iylM4FVYXpsbAT4,155333
|
|
291
291
|
synapse/tests/test_lib_certdir.py,sha256=d5X1lvp0DnBRigXYLbofZAXakZp440-bjaMH30PlGsI,42728
|
|
292
292
|
synapse/tests/test_lib_chop.py,sha256=LkrM_pQU_KS88aVRPD4DI97qSdhxmw6EUA_jb-UJpww,6238
|
|
293
293
|
synapse/tests/test_lib_cli.py,sha256=B8qGx9KtTWp31RlCMtfFMzhJ0TzaaO9ph7RCK2jHtx4,9283
|
|
@@ -302,7 +302,7 @@ synapse/tests/test_lib_datfile.py,sha256=jyWAx0BtPK6hjkUmAzUB0-jAWYgIyx3EmB2XxaZ
|
|
|
302
302
|
synapse/tests/test_lib_dyndeps.py,sha256=qahr9yrB1SM5bkF9VwW_eQqB_Tva_HRUJwx9QQQCxiM,1239
|
|
303
303
|
synapse/tests/test_lib_encoding.py,sha256=Zt-VtnLII7_A2jSmQ_q_B6xHnT6Eg5IlfacCIm2WkeA,6575
|
|
304
304
|
synapse/tests/test_lib_gis.py,sha256=7vUXgHzjLNDPtYfcrVKQmNNo4EoJNYGYFXWdYf7XG9k,3186
|
|
305
|
-
synapse/tests/test_lib_grammar.py,sha256=
|
|
305
|
+
synapse/tests/test_lib_grammar.py,sha256=FcSQ1erbhioCTsQ10g08FUe8x890oho-rEcsIaVfE98,146512
|
|
306
306
|
synapse/tests/test_lib_hashitem.py,sha256=IyyueviwK8g-MpCkXU-jLfMDRFMuO8Bl3870IucZMg8,715
|
|
307
307
|
synapse/tests/test_lib_hashset.py,sha256=HwFsohiEzLyQ3evpvcezlj2iM7Li5IrN4rWh1jZnnPQ,1329
|
|
308
308
|
synapse/tests/test_lib_health.py,sha256=yqNw6rXBm_2UBqPlWxeLpFhawKocdS1VitOCD3Lv8gE,2265
|
|
@@ -331,7 +331,7 @@ synapse/tests/test_lib_slaboffs.py,sha256=FHQ8mGZ27dGqVwGk6q2UJ4gkPRZN22eIVzS8hM
|
|
|
331
331
|
synapse/tests/test_lib_slabseqn.py,sha256=74V6jU7DRTsy_hqUFDuT4C6dPlJ6ObNnjmI9qhbbyVc,5230
|
|
332
332
|
synapse/tests/test_lib_snap.py,sha256=OviJtj9N5LhBV-56TySkWvRly7f8VH9d-VBcNFLAtmg,27805
|
|
333
333
|
synapse/tests/test_lib_spooled.py,sha256=fkLuujrDqjeJtyByptmGZvJbM9QiETCAu4r_4PdLfZg,3929
|
|
334
|
-
synapse/tests/test_lib_storm.py,sha256=
|
|
334
|
+
synapse/tests/test_lib_storm.py,sha256=DehvWuaqr1Jln8v73FQFjESSAlfEUKT0sX0KYpCOTLU,239922
|
|
335
335
|
synapse/tests/test_lib_storm_format.py,sha256=tEZgQMmKAeG8FQZE5HUjOT7bnKawVTpNaVQh_3Wa630,277
|
|
336
336
|
synapse/tests/test_lib_stormctrl.py,sha256=1vY7PGjgmz3AibgSiGcp_G4NSYl9YNifWdjPB0CDf1g,2877
|
|
337
337
|
synapse/tests/test_lib_stormhttp.py,sha256=92LKxnF4iPlM0lCnI6UmNZxbANURAiZtajS5xiIwxCs,45504
|
|
@@ -424,7 +424,7 @@ synapse/tests/test_servers_cortex.py,sha256=2td41cPfC5-hJ1C6sH5NsN-ixjfXPCpnPllP
|
|
|
424
424
|
synapse/tests/test_servers_cryotank.py,sha256=vDxTcF4mUP5QQyf3xD-PKXRsYD0EvLknlkr9S3H2RKc,1185
|
|
425
425
|
synapse/tests/test_servers_stemcell.py,sha256=TJabX5aQVLbGNLffiVd3B7Uj5dH12Y-0KqAW56GM0G8,2320
|
|
426
426
|
synapse/tests/test_servers_univ.py,sha256=eXesifJL05IA91f5od-9bjuIDVhNWMdo8qWzaHEr22s,2704
|
|
427
|
-
synapse/tests/test_telepath.py,sha256=
|
|
427
|
+
synapse/tests/test_telepath.py,sha256=Fci-M1LIZO7rh9ra3xh4Hs8bDBCg-5V8cxm8Gm3Ps_s,46987
|
|
428
428
|
synapse/tests/test_tools_aha.py,sha256=pqfQYh0Uz235z32bgAN4kXJq7N2ge3SuK4rb357zCgM,16763
|
|
429
429
|
synapse/tests/test_tools_apikey.py,sha256=pAjOSAhZiflKksZMHmICWRi0nIO5hS9P5VcT8qUubn0,8909
|
|
430
430
|
synapse/tests/test_tools_autodoc.py,sha256=1SXQcRwB40VZG3YX8T7vGh2YRnDjnSv5AKMz8fj4V1k,9027
|
|
@@ -455,7 +455,7 @@ synapse/tests/test_tools_rstorm.py,sha256=-bIvNCY9Vx702LsNb2vwunZBT6fyXHse28Av6H
|
|
|
455
455
|
synapse/tests/test_tools_snapshot.py,sha256=MfMq8ij4Ztxrn0D_iVYXRGSHI1_rQzEybexjlraeSaQ,1750
|
|
456
456
|
synapse/tests/test_tools_storm.py,sha256=xCDr3RumtBpFsxq0BhI0rRd6S83zoFI0oHeb6VlRsKY,21520
|
|
457
457
|
synapse/tests/test_utils.py,sha256=DHyG6nltUGYBkwq3V_2NX4NLxhUWfCjYEtMx9FL8104,9915
|
|
458
|
-
synapse/tests/test_utils_getrefs.py,sha256=
|
|
458
|
+
synapse/tests/test_utils_getrefs.py,sha256=Cv0LT0DF-tCGwBmOXsYUVNIJdXQA73yRBgdSWxFL3oA,2623
|
|
459
459
|
synapse/tests/test_utils_stormcov.py,sha256=H9p1vFH8kNE6qMLrGzSV0eH7KOgdZFh7QuarFe47FtU,6149
|
|
460
460
|
synapse/tests/utils.py,sha256=TLaj2XPpY9qj4JPa4yXplFe09o2FfIxP1JlwH2k3fvo,78241
|
|
461
461
|
synapse/tests/files/TestUtilsGetrefs.test_basics.yaml,sha256=Ch8cEGFYfDUCZTEvzAqW5Ir79OnYb49pq4i9OJ7K9T0,8257
|
|
@@ -566,7 +566,7 @@ synapse/tools/hive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
566
566
|
synapse/tools/hive/load.py,sha256=ctCNeyHfVgDXmlJcT4DLvYYPPMoBrXF0kAhUQbWRV4o,2188
|
|
567
567
|
synapse/tools/hive/save.py,sha256=179wHdemYXiDnszfvY14_3jSYL7X8BVbXtHFXwpiPk4,1938
|
|
568
568
|
synapse/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
569
|
-
synapse/utils/getrefs.py,sha256=
|
|
569
|
+
synapse/utils/getrefs.py,sha256=6W8Yh0fNtrsCnmejMO0a4sdlHS369Im21e4hS0fvsbQ,2813
|
|
570
570
|
synapse/utils/stormcov/__init__.py,sha256=81TBw16JwbjeOjegMrJmc5-eY5I4gsks4TrOgyot4CU,163
|
|
571
571
|
synapse/utils/stormcov/plugin.py,sha256=NUf3SDemVi5Nm7AzJPTvI7TYdg2uc8B1MvXu7thnIqE,8194
|
|
572
572
|
synapse/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -613,8 +613,8 @@ synapse/vendor/xrpl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
613
613
|
synapse/vendor/xrpl/tests/test_codec.py,sha256=Zwq6A5uZUK_FWDL3BA932c5b-rL3hnC6efobWHSLC4o,6651
|
|
614
614
|
synapse/vendor/xrpl/tests/test_main.py,sha256=kZQwWk7I6HrP-PMvLdsUUN4POvWD9I-iXDHOwdeF090,4299
|
|
615
615
|
synapse/vendor/xrpl/tests/test_main_test_cases.py,sha256=vTlUM4hJD2Hd2wCIdd9rfsvcMZZZQmNHWdCTTFeGz2Y,4221
|
|
616
|
-
synapse-2.
|
|
617
|
-
synapse-2.
|
|
618
|
-
synapse-2.
|
|
619
|
-
synapse-2.
|
|
620
|
-
synapse-2.
|
|
616
|
+
synapse-2.202.0.dist-info/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
|
|
617
|
+
synapse-2.202.0.dist-info/METADATA,sha256=MyMuE8l4chSCow575cLLxkxGXmnnP_lJ068EUhBkQA0,4620
|
|
618
|
+
synapse-2.202.0.dist-info/WHEEL,sha256=SVzJgwHRq-bq9xNTNjXYZdMgXBw9NIJUHI7f40f9nI0,93
|
|
619
|
+
synapse-2.202.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
|
|
620
|
+
synapse-2.202.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|