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.
- synapse/lib/layer.py +134 -0
- synapse/lib/rstorm.py +65 -2
- synapse/lib/snap.py +21 -13
- synapse/lib/stormhttp.py +10 -10
- synapse/lib/stormlib/aha.py +3 -3
- synapse/lib/stormlib/auth.py +11 -11
- synapse/lib/stormlib/cell.py +1 -1
- synapse/lib/stormlib/cortex.py +9 -9
- synapse/lib/stormlib/env.py +4 -5
- synapse/lib/stormlib/ethereum.py +1 -1
- synapse/lib/stormlib/gen.py +3 -3
- synapse/lib/stormlib/hex.py +2 -2
- synapse/lib/stormlib/imap.py +2 -2
- synapse/lib/stormlib/infosec.py +2 -2
- synapse/lib/stormlib/iters.py +2 -2
- synapse/lib/stormlib/model.py +5 -5
- synapse/lib/stormlib/notifications.py +1 -1
- synapse/lib/stormlib/oauth.py +2 -2
- synapse/lib/stormlib/project.py +3 -3
- synapse/lib/stormlib/scrape.py +2 -1
- synapse/lib/stormlib/smtp.py +3 -3
- synapse/lib/stormlib/stats.py +2 -2
- synapse/lib/stormlib/stix.py +2 -2
- synapse/lib/stormlib/utils.py +19 -0
- synapse/lib/stormlib/vault.py +1 -1
- synapse/lib/stormlib/xml.py +2 -2
- synapse/lib/stormlib/yaml.py +1 -1
- synapse/lib/stormtypes.py +164 -60
- synapse/lib/version.py +2 -2
- synapse/tests/test_lib_layer.py +86 -67
- synapse/tests/test_lib_rstorm.py +132 -0
- synapse/tests/test_lib_storm.py +6 -0
- synapse/tests/test_lib_stormlib_env.py +3 -1
- synapse/tests/test_lib_stormlib_utils.py +10 -0
- synapse/tests/test_lib_stormtypes.py +551 -2
- synapse/tools/aha/list.py +9 -9
- synapse/tools/aha/provision/service.py +2 -2
- {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/METADATA +1 -1
- {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/RECORD +42 -42
- {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/WHEEL +0 -0
- {synapse-2.220.0.dist-info → synapse-2.221.0.dist-info}/licenses/LICENSE +0 -0
- {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 (<
|
|
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': ['
|
|
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': ['
|
|
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': '
|
|
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': '
|
|
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
|
|
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': '
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
7805
|
-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
9158
|
-
{'name': 'prop', 'type': 'str
|
|
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
|
|
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
|
|
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
|
|
9175
|
-
{'name': 'prop', 'type': 'str
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
10364
|
+
return valu.valu.buid
|
|
10284
10365
|
|
|
10285
10366
|
if isinstance(valu, s_node.Node):
|
|
10286
|
-
return valu.
|
|
10367
|
+
return valu.buid
|
|
10287
10368
|
|
|
10288
|
-
valu = await
|
|
10289
|
-
|
|
10290
|
-
|
|
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,
|
|
226
|
+
version = (2, 221, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
228
|
+
commit = '6ae7cd60524df7dc861bb91fe25309999eba6d70'
|