49 lines
1.6 KiB
Python
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/syndicate-system/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())
|