synapse 2.225.0__py311-none-any.whl → 2.226.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 +6 -8
- synapse/lib/agenda.py +28 -15
- synapse/lib/ast.py +4 -8
- synapse/lib/platforms/linux.py +2 -0
- synapse/lib/storm.py +11 -3
- synapse/lib/stormlib/aha.py +3 -3
- synapse/lib/stormtypes.py +10 -3
- synapse/lib/types.py +20 -0
- synapse/lib/version.py +2 -2
- synapse/models/base.py +3 -0
- synapse/models/inet.py +58 -5
- synapse/models/infotech.py +18 -0
- synapse/tests/test_cortex.py +113 -0
- synapse/tests/test_lib_agenda.py +140 -27
- synapse/tests/test_lib_lmdbslab.py +2 -0
- synapse/tests/test_lib_platforms_linux.py +4 -0
- synapse/tests/test_lib_storm.py +6 -0
- synapse/tests/test_lib_stormlib_aha.py +6 -2
- synapse/tests/test_model_inet.py +31 -0
- synapse/tests/test_model_infotech.py +15 -1
- synapse/tests/test_tools_aha.py +2 -2
- synapse/tests/utils.py +12 -0
- synapse/tools/aha/mirror.py +1 -1
- {synapse-2.225.0.dist-info → synapse-2.226.0.dist-info}/METADATA +1 -1
- {synapse-2.225.0.dist-info → synapse-2.226.0.dist-info}/RECORD +28 -28
- {synapse-2.225.0.dist-info → synapse-2.226.0.dist-info}/WHEEL +0 -0
- {synapse-2.225.0.dist-info → synapse-2.226.0.dist-info}/licenses/LICENSE +0 -0
- {synapse-2.225.0.dist-info → synapse-2.226.0.dist-info}/top_level.txt +0 -0
synapse/cortex.py
CHANGED
|
@@ -1538,11 +1538,9 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
1538
1538
|
'desc': 'Controls access to deleting storm packages.'},
|
|
1539
1539
|
|
|
1540
1540
|
{'perm': ('storm', 'asroot', 'cmd', '<cmdname>'), 'gate': 'cortex',
|
|
1541
|
-
'desc': '
|
|
1542
|
-
'ex': 'storm.asroot.cmd.movetag'},
|
|
1541
|
+
'desc': 'Deprecated. Please use Storm modules to implement functionality requiring root privileges.'},
|
|
1543
1542
|
{'perm': ('storm', 'asroot', 'mod', '<modname>'), 'gate': 'cortex',
|
|
1544
|
-
'desc': '
|
|
1545
|
-
'ex': 'storm.asroot.cmd.synapse-misp.privsep'},
|
|
1543
|
+
'desc': 'Deprecated. Storm modules should use the asroot:perms key to specify the permissions they require.'},
|
|
1546
1544
|
|
|
1547
1545
|
{'perm': ('storm', 'graph', 'add'), 'gate': 'cortex',
|
|
1548
1546
|
'desc': 'Controls access to add a storm graph.',
|
|
@@ -6914,7 +6912,7 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
6914
6912
|
Delete a cron job
|
|
6915
6913
|
|
|
6916
6914
|
Args:
|
|
6917
|
-
iden (
|
|
6915
|
+
iden (str): The iden of the cron job to be deleted
|
|
6918
6916
|
'''
|
|
6919
6917
|
await self._killCronTask(iden)
|
|
6920
6918
|
try:
|
|
@@ -6931,7 +6929,7 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
6931
6929
|
Change an existing cron job's query
|
|
6932
6930
|
|
|
6933
6931
|
Args:
|
|
6934
|
-
iden (
|
|
6932
|
+
iden (str): The iden of the cron job to be changed
|
|
6935
6933
|
'''
|
|
6936
6934
|
await self.agenda.mod(iden, query)
|
|
6937
6935
|
await self.feedBeholder('cron:edit:query', {'iden': iden, 'query': query}, gates=[iden])
|
|
@@ -6942,7 +6940,7 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
6942
6940
|
Enable a cron job
|
|
6943
6941
|
|
|
6944
6942
|
Args:
|
|
6945
|
-
iden (
|
|
6943
|
+
iden (str): The iden of the cron job to be changed
|
|
6946
6944
|
'''
|
|
6947
6945
|
await self.agenda.enable(iden)
|
|
6948
6946
|
await self.feedBeholder('cron:enable', {'iden': iden}, gates=[iden])
|
|
@@ -6954,7 +6952,7 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
6954
6952
|
Enable a cron job
|
|
6955
6953
|
|
|
6956
6954
|
Args:
|
|
6957
|
-
iden (
|
|
6955
|
+
iden (str): The iden of the cron job to be changed
|
|
6958
6956
|
'''
|
|
6959
6957
|
await self.agenda.disable(iden)
|
|
6960
6958
|
await self._killCronTask(iden)
|
synapse/lib/agenda.py
CHANGED
|
@@ -430,6 +430,9 @@ class _Appt:
|
|
|
430
430
|
|
|
431
431
|
if name == 'lasterrs' and not isinstance(valu, list):
|
|
432
432
|
valu = list(valu)
|
|
433
|
+
elif name == 'nexttime' and valu is None:
|
|
434
|
+
self.recs.clear()
|
|
435
|
+
self.stor._delete_appt_from_heap(self)
|
|
433
436
|
|
|
434
437
|
setattr(self, name, valu)
|
|
435
438
|
|
|
@@ -469,7 +472,6 @@ class Agenda(s_base.Base):
|
|
|
469
472
|
self.apptheap = []
|
|
470
473
|
self.appts = {}
|
|
471
474
|
|
|
472
|
-
to_delete = []
|
|
473
475
|
for iden, info in self.apptdefs.items():
|
|
474
476
|
try:
|
|
475
477
|
appt = _Appt.unpack(self, info)
|
|
@@ -479,18 +481,30 @@ class Agenda(s_base.Base):
|
|
|
479
481
|
self._next_indx = max(self._next_indx, appt.indx + 1)
|
|
480
482
|
except (s_exc.InconsistentStorage, s_exc.BadStorageVersion, s_exc.BadTime, TypeError, KeyError,
|
|
481
483
|
UnicodeDecodeError) as e:
|
|
482
|
-
logger.warning('Invalid appointment %r found in storage: %r.
|
|
483
|
-
to_delete.append(iden)
|
|
484
|
-
continue
|
|
485
|
-
|
|
486
|
-
for iden in to_delete:
|
|
487
|
-
self.apptdefs.pop(iden)
|
|
484
|
+
logger.warning('Invalid appointment %r found in storage: %r. This appointment will be removed.', iden, e)
|
|
488
485
|
|
|
489
486
|
# Make sure we don't assign the same index to 2 appointments
|
|
490
487
|
if self.appts:
|
|
491
488
|
maxindx = max(appt.indx for appt in self.appts.values())
|
|
492
489
|
self._next_indx = maxindx + 1
|
|
493
490
|
|
|
491
|
+
async def _clear_invalid(self):
|
|
492
|
+
|
|
493
|
+
to_delete = []
|
|
494
|
+
for iden, info in self.apptdefs.items():
|
|
495
|
+
try:
|
|
496
|
+
appt = _Appt.unpack(self, info)
|
|
497
|
+
if appt.iden != iden:
|
|
498
|
+
raise s_exc.InconsistentStorage(mesg='iden inconsistency')
|
|
499
|
+
|
|
500
|
+
except (s_exc.InconsistentStorage, s_exc.BadStorageVersion, s_exc.BadTime, TypeError, KeyError,
|
|
501
|
+
UnicodeDecodeError) as e:
|
|
502
|
+
logger.warning('Removing invalid appointment %r.', iden)
|
|
503
|
+
to_delete.append(iden)
|
|
504
|
+
|
|
505
|
+
for iden in to_delete:
|
|
506
|
+
await self.core.delCronJob(iden)
|
|
507
|
+
|
|
494
508
|
def _addappt(self, iden, appt):
|
|
495
509
|
'''
|
|
496
510
|
Updates the data structures to add an appointment
|
|
@@ -685,14 +699,13 @@ class Agenda(s_base.Base):
|
|
|
685
699
|
'''
|
|
686
700
|
Delete an appointment
|
|
687
701
|
'''
|
|
688
|
-
|
|
689
|
-
if appt is None:
|
|
702
|
+
if not self.apptdefs.delete(iden):
|
|
690
703
|
mesg = f'No cron job with iden: {iden}'
|
|
691
704
|
raise s_exc.NoSuchIden(iden=iden, mesg=mesg)
|
|
692
705
|
|
|
693
|
-
self.
|
|
694
|
-
|
|
695
|
-
|
|
706
|
+
if (appt := self.appts.get(iden)) is not None:
|
|
707
|
+
self._delete_appt_from_heap(appt)
|
|
708
|
+
del self.appts[iden]
|
|
696
709
|
|
|
697
710
|
def _delete_appt_from_heap(self, appt):
|
|
698
711
|
try:
|
|
@@ -729,14 +742,14 @@ class Agenda(s_base.Base):
|
|
|
729
742
|
await self.core.addCronEdits(appt.iden, edits)
|
|
730
743
|
await self.core.feedBeholder('cron:stop', {'iden': appt.iden})
|
|
731
744
|
|
|
732
|
-
if appt.nexttime is None:
|
|
733
|
-
self._delete_appt_from_heap(appt)
|
|
734
|
-
|
|
735
745
|
async def runloop(self):
|
|
736
746
|
'''
|
|
737
747
|
Task loop to issue query tasks at the right times.
|
|
738
748
|
'''
|
|
739
749
|
await self.clearRunningStatus()
|
|
750
|
+
|
|
751
|
+
await self._clear_invalid()
|
|
752
|
+
|
|
740
753
|
while not self.isfini:
|
|
741
754
|
|
|
742
755
|
timeout = None
|
synapse/lib/ast.py
CHANGED
|
@@ -3452,10 +3452,6 @@ class PropValue(Value):
|
|
|
3452
3452
|
raise self.kids[0].addExcInfo(exc)
|
|
3453
3453
|
|
|
3454
3454
|
valu = path.node.get(name)
|
|
3455
|
-
if isinstance(valu, (dict, list, tuple)):
|
|
3456
|
-
# these get special cased because changing them affects the node
|
|
3457
|
-
# while it's in the pipeline but the modification doesn't get stored
|
|
3458
|
-
valu = s_msgpack.deepcopy(valu)
|
|
3459
3455
|
return prop, valu
|
|
3460
3456
|
|
|
3461
3457
|
# handle implicit pivot properties
|
|
@@ -3479,10 +3475,6 @@ class PropValue(Value):
|
|
|
3479
3475
|
raise self.kids[0].addExcInfo(exc)
|
|
3480
3476
|
|
|
3481
3477
|
if i >= imax:
|
|
3482
|
-
if isinstance(valu, (dict, list, tuple)):
|
|
3483
|
-
# these get special cased because changing them affects the node
|
|
3484
|
-
# while it's in the pipeline but the modification doesn't get stored
|
|
3485
|
-
valu = s_msgpack.deepcopy(valu)
|
|
3486
3478
|
return prop, valu
|
|
3487
3479
|
|
|
3488
3480
|
form = runt.model.forms.get(prop.type.name)
|
|
@@ -3495,6 +3487,10 @@ class PropValue(Value):
|
|
|
3495
3487
|
|
|
3496
3488
|
async def compute(self, runt, path):
|
|
3497
3489
|
prop, valu = await self.getPropAndValu(runt, path)
|
|
3490
|
+
|
|
3491
|
+
if prop:
|
|
3492
|
+
valu = await prop.type.tostorm(valu)
|
|
3493
|
+
|
|
3498
3494
|
return valu
|
|
3499
3495
|
|
|
3500
3496
|
class RelPropValue(PropValue):
|
synapse/lib/platforms/linux.py
CHANGED
|
@@ -112,7 +112,9 @@ def getSysctls():
|
|
|
112
112
|
('vm.dirty_expire_centisecs', '/proc/sys/vm/dirty_expire_centisecs', int),
|
|
113
113
|
('vm.dirty_writeback_centisecs', '/proc/sys/vm/dirty_writeback_centisecs', int),
|
|
114
114
|
('vm.dirty_background_ratio', '/proc/sys/vm/dirty_background_ratio', int),
|
|
115
|
+
('vm.dirty_background_bytes', '/proc/sys/vm/dirty_background_bytes', int),
|
|
115
116
|
('vm.dirty_ratio', '/proc/sys/vm/dirty_ratio', int),
|
|
117
|
+
('vm.dirty_bytes', '/proc/sys/vm/dirty_bytes', int),
|
|
116
118
|
)
|
|
117
119
|
ret = {}
|
|
118
120
|
for key, fp, func in _sysctls:
|
synapse/lib/storm.py
CHANGED
|
@@ -2521,9 +2521,17 @@ class PureCmd(Cmd):
|
|
|
2521
2521
|
perm = ('storm', 'asroot', 'cmd') + tuple(name.split('.'))
|
|
2522
2522
|
|
|
2523
2523
|
asroot = runt.allowed(perm)
|
|
2524
|
-
if self.asroot
|
|
2525
|
-
mesg = f'Command ({name})
|
|
2526
|
-
|
|
2524
|
+
if self.asroot:
|
|
2525
|
+
mesg = f'Command ({name}) requires asroot permission which is deprecated and will be removed in v3.0.0. ' \
|
|
2526
|
+
'Functionality which requires elevated permissions should be implemented in Storm modules and use ' \
|
|
2527
|
+
'asroot:perms to specify the required permissions.'
|
|
2528
|
+
|
|
2529
|
+
s_common.deprecated('Storm command asroot key', curv='2.226.0', eolv='3.0.0')
|
|
2530
|
+
await runt.warnonce(mesg, log=False)
|
|
2531
|
+
|
|
2532
|
+
if not asroot:
|
|
2533
|
+
mesg = f'Command ({name}) elevates privileges. You need perm: storm.asroot.cmd.{name}'
|
|
2534
|
+
raise s_exc.AuthDeny(mesg=mesg, user=runt.user.iden, username=runt.user.name)
|
|
2527
2535
|
|
|
2528
2536
|
# if a command requires perms, check em!
|
|
2529
2537
|
# ( used to create more intuitive perm boundaries )
|
synapse/lib/stormlib/aha.py
CHANGED
|
@@ -740,10 +740,10 @@ The ready column indicates that a service has entered into the realtime change w
|
|
|
740
740
|
$info = $cell_infos.$svcname
|
|
741
741
|
$cell_info = $info.cell
|
|
742
742
|
$status.nexs_indx = $cell_info.nexsindx
|
|
743
|
-
if ($cell_info.
|
|
744
|
-
$status.role = 'follower'
|
|
745
|
-
} else {
|
|
743
|
+
if ($cell_info.active) {
|
|
746
744
|
$status.role = 'leader'
|
|
745
|
+
} else {
|
|
746
|
+
$status.role = 'follower'
|
|
747
747
|
}
|
|
748
748
|
$status.version = $info.cell.verstring
|
|
749
749
|
$status.synapse_version = $info.synapse.verstring
|
synapse/lib/stormtypes.py
CHANGED
|
@@ -1499,9 +1499,16 @@ class LibBase(Lib):
|
|
|
1499
1499
|
perm = ('storm', 'asroot', 'mod') + tuple(name.split('.'))
|
|
1500
1500
|
asroot = self.runt.allowed(perm)
|
|
1501
1501
|
|
|
1502
|
-
if mdef.get('asroot', False)
|
|
1503
|
-
mesg = f'Module ({name})
|
|
1504
|
-
|
|
1502
|
+
if mdef.get('asroot', False):
|
|
1503
|
+
mesg = f'Module ({name}) requires asroot permission but does not specify any asroot:perms. ' \
|
|
1504
|
+
'storm.asroot.mod.<modname> style permissons are deprecated and will be removed in v3.0.0.'
|
|
1505
|
+
|
|
1506
|
+
s_common.deprecated('Storm module asroot key', curv='2.226.0', eolv='3.0.0')
|
|
1507
|
+
await self.runt.warnonce(mesg, log=False)
|
|
1508
|
+
|
|
1509
|
+
if not asroot:
|
|
1510
|
+
mesg = f'Module ({name}) elevates privileges. You need perm: storm.asroot.mod.{name}'
|
|
1511
|
+
raise s_exc.AuthDeny(mesg=mesg, user=self.runt.user.iden, username=self.runt.user.name)
|
|
1505
1512
|
|
|
1506
1513
|
modr = await self.runt.getModRuntime(query, opts={'vars': {'modconf': modconf}})
|
|
1507
1514
|
modr.asroot = asroot
|
synapse/lib/types.py
CHANGED
|
@@ -32,6 +32,8 @@ class Type:
|
|
|
32
32
|
# ( due to hot-loop needs in the storm runtime )
|
|
33
33
|
isarray = False
|
|
34
34
|
|
|
35
|
+
ismutable = False
|
|
36
|
+
|
|
35
37
|
def __init__(self, modl, name, info, opts):
|
|
36
38
|
'''
|
|
37
39
|
Construct a new Type object.
|
|
@@ -369,6 +371,17 @@ class Type:
|
|
|
369
371
|
topt.update(opts)
|
|
370
372
|
return self.__class__(self.modl, self.name, self.info, topt)
|
|
371
373
|
|
|
374
|
+
async def tostorm(self, valu):
|
|
375
|
+
'''
|
|
376
|
+
Allows type-specific modifications to values to make them safe for use in the runtime.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
valu (any): The valu to update.
|
|
380
|
+
'''
|
|
381
|
+
if self.ismutable:
|
|
382
|
+
return s_msgpack.deepcopy(valu, use_list=True)
|
|
383
|
+
return valu
|
|
384
|
+
|
|
372
385
|
def __eq__(self, othr):
|
|
373
386
|
if self.name != othr.name:
|
|
374
387
|
return False
|
|
@@ -415,6 +428,7 @@ class Bool(Type):
|
|
|
415
428
|
class Array(Type):
|
|
416
429
|
|
|
417
430
|
isarray = True
|
|
431
|
+
ismutable = True
|
|
418
432
|
|
|
419
433
|
def postTypeInit(self):
|
|
420
434
|
|
|
@@ -534,6 +548,9 @@ class Comp(Type):
|
|
|
534
548
|
|
|
535
549
|
_type = self.tcache[name]
|
|
536
550
|
|
|
551
|
+
if _type.ismutable:
|
|
552
|
+
self.ismutable = True
|
|
553
|
+
|
|
537
554
|
norm, info = _type.norm(valu[i])
|
|
538
555
|
|
|
539
556
|
subs[name] = norm
|
|
@@ -1623,6 +1640,8 @@ class TimeEdge(Edge):
|
|
|
1623
1640
|
|
|
1624
1641
|
class Data(Type):
|
|
1625
1642
|
|
|
1643
|
+
ismutable = True
|
|
1644
|
+
|
|
1626
1645
|
stortype = s_layer.STOR_TYPE_MSGP
|
|
1627
1646
|
|
|
1628
1647
|
def postTypeInit(self):
|
|
@@ -1643,6 +1662,7 @@ class Data(Type):
|
|
|
1643
1662
|
|
|
1644
1663
|
class NodeProp(Type):
|
|
1645
1664
|
|
|
1665
|
+
ismutable = True
|
|
1646
1666
|
stortype = s_layer.STOR_TYPE_MSGP
|
|
1647
1667
|
|
|
1648
1668
|
def postTypeInit(self):
|
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, 226, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
228
|
+
commit = '90a28a430a0b2b1f8cc74af240f55bfcf717b582'
|
synapse/models/base.py
CHANGED
|
@@ -176,6 +176,9 @@ class BaseModule(s_module.CoreModule):
|
|
|
176
176
|
((None, 'refs', None), {
|
|
177
177
|
'doc': 'The source node contains a reference to the target node.'}),
|
|
178
178
|
|
|
179
|
+
((None, 'linked', None), {
|
|
180
|
+
'doc': 'The source node is linked to the target node.'}),
|
|
181
|
+
|
|
179
182
|
(('meta:source', 'seen', None), {
|
|
180
183
|
'doc': 'The meta:source observed the target node.'}),
|
|
181
184
|
|
synapse/models/inet.py
CHANGED
|
@@ -1550,13 +1550,23 @@ class InetModule(s_module.CoreModule):
|
|
|
1550
1550
|
('inet:ssl:jarmsample', ('comp', {'fields': (('server', 'inet:server'), ('jarmhash', 'inet:ssl:jarmhash'))}), {
|
|
1551
1551
|
'doc': 'A JARM hash sample taken from a server.'}),
|
|
1552
1552
|
|
|
1553
|
+
('inet:service:platform:type:taxonomy', ('taxonomy', {}), {
|
|
1554
|
+
'interfaces': ('meta:taxonomy',),
|
|
1555
|
+
'doc': 'A service platform type taxonomy.'}),
|
|
1556
|
+
|
|
1553
1557
|
('inet:service:platform', ('guid', {}), {
|
|
1554
1558
|
'doc': 'A network platform which provides services.'}),
|
|
1555
1559
|
|
|
1560
|
+
('inet:service:agent', ('guid', {}), {
|
|
1561
|
+
'interfaces': ('inet:service:object',),
|
|
1562
|
+
'template': {'service:base': 'agent'},
|
|
1563
|
+
'doc': 'An instance of a deployed agent or software integration which is part of the service architecture.'}),
|
|
1564
|
+
|
|
1556
1565
|
('inet:service:app', ('guid', {}), {
|
|
1557
1566
|
'interfaces': ('inet:service:object',),
|
|
1558
1567
|
'template': {'service:base': 'application'},
|
|
1559
|
-
'
|
|
1568
|
+
'deprecated': True,
|
|
1569
|
+
'doc': 'Deprecated. Please use inet:service:agent for autonomous agents.'}),
|
|
1560
1570
|
|
|
1561
1571
|
('inet:service:instance', ('guid', {}), {
|
|
1562
1572
|
'doc': 'An instance of the platform such as Slack or Discord instances.'}),
|
|
@@ -1795,7 +1805,8 @@ class InetModule(s_module.CoreModule):
|
|
|
1795
1805
|
'doc': 'The service account which removed or decommissioned the {service:base}.'}),
|
|
1796
1806
|
|
|
1797
1807
|
('app', ('inet:service:app', {}), {
|
|
1798
|
-
'
|
|
1808
|
+
'deprecated': True,
|
|
1809
|
+
'doc': 'Deprecated. Objects are no longer scoped to an application or agent.'}),
|
|
1799
1810
|
),
|
|
1800
1811
|
}),
|
|
1801
1812
|
|
|
@@ -1816,7 +1827,11 @@ class InetModule(s_module.CoreModule):
|
|
|
1816
1827
|
'props': (
|
|
1817
1828
|
|
|
1818
1829
|
('app', ('inet:service:app', {}), {
|
|
1819
|
-
'
|
|
1830
|
+
'deprecated': True,
|
|
1831
|
+
'doc': 'Deprecated. Please use :agent / inet:service:agent.'}),
|
|
1832
|
+
|
|
1833
|
+
('agent', ('inet:service:agent', {}), {
|
|
1834
|
+
'doc': 'The service agent which performed the action potentially on behalf of an account.'}),
|
|
1820
1835
|
|
|
1821
1836
|
('time', ('time', {}), {
|
|
1822
1837
|
'doc': 'The time that the account initiated the action.'}),
|
|
@@ -1851,8 +1866,12 @@ class InetModule(s_module.CoreModule):
|
|
|
1851
1866
|
('client:host', ('it:host', {}), {
|
|
1852
1867
|
'doc': 'The client host which initiated the action.'}),
|
|
1853
1868
|
|
|
1869
|
+
('client:software', ('it:prod:softver', {}), {
|
|
1870
|
+
'doc': 'The client software used to initiate the action.'}),
|
|
1871
|
+
|
|
1854
1872
|
('client:app', ('inet:service:app', {}), {
|
|
1855
|
-
'
|
|
1873
|
+
'deprecated': True,
|
|
1874
|
+
'doc': 'Deprecated. Please use :client:software.'}),
|
|
1856
1875
|
|
|
1857
1876
|
('server', ('inet:server', {}), {
|
|
1858
1877
|
'doc': 'The network address of the server which handled the action.'}),
|
|
@@ -3698,6 +3717,8 @@ class InetModule(s_module.CoreModule):
|
|
|
3698
3717
|
'ro': True,
|
|
3699
3718
|
'doc': 'The x509 certificate sent by the client.'})
|
|
3700
3719
|
)),
|
|
3720
|
+
|
|
3721
|
+
('inet:service:platform:type:taxonomy', {}, ()),
|
|
3701
3722
|
('inet:service:platform', {}, (
|
|
3702
3723
|
|
|
3703
3724
|
('id', ('str', {'strip': True}), {
|
|
@@ -3732,6 +3753,12 @@ class InetModule(s_module.CoreModule):
|
|
|
3732
3753
|
'disp': {'hint': 'text'},
|
|
3733
3754
|
'doc': 'A description of the service platform.'}),
|
|
3734
3755
|
|
|
3756
|
+
('type', ('inet:service:platform:type:taxonomy', {}), {
|
|
3757
|
+
'doc': 'The type of service platform.'}),
|
|
3758
|
+
|
|
3759
|
+
('family', ('str', {'onespace': True, 'lower': True}), {
|
|
3760
|
+
'doc': 'A family designation for use with instanced platforms such as Slack, Discord, or Mastodon.'}),
|
|
3761
|
+
|
|
3735
3762
|
('parent', ('inet:service:platform', {}), {
|
|
3736
3763
|
'doc': 'A parent platform which owns this platform.'}),
|
|
3737
3764
|
|
|
@@ -3752,6 +3779,9 @@ class InetModule(s_module.CoreModule):
|
|
|
3752
3779
|
|
|
3753
3780
|
('provider:name', ('ou:name', {}), {
|
|
3754
3781
|
'doc': 'The name of the organization which operates the platform.'}),
|
|
3782
|
+
|
|
3783
|
+
('software', ('it:prod:softver', {}), {
|
|
3784
|
+
'doc': 'The latest known software version that the platform is running.'}),
|
|
3755
3785
|
)),
|
|
3756
3786
|
|
|
3757
3787
|
('inet:service:instance', {}, (
|
|
@@ -3791,7 +3821,8 @@ class InetModule(s_module.CoreModule):
|
|
|
3791
3821
|
'doc': 'The tenant which contains the instance.'}),
|
|
3792
3822
|
|
|
3793
3823
|
('app', ('inet:service:app', {}), {
|
|
3794
|
-
'
|
|
3824
|
+
'deprecated': True,
|
|
3825
|
+
'doc': 'Deprecated. Instances are no longer scoped to applications.'}),
|
|
3795
3826
|
)),
|
|
3796
3827
|
|
|
3797
3828
|
('inet:service:app', {}, (
|
|
@@ -3816,6 +3847,25 @@ class InetModule(s_module.CoreModule):
|
|
|
3816
3847
|
'doc': 'The name of the organization which provides the application.'}),
|
|
3817
3848
|
)),
|
|
3818
3849
|
|
|
3850
|
+
('inet:service:agent', {}, (
|
|
3851
|
+
|
|
3852
|
+
('name', ('str', {'lower': True, 'onespace': True}), {
|
|
3853
|
+
'alts': ('names',),
|
|
3854
|
+
'doc': 'The name of the service agent instance.'}),
|
|
3855
|
+
|
|
3856
|
+
('names', ('array', {'type': 'str',
|
|
3857
|
+
'typeopts': {'onespace': True, 'lower': True},
|
|
3858
|
+
'sorted': True, 'uniq': True}), {
|
|
3859
|
+
'doc': 'An array of alternate names for the service agent instance.'}),
|
|
3860
|
+
|
|
3861
|
+
('desc', ('str', {}), {
|
|
3862
|
+
'disp': {'hint': 'text'},
|
|
3863
|
+
'doc': 'A description of the deployed service agent instance.'}),
|
|
3864
|
+
|
|
3865
|
+
('software', ('it:prod:softver', {}), {
|
|
3866
|
+
'doc': 'The latest known software version running on the service agent instance.'}),
|
|
3867
|
+
)),
|
|
3868
|
+
|
|
3819
3869
|
('inet:service:account', {}, (
|
|
3820
3870
|
|
|
3821
3871
|
('user', ('inet:user', {}), {
|
|
@@ -3911,6 +3961,9 @@ class InetModule(s_module.CoreModule):
|
|
|
3911
3961
|
|
|
3912
3962
|
('inet:service:login', {}, (
|
|
3913
3963
|
|
|
3964
|
+
('url', ('inet:url', {}), {
|
|
3965
|
+
'doc': 'The URL of the login endpoint used for this login attempt.'}),
|
|
3966
|
+
|
|
3914
3967
|
('method', ('inet:service:login:method:taxonomy', {}), {
|
|
3915
3968
|
'doc': 'The type of authentication used for the login. For example "password" or "multifactor.sms".'}),
|
|
3916
3969
|
|
synapse/models/infotech.py
CHANGED
|
@@ -803,6 +803,9 @@ class ItModule(s_module.CoreModule):
|
|
|
803
803
|
('it:dev:repo:diff', ('guid', {}), {
|
|
804
804
|
'doc': 'A diff of a file being applied in a single commit.',
|
|
805
805
|
}),
|
|
806
|
+
('it:dev:repo:entry', ('guid', {}), {
|
|
807
|
+
'doc': 'A file included in a repository.',
|
|
808
|
+
}),
|
|
806
809
|
('it:dev:repo:issue:label', ('guid', {}), {
|
|
807
810
|
'interfaces': ('inet:service:object',),
|
|
808
811
|
'template': {'service:base': 'repository issue label'},
|
|
@@ -1119,6 +1122,10 @@ class ItModule(s_module.CoreModule):
|
|
|
1119
1122
|
'doc': 'The YARA rule is intended for use in detecting the target node.'}),
|
|
1120
1123
|
(('it:dev:repo', 'has', 'inet:url'), {
|
|
1121
1124
|
'doc': 'The repo has content hosted at the URL.'}),
|
|
1125
|
+
(('it:dev:repo:commit', 'has', 'it:dev:repo:entry'), {
|
|
1126
|
+
'doc': 'The file entry is present in the commit version of the repository.'}),
|
|
1127
|
+
(('it:log:event', 'about', None), {
|
|
1128
|
+
'doc': 'The it:log:event is about the target node.'}),
|
|
1122
1129
|
),
|
|
1123
1130
|
'forms': (
|
|
1124
1131
|
('it:hostname', {}, ()),
|
|
@@ -2001,6 +2008,17 @@ class ItModule(s_module.CoreModule):
|
|
|
2001
2008
|
'doc': 'The URL where the diff is hosted.'}),
|
|
2002
2009
|
)),
|
|
2003
2010
|
|
|
2011
|
+
('it:dev:repo:entry', {}, (
|
|
2012
|
+
|
|
2013
|
+
('repo', ('it:dev:repo', {}), {
|
|
2014
|
+
'doc': 'The repository which contains the file.'}),
|
|
2015
|
+
|
|
2016
|
+
('file', ('file:bytes', {}), {
|
|
2017
|
+
'doc': 'The file which the repository contains.'}),
|
|
2018
|
+
|
|
2019
|
+
('path', ('file:path', {}), {
|
|
2020
|
+
'doc': 'The path to the file in the repository.'}),
|
|
2021
|
+
)),
|
|
2004
2022
|
('it:dev:repo:issue', {}, (
|
|
2005
2023
|
|
|
2006
2024
|
('repo', ('it:dev:repo', {}), {
|
synapse/tests/test_cortex.py
CHANGED
|
@@ -9093,3 +9093,116 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
9093
9093
|
async with self.getRegrCore('2.213.0-queue-authgates') as core:
|
|
9094
9094
|
self.nn(await core.getAuthGate('queue:stillhere'))
|
|
9095
9095
|
self.none(await core.getAuthGate('queue:authtest'))
|
|
9096
|
+
|
|
9097
|
+
async def test_cortex_prop_copy(self):
|
|
9098
|
+
async with self.getTestCore() as core:
|
|
9099
|
+
q = '[test:arrayprop=(ap0,) :strs=(foo, bar, baz)]'
|
|
9100
|
+
self.len(1, await core.nodes(q))
|
|
9101
|
+
|
|
9102
|
+
q = 'test:arrayprop=(ap0,) $l=:strs $r=$l.rem(baz) return(($r, $l))'
|
|
9103
|
+
valu = await core.callStorm(q)
|
|
9104
|
+
self.true(valu[0])
|
|
9105
|
+
self.sorteq(valu[1], ['foo', 'bar'])
|
|
9106
|
+
|
|
9107
|
+
# modifying the property value shouldn't update the node
|
|
9108
|
+
nodes = await core.nodes('test:arrayprop=(ap0,) $l=:strs $l.rem(baz)')
|
|
9109
|
+
self.len(1, nodes)
|
|
9110
|
+
self.sorteq(nodes[0].get('strs'), ['foo', 'bar', 'baz'])
|
|
9111
|
+
|
|
9112
|
+
data = {
|
|
9113
|
+
'str': 'strval',
|
|
9114
|
+
'int': 1,
|
|
9115
|
+
'dict': {'dictkey': 'dictval'},
|
|
9116
|
+
'list': ('listval0', 'listval1'),
|
|
9117
|
+
'tuple': ('tupleval0', 'tupleval1'),
|
|
9118
|
+
}
|
|
9119
|
+
|
|
9120
|
+
opts = {
|
|
9121
|
+
'vars': {
|
|
9122
|
+
'data': data,
|
|
9123
|
+
}
|
|
9124
|
+
}
|
|
9125
|
+
q = '''
|
|
9126
|
+
[ test:guid=(d0,)
|
|
9127
|
+
:data=$data
|
|
9128
|
+
:comp=(1, foo)
|
|
9129
|
+
:mutcomp=(foo, (1, 2, 3))
|
|
9130
|
+
]
|
|
9131
|
+
'''
|
|
9132
|
+
self.len(1, await core.nodes(q, opts=opts))
|
|
9133
|
+
|
|
9134
|
+
q = '''
|
|
9135
|
+
test:guid=(d0,)
|
|
9136
|
+
$d=:data
|
|
9137
|
+
$d.list.rem(listval0)
|
|
9138
|
+
$d.str = foo
|
|
9139
|
+
$d.int = ($d.int + 1)
|
|
9140
|
+
$d.dict.foo = bar
|
|
9141
|
+
$d.tuple.append(tupleval2)
|
|
9142
|
+
return($d)
|
|
9143
|
+
'''
|
|
9144
|
+
valu = await core.callStorm(q)
|
|
9145
|
+
self.eq(valu, {
|
|
9146
|
+
'str': 'foo',
|
|
9147
|
+
'int': 2,
|
|
9148
|
+
'dict': {'dictkey': 'dictval', 'foo': 'bar'},
|
|
9149
|
+
'list': ('listval1',),
|
|
9150
|
+
'tuple': ('tupleval0', 'tupleval1', 'tupleval2'),
|
|
9151
|
+
})
|
|
9152
|
+
|
|
9153
|
+
# modifying the property value shouldn't update the node
|
|
9154
|
+
q = '''
|
|
9155
|
+
test:guid=(d0,)
|
|
9156
|
+
$d=:data
|
|
9157
|
+
$d.dict = $lib.undef
|
|
9158
|
+
'''
|
|
9159
|
+
nodes = await core.nodes(q)
|
|
9160
|
+
self.len(1, nodes)
|
|
9161
|
+
self.eq(nodes[0].get('data')['dict'], {'dictkey': 'dictval'})
|
|
9162
|
+
|
|
9163
|
+
q = '''
|
|
9164
|
+
test:guid=(d0,)
|
|
9165
|
+
$c=:comp
|
|
9166
|
+
$c.rem((1))
|
|
9167
|
+
$m=:mutcomp
|
|
9168
|
+
$m.1.rem((3))
|
|
9169
|
+
return(($c, :comp, $m, :mutcomp))
|
|
9170
|
+
'''
|
|
9171
|
+
valu = await core.callStorm(q)
|
|
9172
|
+
self.eq(valu, (
|
|
9173
|
+
(1, 'foo'),
|
|
9174
|
+
(1, 'foo'),
|
|
9175
|
+
('foo', (1, 2)),
|
|
9176
|
+
('foo', (1, 2, 3)),
|
|
9177
|
+
))
|
|
9178
|
+
|
|
9179
|
+
# Nodeprops could have mutable types in them so make sure modifying
|
|
9180
|
+
# them doesn't cause modifications to the node
|
|
9181
|
+
q = '''
|
|
9182
|
+
$data = { test:guid=(d0,) return(:data) }
|
|
9183
|
+
[ test:str=foobar :baz=(test:guid:data, $data) ]
|
|
9184
|
+
($prop, $valu) = :baz
|
|
9185
|
+
$valu.list.rem(listval0)
|
|
9186
|
+
return((:baz, $valu))
|
|
9187
|
+
'''
|
|
9188
|
+
valu = await core.callStorm(q)
|
|
9189
|
+
|
|
9190
|
+
exp = {
|
|
9191
|
+
'str': 'strval',
|
|
9192
|
+
'int': 1,
|
|
9193
|
+
'dict': {'dictkey': 'dictval'},
|
|
9194
|
+
'list': ('listval1',),
|
|
9195
|
+
'tuple': ('tupleval0', 'tupleval1'),
|
|
9196
|
+
}
|
|
9197
|
+
|
|
9198
|
+
self.eq(valu, (('test:guid:data', data), exp))
|
|
9199
|
+
|
|
9200
|
+
# Make sure $node.props aren't modifiable either
|
|
9201
|
+
nodes = await core.nodes('test:str=foobar $node.props.baz.1.list.rem(listval0)')
|
|
9202
|
+
self.len(1, nodes)
|
|
9203
|
+
self.eq(nodes[0].get('baz'), ('test:guid:data', data))
|
|
9204
|
+
|
|
9205
|
+
# Dereferencing mutable types from $node.props should
|
|
9206
|
+
# return mutable instances without mutating the original prop valu
|
|
9207
|
+
valu = await core.callStorm('test:str=foobar ($prop, $valu) = :baz $valu.list.rem(listval0) return((:baz, $valu))')
|
|
9208
|
+
self.eq(valu, (('test:guid:data', data), exp))
|
synapse/tests/test_lib_agenda.py
CHANGED
|
@@ -295,7 +295,7 @@ class AgendaTest(s_t_utils.SynTest):
|
|
|
295
295
|
|
|
296
296
|
# Cancel the Wednesday/Friday appt
|
|
297
297
|
await agenda.delete(guid)
|
|
298
|
-
await self.asyncraises(s_exc.NoSuchIden, agenda.delete(
|
|
298
|
+
await self.asyncraises(s_exc.NoSuchIden, agenda.delete('1234'))
|
|
299
299
|
|
|
300
300
|
# Then Dec 25
|
|
301
301
|
unixtime = datetime.datetime(year=2018, month=12, day=25, hour=10, minute=16, tzinfo=tz.utc).timestamp()
|
|
@@ -1205,32 +1205,6 @@ class AgendaTest(s_t_utils.SynTest):
|
|
|
1205
1205
|
self.false(cron01[0].get('isrunning'))
|
|
1206
1206
|
self.eq(cron01[0].get('lasterrs')[0], 'aborted')
|
|
1207
1207
|
|
|
1208
|
-
async def test_agenda_clear_running_none_nexttime(self):
|
|
1209
|
-
|
|
1210
|
-
async with self.getTestCore() as core:
|
|
1211
|
-
|
|
1212
|
-
cdef = {
|
|
1213
|
-
'creator': core.auth.rootuser.iden,
|
|
1214
|
-
'iden': s_common.guid(),
|
|
1215
|
-
'storm': '$lib.log.info("test")',
|
|
1216
|
-
'reqs': {},
|
|
1217
|
-
'incunit': 'minute',
|
|
1218
|
-
'incvals': 1
|
|
1219
|
-
}
|
|
1220
|
-
await core.addCronJob(cdef)
|
|
1221
|
-
|
|
1222
|
-
appt = core.agenda.appts[cdef['iden']]
|
|
1223
|
-
self.true(appt in core.agenda.apptheap)
|
|
1224
|
-
|
|
1225
|
-
appt.isrunning = True
|
|
1226
|
-
appt.nexttime = None
|
|
1227
|
-
|
|
1228
|
-
await core.agenda.clearRunningStatus()
|
|
1229
|
-
self.false(appt in core.agenda.apptheap)
|
|
1230
|
-
|
|
1231
|
-
crons = await core.callStorm('return($lib.cron.list())')
|
|
1232
|
-
self.len(1, crons)
|
|
1233
|
-
|
|
1234
1208
|
async def test_agenda_lasterrs(self):
|
|
1235
1209
|
|
|
1236
1210
|
async with self.getTestCore() as core:
|
|
@@ -1262,3 +1236,142 @@ class AgendaTest(s_t_utils.SynTest):
|
|
|
1262
1236
|
appt = await core.agenda.get('test')
|
|
1263
1237
|
self.true(isinstance(appt.lasterrs, list))
|
|
1264
1238
|
self.eq(appt.lasterrs, ['error1', 'error2'])
|
|
1239
|
+
|
|
1240
|
+
async def test_cron_at_mirror_cleanup(self):
|
|
1241
|
+
|
|
1242
|
+
with self.getTestDir() as dirn:
|
|
1243
|
+
|
|
1244
|
+
dirn00 = s_common.genpath(dirn, 'core00')
|
|
1245
|
+
dirn01 = s_common.genpath(dirn, 'core01')
|
|
1246
|
+
|
|
1247
|
+
async with self.getTestAha() as aha:
|
|
1248
|
+
|
|
1249
|
+
conf = {'aha:provision': await aha.addAhaSvcProv('00.cortex')}
|
|
1250
|
+
core00 = await aha.enter_context(self.getTestCore(conf=conf, dirn=dirn00))
|
|
1251
|
+
|
|
1252
|
+
conf = {'aha:provision': await aha.addAhaSvcProv('01.cortex', {'mirror': 'cortex'})}
|
|
1253
|
+
core01 = await aha.enter_context(self.getTestCore(conf=conf, dirn=dirn01))
|
|
1254
|
+
|
|
1255
|
+
msgs = await core00.stormlist('cron.at --minute +1 { $lib.log.info(cronran) }')
|
|
1256
|
+
await core01.sync()
|
|
1257
|
+
|
|
1258
|
+
with self.getAsyncLoggerStream('synapse.storm.log', 'cronran') as stream:
|
|
1259
|
+
core00.agenda._addTickOff(60)
|
|
1260
|
+
self.true(await stream.wait(timeout=12))
|
|
1261
|
+
|
|
1262
|
+
await core01.sync()
|
|
1263
|
+
|
|
1264
|
+
# appt.recs should be cleared on both leader and mirror
|
|
1265
|
+
appt = list(core00.agenda.appts.values())[0]
|
|
1266
|
+
self.len(0, appt.recs)
|
|
1267
|
+
|
|
1268
|
+
appt = list(core01.agenda.appts.values())[0]
|
|
1269
|
+
self.len(0, appt.recs)
|
|
1270
|
+
|
|
1271
|
+
# apptheap should also now be empty on both
|
|
1272
|
+
self.len(0, core00.agenda.apptheap)
|
|
1273
|
+
self.len(0, core01.agenda.apptheap)
|
|
1274
|
+
|
|
1275
|
+
await core00.fini()
|
|
1276
|
+
core00 = await aha.enter_context(self.getTestCore(dirn=dirn00))
|
|
1277
|
+
|
|
1278
|
+
await core01.fini()
|
|
1279
|
+
core01 = await aha.enter_context(self.getTestCore(dirn=dirn01))
|
|
1280
|
+
|
|
1281
|
+
# Job still exists on leader and mirror, wasn't removed due to being invalid
|
|
1282
|
+
cron00 = await core00.listCronJobs()
|
|
1283
|
+
cron01 = await core01.listCronJobs()
|
|
1284
|
+
self.len(1, cron00)
|
|
1285
|
+
self.eq(cron00, cron01)
|
|
1286
|
+
|
|
1287
|
+
await core00.delCronJob(cron00[0]['iden'])
|
|
1288
|
+
|
|
1289
|
+
# Add a job that is past due that will be deleted on startup
|
|
1290
|
+
xmas = {'dayofmonth': 25, 'month': 12, 'year': 2099}
|
|
1291
|
+
cdef = {'creator': core00.auth.rootuser.iden,
|
|
1292
|
+
'storm': '#happyholidays',
|
|
1293
|
+
'reqs': (xmas,)}
|
|
1294
|
+
guid = s_common.guid()
|
|
1295
|
+
cdef['iden'] = guid
|
|
1296
|
+
|
|
1297
|
+
await core00.addCronJob(cdef)
|
|
1298
|
+
await core01.sync()
|
|
1299
|
+
|
|
1300
|
+
# Move the year back to the past
|
|
1301
|
+
apptdef = core01.agenda.apptdefs.get(guid)
|
|
1302
|
+
apptdef['recs'][0][0]['year'] = 1999
|
|
1303
|
+
|
|
1304
|
+
core00.agenda.apptdefs.set(guid, apptdef)
|
|
1305
|
+
core01.agenda.apptdefs.set(guid, apptdef)
|
|
1306
|
+
|
|
1307
|
+
with self.getAsyncLoggerStream('synapse.lib.agenda', 'This appointment will be removed') as stream:
|
|
1308
|
+
await core01.fini()
|
|
1309
|
+
core01 = await aha.enter_context(self.getTestCore(dirn=dirn01))
|
|
1310
|
+
self.true(await stream.wait(timeout=12))
|
|
1311
|
+
|
|
1312
|
+
# Mirror warns about the invalid appointment but does not remove it
|
|
1313
|
+
self.nn(core01.agenda.apptdefs.get(guid))
|
|
1314
|
+
self.nn(await core01.getAuthGate(guid))
|
|
1315
|
+
|
|
1316
|
+
with self.getAsyncLoggerStream('synapse.lib.agenda', 'Removing invalid appointment') as stream:
|
|
1317
|
+
await core00.fini()
|
|
1318
|
+
core00 = await aha.enter_context(self.getTestCore(dirn=dirn00))
|
|
1319
|
+
self.true(await stream.wait(timeout=12))
|
|
1320
|
+
|
|
1321
|
+
await core01.sync()
|
|
1322
|
+
|
|
1323
|
+
# Leader removes the appointment via delCronJob which cleans up properly
|
|
1324
|
+
self.none(core00.agenda.apptdefs.get(guid))
|
|
1325
|
+
self.none(core01.agenda.apptdefs.get(guid))
|
|
1326
|
+
|
|
1327
|
+
self.none(await core00.getAuthGate(guid))
|
|
1328
|
+
self.none(await core01.getAuthGate(guid))
|
|
1329
|
+
|
|
1330
|
+
# Add a job with iden mismatch for coverage
|
|
1331
|
+
cdef = {'creator': core00.auth.rootuser.iden,
|
|
1332
|
+
'storm': '#happyholidays',
|
|
1333
|
+
'reqs': (xmas,)}
|
|
1334
|
+
guid = s_common.guid()
|
|
1335
|
+
cdef['iden'] = guid
|
|
1336
|
+
|
|
1337
|
+
await core00.addCronJob(cdef)
|
|
1338
|
+
await core01.sync()
|
|
1339
|
+
|
|
1340
|
+
apptdef = core01.agenda.apptdefs.get(guid)
|
|
1341
|
+
apptdef['iden'] = s_common.guid()
|
|
1342
|
+
|
|
1343
|
+
core00.agenda.apptdefs.set(guid, apptdef)
|
|
1344
|
+
core01.agenda.apptdefs.set(guid, apptdef)
|
|
1345
|
+
|
|
1346
|
+
with self.getAsyncLoggerStream('synapse.lib.agenda', 'Removing invalid appointment') as stream:
|
|
1347
|
+
await core00.fini()
|
|
1348
|
+
core00 = await aha.enter_context(self.getTestCore(dirn=dirn00))
|
|
1349
|
+
|
|
1350
|
+
await core01.fini()
|
|
1351
|
+
core01 = await aha.enter_context(self.getTestCore(dirn=dirn01))
|
|
1352
|
+
self.true(await stream.wait(timeout=12))
|
|
1353
|
+
|
|
1354
|
+
await core01.sync()
|
|
1355
|
+
|
|
1356
|
+
self.none(core00.agenda.apptdefs.get(guid))
|
|
1357
|
+
self.none(core01.agenda.apptdefs.get(guid))
|
|
1358
|
+
|
|
1359
|
+
with self.getAsyncLoggerStream('synapse.storm.log', 'I AM A ERROR') as stream:
|
|
1360
|
+
q = "cron.at --now ${ while((true)) { $lib.log.error('I AM A ERROR') $lib.time.sleep(6) } }"
|
|
1361
|
+
await core00.nodes(q)
|
|
1362
|
+
self.true(await stream.wait(timeout=12))
|
|
1363
|
+
await core01.sync()
|
|
1364
|
+
|
|
1365
|
+
await core01.promote(graceful=True)
|
|
1366
|
+
await core00.sync()
|
|
1367
|
+
|
|
1368
|
+
cron00 = await core00.listCronJobs()
|
|
1369
|
+
cron01 = await core01.listCronJobs()
|
|
1370
|
+
|
|
1371
|
+
self.len(1, cron00)
|
|
1372
|
+
self.false(cron00[0].get('isrunning'))
|
|
1373
|
+
self.eq(cron00[0].get('lasterrs')[0], 'aborted')
|
|
1374
|
+
self.eq(cron00, cron01)
|
|
1375
|
+
|
|
1376
|
+
self.len(0, core00.agenda.apptheap)
|
|
1377
|
+
self.len(0, core01.agenda.apptheap)
|
|
@@ -369,7 +369,9 @@ class LmdbSlabTest(s_t_utils.SynTest):
|
|
|
369
369
|
'vm.dirty_expire_centisecs',
|
|
370
370
|
'vm.dirty_writeback_centisecs',
|
|
371
371
|
'vm.dirty_background_ratio',
|
|
372
|
+
'vm.dirty_background_bytes',
|
|
372
373
|
'vm.dirty_ratio',
|
|
374
|
+
'vm.dirty_bytes',
|
|
373
375
|
], msgs[0].get('sysctls', {}).keys())
|
|
374
376
|
|
|
375
377
|
async def test_lmdbslab_commit_over_max_xactops(self):
|
|
@@ -60,3 +60,7 @@ class LinuxTest(s_t_utils.SynTest):
|
|
|
60
60
|
self.isinstance(ret, dict)
|
|
61
61
|
self.isin('vm.swappiness', ret)
|
|
62
62
|
self.isinstance(ret['vm.swappiness'], int)
|
|
63
|
+
self.isin('vm.dirty_bytes', ret)
|
|
64
|
+
self.isinstance(ret['vm.dirty_bytes'], int)
|
|
65
|
+
self.isin('vm.dirty_background_bytes', ret)
|
|
66
|
+
self.isinstance(ret['vm.dirty_background_bytes'], int)
|
synapse/tests/test_lib_storm.py
CHANGED
|
@@ -1095,6 +1095,9 @@ class StormTest(s_t_utils.SynTest):
|
|
|
1095
1095
|
|
|
1096
1096
|
await visi.addRule((True, ('storm', 'asroot', 'cmd', 'asroot', 'yep')))
|
|
1097
1097
|
|
|
1098
|
+
msgs = await core.stormlist('asroot.yep', opts=opts)
|
|
1099
|
+
self.stormIsInWarn('Command (asroot.yep) requires asroot permission which is deprecated', msgs)
|
|
1100
|
+
|
|
1098
1101
|
nodes = await core.nodes('asroot.yep', opts=opts)
|
|
1099
1102
|
self.len(1, nodes)
|
|
1100
1103
|
self.eq('false', nodes[0].ndef[1])
|
|
@@ -1184,6 +1187,9 @@ class StormTest(s_t_utils.SynTest):
|
|
|
1184
1187
|
await visi.addRule((True, ('storm', 'asroot', 'mod', 'foo')))
|
|
1185
1188
|
self.len(1, await core.nodes('yield $lib.import(foo.baz).lol()', opts=opts))
|
|
1186
1189
|
|
|
1190
|
+
msgs = await core.stormlist('$lib.import(foo.bar)')
|
|
1191
|
+
self.stormIsInWarn('Module (foo.bar) requires asroot permission but does not specify any asroot:perms', msgs)
|
|
1192
|
+
|
|
1187
1193
|
# coverage for dyncall/dyniter with asroot...
|
|
1188
1194
|
await core.nodes('$lib.import(foo.bar).dyncall()', opts=opts)
|
|
1189
1195
|
await core.nodes('$lib.import(foo.bar).dyniter()', opts=opts)
|
|
@@ -341,13 +341,13 @@ Connection information:
|
|
|
341
341
|
|
|
342
342
|
async def mockCellInfo():
|
|
343
343
|
return {
|
|
344
|
-
'cell': {'ready': True, 'nexsindx': 10, '
|
|
344
|
+
'cell': {'ready': True, 'nexsindx': 10, 'active': True},
|
|
345
345
|
'synapse': {'verstring': '2.190.0'},
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
async def mockOutOfSyncCellInfo():
|
|
349
349
|
return {
|
|
350
|
-
'cell': {'ready': True, 'nexsindx': 5, '
|
|
350
|
+
'cell': {'ready': True, 'nexsindx': 5, 'active': False},
|
|
351
351
|
'synapse': {'verstring': '2.190.0'},
|
|
352
352
|
}
|
|
353
353
|
|
|
@@ -378,6 +378,10 @@ Connection information:
|
|
|
378
378
|
msgs = await core00.stormlist('aha.svc.mirror --timeout 1')
|
|
379
379
|
self.stormIsInPrint('Group Status: Out of Sync', msgs)
|
|
380
380
|
|
|
381
|
+
await cell01.nexsroot.client.fini()
|
|
382
|
+
msgs = await core00.stormlist('aha.svc.mirror')
|
|
383
|
+
self.stormIsInPrint('follower', msgs)
|
|
384
|
+
|
|
381
385
|
await aha.delAhaSvc('00.cell', network='synapse')
|
|
382
386
|
msgs = await core00.stormlist('aha.svc.mirror')
|
|
383
387
|
self.stormNotInPrint('Service Mirror Groups:', msgs)
|
synapse/tests/test_model_inet.py
CHANGED
|
@@ -2999,17 +2999,21 @@ class InetModelTest(s_t_utils.SynTest):
|
|
|
2999
2999
|
:names=("slack chat",)
|
|
3000
3000
|
:parent={[ inet:service:platform=({"name": "salesforce"}) ]}
|
|
3001
3001
|
:status=available
|
|
3002
|
+
:family=" FooFam "
|
|
3002
3003
|
:period=(2022, 2023)
|
|
3003
3004
|
:creator={[ inet:service:account=({"id": "bar"}) ]}
|
|
3004
3005
|
:remover={[ inet:service:account=({"id": "baz"}) ]}
|
|
3005
3006
|
:provider={ ou:org:name=$provname }
|
|
3006
3007
|
:provider:name=$provname
|
|
3008
|
+
:type=foo.bar
|
|
3007
3009
|
]
|
|
3008
3010
|
'''
|
|
3009
3011
|
nodes = await core.nodes(q, opts=opts)
|
|
3010
3012
|
self.len(1, nodes)
|
|
3011
3013
|
self.eq(nodes[0].ndef, ('inet:service:platform', s_common.guid(('slack',))))
|
|
3012
3014
|
self.eq('foo', nodes[0].get('id'))
|
|
3015
|
+
self.eq('foo.bar.', nodes[0].get('type'))
|
|
3016
|
+
self.eq('foofam', nodes[0].get('family'))
|
|
3013
3017
|
self.eq(nodes[0].get('url'), 'https://slack.com')
|
|
3014
3018
|
self.eq(nodes[0].get('urls'), ('https://slacker.com',))
|
|
3015
3019
|
self.eq(nodes[0].get('zones'), ('slack.com', 'slacker.com'))
|
|
@@ -3039,6 +3043,9 @@ class InetModelTest(s_t_utils.SynTest):
|
|
|
3039
3043
|
nodes = await core.nodes('[ inet:service:platform=({"zone": "slacker.com"}) ]')
|
|
3040
3044
|
self.eq(nodes[0].ndef, platform.ndef)
|
|
3041
3045
|
|
|
3046
|
+
nodes = await core.nodes('inet:service:platform:type:taxonomy')
|
|
3047
|
+
self.sorteq(['foo.', 'foo.bar.'], [n.ndef[1] for n in nodes])
|
|
3048
|
+
|
|
3042
3049
|
q = '''
|
|
3043
3050
|
[ inet:service:instance=(vertex, slack)
|
|
3044
3051
|
:id='T2XK1223Y'
|
|
@@ -3193,6 +3200,7 @@ class InetModelTest(s_t_utils.SynTest):
|
|
|
3193
3200
|
q = '''
|
|
3194
3201
|
[ inet:service:login=*
|
|
3195
3202
|
:method=password
|
|
3203
|
+
:url=https://vertex.link/api/v1/login
|
|
3196
3204
|
:session=$blcksess
|
|
3197
3205
|
:server=tcp://10.10.10.4:443
|
|
3198
3206
|
:client=tcp://192.168.0.10:12345
|
|
@@ -3202,6 +3210,7 @@ class InetModelTest(s_t_utils.SynTest):
|
|
|
3202
3210
|
nodes = await core.nodes(q, opts=opts)
|
|
3203
3211
|
self.len(1, nodes)
|
|
3204
3212
|
self.eq(nodes[0].get('method'), 'password.')
|
|
3213
|
+
self.eq(nodes[0].get('url'), 'https://vertex.link/api/v1/login')
|
|
3205
3214
|
|
|
3206
3215
|
server = await core.nodes('inet:server=tcp://10.10.10.4:443')
|
|
3207
3216
|
self.len(1, server)
|
|
@@ -3561,6 +3570,28 @@ class InetModelTest(s_t_utils.SynTest):
|
|
|
3561
3570
|
self.len(1, await core.nodes('inet:service:subscription :pay:instrument -> econ:bank:account'))
|
|
3562
3571
|
self.len(1, await core.nodes('inet:service:subscription :subscriber -> inet:service:tenant'))
|
|
3563
3572
|
|
|
3573
|
+
nodes = await core.nodes('''
|
|
3574
|
+
[ inet:service:agent=*
|
|
3575
|
+
:name=woot
|
|
3576
|
+
:names=(foo, bar)
|
|
3577
|
+
:desc="Foo Bar"
|
|
3578
|
+
:software={[ it:prod:softver=(hehe, haha) ]}
|
|
3579
|
+
:platform={inet:service:platform | limit 1}
|
|
3580
|
+
|
|
3581
|
+
// ensure we got the interface...
|
|
3582
|
+
:creator={ inet:service:account | limit 1 }
|
|
3583
|
+
]
|
|
3584
|
+
''')
|
|
3585
|
+
self.len(1, nodes)
|
|
3586
|
+
self.eq(nodes[0].get('name'), 'woot')
|
|
3587
|
+
self.eq(nodes[0].get('names'), ('bar', 'foo'))
|
|
3588
|
+
self.eq(nodes[0].get('desc'), 'Foo Bar')
|
|
3589
|
+
self.nn(nodes[0].get('creator'))
|
|
3590
|
+
self.nn(nodes[0].get('platform'))
|
|
3591
|
+
|
|
3592
|
+
self.len(1, await core.nodes('inet:service:action | limit 1 | [ :agent={ inet:service:agent } ]'))
|
|
3593
|
+
self.len(1, await core.nodes('inet:service:platform | limit 1 | [ :software={[ it:prod:softver=(hehe, haha) ]} ]'))
|
|
3594
|
+
|
|
3564
3595
|
async def test_model_inet_tls_ja4(self):
|
|
3565
3596
|
|
|
3566
3597
|
async with self.getTestCore() as core:
|
|
@@ -2163,6 +2163,20 @@ class InfotechModelTest(s_t_utils.SynTest):
|
|
|
2163
2163
|
self.eq(node.get('url'),
|
|
2164
2164
|
'https://github.com/vertexproject/synapse/commit/03c71e723bceedb38ef8fc14543c30b9e82e64cf')
|
|
2165
2165
|
|
|
2166
|
+
nodes = await core.nodes('''
|
|
2167
|
+
[ it:dev:repo:entry=*
|
|
2168
|
+
:repo={it:dev:repo | limit 1}
|
|
2169
|
+
:file=*
|
|
2170
|
+
:path=foo/bar/baz.exe
|
|
2171
|
+
<(has)+ { it:dev:repo:commit | limit 1 }
|
|
2172
|
+
]
|
|
2173
|
+
''')
|
|
2174
|
+
self.nn(nodes[0].get('file'))
|
|
2175
|
+
self.nn(nodes[0].get('repo'))
|
|
2176
|
+
self.eq(nodes[0].get('path'), 'foo/bar/baz.exe')
|
|
2177
|
+
|
|
2178
|
+
self.len(1, await core.nodes('it:dev:repo:entry <(has)- it:dev:repo:commit'))
|
|
2179
|
+
|
|
2166
2180
|
props = {
|
|
2167
2181
|
'commit': commit,
|
|
2168
2182
|
'file': file,
|
|
@@ -2306,7 +2320,7 @@ class InfotechModelTest(s_t_utils.SynTest):
|
|
|
2306
2320
|
self.len(2, nodes)
|
|
2307
2321
|
|
|
2308
2322
|
nodes = await core.nodes('it:dev:repo <- *')
|
|
2309
|
-
self.len(
|
|
2323
|
+
self.len(5, nodes)
|
|
2310
2324
|
|
|
2311
2325
|
nodes = await core.nodes('it:dev:repo:commit')
|
|
2312
2326
|
self.len(3, nodes)
|
synapse/tests/test_tools_aha.py
CHANGED
|
@@ -273,13 +273,13 @@ class AhaToolsTest(s_t_utils.SynTest):
|
|
|
273
273
|
|
|
274
274
|
async def mockCellInfo():
|
|
275
275
|
return {
|
|
276
|
-
'cell': {'ready': True, 'nexsindx': 10, '
|
|
276
|
+
'cell': {'ready': True, 'nexsindx': 10, 'active': True},
|
|
277
277
|
'synapse': {'verstring': s_version.verstring},
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
async def mockOutOfSyncCellInfo():
|
|
281
281
|
return {
|
|
282
|
-
'cell': {'ready': True, 'nexsindx': 5, '
|
|
282
|
+
'cell': {'ready': True, 'nexsindx': 5, 'active': False},
|
|
283
283
|
'synapse': {'verstring': s_version.verstring},
|
|
284
284
|
}
|
|
285
285
|
|
synapse/tests/utils.py
CHANGED
|
@@ -341,6 +341,10 @@ testmodel = {
|
|
|
341
341
|
('foo', 'test:int'),
|
|
342
342
|
('bar', ('str', {'lower': True}),),
|
|
343
343
|
)}), {'doc': 'A complex comp type.'}),
|
|
344
|
+
('test:mutcomp', ('comp', {'fields': (
|
|
345
|
+
('str', 'str'),
|
|
346
|
+
('list', 'array'))
|
|
347
|
+
}), {'doc': 'A mutable comp type.'}),
|
|
344
348
|
('test:hexa', ('hex', {}), {'doc': 'anysize test hex type.'}),
|
|
345
349
|
('test:hex4', ('hex', {'size': 4}), {'doc': 'size 4 test hex type.'}),
|
|
346
350
|
('test:hexpad', ('hex', {'size': 8, 'zeropad': True}), {'doc': 'size 8 test hex type, zero padded.'}),
|
|
@@ -420,6 +424,11 @@ testmodel = {
|
|
|
420
424
|
('bar', ('str', {'lower': 1}), {'ro': True})
|
|
421
425
|
)),
|
|
422
426
|
|
|
427
|
+
('test:mutcomp', {}, (
|
|
428
|
+
('str', ('str', {}), {'ro': True}),
|
|
429
|
+
('list', ('array', {'type': 'int'}), {'ro': True}),
|
|
430
|
+
)),
|
|
431
|
+
|
|
423
432
|
('test:int', {}, (
|
|
424
433
|
('loc', ('loc', {}), {}),
|
|
425
434
|
('int2', ('int', {}), {}),
|
|
@@ -441,6 +450,9 @@ testmodel = {
|
|
|
441
450
|
('size', ('test:int', {}), {}),
|
|
442
451
|
('name', ('test:str', {}), {}),
|
|
443
452
|
('tick', ('test:time', {}), {}),
|
|
453
|
+
('data', ('data', {}), {}),
|
|
454
|
+
('comp', ('test:comp', {}), {}),
|
|
455
|
+
('mutcomp', ('test:mutcomp', {}), {}),
|
|
444
456
|
('posneg', ('test:sub', {}), {}),
|
|
445
457
|
('posneg:isbig', ('bool', {}), {}),
|
|
446
458
|
)),
|
synapse/tools/aha/mirror.py
CHANGED
|
@@ -45,7 +45,7 @@ def build_status_list(members, cell_infos):
|
|
|
45
45
|
cell_info = info.get('cell', {})
|
|
46
46
|
status.update({
|
|
47
47
|
'nexs_indx': cell_info.get('nexsindx', 0),
|
|
48
|
-
'role': '
|
|
48
|
+
'role': 'leader' if cell_info.get('active') else 'follower',
|
|
49
49
|
'version': str(info.get('cell', {}).get('verstring', '')),
|
|
50
50
|
'synapse': str(info.get('synapse', {}).get('verstring', '')),
|
|
51
51
|
'online': 'True',
|
|
@@ -2,7 +2,7 @@ synapse/__init__.py,sha256=R2kOXlF5j-8m6G0JkHuN7rXRPg_tHLmbMxr__94mHQk,1145
|
|
|
2
2
|
synapse/axon.py,sha256=tHt1FQH-hLZFFh8NpANFRx0n7LJjSFY3sWhFt0_pvDo,66457
|
|
3
3
|
synapse/cells.py,sha256=eNvdglfAoTURVhGOLGcgMXCGpfsIX1a02SQnyiklo3E,308
|
|
4
4
|
synapse/common.py,sha256=h2ZPK9xNnKcZ4uOxfGzfr70OnzP3ldZZojM8ZAev7kA,37895
|
|
5
|
-
synapse/cortex.py,sha256=
|
|
5
|
+
synapse/cortex.py,sha256=uL50glDaj2QQgxPX0XOhScJBi4nTolXlUwnzSoComSM,274667
|
|
6
6
|
synapse/cryotank.py,sha256=C747V7mCSmLUMwy3niEPl6_4wuXaYKHJdm5wB-o1MMQ,12202
|
|
7
7
|
synapse/daemon.py,sha256=CllFBFGcZ8aI5jOmAu-7AQRXExjhojmq4saUE7uFOAQ,17171
|
|
8
8
|
synapse/datamodel.py,sha256=aoxZlYbp4QevIwMC_JkdzFUXq_d302Cy2q6z5_jEqpI,40347
|
|
@@ -87,9 +87,9 @@ synapse/data/lark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
|
87
87
|
synapse/data/lark/imap.lark,sha256=LpPhhbI_oYjSYn30gL5q9kZVSWR4LT48OFDu1UdiF48,237
|
|
88
88
|
synapse/data/lark/storm.lark,sha256=Q72SAVH49o4z8Wnlhp__sInEdi2xHiYMm2kCHH-0E2o,27436
|
|
89
89
|
synapse/lib/__init__.py,sha256=qLS7nt8-Iot8jnD2Xss_6wZi5lJoyv2rqxF9kkektT0,129
|
|
90
|
-
synapse/lib/agenda.py,sha256=
|
|
90
|
+
synapse/lib/agenda.py,sha256=rSVsQXA5ozWjPDvhhx8qS-3GoXDdOBjN3bKv2fslKbw,35027
|
|
91
91
|
synapse/lib/aha.py,sha256=FZC-NjEBN4QFdzOo1ENbRnJu_z0cBuZt7n8NRqbFYBg,56471
|
|
92
|
-
synapse/lib/ast.py,sha256=
|
|
92
|
+
synapse/lib/ast.py,sha256=hT7ug77ovEdGHebWUu8Te5bipwwraL5YD0t4YX-RPA8,166393
|
|
93
93
|
synapse/lib/auth.py,sha256=B7-Ji3MzPlW6pvRNtb0ciJKDru54QC-_yvznGraZCJs,54400
|
|
94
94
|
synapse/lib/autodoc.py,sha256=tM2OCPrV7yeth8Cx-wx-_VXBmBfzJS52vaubg_7BqCI,23217
|
|
95
95
|
synapse/lib/base.py,sha256=yJVfv7SiZhnzAP9LWKHlFOsY_l6ztUDNtt2TDT22U4Q,23422
|
|
@@ -144,12 +144,12 @@ synapse/lib/slaboffs.py,sha256=Fd0RrIRBMjh159aQz5y1ONmzw0NvV040kVX_jZjQW6I,815
|
|
|
144
144
|
synapse/lib/slabseqn.py,sha256=sKQJJeTq40QOC4n8nz_ZVfJsh8ee3O37d2w-U9vzuFo,11167
|
|
145
145
|
synapse/lib/snap.py,sha256=3yG69MYqbju8eROoW65cAlwt-ksL7FYPN9ezxp-UL3o,64871
|
|
146
146
|
synapse/lib/spooled.py,sha256=BQHIW-qZvEcvhEf8PpXhbDDGzq1go4TH63D6kn-1anM,6021
|
|
147
|
-
synapse/lib/storm.py,sha256=
|
|
147
|
+
synapse/lib/storm.py,sha256=yNgGeQx1o3quHUxh1sWA1QAtlYRrRS_8oP0iYFETrlc,201501
|
|
148
148
|
synapse/lib/storm_format.py,sha256=9cE8WNPYTcqgRakIqkmIQzOr16Hqbj_sM1QabHug3i0,4908
|
|
149
149
|
synapse/lib/stormctrl.py,sha256=3UC2LOHClC17JwYNuo8NeyntuAvIXphjenXEzVP33mY,2523
|
|
150
150
|
synapse/lib/stormhttp.py,sha256=D5xINUnGYwtWoBpstgW4PkDYEz0xibVlWQWZgG-DljM,29073
|
|
151
151
|
synapse/lib/stormsvc.py,sha256=FURIsQUVNJmY8Z5TmhTF1O__DGXPiVg5pUiOoPM8r3g,7573
|
|
152
|
-
synapse/lib/stormtypes.py,sha256=
|
|
152
|
+
synapse/lib/stormtypes.py,sha256=OnVSwCUPZIuXKgSUxEpc3iyvrHCi03Wkwx-NbGI0m5w,412568
|
|
153
153
|
synapse/lib/stormwhois.py,sha256=w7N2oCyMljNvi_sRt_bZb5BJwWwYkVGcRd7H_0oHY8Q,2554
|
|
154
154
|
synapse/lib/structlog.py,sha256=v5MK5jtJIRSF-E4y4fQuzEVKmbocu8ByFLDTY8Ybjpk,1336
|
|
155
155
|
synapse/lib/task.py,sha256=LVVM7Yr0VPUihIH6N_CrMHm3GHZR3bu-dw05SkG8zFE,6267
|
|
@@ -158,9 +158,9 @@ synapse/lib/thisplat.py,sha256=kQhj9Iy97zKHCnaxFSBoSnKabfza9vjpg9m6V7w-Xt4,417
|
|
|
158
158
|
synapse/lib/threads.py,sha256=TSsC7ryXm_CbM0LQMsvk1vYV4iyvarzWzH59TrUzKuo,164
|
|
159
159
|
synapse/lib/time.py,sha256=bk_1F6_MDuCWJ1ToPJ-XHkeTWVw5b4SE7cCixBqVxXo,9435
|
|
160
160
|
synapse/lib/trigger.py,sha256=jxNZRcCw5OLpugyQOo64vIigisTDzDk7feWEfazBMwk,20985
|
|
161
|
-
synapse/lib/types.py,sha256=
|
|
161
|
+
synapse/lib/types.py,sha256=iMt5DKm7TMWxIf4IqYnbmjA9WQ5ydlXh4LwF4TmQX9w,71395
|
|
162
162
|
synapse/lib/urlhelp.py,sha256=ljhnF91z9ihyOLdZZ6OoQYCN1WYjOj1imukD45xiKU0,3320
|
|
163
|
-
synapse/lib/version.py,sha256=
|
|
163
|
+
synapse/lib/version.py,sha256=OqHEpXCuInFPjwoyDQE1BIqdV3HEU8s0eTLGx8YI0Sk,7162
|
|
164
164
|
synapse/lib/view.py,sha256=yzN5MKN9A4NMeVrB_ZSIIFAoVygNXni27F2S4-QhTZQ,63301
|
|
165
165
|
synapse/lib/crypto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
166
166
|
synapse/lib/crypto/coin.py,sha256=_dhlkzIrHT8BvHdJOWK7PDThz3sK3dDRnWAUqjRpZJc,4910
|
|
@@ -172,10 +172,10 @@ synapse/lib/platforms/__init__.py,sha256=-_SwKehr4TtKgiEjUMPpJFiH3VucpGrVkqBmk-y
|
|
|
172
172
|
synapse/lib/platforms/common.py,sha256=7D_PFtU5K-80G7f1ePPlWjavoYEDP3oJt36DxDVYJRw,1165
|
|
173
173
|
synapse/lib/platforms/darwin.py,sha256=2Q5ohUyVLpZiVpZ1dHqDCOnI69_OnEFQIevPRzaDKFg,150
|
|
174
174
|
synapse/lib/platforms/freebsd.py,sha256=0lJNc9W5a5TWfsz734o30gtF3vS3BH8QXWvy04pz1pY,149
|
|
175
|
-
synapse/lib/platforms/linux.py,sha256=
|
|
175
|
+
synapse/lib/platforms/linux.py,sha256=LaBhGUrUUT7PO9V3ri9QHE2VetH1khAZAqXz13sgg6c,8146
|
|
176
176
|
synapse/lib/platforms/windows.py,sha256=YbB73MIoBPvePNYiTYa2xEvpGAotAiEKNl4P--njPPM,2069
|
|
177
177
|
synapse/lib/stormlib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
178
|
-
synapse/lib/stormlib/aha.py,sha256=
|
|
178
|
+
synapse/lib/stormlib/aha.py,sha256=tJd7i_ORA1WeVwI1GTCw7yBOiXjcSA683EZN3ebHnuo,34493
|
|
179
179
|
synapse/lib/stormlib/auth.py,sha256=y0CrB7ws8vfk0WNxg7EEoPF1HMgd_A0BwjDsLCNI8N8,92939
|
|
180
180
|
synapse/lib/stormlib/backup.py,sha256=-cR7lR9IRib-e0uMRV1oKVfdJJ3PYbowtwtH0i3mOtY,2846
|
|
181
181
|
synapse/lib/stormlib/basex.py,sha256=BHnThzA7xv_wBaoxO3sVjjPGgS7K5PMXyGrFFQzmX2Y,2638
|
|
@@ -232,7 +232,7 @@ synapse/lookup/phonenum.py,sha256=TQb1Q6KvQb3Gs_kgiHcCjSOZ0hpYBhI7qUYcddj-Uic,16
|
|
|
232
232
|
synapse/lookup/timezones.py,sha256=5_XejZyjbXMX0OHyVyiqVMiNYOMk6vlZ83ANCwO1z0A,996
|
|
233
233
|
synapse/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
234
234
|
synapse/models/auth.py,sha256=G7QGVB99fjtG1UUness9eRAJuAYKfoAkiOUSkxPOylo,3097
|
|
235
|
-
synapse/models/base.py,sha256=
|
|
235
|
+
synapse/models/base.py,sha256=57KsKJI_jpTgejB8khf0LHZb08Q_iMnPuEHzRwdF-Qo,19738
|
|
236
236
|
synapse/models/belief.py,sha256=lB61Wvp2cgaPlrwqBU2JTU-BOutAVOEKD597sTu0juo,2928
|
|
237
237
|
synapse/models/biz.py,sha256=01i9qnxrWwWt712dNUCAOHqdL1N0TY84P1utx_O5G8g,14909
|
|
238
238
|
synapse/models/crypto.py,sha256=dEgg3n6cY1hiBfnL8QbgJW7hQw-DWOKhbLWkq4hyXzQ,30160
|
|
@@ -243,8 +243,8 @@ synapse/models/entity.py,sha256=loHKByGwv2xyz6cYWWUpwk12mxWNzC06BKgDgWfX6ek,1617
|
|
|
243
243
|
synapse/models/files.py,sha256=H_149eOWirYEPvFxDjhxQkc4VInocifcjQMmjGvtR3U,34444
|
|
244
244
|
synapse/models/geopol.py,sha256=1DGxLJ60QlnSIe3WxxViYQ3KFSwm89vvGc534bbSNBo,11304
|
|
245
245
|
synapse/models/geospace.py,sha256=Ix54xGdGRZNqLI0r6r9OA1t6vqB3XM1lkoy86Vjt5XA,21155
|
|
246
|
-
synapse/models/inet.py,sha256=
|
|
247
|
-
synapse/models/infotech.py,sha256=
|
|
246
|
+
synapse/models/inet.py,sha256=A3Aq-xSewpBoA2naybXnIV2sc9RuR2U_dkRl20X0TYk,186268
|
|
247
|
+
synapse/models/infotech.py,sha256=4X1h3l5DmzDJ8k2BjriuEaj8JncLVdLthBBALVCu5a4,156288
|
|
248
248
|
synapse/models/language.py,sha256=hBVVIf5kc_FSIV7HZhWnberoc9ssxuqeff4fqC9iz4o,3640
|
|
249
249
|
synapse/models/material.py,sha256=UvmnBEkbhBbdbnvWtTlgGJAJlKDrx9E-YSQ3K49ws5M,5405
|
|
250
250
|
synapse/models/math.py,sha256=5zDLSwGbOcWI6T5-KspPL20sR8Bcs59pnRK2nEELzss,1775
|
|
@@ -277,7 +277,7 @@ synapse/tests/test_cmds_boss.py,sha256=SdBwM2qJHFzzfrjWYiZOLBKeye8uru7KeJ3NU_YSk
|
|
|
277
277
|
synapse/tests/test_cmds_cortex.py,sha256=hVe4xxp14vFHbJywnWxFLkDvbxyc_XHBcP6HOUA85Ag,17187
|
|
278
278
|
synapse/tests/test_cmds_hive.py,sha256=YospZkpYj3kjSFxpY_BwSbWLSU200AX1uYJzgi_wtb4,5904
|
|
279
279
|
synapse/tests/test_common.py,sha256=viVCDLV7PbyFSNDzc-9kYJzkfYzia03SFrnkcn2aBBk,17376
|
|
280
|
-
synapse/tests/test_cortex.py,sha256=
|
|
280
|
+
synapse/tests/test_cortex.py,sha256=ZpHaLZ4tSR0TBAWr0r1-HeXrO3asYUGObV0TR4bmVIU,387658
|
|
281
281
|
synapse/tests/test_cryotank.py,sha256=ms2VkL0aUskMi-LArTzRt8LUYw0z_y8nQfOOBDiCkvI,12027
|
|
282
282
|
synapse/tests/test_daemon.py,sha256=uwb3dK8Xx-49EAjxKCjLY0nXZwiE-GNKmc5spzxV5z0,7729
|
|
283
283
|
synapse/tests/test_data.py,sha256=f8L-q6kpMq8XPG3hq1jwlyaFRQEinSBf7ZlsRFeCuoM,196
|
|
@@ -285,7 +285,7 @@ synapse/tests/test_datamodel.py,sha256=G1-BYTuiyLYQ5phrh2zfYaCCU8WPs5Gqvs7idsGV5
|
|
|
285
285
|
synapse/tests/test_exc.py,sha256=Ado2J8SPImNXbKRKSsnq6pkHlKKksSZaETgBmdXsi-A,2181
|
|
286
286
|
synapse/tests/test_glob.py,sha256=cSNrtEKWLsZXRhsjxQjRjjMqdgqfpl05yT4S53dC0NU,249
|
|
287
287
|
synapse/tests/test_init.py,sha256=rHqYBVL_aFf1HO6zCF5akHVcHUP2g1kpJLRdTkV0yys,557
|
|
288
|
-
synapse/tests/test_lib_agenda.py,sha256=
|
|
288
|
+
synapse/tests/test_lib_agenda.py,sha256=_qiuxNM8oOD34-m9Uh_p6-Crpl2qKbCIU_BKhnbHmQI,62355
|
|
289
289
|
synapse/tests/test_lib_aha.py,sha256=5cvDDPVfYxrZXSvDY2LMgPxlFmh3fYHC7BUF6L0sCs8,73522
|
|
290
290
|
synapse/tests/test_lib_ast.py,sha256=Jl05O0yZ4YqBo-Pjo2isBvt33-MFzQhNum7MbO66bZc,194372
|
|
291
291
|
synapse/tests/test_lib_auth.py,sha256=sjollaFisSeI6-PUYGuX1E0VSHt2_so1flHZ1U087aI,45127
|
|
@@ -319,7 +319,7 @@ synapse/tests/test_lib_json.py,sha256=RY9uyXknqiM4w1O5aC2bOJfzMBZHmhbFZ7XabjhvT_
|
|
|
319
319
|
synapse/tests/test_lib_jsonstor.py,sha256=nGHM2MW8ih6p_JQEMhV-2T2oqJgGkdMGeRLQtPlhBSA,7864
|
|
320
320
|
synapse/tests/test_lib_layer.py,sha256=l7q6PPKHAdX6ve_DScrs4yHZ-tSiZ-Sw0GtkS-pMZHA,101373
|
|
321
321
|
synapse/tests/test_lib_link.py,sha256=JZZi3mt9k3dvIvLtRDNdzoVcmxet2bhmhrk8m4LB5hg,10311
|
|
322
|
-
synapse/tests/test_lib_lmdbslab.py,sha256=
|
|
322
|
+
synapse/tests/test_lib_lmdbslab.py,sha256=jFXCYBwJpPEKjTlAbekOvXCni0_tZQqk0qZsFjiL8cM,67772
|
|
323
323
|
synapse/tests/test_lib_modelrev.py,sha256=DK9ueo4WCUFagGFBP2xqEHvLqA9gnQLdbJTuKQmJs5k,81055
|
|
324
324
|
synapse/tests/test_lib_module.py,sha256=h2OyCW4HW-ZFiJBNQtZ-sPLjsnrlLdTFHQPaXpA8cds,3923
|
|
325
325
|
synapse/tests/test_lib_msgpack.py,sha256=_cS-Kzap6InQstBH0nCgFj9HoVO_tB2dj7D2zCa2miU,10056
|
|
@@ -327,7 +327,7 @@ synapse/tests/test_lib_multislabseqn.py,sha256=nV9MMqq152FVECEsAoIFdn7Cke2Bi6DGF
|
|
|
327
327
|
synapse/tests/test_lib_nexus.py,sha256=jSI6HeNE0-Azsf955X3UqOS7ZJrd9bsZl4JpqtKIXkU,17704
|
|
328
328
|
synapse/tests/test_lib_node.py,sha256=ZSDVVcsKOI8wmTBCwz7zse0Dr5FflOXcbp0n7V26FCA,24733
|
|
329
329
|
synapse/tests/test_lib_output.py,sha256=iYt3DSEVvJiolIUkGKhATYqHbSk-N92swIr4p6lmzl0,603
|
|
330
|
-
synapse/tests/test_lib_platforms_linux.py,sha256=
|
|
330
|
+
synapse/tests/test_lib_platforms_linux.py,sha256=f_9Spcvmja6KBh57opFIFBayCih7cRcQgan2Kmb4iyU,2764
|
|
331
331
|
synapse/tests/test_lib_queue.py,sha256=pr1dTeBcu4zVD9p0li1PvgH3XTiXZ4oPQm2ibAXXMpg,829
|
|
332
332
|
synapse/tests/test_lib_ratelimit.py,sha256=2aH3KodVGOEkxbe0hZ1RAQ4p6waF1tueSZP9h_QNya0,415
|
|
333
333
|
synapse/tests/test_lib_reflect.py,sha256=C2GMXUPm705p2ySLRpICWZUNB-oo4NiluT6XU_gY_jA,3104
|
|
@@ -338,11 +338,11 @@ synapse/tests/test_lib_slaboffs.py,sha256=FHQ8mGZ27dGqVwGk6q2UJ4gkPRZN22eIVzS8hM
|
|
|
338
338
|
synapse/tests/test_lib_slabseqn.py,sha256=Jup5xuUJUMrFSvQSFVWqZoDa_9J2p8Zc41DHhQigzFo,6314
|
|
339
339
|
synapse/tests/test_lib_snap.py,sha256=OviJtj9N5LhBV-56TySkWvRly7f8VH9d-VBcNFLAtmg,27805
|
|
340
340
|
synapse/tests/test_lib_spooled.py,sha256=Ki9UnzTPUtw7devwN_M0a8uwOst81fGQtGSVqSSh1u8,4002
|
|
341
|
-
synapse/tests/test_lib_storm.py,sha256=
|
|
341
|
+
synapse/tests/test_lib_storm.py,sha256=3809AuNX5ztCCVx_MARBOh9B86zFUUIEAAkfV7aV59c,264510
|
|
342
342
|
synapse/tests/test_lib_storm_format.py,sha256=tEZgQMmKAeG8FQZE5HUjOT7bnKawVTpNaVQh_3Wa630,277
|
|
343
343
|
synapse/tests/test_lib_stormctrl.py,sha256=1vY7PGjgmz3AibgSiGcp_G4NSYl9YNifWdjPB0CDf1g,2877
|
|
344
344
|
synapse/tests/test_lib_stormhttp.py,sha256=eR9dESCl5NRdJuZJpzk5t4HQHZ4D8YE5HQGkJwQGWQE,46709
|
|
345
|
-
synapse/tests/test_lib_stormlib_aha.py,sha256=
|
|
345
|
+
synapse/tests/test_lib_stormlib_aha.py,sha256=OixDfD6stMx2KrsNhfE3dJaTiY9vK0GOw2ZWCSeuchE,17947
|
|
346
346
|
synapse/tests/test_lib_stormlib_auth.py,sha256=8JvqF8InTU8KTuUQTfnPUce9780UdKwXuiTRwcoN99k,65628
|
|
347
347
|
synapse/tests/test_lib_stormlib_backup.py,sha256=3ZYE3swQ4A8aYJyVueFXzbekCdoKMC7jsHLoq0hTKGI,1644
|
|
348
348
|
synapse/tests/test_lib_stormlib_basex.py,sha256=DDOsH3XDR8MdJ1uj5avyqnFqBnlaIu8L5stX61jqKrw,2049
|
|
@@ -414,8 +414,8 @@ synapse/tests/test_model_geospace.py,sha256=8ATsx662mrcKzurMpQGbshnQPYOWqO7wxOWp
|
|
|
414
414
|
synapse/tests/test_model_gov_cn.py,sha256=FnfKNM_wnvmScLm4cYFSQXZ21kVaTPPDusiCD79awBA,675
|
|
415
415
|
synapse/tests/test_model_gov_intl.py,sha256=mHYK056C2R0aDH-5-TnUxtH0ZlKnEOoSd9ODIMasmow,780
|
|
416
416
|
synapse/tests/test_model_gov_us.py,sha256=kvZ9DudBrbKtZmqGm8X-b_IOw4oJ7XZMnvTgiDkzsrY,1525
|
|
417
|
-
synapse/tests/test_model_inet.py,sha256=
|
|
418
|
-
synapse/tests/test_model_infotech.py,sha256=
|
|
417
|
+
synapse/tests/test_model_inet.py,sha256=gK-gEp1nNkq6xIUdT-GumkOcV8tZnwvWl_PkB01Sp3I,163839
|
|
418
|
+
synapse/tests/test_model_infotech.py,sha256=qNqsD7tmZct6rDTCOK7T1nByWOr8eHmndC-32fxF3Lc,116211
|
|
419
419
|
synapse/tests/test_model_language.py,sha256=49stF1B8_EwWJB67Xa5VXCG563Zfbr6S85iKN9Iom48,3046
|
|
420
420
|
synapse/tests/test_model_material.py,sha256=Hkd8BJh6FdQE0RuFMV2NO6fGqw9kOCb5AeIuTYtwCEM,2723
|
|
421
421
|
synapse/tests/test_model_math.py,sha256=x-rHBfm-59ueZdHXXzSi53eshldvVURoJeLeexWTL2U,826
|
|
@@ -435,7 +435,7 @@ synapse/tests/test_servers_cryotank.py,sha256=vDxTcF4mUP5QQyf3xD-PKXRsYD0EvLknlk
|
|
|
435
435
|
synapse/tests/test_servers_stemcell.py,sha256=TJabX5aQVLbGNLffiVd3B7Uj5dH12Y-0KqAW56GM0G8,2320
|
|
436
436
|
synapse/tests/test_servers_univ.py,sha256=eXesifJL05IA91f5od-9bjuIDVhNWMdo8qWzaHEr22s,2704
|
|
437
437
|
synapse/tests/test_telepath.py,sha256=SHfZYZy02yeiLqjpH1JEWcQ64tYVWFhCfdYUT4Vl1ao,50670
|
|
438
|
-
synapse/tests/test_tools_aha.py,sha256=
|
|
438
|
+
synapse/tests/test_tools_aha.py,sha256=BSD4TZjhNfxToeMtvdbqSteeSWsfpquhjQ5yBelQJIk,16782
|
|
439
439
|
synapse/tests/test_tools_axon_copy.py,sha256=Enkk2K7AnjOFqga1MyhEMyisNay4TOGaQTiD_ayITBQ,1326
|
|
440
440
|
synapse/tests/test_tools_axon_dump_load.py,sha256=xbB2a5v7Gw2x47D-YoTALHLfbWCK-aew0qfuBZgsozI,14619
|
|
441
441
|
synapse/tests/test_tools_axon_get.py,sha256=No5mwpOcxnS87q9YW17yejeB1yCKBa015i_LBA2kRdY,2029
|
|
@@ -472,7 +472,7 @@ synapse/tests/test_tools_utils_rstorm.py,sha256=lwc2jaxCkIlaytEmZJQKYlKgKxA3xM_0
|
|
|
472
472
|
synapse/tests/test_utils.py,sha256=AUilgkkXARC-amyYuCHwlEsdYcq02UGb-NiVrXb4hUI,10810
|
|
473
473
|
synapse/tests/test_utils_getrefs.py,sha256=Cv0LT0DF-tCGwBmOXsYUVNIJdXQA73yRBgdSWxFL3oA,2623
|
|
474
474
|
synapse/tests/test_utils_stormcov.py,sha256=H9p1vFH8kNE6qMLrGzSV0eH7KOgdZFh7QuarFe47FtU,6149
|
|
475
|
-
synapse/tests/utils.py,sha256=
|
|
475
|
+
synapse/tests/utils.py,sha256=ybInX0t5M1gWmGvPbLOm2s3Sje4FltdCnAFKBCWeSYo,80023
|
|
476
476
|
synapse/tests/files/TestUtilsGetrefs.test_basics.yaml,sha256=Ch8cEGFYfDUCZTEvzAqW5Ir79OnYb49pq4i9OJ7K9T0,8257
|
|
477
477
|
synapse/tests/files/__init__.py,sha256=G0DpSelVbC5S6PncHNL3QjgFvjCfaq7Kb1GgksJgEO4,1774
|
|
478
478
|
synapse/tests/files/cpedata.json,sha256=e_wajnxn4ZClQ3-hwlOxK-2MWzLQwrqgtWVUV5dUVF4,13799445
|
|
@@ -577,7 +577,7 @@ synapse/tools/aha/clone.py,sha256=fGgcBWIPe1boRq2w1HdmfmR_ENG6ajuLDgLML-O3LSk,15
|
|
|
577
577
|
synapse/tools/aha/easycert.py,sha256=79iiLOJva3IrzPcr4HZBGYT-xRZtcXGbkagXvzDqG9Y,3198
|
|
578
578
|
synapse/tools/aha/enroll.py,sha256=8FDD_l7Y0j7PAi8P_8Pi4lrUgspPaOpKkjuHhXfgMgo,3235
|
|
579
579
|
synapse/tools/aha/list.py,sha256=O0fiMBTHbyzxXD1FAZCYhGzqxjoMTT8pR_mpnlVBttU,2693
|
|
580
|
-
synapse/tools/aha/mirror.py,sha256=
|
|
580
|
+
synapse/tools/aha/mirror.py,sha256=Nm42ogs4whuGCQfVRnHIIpqMcLpV9rz3eo7oBlIRfDA,8104
|
|
581
581
|
synapse/tools/aha/provision/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
582
582
|
synapse/tools/aha/provision/service.py,sha256=SMF4QzgXR2d_lu2K6hl6TGY7f1z7SrpNWNdIpHQVmMw,3152
|
|
583
583
|
synapse/tools/aha/provision/user.py,sha256=0x_kUWaJuODcd91WhproP9bK7pU4qLOK55V44G40jT8,1786
|
|
@@ -678,8 +678,8 @@ synapse/vendor/xrpl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
678
678
|
synapse/vendor/xrpl/tests/test_codec.py,sha256=Zwq6A5uZUK_FWDL3BA932c5b-rL3hnC6efobWHSLC4o,6651
|
|
679
679
|
synapse/vendor/xrpl/tests/test_main.py,sha256=kZQwWk7I6HrP-PMvLdsUUN4POvWD9I-iXDHOwdeF090,4299
|
|
680
680
|
synapse/vendor/xrpl/tests/test_main_test_cases.py,sha256=vTlUM4hJD2Hd2wCIdd9rfsvcMZZZQmNHWdCTTFeGz2Y,4221
|
|
681
|
-
synapse-2.
|
|
682
|
-
synapse-2.
|
|
683
|
-
synapse-2.
|
|
684
|
-
synapse-2.
|
|
685
|
-
synapse-2.
|
|
681
|
+
synapse-2.226.0.dist-info/licenses/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
|
|
682
|
+
synapse-2.226.0.dist-info/METADATA,sha256=QQur3odiibjhIJ8IpU-_vy9yaTo8cy_dglm5fJtrHko,4583
|
|
683
|
+
synapse-2.226.0.dist-info/WHEEL,sha256=cRWFNt_CJSuf6BnJKAdKunDXUJxjAbWvbt_kstDCs1I,93
|
|
684
|
+
synapse-2.226.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
|
|
685
|
+
synapse-2.226.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|