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 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': 'Controls running storm commands requiring root privileges.',
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': 'Controls importing modules requiring root privileges.',
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 (bytes): The iden of the cron job to be deleted
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 (bytes): The iden of the cron job to be changed
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 (bytes): The iden of the cron job to be changed
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 (bytes): The iden of the cron job to be changed
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. Removing.', iden, e)
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
- appt = self.appts.get(iden)
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._delete_appt_from_heap(appt)
694
- del self.appts[iden]
695
- self.apptdefs.delete(iden)
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):
@@ -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 and not asroot:
2525
- mesg = f'Command ({name}) elevates privileges. You need perm: storm.asroot.cmd.{name}'
2526
- raise s_exc.AuthDeny(mesg=mesg, user=runt.user.iden, username=runt.user.name)
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 )
@@ -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.uplink) {
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) and not asroot:
1503
- mesg = f'Module ({name}) elevates privileges. You need perm: storm.asroot.mod.{name}'
1504
- raise s_exc.AuthDeny(mesg=mesg, user=self.runt.user.iden, username=self.runt.user.name)
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, 225, 0)
226
+ version = (2, 226, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = 'd2ab923e3df9fe64611ac05b6ffdd7e8c2dc1b22'
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
- 'doc': 'An application which is part of a service architecture.'}),
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
- 'doc': 'The app which contains the {service:base}.'}),
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
- 'doc': 'The app which handled the action.'}),
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
- 'doc': 'The client service app which initiated the action.'}),
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
- 'doc': 'The app which contains the instance.'}),
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
 
@@ -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', {}), {
@@ -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))
@@ -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(b'1234'))
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)
@@ -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, 'uplink': None},
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, 'uplink': cell00.iden},
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)
@@ -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(4, nodes)
2323
+ self.len(5, nodes)
2310
2324
 
2311
2325
  nodes = await core.nodes('it:dev:repo:commit')
2312
2326
  self.len(3, nodes)
@@ -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, 'uplink': None},
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, 'uplink': cell00.iden},
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
  )),
@@ -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': 'follower' if cell_info.get('uplink') else 'leader',
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',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse
3
- Version: 2.225.0
3
+ Version: 2.226.0
4
4
  Summary: Synapse Intelligence Analysis Framework
5
5
  Author-email: The Vertex Project LLC <root@vertex.link>
6
6
  License-Expression: Apache-2.0
@@ -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=XuInelqcWjR8dF-5NKF4RwlCcDZ1pEz0lFQFOzw1Qtg,274705
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=v3g6LC7lD9i1V5sngnmpw9AYZTar6LwBu1or2qQ8QXc,34429
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=il04TkWo1NIPzzGUAa1deUFHNkACuvIXWzQXq54Mi7I,166877
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=bjLKLs3Tr7gUzHNYzYjJJquLuAb-Yp9sjneniOMfoXg,201026
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=eAUuHxnWzy75V5KLmo-39J7O5RBiPWWsgrwy9qPLwaE,412164
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=0ILS8netSELraSJu1YfPyQf3P-bVbevYkVzSC-WigsU,70917
161
+ synapse/lib/types.py,sha256=iMt5DKm7TMWxIf4IqYnbmjA9WQ5ydlXh4LwF4TmQX9w,71395
162
162
  synapse/lib/urlhelp.py,sha256=ljhnF91z9ihyOLdZZ6OoQYCN1WYjOj1imukD45xiKU0,3320
163
- synapse/lib/version.py,sha256=q1o5iz0LK07Od-DqDJ45tuqXPp3xqIQ6sVAZHWL5fak,7162
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=VBUn_tf7PYGgfBXDBBNfE16QBGWstSkuV2l4LXX0dvQ,8002
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=jHEI2XPRm_pI-EdF7OtSn64lpk4hg1IHCNNxuVrh_Gs,34493
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=SXsAq1svfkJIL6D_dNgY4fw-KwS2xgdTSQSCpra6gaU,19616
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=_4KrAV68rs9t1wtTzUzZxyV9gobJuRrEVAlnNB1IvPc,183315
247
- synapse/models/infotech.py,sha256=IfxcD3Ap9W4jrBGkI55kej6UOdnTE2ZL3dH4R9f3MbI,155406
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=H7oX8FEqD9VHep6m6S4_UYomuDODM7qShgBplAgrLr4,383626
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=YT-eVKMa2y_Y5aeDw5WKv9FSRMFq4OqtLUtPC80AzSU,57233
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=2R80A17AoErvrt5cW5KattFlAdQrxMXzG02o82uD5So,67693
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=MgafTw5hq1ld9sKLREqf3LnmINk4Kdhz589jvE5NC0M,2556
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=nc6qX1eg3huB1r7wKATxZqVngF2mtb1qCal-0TwsSik,264149
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=XhBokRnanwe2vWZf0PcwyZgJE3mu-7V4xKNhFf7Go4U,17782
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=Nql6o0NBoJw-GKcJxkXFyR9Dxe-BIG2kDnVaVoJoU_A,162389
418
- synapse/tests/test_model_infotech.py,sha256=Haf6au6ZX97cZF5x4fm5c5vbQDuloWRHkTvVYu-CPJ8,115679
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=dWvXn8SJohZSjo2oFlXMH9cX9GynAb7USSBVv7K19Sg,16788
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=evn6XG7TMWS7j4oxoXcILjSjoISxKg3jSK5pMSLuvAc,79579
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=MUewnOEzEmscSpKvn5psEyc1PYWMHSflybuWUI9CKIQ,8104
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.225.0.dist-info/licenses/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
682
- synapse-2.225.0.dist-info/METADATA,sha256=5DwPaHtRy7uA-LwxkV5TDB8oV-MdUhs0oQXpLPOAWWs,4583
683
- synapse-2.225.0.dist-info/WHEEL,sha256=cRWFNt_CJSuf6BnJKAdKunDXUJxjAbWvbt_kstDCs1I,93
684
- synapse-2.225.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
685
- synapse-2.225.0.dist-info/RECORD,,
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,,