synapse 2.220.0__py311-none-any.whl → 2.221.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.

Files changed (42) hide show
  1. synapse/lib/layer.py +134 -0
  2. synapse/lib/rstorm.py +65 -2
  3. synapse/lib/snap.py +21 -13
  4. synapse/lib/stormhttp.py +10 -10
  5. synapse/lib/stormlib/aha.py +3 -3
  6. synapse/lib/stormlib/auth.py +11 -11
  7. synapse/lib/stormlib/cell.py +1 -1
  8. synapse/lib/stormlib/cortex.py +9 -9
  9. synapse/lib/stormlib/env.py +4 -5
  10. synapse/lib/stormlib/ethereum.py +1 -1
  11. synapse/lib/stormlib/gen.py +3 -3
  12. synapse/lib/stormlib/hex.py +2 -2
  13. synapse/lib/stormlib/imap.py +2 -2
  14. synapse/lib/stormlib/infosec.py +2 -2
  15. synapse/lib/stormlib/iters.py +2 -2
  16. synapse/lib/stormlib/model.py +5 -5
  17. synapse/lib/stormlib/notifications.py +1 -1
  18. synapse/lib/stormlib/oauth.py +2 -2
  19. synapse/lib/stormlib/project.py +3 -3
  20. synapse/lib/stormlib/scrape.py +2 -1
  21. synapse/lib/stormlib/smtp.py +3 -3
  22. synapse/lib/stormlib/stats.py +2 -2
  23. synapse/lib/stormlib/stix.py +2 -2
  24. synapse/lib/stormlib/utils.py +19 -0
  25. synapse/lib/stormlib/vault.py +1 -1
  26. synapse/lib/stormlib/xml.py +2 -2
  27. synapse/lib/stormlib/yaml.py +1 -1
  28. synapse/lib/stormtypes.py +164 -60
  29. synapse/lib/version.py +2 -2
  30. synapse/tests/test_lib_layer.py +86 -67
  31. synapse/tests/test_lib_rstorm.py +132 -0
  32. synapse/tests/test_lib_storm.py +6 -0
  33. synapse/tests/test_lib_stormlib_env.py +3 -1
  34. synapse/tests/test_lib_stormlib_utils.py +10 -0
  35. synapse/tests/test_lib_stormtypes.py +551 -2
  36. synapse/tools/aha/list.py +9 -9
  37. synapse/tools/aha/provision/service.py +2 -2
  38. {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/METADATA +1 -1
  39. {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/RECORD +42 -42
  40. {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/WHEEL +0 -0
  41. {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/licenses/LICENSE +0 -0
  42. {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/top_level.txt +0 -0
synapse/lib/stormtypes.py CHANGED
@@ -312,6 +312,18 @@ class StormTypesRegistry:
312
312
  locl = getattr(obj, funcname, None)
313
313
  assert locl is not None, f'bad _funcname=[{funcname}] for {obj} {info.get("name")}'
314
314
  args = rtype.get('args', ())
315
+ for idx, arg in enumerate(args):
316
+ argname = arg.get('name')
317
+ assert argname is not None, f'Argument at index {idx} has no name'
318
+ argtype = arg.get('type')
319
+ assert argtype is not None, f'The type for argument {argname} of function {funcname} is unknown'
320
+ if isinstance(argtype, (list, tuple)):
321
+ for atyp in argtype:
322
+ if atyp not in self.known_types and atyp not in self.undefined_types:
323
+ raise s_exc.NoSuchType(mesg=f'The argument type {atyp} for arg {argname} of function {obj.__name__}.{funcname} is unknown.', type=argtype)
324
+ else:
325
+ if argtype not in self.known_types and argtype not in self.undefined_types:
326
+ raise s_exc.NoSuchType(mesg=f'The argument type {argtype} for arg {argname} of function {obj.__name__}.{funcname} is unknown.', type=argtype)
315
327
  callsig = getCallSig(locl)
316
328
  # Assert the callsigs match
317
329
  callsig_args = [str(v).split('=')[0] for v in callsig.parameters.values()]
@@ -1454,7 +1466,7 @@ class LibBase(Lib):
1454
1466
  {'name': 'valu', 'type': 'any', 'desc': 'The value to normalize.', },
1455
1467
  ),
1456
1468
  'returns': {'type': 'list',
1457
- 'desc': 'A list of (<bool>, <prim>) for status and normalized value.', }}},
1469
+ 'desc': 'A list of (<boolean>, <prim>) for status and normalized value.', }}},
1458
1470
  {'name': 'repr', 'desc': '''
1459
1471
  Attempt to convert a system mode value to a display mode string.
1460
1472
 
@@ -2159,7 +2171,7 @@ class LibAxon(Lib):
2159
2171
  'desc': 'Set to False to disable SSL/TLS certificate verification.', 'default': True},
2160
2172
  {'name': 'timeout', 'type': 'int', 'desc': 'Timeout for the download operation.',
2161
2173
  'default': None},
2162
- {'name': 'proxy', 'type': ['bool', 'str'],
2174
+ {'name': 'proxy', 'type': ['boolean', 'str'],
2163
2175
  'desc': 'Configure proxy usage. See $lib.axon help for additional details.', 'default': True},
2164
2176
  {'name': 'ssl_opts', 'type': 'dict',
2165
2177
  'desc': 'Optional SSL/TLS options. See $lib.axon help for additional details.',
@@ -2182,7 +2194,7 @@ class LibAxon(Lib):
2182
2194
  'desc': 'Set to False to disable SSL/TLS certificate verification.', 'default': True},
2183
2195
  {'name': 'timeout', 'type': 'int', 'desc': 'Timeout for the download operation.',
2184
2196
  'default': None},
2185
- {'name': 'proxy', 'type': ['bool', 'str'],
2197
+ {'name': 'proxy', 'type': ['boolean', 'str'],
2186
2198
  'desc': 'Configure proxy usage. See $lib.axon help for additional details.', 'default': True},
2187
2199
  {'name': 'ssl_opts', 'type': 'dict',
2188
2200
  'desc': 'Optional SSL/TLS options. See $lib.axon help for additional details.',
@@ -2212,7 +2224,7 @@ class LibAxon(Lib):
2212
2224
  ''',
2213
2225
  'type': {'type': 'function', '_funcname': 'del_',
2214
2226
  'args': (
2215
- {'name': 'sha256', 'type': 'hash:sha256',
2227
+ {'name': 'sha256', 'type': 'str',
2216
2228
  'desc': 'The sha256 of the bytes to remove from the Axon.'},
2217
2229
  ),
2218
2230
  'returns': {'type': 'boolean', 'desc': 'True if the bytes were found and removed.'}}},
@@ -7178,11 +7190,11 @@ class Layer(Prim):
7178
7190
  'type': {'type': 'function', '_funcname': 'getStorNodesByProp',
7179
7191
  'args': (
7180
7192
  {'name': 'propname', 'type': 'str', 'desc': 'The full property name to lift by.'},
7181
- {'name': 'propvalu', 'type': 'obj', 'desc': 'The value for the property.', 'default': None},
7193
+ {'name': 'propvalu', 'type': 'prim', 'desc': 'The value for the property.', 'default': None},
7182
7194
  {'name': 'propcmpr', 'type': 'str', 'desc': 'The comparison operation to use on the value.',
7183
7195
  'default': '='},
7184
7196
  ),
7185
- 'returns': {'name': 'Yields', 'type': 'list', 'desc': 'Tuple of buid, sode values.', }}},
7197
+ 'returns': {'name': 'Yields', 'type': 'list', 'desc': 'Tuple of node iden, sode values.', }}},
7186
7198
  {'name': 'setStorNodeProp',
7187
7199
  'desc': 'Set a property on a node in this layer.',
7188
7200
  'type': {'type': 'function', '_funcname': 'setStorNodeProp',
@@ -7192,6 +7204,13 @@ class Layer(Prim):
7192
7204
  {'name': 'valu', 'type': 'any', 'desc': 'The value to set.'},
7193
7205
  ),
7194
7206
  'returns': {'type': 'boolean', 'desc': 'Returns true if edits were made.'}}},
7207
+ {'name': 'delStorNode',
7208
+ 'desc': 'Delete a storage node, node data, and associated edges from a node in this layer.',
7209
+ 'type': {'type': 'function', '_funcname': 'delStorNode',
7210
+ 'args': (
7211
+ {'name': 'nodeid', 'type': 'str', 'desc': 'The hex string of the node iden.'},
7212
+ ),
7213
+ 'returns': {'type': 'boolean', 'desc': 'Returns true if edits were made.'}}},
7195
7214
  {'name': 'delStorNodeProp',
7196
7215
  'desc': 'Delete a property from a node in this layer.',
7197
7216
  'type': {'type': 'function', '_funcname': 'delStorNodeProp',
@@ -7200,6 +7219,23 @@ class Layer(Prim):
7200
7219
  {'name': 'prop', 'type': 'str', 'desc': 'The property name to delete.'},
7201
7220
  ),
7202
7221
  'returns': {'type': 'boolean', 'desc': 'Returns true if edits were made.'}}},
7222
+ {'name': 'delNodeData',
7223
+ 'desc': 'Delete node data from a node in this layer.',
7224
+ 'type': {'type': 'function', '_funcname': 'delNodeData',
7225
+ 'args': (
7226
+ {'name': 'nodeid', 'type': 'str', 'desc': 'The hex string of the node iden.'},
7227
+ {'name': 'name', 'type': 'str', 'default': None, 'desc': 'The node data key to delete.'},
7228
+ ),
7229
+ 'returns': {'type': 'boolean', 'desc': 'Returns true if edits were made.'}}},
7230
+ {'name': 'delEdge',
7231
+ 'desc': 'Delete edges from a node in this layer.',
7232
+ 'type': {'type': 'function', '_funcname': 'delEdge',
7233
+ 'args': (
7234
+ {'name': 'nodeid1', 'type': 'str', 'desc': 'The hex string of the N1 node iden.'},
7235
+ {'name': 'verb', 'type': 'str', 'desc': 'The edge verb to delete.'},
7236
+ {'name': 'nodeid2', 'type': 'str', 'desc': 'The hex string of the N2 node iden.'},
7237
+ ),
7238
+ 'returns': {'type': 'boolean', 'desc': 'Returns true if edits were made.'}}},
7203
7239
  {'name': 'getMirrorStatus', 'desc': '''
7204
7240
  Return a dictionary of the mirror synchronization status for the layer.
7205
7241
  ''',
@@ -7254,7 +7290,7 @@ class Layer(Prim):
7254
7290
  'type': {'type': 'function', '_funcname': 'liftByProp',
7255
7291
  'args': (
7256
7292
  {'name': 'propname', 'type': 'str', 'desc': 'The full property name to lift by.'},
7257
- {'name': 'propvalu', 'type': 'obj', 'desc': 'The value for the property.', 'default': None},
7293
+ {'name': 'propvalu', 'type': 'any', 'desc': 'The value for the property.', 'default': None},
7258
7294
  {'name': 'propcmpr', 'type': 'str', 'desc': 'The comparison operation to use on the value.', 'default': '='},
7259
7295
  ),
7260
7296
  'returns': {'name': 'Yields', 'type': 'node',
@@ -7296,6 +7332,16 @@ class Layer(Prim):
7296
7332
  'returns': {'name': 'Yields', 'type': 'node',
7297
7333
  'desc': 'Yields nodes.', }}},
7298
7334
 
7335
+ {'name': 'hasEdge', 'desc': 'Check if a light edge between two nodes exists in the layer.',
7336
+ 'type': {'type': 'function', '_funcname': 'hasEdge',
7337
+ 'args': (
7338
+ {'name': 'nodeid1', 'type': 'str', 'desc': 'The hex string of the N1 node iden.'},
7339
+ {'name': 'verb', 'type': 'str', 'desc': 'The edge verb.'},
7340
+ {'name': 'nodeid2', 'type': 'str', 'desc': 'The hex string of the N2 node iden.'},
7341
+ ),
7342
+ 'returns': {'type': 'boolean',
7343
+ 'desc': 'True if the edge exists in the layer, False if it does not.', }}},
7344
+
7299
7345
  {'name': 'getEdges', 'desc': '''
7300
7346
  Yield (n1iden, verb, n2iden) tuples for any light edges in the layer.
7301
7347
 
@@ -7326,6 +7372,7 @@ class Layer(Prim):
7326
7372
  'type': {'type': 'function', '_funcname': 'getEdgesByN1',
7327
7373
  'args': (
7328
7374
  {'name': 'nodeid', 'type': 'str', 'desc': 'The hex string of the node iden.'},
7375
+ {'name': 'verb', 'type': 'str', 'desc': 'An optional edge verb to filter by.', 'default': None},
7329
7376
  ),
7330
7377
  'returns': {'name': 'Yields', 'type': 'list',
7331
7378
  'desc': 'Yields (<verb>, <n2iden>) tuples', }}},
@@ -7343,6 +7390,7 @@ class Layer(Prim):
7343
7390
  'type': {'type': 'function', '_funcname': 'getEdgesByN2',
7344
7391
  'args': (
7345
7392
  {'name': 'nodeid', 'type': 'str', 'desc': 'The hex string of the node iden.'},
7393
+ {'name': 'verb', 'type': 'str', 'desc': 'An optional edge verb to filter by.', 'default': None},
7346
7394
  ),
7347
7395
  'returns': {'name': 'Yields', 'type': 'list',
7348
7396
  'desc': 'Yields (<verb>, <n1iden>) tuples', }}},
@@ -7405,6 +7453,7 @@ class Layer(Prim):
7405
7453
  'delPush': self._delPush,
7406
7454
  'addPull': self._addPull,
7407
7455
  'delPull': self._delPull,
7456
+ 'hasEdge': self.hasEdge,
7408
7457
  'getEdges': self.getEdges,
7409
7458
  'liftByTag': self.liftByTag,
7410
7459
  'liftByProp': self.liftByProp,
@@ -7424,7 +7473,10 @@ class Layer(Prim):
7424
7473
  'getNodeData': self.getNodeData,
7425
7474
  'getMirrorStatus': self.getMirrorStatus,
7426
7475
  'setStorNodeProp': self.setStorNodeProp,
7476
+ 'delStorNode': self.delStorNode,
7427
7477
  'delStorNodeProp': self.delStorNodeProp,
7478
+ 'delNodeData': self.delNodeData,
7479
+ 'delEdge': self.delEdge,
7428
7480
  }
7429
7481
 
7430
7482
  @stormfunc(readonly=True)
@@ -7442,8 +7494,7 @@ class Layer(Prim):
7442
7494
  async for _, buid, sode in layr.liftByTag(tagname, form=formname):
7443
7495
  yield await self.runt.snap._joinStorNode(buid, {iden: sode})
7444
7496
 
7445
- @stormfunc(readonly=True)
7446
- async def liftByProp(self, propname, propvalu=None, propcmpr='='):
7497
+ async def _liftByProp(self, propname, propvalu=None, propcmpr='='):
7447
7498
 
7448
7499
  propname = await tostr(propname)
7449
7500
  propvalu = await toprim(propvalu)
@@ -7471,12 +7522,18 @@ class Layer(Prim):
7471
7522
 
7472
7523
  if propvalu is None:
7473
7524
  async for _, buid, sode in layr.liftByProp(liftform, liftprop):
7474
- yield await self.runt.snap._joinStorNode(buid, {iden: sode})
7525
+ yield buid, sode
7475
7526
  return
7476
7527
 
7477
7528
  norm, info = prop.type.norm(propvalu)
7478
7529
  cmprvals = prop.type.getStorCmprs(propcmpr, norm)
7479
7530
  async for _, buid, sode in layr.liftByPropValu(liftform, liftprop, cmprvals):
7531
+ yield buid, sode
7532
+
7533
+ @stormfunc(readonly=True)
7534
+ async def liftByProp(self, propname, propvalu=None, propcmpr='='):
7535
+ iden = self.valu.get('iden')
7536
+ async for buid, sode in self._liftByProp(propname, propvalu=propvalu, propcmpr=propcmpr):
7480
7537
  yield await self.runt.snap._joinStorNode(buid, {iden: sode})
7481
7538
 
7482
7539
  @stormfunc(readonly=True)
@@ -7499,24 +7556,56 @@ class Layer(Prim):
7499
7556
  return await layr.getMirrorStatus()
7500
7557
 
7501
7558
  async def setStorNodeProp(self, nodeid, prop, valu):
7502
- iden = self.valu.get('iden')
7503
- layr = self.runt.snap.core.getLayer(iden)
7504
- buid = s_common.uhex(await tostr(nodeid))
7559
+ buid = await tobuid(nodeid)
7505
7560
  prop = await tostr(prop)
7506
7561
  valu = await tostor(valu)
7562
+
7563
+ iden = self.valu.get('iden')
7564
+ layr = self.runt.snap.core.getLayer(iden)
7507
7565
  self.runt.reqAdmin(mesg='setStorNodeProp() requires admin privileges.')
7508
7566
  meta = {'time': s_common.now(), 'user': self.runt.user.iden}
7509
7567
  return await layr.setStorNodeProp(buid, prop, valu, meta=meta)
7510
7568
 
7511
- async def delStorNodeProp(self, nodeid, prop):
7569
+ async def delStorNode(self, nodeid):
7570
+ buid = await tobuid(nodeid)
7571
+
7512
7572
  iden = self.valu.get('iden')
7513
7573
  layr = self.runt.snap.core.getLayer(iden)
7514
- buid = s_common.uhex(await tostr(nodeid))
7574
+ self.runt.reqAdmin(mesg='delStorNode() requires admin privileges.')
7575
+ meta = {'time': s_common.now(), 'user': self.runt.user.iden}
7576
+ return await layr.delStorNode(buid, meta=meta)
7577
+
7578
+ async def delStorNodeProp(self, nodeid, prop):
7579
+ buid = await tobuid(nodeid)
7515
7580
  prop = await tostr(prop)
7581
+
7582
+ iden = self.valu.get('iden')
7583
+ layr = self.runt.snap.core.getLayer(iden)
7516
7584
  self.runt.reqAdmin(mesg='delStorNodeProp() requires admin privileges.')
7517
7585
  meta = {'time': s_common.now(), 'user': self.runt.user.iden}
7518
7586
  return await layr.delStorNodeProp(buid, prop, meta=meta)
7519
7587
 
7588
+ async def delNodeData(self, nodeid, name=None):
7589
+ buid = await tobuid(nodeid)
7590
+ name = await tostr(name, noneok=True)
7591
+
7592
+ iden = self.valu.get('iden')
7593
+ layr = self.runt.snap.core.getLayer(iden)
7594
+ self.runt.reqAdmin(mesg='delNodeData() requires admin privileges.')
7595
+ meta = {'time': s_common.now(), 'user': self.runt.user.iden}
7596
+ return await layr.delNodeData(buid, meta=meta, name=name)
7597
+
7598
+ async def delEdge(self, nodeid1, verb, nodeid2):
7599
+ n1buid = await tobuid(nodeid1)
7600
+ verb = await tostr(verb)
7601
+ n2buid = await tobuid(nodeid2)
7602
+
7603
+ iden = self.valu.get('iden')
7604
+ layr = self.runt.snap.core.getLayer(iden)
7605
+ self.runt.reqAdmin(mesg='delEdge() requires admin privileges.')
7606
+ meta = {'time': s_common.now(), 'user': self.runt.user.iden}
7607
+ return await layr.delEdge(n1buid, verb, n2buid, meta=meta)
7608
+
7520
7609
  async def _addPull(self, url, offs=0, queue_size=s_const.layer_pdef_qsize, chunk_size=s_const.layer_pdef_csize):
7521
7610
  url = await tostr(url)
7522
7611
  offs = await toint(offs)
@@ -7772,11 +7861,11 @@ class Layer(Prim):
7772
7861
 
7773
7862
  @stormfunc(readonly=True)
7774
7863
  async def getStorNode(self, nodeid):
7775
- nodeid = await tostr(nodeid)
7864
+ nodeid = await tobuid(nodeid)
7776
7865
  layriden = self.valu.get('iden')
7777
7866
  await self.runt.reqUserCanReadLayer(layriden)
7778
7867
  layr = self.runt.snap.core.getLayer(layriden)
7779
- return await layr.getStorNode(s_common.uhex(nodeid))
7868
+ return await layr.getStorNode(nodeid)
7780
7869
 
7781
7870
  @stormfunc(readonly=True)
7782
7871
  async def getStorNodes(self):
@@ -7801,25 +7890,18 @@ class Layer(Prim):
7801
7890
 
7802
7891
  @stormfunc(readonly=True)
7803
7892
  async def getStorNodesByProp(self, propname, propvalu=None, propcmpr='='):
7804
- propname = await tostr(propname)
7805
- propvalu = await tostor(propvalu)
7806
- propcmpr = await tostr(propcmpr)
7893
+ async for buid, sode in self._liftByProp(propname, propvalu=propvalu, propcmpr=propcmpr):
7894
+ yield s_common.ehex(buid), sode
7807
7895
 
7896
+ @stormfunc(readonly=True)
7897
+ async def hasEdge(self, nodeid1, verb, nodeid2):
7898
+ nodeid1 = await tobuid(nodeid1)
7899
+ verb = await tostr(verb)
7900
+ nodeid2 = await tobuid(nodeid2)
7808
7901
  layriden = self.valu.get('iden')
7809
7902
  await self.runt.reqUserCanReadLayer(layriden)
7810
7903
  layr = self.runt.snap.core.getLayer(layriden)
7811
-
7812
- prop = self.runt.snap.core.model.reqProp(propname)
7813
-
7814
- if propvalu is not None:
7815
- norm, info = prop.type.norm(propvalu)
7816
- cmprvals = prop.type.getStorCmprs(propcmpr, norm)
7817
- async for _, buid, sode in layr.liftByPropValu(prop.form.name, prop.name, cmprvals):
7818
- yield (s_common.ehex(buid), sode)
7819
- return
7820
-
7821
- async for _, buid, sode in layr.liftByProp(prop.form.name, prop.name):
7822
- yield (s_common.ehex(buid), sode)
7904
+ return await layr.hasNodeEdge(nodeid1, verb, nodeid2)
7823
7905
 
7824
7906
  @stormfunc(readonly=True)
7825
7907
  async def getEdges(self):
@@ -7830,30 +7912,32 @@ class Layer(Prim):
7830
7912
  yield item
7831
7913
 
7832
7914
  @stormfunc(readonly=True)
7833
- async def getEdgesByN1(self, nodeid):
7834
- nodeid = await tostr(nodeid)
7915
+ async def getEdgesByN1(self, nodeid, verb=None):
7916
+ nodeid = await tobuid(nodeid)
7917
+ verb = await tostr(verb, noneok=True)
7835
7918
  layriden = self.valu.get('iden')
7836
7919
  await self.runt.reqUserCanReadLayer(layriden)
7837
7920
  layr = self.runt.snap.core.getLayer(layriden)
7838
- async for item in layr.iterNodeEdgesN1(s_common.uhex(nodeid)):
7921
+ async for item in layr.iterNodeEdgesN1(nodeid, verb=verb):
7839
7922
  yield item
7840
7923
 
7841
7924
  @stormfunc(readonly=True)
7842
- async def getEdgesByN2(self, nodeid):
7843
- nodeid = await tostr(nodeid)
7925
+ async def getEdgesByN2(self, nodeid, verb=None):
7926
+ nodeid = await tobuid(nodeid)
7927
+ verb = await tostr(verb, noneok=True)
7844
7928
  layriden = self.valu.get('iden')
7845
7929
  await self.runt.reqUserCanReadLayer(layriden)
7846
7930
  layr = self.runt.snap.core.getLayer(layriden)
7847
- async for item in layr.iterNodeEdgesN2(s_common.uhex(nodeid)):
7931
+ async for item in layr.iterNodeEdgesN2(nodeid, verb=verb):
7848
7932
  yield item
7849
7933
 
7850
7934
  @stormfunc(readonly=True)
7851
7935
  async def getNodeData(self, nodeid):
7852
- nodeid = await tostr(nodeid)
7936
+ nodeid = await tobuid(nodeid)
7853
7937
  layriden = self.valu.get('iden')
7854
7938
  await self.runt.reqUserCanReadLayer(layriden)
7855
7939
  layr = self.runt.snap.core.getLayer(layriden)
7856
- async for item in layr.iterNodeData(s_common.uhex(nodeid)):
7940
+ async for item in layr.iterNodeData(nodeid):
7857
7941
  yield item
7858
7942
 
7859
7943
  @stormfunc(readonly=True)
@@ -9154,39 +9238,39 @@ class LibJsonStor(Lib):
9154
9238
  {'name': 'get', 'desc': 'Return a stored JSON object or object property.',
9155
9239
  'type': {'type': 'function', '_funcname': 'get',
9156
9240
  'args': (
9157
- {'name': 'path', 'type': 'str|list', 'desc': 'A path string or list of path parts.'},
9158
- {'name': 'prop', 'type': 'str|list', 'desc': 'A property name or list of name parts.', 'default': None},
9241
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'A path string or list of path parts.'},
9242
+ {'name': 'prop', 'type': ['str', 'list'], 'desc': 'A property name or list of name parts.', 'default': None},
9159
9243
  ),
9160
9244
  'returns': {'type': 'prim', 'desc': 'The previously stored value or ``(null)``.'}}},
9161
9245
 
9162
9246
  {'name': 'set', 'desc': 'Set a JSON object or object property.',
9163
9247
  'type': {'type': 'function', '_funcname': 'set',
9164
9248
  'args': (
9165
- {'name': 'path', 'type': 'str|list', 'desc': 'A path string or list of path elements.'},
9249
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'A path string or list of path elements.'},
9166
9250
  {'name': 'valu', 'type': 'prim', 'desc': 'The value to set as the JSON object or object property.'},
9167
- {'name': 'prop', 'type': 'str|list', 'desc': 'A property name or list of name parts.', 'default': None},
9251
+ {'name': 'prop', 'type': ['str', 'list'], 'desc': 'A property name or list of name parts.', 'default': None},
9168
9252
  ),
9169
9253
  'returns': {'type': 'boolean', 'desc': 'True if the set operation was successful.'}}},
9170
9254
 
9171
9255
  {'name': 'del', 'desc': 'Delete a stored JSON object or object.',
9172
9256
  'type': {'type': 'function', '_funcname': '_del',
9173
9257
  'args': (
9174
- {'name': 'path', 'type': 'str|list', 'desc': 'A path string or list of path parts.'},
9175
- {'name': 'prop', 'type': 'str|list', 'desc': 'A property name or list of name parts.', 'default': None},
9258
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'A path string or list of path parts.'},
9259
+ {'name': 'prop', 'type': ['str', 'list'], 'desc': 'A property name or list of name parts.', 'default': None},
9176
9260
  ),
9177
9261
  'returns': {'type': 'boolean', 'desc': 'True if the del operation was successful.'}}},
9178
9262
 
9179
9263
  {'name': 'iter', 'desc': 'Yield (<path>, <valu>) tuples for the JSON objects.',
9180
9264
  'type': {'type': 'function', '_funcname': 'iter',
9181
9265
  'args': (
9182
- {'name': 'path', 'type': 'str|list', 'desc': 'A path string or list of path parts.', 'default': None},
9266
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'A path string or list of path parts.', 'default': None},
9183
9267
  ),
9184
9268
  'returns': {'name': 'Yields', 'type': 'list', 'desc': '(<path>, <item>) tuples.'}}},
9185
9269
  {'name': 'cacheget',
9186
9270
  'desc': 'Retrieve data stored with cacheset() if it was stored more recently than the asof argument.',
9187
9271
  'type': {'type': 'function', '_funcname': 'cacheget',
9188
9272
  'args': (
9189
- {'name': 'path', 'type': 'str|list', 'desc': 'The base path to use for the cache key.', },
9273
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'The base path to use for the cache key.', },
9190
9274
  {'name': 'key', 'type': 'prim', 'desc': 'The value to use for the GUID cache key.', },
9191
9275
  {'name': 'asof', 'type': 'time', 'default': 'now', 'desc': 'The max cache age.'},
9192
9276
  {'name': 'envl', 'type': 'boolean', 'default': False, 'desc': 'Return the full cache envelope.'},
@@ -9196,7 +9280,7 @@ class LibJsonStor(Lib):
9196
9280
  'desc': 'Set cache data with an envelope that tracks time for cacheget() use.',
9197
9281
  'type': {'type': 'function', '_funcname': 'cacheset',
9198
9282
  'args': (
9199
- {'name': 'path', 'type': 'str|list', 'desc': 'The base path to use for the cache key.', },
9283
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'The base path to use for the cache key.', },
9200
9284
  {'name': 'key', 'type': 'prim', 'desc': 'The value to use for the GUID cache key.', },
9201
9285
  {'name': 'valu', 'type': 'prim', 'desc': 'The data to store.', },
9202
9286
  ),
@@ -9205,7 +9289,7 @@ class LibJsonStor(Lib):
9205
9289
  'desc': 'Remove cached data set with cacheset.',
9206
9290
  'type': {'type': 'function', '_funcname': 'cachedel',
9207
9291
  'args': (
9208
- {'name': 'path', 'type': 'str|list', 'desc': 'The base path to use for the cache key.', },
9292
+ {'name': 'path', 'type': ['str', 'list'], 'desc': 'The base path to use for the cache key.', },
9209
9293
  {'name': 'key', 'type': 'prim', 'desc': 'The value to use for the GUID cache key.', },
9210
9294
  ),
9211
9295
  'returns': {'type': 'boolean', 'desc': 'True if the del operation was successful.'}}},
@@ -9434,7 +9518,7 @@ class LibCron(Lib):
9434
9518
  {'name': 'prefix', 'type': 'str',
9435
9519
  'desc': 'A prefix to match in order to identify a cron job to modify. '
9436
9520
  'Only a single matching prefix will be modified.', },
9437
- {'name': 'query', 'type': ['str', 'query'],
9521
+ {'name': 'query', 'type': ['str', 'storm:query'],
9438
9522
  'desc': 'The new Storm query for the Cron Job.', }
9439
9523
  ),
9440
9524
  'returns': {'type': 'str', 'desc': 'The iden of the CronJob which was modified.'}}},
@@ -10274,24 +10358,44 @@ async def torepr(valu, usestr=False):
10274
10358
  return str(valu)
10275
10359
  return repr(valu)
10276
10360
 
10277
- async def tobuidhex(valu, noneok=False):
10278
-
10279
- if noneok and valu is None:
10280
- return None
10361
+ async def tobuid(valu):
10281
10362
 
10282
10363
  if isinstance(valu, Node):
10283
- return valu.valu.iden()
10364
+ return valu.valu.buid
10284
10365
 
10285
10366
  if isinstance(valu, s_node.Node):
10286
- return valu.iden()
10367
+ return valu.buid
10287
10368
 
10288
- valu = await tostr(valu)
10289
- if not s_common.isbuidhex(valu):
10290
- mesg = f'Invalid buid string: {valu}'
10369
+ valu = await toprim(valu)
10370
+
10371
+ if isinstance(valu, str):
10372
+ if not s_common.isbuidhex(valu):
10373
+ mesg = f'Invalid buid string: {valu}'
10374
+ raise s_exc.BadCast(mesg=mesg)
10375
+
10376
+ return s_common.uhex(valu)
10377
+
10378
+ if not isinstance(valu, bytes):
10379
+ mesg = f'Invalid buid valu: {valu}'
10380
+ raise s_exc.BadCast(mesg=mesg)
10381
+
10382
+ if len(valu) != 32:
10383
+ mesg = f'Invalid buid valu: {valu}'
10291
10384
  raise s_exc.BadCast(mesg=mesg)
10292
10385
 
10293
10386
  return valu
10294
10387
 
10388
+ async def tobuidhex(valu, noneok=False):
10389
+
10390
+ if noneok and valu is None:
10391
+ return None
10392
+
10393
+ if isinstance(valu, str) and s_common.isbuidhex(valu):
10394
+ return valu
10395
+
10396
+ buid = await tobuid(valu)
10397
+ return s_common.ehex(buid)
10398
+
10295
10399
  async def totype(valu, basetypes=False) -> str:
10296
10400
  '''
10297
10401
  Convert a value to its Storm type string.
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, 220, 0)
226
+ version = (2, 221, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = '913156d6c195af916a32860341f285954cb4e882'
228
+ commit = '6ae7cd60524df7dc861bb91fe25309999eba6d70'