Skip to content

Instantly share code, notes, and snippets.

@eaon
Last active February 1, 2023 19:39
Show Gist options
  • Save eaon/0e8751431191c0b29a6c264060ca1943 to your computer and use it in GitHub Desktop.
Save eaon/0e8751431191c0b29a6c264060ca1943 to your computer and use it in GitHub Desktop.
"""Extension responsible for VM readable hierarchical key value stores"""
import qubes.ext
def _sdkv_get_key(feature):
branch = "sdkv."
return feature[len(branch):] if feature.startswith(branch) else None
class SdkvExtension(qubes.ext.Extension):
"""This extension exports features prefixed with 'sdkv.' to QubesDB in
its /sdkv/ tree.
"""
def _set_key_value(self, vm, key, value):
# TODO
# Convert value to base64, chunked?
vm.untrusted_qdb.write('/sdkv/{}'.format(key.replace('.', '/')), str(value))
@qubes.ext.handler('domain-qdb-create')
def on_domain_qdb_create(self, vm, _event):
"""Actually export features"""
for feature, value in vm.features.items():
key = _sdkv_get_key(feature)
if key:
self._set_key_value(vm, key, value)
@qubes.ext.handler('domain-feature-set:*')
def on_domain_feature_set(self, vm, _event, feature, value, oldvalue=None):
"""Update /sdkv/ QubesDB tree in runtime"""
if not vm.is_running():
return
key = _sdkv_get_key(feature)
if key:
self._set_key_value(vm, key, value)
@qubes.ext.handler('domain-feature-delete:*')
def on_domain_feature_delete(self, vm, event, feature):
"""Update /sdkv/ QubesDB tree in runtime"""
if not vm.is_running():
return
key = _sdkv_get_key(feature)
if key:
vm.untrusted_qdb.rm('/sdkv/{}'.format(key))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment