synit/packaging/packages/synit-config/files/usr/lib/synit/python/synit/daemon/user_settings_daemon.py

49 lines
1.6 KiB
Python

import sys
import os
import preserves.schema
import hashlib
from syndicate import patterns as P, relay, turn, dataspace, Symbol, canonicalize, stringify
from syndicate.actor import find_loop
from syndicate.during import During
try:
schemas = preserves.schema.load_schema_file('/usr/share/synit/schemas/schema-bundle.prb')
except:
schemas = preserves.schema.load_schema_file('/home/tonyg/src/synit/protocols/schema-bundle.bin')
userSettings = schemas.userSettings
def digest(item):
return hashlib.sha1(canonicalize(item)).hexdigest()
@relay.service(name='user_settings_daemon', debug=False)
@During().add_handler
def main(args):
config = args[Symbol('config')].embeddedValue
settingsDir = args[Symbol('settingsDir')]
def assert_item(item):
filename = os.path.join(settingsDir, digest(item) + '.pr')
turn.log.info(f'Asserting: {item} --> {filename}')
with open(filename, 'wt') as f:
f.write(stringify(item, indent=2) + '\n')
def retract_item(item):
filename = os.path.join(settingsDir, digest(item) + '.pr')
turn.log.info(f'Retracting: {item} --> {filename}')
try:
os.unlink(filename)
except FileNotFoundError:
pass
@dataspace.during(config, P.bind(P.quote(userSettings.Command(P.u_, P.u_))))
def handle_command(c):
c = userSettings.Command.try_decode(c)
if c is None: return
c.action._accept({
'assert': assert_item,
'retract': retract_item,
})
if c.reply.VARIANT.name == 'replyWanted':
turn.publish(c.reply.value, userSettings.CommandReply())