@scrypted/server 0.7.74 → 0.7.76
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 @scrypted/server might be problematic. Click here for more details.
- package/dist/plugin/system.js +7 -2
- package/dist/plugin/system.js.map +1 -1
- package/package.json +2 -2
- package/python/plugin_remote.py +146 -21
- package/src/plugin/system.ts +7 -2
package/dist/plugin/system.js
CHANGED
@@ -154,14 +154,19 @@ class SystemManagerImpl {
|
|
154
154
|
getDeviceById(idOrPluginId, nativeId) {
|
155
155
|
let id;
|
156
156
|
if (this.state[idOrPluginId]) {
|
157
|
+
// don't allow invalid input on nativeId, must be nullish if there is an exact id match.
|
158
|
+
if (nativeId != null)
|
159
|
+
return;
|
157
160
|
id = idOrPluginId;
|
158
161
|
}
|
159
162
|
else {
|
160
163
|
for (const check of Object.keys(this.state)) {
|
161
164
|
const state = this.state[check];
|
162
|
-
if (state
|
165
|
+
if (!state)
|
166
|
+
continue;
|
167
|
+
if (state[types_1.ScryptedInterfaceProperty.pluginId]?.value === idOrPluginId) {
|
163
168
|
// null and undefined should match here.
|
164
|
-
if (
|
169
|
+
if (state[types_1.ScryptedInterfaceProperty.nativeId]?.value == nativeId) {
|
165
170
|
id = check;
|
166
171
|
break;
|
167
172
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/plugin/system.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/plugin/system.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
{
|
2
2
|
"name": "@scrypted/server",
|
3
|
-
"version": "0.7.
|
3
|
+
"version": "0.7.76",
|
4
4
|
"description": "",
|
5
5
|
"dependencies": {
|
6
6
|
"@mapbox/node-pre-gyp": "^1.0.10",
|
7
|
-
"@scrypted/types": "^0.2.
|
7
|
+
"@scrypted/types": "^0.2.87",
|
8
8
|
"adm-zip": "^0.5.10",
|
9
9
|
"axios": "^0.21.4",
|
10
10
|
"body-parser": "^1.20.2",
|
package/python/plugin_remote.py
CHANGED
@@ -23,6 +23,7 @@ import scrypted_python.scrypted_sdk.types
|
|
23
23
|
from scrypted_python.scrypted_sdk import PluginFork, ScryptedStatic
|
24
24
|
from scrypted_python.scrypted_sdk.types import (Device, DeviceManifest,
|
25
25
|
EventDetails,
|
26
|
+
ScryptedInterfaceMethods,
|
26
27
|
ScryptedInterfaceProperty,
|
27
28
|
Storage)
|
28
29
|
|
@@ -38,20 +39,121 @@ import multiprocessing.connection
|
|
38
39
|
import rpc
|
39
40
|
import rpc_reader
|
40
41
|
|
42
|
+
|
41
43
|
class SystemDeviceState(TypedDict):
|
42
44
|
lastEventTime: int
|
43
45
|
stateTime: int
|
44
46
|
value: any
|
45
47
|
|
48
|
+
|
49
|
+
class DeviceProxy(object):
|
50
|
+
device: asyncio.Future[rpc.RpcPeer]
|
51
|
+
|
52
|
+
def __init__(self, systemManager: SystemManager, id: str):
|
53
|
+
self.systemManager = systemManager
|
54
|
+
self.id = id
|
55
|
+
self.device = None
|
56
|
+
|
57
|
+
def __getattr__(self, name):
|
58
|
+
if name == 'id':
|
59
|
+
return self.id
|
60
|
+
|
61
|
+
if hasattr(ScryptedInterfaceProperty, name):
|
62
|
+
state = self.systemManager.systemState.get(self.id)
|
63
|
+
if not state:
|
64
|
+
return
|
65
|
+
p = state.get(name)
|
66
|
+
if not p:
|
67
|
+
return
|
68
|
+
return p.get('value', None)
|
69
|
+
if hasattr(ScryptedInterfaceMethods, name):
|
70
|
+
return rpc.RpcProxyMethod(self, name)
|
71
|
+
|
72
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
73
|
+
if name == '__proxy_finalizer_id':
|
74
|
+
self.__dict__['__proxy_entry']['finalizerId'] = value
|
75
|
+
|
76
|
+
return super().__setattr__(name, value)
|
77
|
+
|
78
|
+
def __apply__(self, method: str, args: list):
|
79
|
+
if not self.device:
|
80
|
+
self.device = self.systemManager.api.getDeviceById(self.id)
|
81
|
+
|
82
|
+
async def apply():
|
83
|
+
device = await self.device
|
84
|
+
return await device.__apply__(method, args)
|
85
|
+
return apply()
|
86
|
+
|
87
|
+
|
46
88
|
class SystemManager(scrypted_python.scrypted_sdk.types.SystemManager):
|
89
|
+
deviceProxies: Mapping[str, DeviceProxy]
|
90
|
+
|
47
91
|
def __init__(self, api: Any, systemState: Mapping[str, Mapping[str, SystemDeviceState]]) -> None:
|
48
92
|
super().__init__()
|
49
93
|
self.api = api
|
50
94
|
self.systemState = systemState
|
95
|
+
self.deviceProxies = {}
|
51
96
|
|
52
97
|
async def getComponent(self, id: str) -> Any:
|
53
98
|
return await self.api.getComponent(id)
|
54
99
|
|
100
|
+
def getSystemState(self) -> Any:
|
101
|
+
return self.systemState
|
102
|
+
|
103
|
+
def getDeviceById(self, idOrPluginId: str, nativeId: str = None) -> scrypted_python.scrypted_sdk.ScryptedDevice:
|
104
|
+
id: str = None
|
105
|
+
if self.systemState.get(idOrPluginId, None):
|
106
|
+
if nativeId is not None:
|
107
|
+
return
|
108
|
+
id = idOrPluginId
|
109
|
+
else:
|
110
|
+
for check in self.systemState:
|
111
|
+
state = self.systemState.get(check, None)
|
112
|
+
if not state:
|
113
|
+
continue
|
114
|
+
pluginId = state.get('pluginId', None)
|
115
|
+
if not pluginId:
|
116
|
+
continue
|
117
|
+
pluginId = pluginId.get('value', None)
|
118
|
+
if pluginId == idOrPluginId:
|
119
|
+
checkNativeId = state.get('nativeId', None)
|
120
|
+
if not checkNativeId:
|
121
|
+
continue
|
122
|
+
checkNativeId = checkNativeId.get('value', None)
|
123
|
+
if nativeId == checkNativeId:
|
124
|
+
id = idOrPluginId
|
125
|
+
break
|
126
|
+
|
127
|
+
if not id:
|
128
|
+
return
|
129
|
+
ret = self.deviceProxies.get(id)
|
130
|
+
if not ret:
|
131
|
+
ret = DeviceProxy(self, id)
|
132
|
+
self.deviceProxies[id] = ret
|
133
|
+
return ret
|
134
|
+
|
135
|
+
def getDeviceByName(self, name: str) -> scrypted_python.scrypted_sdk.ScryptedDevice:
|
136
|
+
for check in self.systemState:
|
137
|
+
state = self.systemState.get(check, None)
|
138
|
+
if not state:
|
139
|
+
continue
|
140
|
+
checkName = state.get('name', None)
|
141
|
+
if not checkName:
|
142
|
+
continue
|
143
|
+
if checkName.get('value', None) == name:
|
144
|
+
return self.getDeviceById(check)
|
145
|
+
|
146
|
+
# TODO
|
147
|
+
async def listen(self, callback: scrypted_python.scrypted_sdk.EventListener) -> scrypted_python.scrypted_sdk.EventListenerRegister:
|
148
|
+
return super().listen(callback)
|
149
|
+
|
150
|
+
# TODO
|
151
|
+
async def listenDevice(self, id: str, event: str | scrypted_python.scrypted_sdk.EventListenerOptions, callback: scrypted_python.scrypted_sdk.EventListener) -> scrypted_python.scrypted_sdk.EventListenerRegister:
|
152
|
+
return super().listenDevice(id, event, callback)
|
153
|
+
|
154
|
+
async def removeDevice(self, id: str) -> None:
|
155
|
+
return await self.api.removeDevice(id)
|
156
|
+
|
55
157
|
|
56
158
|
class MediaObject(scrypted_python.scrypted_sdk.types.MediaObject):
|
57
159
|
def __init__(self, data, mimeType, options):
|
@@ -216,6 +318,7 @@ class DeviceManager(scrypted_python.scrypted_sdk.types.DeviceManager):
|
|
216
318
|
def getDeviceStorage(self, nativeId: str = None) -> Storage:
|
217
319
|
return self.nativeIds.get(nativeId, None)
|
218
320
|
|
321
|
+
|
219
322
|
class PluginRemote:
|
220
323
|
systemState: Mapping[str, Mapping[str, SystemDeviceState]] = {}
|
221
324
|
nativeIds: Mapping[str, DeviceStorage] = {}
|
@@ -272,7 +375,7 @@ class PluginRemote:
|
|
272
375
|
asyncio.run_coroutine_threadsafe(self.print_async(
|
273
376
|
nativeId, *values, sep=sep, end=end, flush=flush), self.loop)
|
274
377
|
|
275
|
-
async def loadZip(self, packageJson, zipData, options: dict=None):
|
378
|
+
async def loadZip(self, packageJson, zipData, options: dict = None):
|
276
379
|
try:
|
277
380
|
return await self.loadZipWrapped(packageJson, zipData, options)
|
278
381
|
except:
|
@@ -280,7 +383,7 @@ class PluginRemote:
|
|
280
383
|
traceback.print_exc()
|
281
384
|
raise
|
282
385
|
|
283
|
-
async def loadZipWrapped(self, packageJson, zipData, options: dict=None):
|
386
|
+
async def loadZipWrapped(self, packageJson, zipData, options: dict = None):
|
284
387
|
sdk = ScryptedStatic()
|
285
388
|
|
286
389
|
clusterId = options['clusterId']
|
@@ -311,15 +414,18 @@ class PluginRemote:
|
|
311
414
|
return sourcePeer.localProxyMap.get(id, None)
|
312
415
|
|
313
416
|
clusterPeers: Mapping[int, asyncio.Future[rpc.RpcPeer]] = {}
|
417
|
+
|
314
418
|
async def handleClusterClient(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
|
315
419
|
_, clusterPeerPort = writer.get_extra_info('peername')
|
316
420
|
rpcTransport = rpc_reader.RpcStreamTransport(reader, writer)
|
317
421
|
peer: rpc.RpcPeer
|
318
422
|
peer, peerReadLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
|
319
|
-
peer.onProxySerialization = lambda value, proxyId: onProxySerialization(
|
423
|
+
peer.onProxySerialization = lambda value, proxyId: onProxySerialization(
|
424
|
+
value, proxyId, clusterPeerPort)
|
320
425
|
future = asyncio.Future[rpc.RpcPeer]()
|
321
426
|
future.set_result(peer)
|
322
427
|
clusterPeers[clusterPeerPort] = future
|
428
|
+
|
323
429
|
async def connectRPCObject(id: str, secret: str, sourcePeerPort: int = None):
|
324
430
|
m = hashlib.sha256()
|
325
431
|
m.update(bytes('%s%s' % (clusterPort, clusterSecret), 'utf8'))
|
@@ -348,10 +454,12 @@ class PluginRemote:
|
|
348
454
|
reader, writer = await asyncio.open_connection(
|
349
455
|
'127.0.0.1', port)
|
350
456
|
_, clusterPeerPort = writer.get_extra_info('sockname')
|
351
|
-
rpcTransport = rpc_reader.RpcStreamTransport(
|
457
|
+
rpcTransport = rpc_reader.RpcStreamTransport(
|
458
|
+
reader, writer)
|
352
459
|
clusterPeer, peerReadLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
|
353
460
|
clusterPeer.tags['localPort'] = clusterPeerPort
|
354
|
-
clusterPeer.onProxySerialization = lambda value, proxyId: onProxySerialization(
|
461
|
+
clusterPeer.onProxySerialization = lambda value, proxyId: onProxySerialization(
|
462
|
+
value, proxyId, clusterPeerPort)
|
355
463
|
|
356
464
|
async def run_loop():
|
357
465
|
try:
|
@@ -362,7 +470,8 @@ class PluginRemote:
|
|
362
470
|
clusterPeers.pop(port)
|
363
471
|
asyncio.run_coroutine_threadsafe(run_loop(), self.loop)
|
364
472
|
return clusterPeer
|
365
|
-
clusterPeerPromise = self.loop.create_task(
|
473
|
+
clusterPeerPromise = self.loop.create_task(
|
474
|
+
connectClusterPeer())
|
366
475
|
clusterPeers[port] = clusterPeerPromise
|
367
476
|
return clusterPeerPromise
|
368
477
|
|
@@ -373,7 +482,7 @@ class PluginRemote:
|
|
373
482
|
|
374
483
|
if clusterObject.get('id', None) != clusterId:
|
375
484
|
return value
|
376
|
-
|
485
|
+
|
377
486
|
port = clusterObject['port']
|
378
487
|
proxyId = clusterObject['proxyId']
|
379
488
|
source = clusterObject.get('source', None)
|
@@ -407,7 +516,8 @@ class PluginRemote:
|
|
407
516
|
zipPath: str
|
408
517
|
|
409
518
|
if isinstance(zipData, str):
|
410
|
-
zipPath = (options and options.get(
|
519
|
+
zipPath = (options and options.get(
|
520
|
+
'filename', None)) or zipData
|
411
521
|
if zipPath != zipData:
|
412
522
|
shutil.copyfile(zipData, zipPath)
|
413
523
|
else:
|
@@ -427,9 +537,12 @@ class PluginRemote:
|
|
427
537
|
# this will cause prebuilt wheel installation to fail.
|
428
538
|
if platform.machine() == 'aarch64' and platform.architecture()[0] == '32bit':
|
429
539
|
print('=============================================')
|
430
|
-
print(
|
431
|
-
|
432
|
-
print(
|
540
|
+
print(
|
541
|
+
'Python machine vs architecture mismatch detected. Plugin installation may fail.')
|
542
|
+
print(
|
543
|
+
'This issue occurs if a 32bit system was upgraded to a 64bit kernel.')
|
544
|
+
print(
|
545
|
+
'Reverting to the 32bit kernel (or reflashing as native 64 bit is recommended.')
|
433
546
|
print('https://github.com/koush/scrypted/issues/678')
|
434
547
|
print('=============================================')
|
435
548
|
|
@@ -437,7 +550,8 @@ class PluginRemote:
|
|
437
550
|
sys.version_info[0])+"."+str(sys.version_info[1])
|
438
551
|
print('python version:', python_version)
|
439
552
|
|
440
|
-
python_versioned_directory = '%s-%s-%s' % (
|
553
|
+
python_versioned_directory = '%s-%s-%s' % (
|
554
|
+
python_version, platform.system(), platform.machine())
|
441
555
|
SCRYPTED_BASE_VERSION = os.environ.get('SCRYPTED_BASE_VERSION')
|
442
556
|
if SCRYPTED_BASE_VERSION:
|
443
557
|
python_versioned_directory += '-' + SCRYPTED_BASE_VERSION
|
@@ -454,7 +568,8 @@ class PluginRemote:
|
|
454
568
|
requirements = zip.open('requirements.txt').read()
|
455
569
|
str_requirements = requirements.decode('utf8')
|
456
570
|
|
457
|
-
requirementstxt = os.path.join(
|
571
|
+
requirementstxt = os.path.join(
|
572
|
+
python_prefix, 'requirements.txt')
|
458
573
|
installed_requirementstxt = os.path.join(
|
459
574
|
python_prefix, 'requirements.installed.txt')
|
460
575
|
|
@@ -470,7 +585,8 @@ class PluginRemote:
|
|
470
585
|
for de in os.listdir(plugin_volume):
|
471
586
|
if de.startswith('linux') or de.startswith('darwin') or de.startswith('win32') or de.startswith('python') or de.startswith('node'):
|
472
587
|
filePath = os.path.join(plugin_volume, de)
|
473
|
-
print('Removing old dependencies: %s' %
|
588
|
+
print('Removing old dependencies: %s' %
|
589
|
+
filePath)
|
474
590
|
try:
|
475
591
|
shutil.rmtree(filePath)
|
476
592
|
except:
|
@@ -488,7 +604,7 @@ class PluginRemote:
|
|
488
604
|
f.close()
|
489
605
|
|
490
606
|
p = subprocess.Popen([sys.executable, '-m', 'pip', 'install', '-r', requirementstxt,
|
491
|
-
|
607
|
+
'--prefix', python_prefix], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
492
608
|
while True:
|
493
609
|
line = p.stdout.readline()
|
494
610
|
if not line:
|
@@ -539,7 +655,8 @@ class PluginRemote:
|
|
539
655
|
parent_conn, child_conn = multiprocessing.Pipe()
|
540
656
|
pluginFork = PluginFork()
|
541
657
|
print('new fork')
|
542
|
-
pluginFork.worker = multiprocessing.Process(
|
658
|
+
pluginFork.worker = multiprocessing.Process(
|
659
|
+
target=plugin_fork, args=(child_conn,), daemon=True)
|
543
660
|
pluginFork.worker.start()
|
544
661
|
|
545
662
|
def schedule_exit_check():
|
@@ -553,7 +670,8 @@ class PluginRemote:
|
|
553
670
|
schedule_exit_check()
|
554
671
|
|
555
672
|
async def getFork():
|
556
|
-
rpcTransport = rpc_reader.RpcConnectionTransport(
|
673
|
+
rpcTransport = rpc_reader.RpcConnectionTransport(
|
674
|
+
parent_conn)
|
557
675
|
forkPeer, readLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
|
558
676
|
forkPeer.peerName = 'thread'
|
559
677
|
|
@@ -573,7 +691,8 @@ class PluginRemote:
|
|
573
691
|
parent_conn.close()
|
574
692
|
rpcTransport.executor.shutdown()
|
575
693
|
pluginFork.worker.kill()
|
576
|
-
asyncio.run_coroutine_threadsafe(
|
694
|
+
asyncio.run_coroutine_threadsafe(
|
695
|
+
forkReadLoop(), loop=self.loop)
|
577
696
|
getRemote = await forkPeer.getParam('getRemote')
|
578
697
|
remote: PluginRemote = await getRemote(self.api, self.pluginId, self.hostInfo)
|
579
698
|
await remote.setSystemState(self.systemManager.getSystemState())
|
@@ -688,16 +807,19 @@ class PluginRemote:
|
|
688
807
|
|
689
808
|
stats_runner()
|
690
809
|
|
810
|
+
|
691
811
|
async def plugin_async_main(loop: AbstractEventLoop, rpcTransport: rpc_reader.RpcTransport):
|
692
812
|
peer, readLoop = await rpc_reader.prepare_peer_readloop(loop, rpcTransport)
|
693
813
|
peer.params['print'] = print
|
694
|
-
peer.params['getRemote'] = lambda api, pluginId, hostInfo: PluginRemote(
|
814
|
+
peer.params['getRemote'] = lambda api, pluginId, hostInfo: PluginRemote(
|
815
|
+
peer, api, pluginId, hostInfo, loop)
|
695
816
|
|
696
817
|
try:
|
697
818
|
await readLoop()
|
698
819
|
finally:
|
699
820
|
os._exit(0)
|
700
821
|
|
822
|
+
|
701
823
|
def main(rpcTransport: rpc_reader.RpcTransport):
|
702
824
|
loop = asyncio.new_event_loop()
|
703
825
|
|
@@ -709,6 +831,7 @@ def main(rpcTransport: rpc_reader.RpcTransport):
|
|
709
831
|
loop.run_until_complete(plugin_async_main(loop, rpcTransport))
|
710
832
|
loop.close()
|
711
833
|
|
834
|
+
|
712
835
|
def plugin_main(rpcTransport: rpc_reader.RpcTransport):
|
713
836
|
# gi import will fail on windows (and posisbly elsewhere)
|
714
837
|
# if it does, try starting without it.
|
@@ -723,7 +846,8 @@ def plugin_main(rpcTransport: rpc_reader.RpcTransport):
|
|
723
846
|
# seems optional on other platforms.
|
724
847
|
loop = GLib.MainLoop()
|
725
848
|
|
726
|
-
worker = threading.Thread(target=main, args=(
|
849
|
+
worker = threading.Thread(target=main, args=(
|
850
|
+
rpcTransport,), name="asyncio-main")
|
727
851
|
worker.start()
|
728
852
|
|
729
853
|
loop.run()
|
@@ -731,12 +855,13 @@ def plugin_main(rpcTransport: rpc_reader.RpcTransport):
|
|
731
855
|
except:
|
732
856
|
pass
|
733
857
|
|
734
|
-
# reattempt without gi outside of the exception handler in case the plugin fails.
|
858
|
+
# reattempt without gi outside of the exception handler in case the plugin fails.
|
735
859
|
main(rpcTransport)
|
736
860
|
|
737
861
|
|
738
862
|
def plugin_fork(conn: multiprocessing.connection.Connection):
|
739
863
|
plugin_main(rpc_reader.RpcConnectionTransport(conn))
|
740
864
|
|
865
|
+
|
741
866
|
if __name__ == "__main__":
|
742
867
|
plugin_main(rpc_reader.RpcFileTransport(3, 4))
|
package/src/plugin/system.ts
CHANGED
@@ -178,14 +178,19 @@ export class SystemManagerImpl implements SystemManager {
|
|
178
178
|
getDeviceById(idOrPluginId: string, nativeId?: ScryptedNativeId): any {
|
179
179
|
let id: string;
|
180
180
|
if (this.state[idOrPluginId]) {
|
181
|
+
// don't allow invalid input on nativeId, must be nullish if there is an exact id match.
|
182
|
+
if (nativeId != null)
|
183
|
+
return;
|
181
184
|
id = idOrPluginId;
|
182
185
|
}
|
183
186
|
else {
|
184
187
|
for (const check of Object.keys(this.state)) {
|
185
188
|
const state = this.state[check];
|
186
|
-
if (state
|
189
|
+
if (!state)
|
190
|
+
continue;
|
191
|
+
if (state[ScryptedInterfaceProperty.pluginId]?.value === idOrPluginId) {
|
187
192
|
// null and undefined should match here.
|
188
|
-
if (
|
193
|
+
if (state[ScryptedInterfaceProperty.nativeId]?.value == nativeId) {
|
189
194
|
id = check;
|
190
195
|
break;
|
191
196
|
}
|