ext/block: make use of QubesDB watch
Actually use just introduced API. Also document new `device-list-change:class` event. QubesOS/qubes-issues#2940
This commit is contained in:
parent
b7f0cf7d82
commit
67c382c8b0
@ -44,11 +44,17 @@ Such extension should provide:
|
|||||||
domain of given identifier
|
domain of given identifier
|
||||||
- handle `device-list-attached:class` event - list currently attached
|
- handle `device-list-attached:class` event - list currently attached
|
||||||
devices to this domain
|
devices to this domain
|
||||||
|
- fire `device-list-change:class` event when device list change is detected
|
||||||
|
(new/removed device)
|
||||||
|
|
||||||
Note that device-listing event handlers can not be asynchronous. This for
|
Note that device-listing event handlers can not be asynchronous. This for
|
||||||
example means you can not call qrexec service there. This is intentional to
|
example means you can not call qrexec service there. This is intentional to
|
||||||
keep device listing operation cheap. You need to design the extension to take
|
keep device listing operation cheap. You need to design the extension to take
|
||||||
this into account (for example by using QubesDB).
|
this into account (for example by using QubesDB).
|
||||||
|
|
||||||
|
Extension may use QubesDB watch API (QubesVM.watch_qdb_path(path), then handle
|
||||||
|
`domain-qdb-change:path`) to detect changes and fire
|
||||||
|
`device-list-change:class` event.
|
||||||
'''
|
'''
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
@ -106,6 +106,18 @@ class BlockDevice(qubes.devices.DeviceInfo):
|
|||||||
|
|
||||||
|
|
||||||
class BlockDeviceExtension(qubes.ext.Extension):
|
class BlockDeviceExtension(qubes.ext.Extension):
|
||||||
|
@qubes.ext.handler('domain-init', 'domain-load')
|
||||||
|
def on_domain_init_load(self, vm, event):
|
||||||
|
'''Initialize watching for changes'''
|
||||||
|
# pylint: disable=unused-argument,no-self-use
|
||||||
|
vm.watch_qdb_path('/qubes-block-devices')
|
||||||
|
|
||||||
|
@qubes.ext.handler('domain-qdb-change:/qubes-block-devices')
|
||||||
|
def on_qdb_change(self, vm, event, path):
|
||||||
|
'''A change in QubesDB means a change in device list'''
|
||||||
|
# pylint: disable=unused-argument,no-self-use
|
||||||
|
vm.fire_event('device-list-change:block')
|
||||||
|
|
||||||
def device_get(self, vm, ident):
|
def device_get(self, vm, ident):
|
||||||
# pylint: disable=no-self-use
|
# pylint: disable=no-self-use
|
||||||
'''Read information about device from QubesDB
|
'''Read information about device from QubesDB
|
||||||
|
Loading…
Reference in New Issue
Block a user