diff --git a/dirty-upload-synit-config.sh b/dirty-upload-synit-config.sh new file mode 100755 index 0000000..bad7da1 --- /dev/null +++ b/dirty-upload-synit-config.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Upload packages and scripts for converting a plain PostmarketOS system into a Synit system + +set -eu + +HOST=${1:-pm-qemu} +SUDOPASS=${SUDOPASS:-user} + +ssh ${HOST} " + cp `which rsync` root-rsync; + echo ${SUDOPASS} | sudo -S sh -c 'chown root:root root-rsync; chmod +s root-rsync'; + echo ${SUDOPASS} | sudo -S sh -c 'echo \"! >\" > /run/etc/syndicate/throck.pr'; +" +rsync -avu --rsync-path="./root-rsync" \ + packaging/packages/synit-config/files/. \ + ${HOST}:/ diff --git a/packaging/Makefile b/packaging/Makefile index 5d6f3a0..a1a8c90 100644 --- a/packaging/Makefile +++ b/packaging/Makefile @@ -1,3 +1,5 @@ +__ignored__ := $(shell ./copy-local-resources-into-package-folders.sh) + .PHONY: build-image build sign clean veryclean keyfile # If you run: diff --git a/packaging/Makefile.internal b/packaging/Makefile.internal index dab4597..3c6030f 100644 --- a/packaging/Makefile.internal +++ b/packaging/Makefile.internal @@ -8,11 +8,13 @@ ARCH_TARGET = $(TARGET)/packages/$(ARCH) SIGNING_KEY = $(HOME)/.abuild/$(KEYFILE) PACKAGES = \ + preserves-schemas.apk \ preserves-tools.apk \ py3-preserves.apk \ py3-syndicate.apk \ squeak-cog-vm.apk \ squeak-stack-vm.apk \ + syndicate-schemas.apk \ syndicate-server.apk \ syndicate-sh.apk \ synit-pid1.apk \ diff --git a/packaging/copy-local-resources-into-package-folders.sh b/packaging/copy-local-resources-into-package-folders.sh new file mode 100755 index 0000000..a67607d --- /dev/null +++ b/packaging/copy-local-resources-into-package-folders.sh @@ -0,0 +1,2 @@ +#!/bin/sh +rsync -a ../protocols packages/synit-config diff --git a/packaging/packages/preserves-schemas/APKBUILD b/packaging/packages/preserves-schemas/APKBUILD new file mode 100644 index 0000000..3ffb09f --- /dev/null +++ b/packaging/packages/preserves-schemas/APKBUILD @@ -0,0 +1,24 @@ +# Maintainer: Tony Garnock-Jones +pkgname=preserves-schemas +pkgver=0.6.0-r20220114 +pkgrel=0 +pkgdesc="Shared Preserves Schema definitions" +url="https://preserves.gitlab.io/" +arch="noarch" +license="Apache-2.0" +source="https://gitlab.com/preserves/preserves/-/archive/${pkgver}/preserves-${pkgver}.zip" +builddir="$srcdir/preserves-${pkgver}" +options="!check" + +package() { + cd "$builddir" + mkdir -p "$pkgdir/usr/share/preserves/schemas" + cp ./schema/schema.prs "$pkgdir/usr/share/preserves/schemas/." + cp ./schema/schema.bin "$pkgdir/usr/share/preserves/schemas/schema.prb" + cp ./path/path.prs "$pkgdir/usr/share/preserves/schemas/." + cp ./path/path.bin "$pkgdir/usr/share/preserves/schemas/path.prb" +} + +sha512sums=" +62363962bc6849f026fe03faf1b41b4880f41cd2cacb26bb6e716f5c0d3b68f025aa306e0caa367bea32292694729f5e47069624b7395bb755b306a54532e288 preserves-0.6.0-r20220114.zip +" diff --git a/packaging/packages/syndicate-schemas/APKBUILD b/packaging/packages/syndicate-schemas/APKBUILD new file mode 100644 index 0000000..f8b28b9 --- /dev/null +++ b/packaging/packages/syndicate-schemas/APKBUILD @@ -0,0 +1,24 @@ +# Maintainer: Tony Garnock-Jones +pkgname=syndicate-schemas +pkgver=0.0.1-r20220114 +pkgrel=0 +pkgdesc="Shared Syndicate Preserves Schema definitions" +url="https://syndicate-lang.org/" +arch="noarch" +license="Apache-2.0" +source="https://git.syndicate-lang.org/syndicate-lang/syndicate-protocols/archive/0.0.1-r20220114.zip" +builddir="$srcdir/syndicate-protocols" +makedepends=" + rsync +" +options="!check" + +package() { + cd "$builddir" + mkdir -p "$pkgdir/usr/share/syndicate/schemas" + rsync schema-bundle.bin schemas "$pkgdir/usr/share/syndicate/schemas/." +} + +sha512sums=" +f6b230db7315cbf32f3968d971ae807aa7344a5a97e42301beb069f4bda06034cd619c2c6afc5b4fc886ae956225393bed9e4e733977e2ec613a64bc72b243d7 0.0.1-r20220114.zip +" diff --git a/packaging/packages/syndicate-server/APKBUILD b/packaging/packages/syndicate-server/APKBUILD index 04b6737..95d0921 100644 --- a/packaging/packages/syndicate-server/APKBUILD +++ b/packaging/packages/syndicate-server/APKBUILD @@ -1,19 +1,15 @@ # Contributor: Tony Garnock-Jones # Maintainer: Tony Garnock-Jones pkgname=syndicate-server -pkgver=0.18.0 -pkgrel=0 +pkgver=0.0.0 +pkgrel=$(date '+%Y%m%d%H%M%S') pkgdesc="Syndicate server" url="https://syndicate-lang.org/" arch="all" license="GPLv3" depends="" -makedepends="" -source=" -syndicate-server.aarch64 -syndicate-server.armv7 -syndicate-server.x86_64 -" +makedepends="rsync" +source="" builddir="$srcdir/" options="!check" @@ -23,11 +19,9 @@ build() { package() { mkdir -p "$pkgdir/usr/bin" - cp -p syndicate-server.${CARCH} "$pkgdir/usr/bin/syndicate-server" -} + cp -p ../syndicate-server.${CARCH} "$pkgdir/usr/bin/syndicate-server" -sha512sums=" -1778c033ef250de0a2a30767c962245eb1f247d71958833ed7a7fe7fbfdfe730ade6c6562b2e83f76dec4a6c061b0e2ed78ee25f5362aceea537b08df7634469 syndicate-server.aarch64 -80034a35ffb5e661e32bec63d81b22748ba5788546daa3472a0ba6cf5735cfae1812dcd24220aecd8088bbe9d94f35c01dd2cb514a4c9f1c812ab7f28154931d syndicate-server.armv7 -8d7f34a6ceb5ee23ae14fb8d82a8a75ec07887fb80ed83cfd4d9de4f7a41435f9eb213fe2607bd9784fe04f2dc8222c9daf17209360bbedd28112a0d0c406d96 syndicate-server.x86_64 -" + mkdir -p "$pkgdir/usr/share/syndicate-server/schemas" + rsync ../protocols/schema-bundle.bin ../protocols/schemas \ + "$pkgdir/usr/share/syndicate-server/schemas" +} diff --git a/packaging/packages/syndicate-server/protocols/Makefile b/packaging/packages/syndicate-server/protocols/Makefile new file mode 100644 index 0000000..a738837 --- /dev/null +++ b/packaging/packages/syndicate-server/protocols/Makefile @@ -0,0 +1,8 @@ +all: schema-bundle.bin + +clean: + rm -f schema-bundle.bin + +schema-bundle.bin: schemas/*.prs + preserves-schemac schemas > $@.tmp + mv $@.tmp $@ diff --git a/packaging/packages/syndicate-server/protocols/schema-bundle.bin b/packaging/packages/syndicate-server/protocols/schema-bundle.bin new file mode 100644 index 0000000..86f634a --- /dev/null +++ b/packaging/packages/syndicate-server/protocols/schema-bundle.bin @@ -0,0 +1,9 @@ +´³bundle·µ³externalServices„´³schema·³version‘³ definitions·³Process´³orµµ±simple´³refµ„³ CommandLine„„µ±full´³refµ„³ FullProcess„„„„³Service´³refµ„³ DaemonService„³ClearEnv´³orµµ±present´³dict·³clearEnv´³named³clearEnv´³atom³Boolean„„„„„µ±invalid´³dict·³clearEnv´³named³clearEnv³any„„„„µ±absent´³dict·„„„„„³EnvValue´³orµµ±set´³atom³String„„µ±remove´³lit€„„µ±invalid³any„„„³Protocol´³orµµ±none´³lit³none„„µ±binarySyndicate´³lit³application/syndicate„„µ± textSyndicate´³lit³text/syndicate„„„„³ +ProcessDir´³orµµ±present´³dict·³dir´³named³dir´³atom³String„„„„„µ±invalid´³dict·³dir´³named³dir³any„„„„µ±absent´³dict·„„„„„³ +ProcessEnv´³orµµ±present´³dict·³env´³named³env´³dictof´³refµ„³ EnvVariable„´³refµ„³EnvValue„„„„„„µ±invalid´³dict·³env´³named³env³any„„„„µ±absent´³dict·„„„„„³ CommandLine´³orµµ±shell´³atom³String„„µ±full´³refµ„³FullCommandLine„„„„³ EnvVariable´³orµµ±string´³atom³String„„µ±symbol´³atom³Symbol„„µ±invalid³any„„„³ FullProcess´³andµ´³dict·³argv´³named³argv´³refµ„³ CommandLine„„„„´³named³env´³refµ„³ +ProcessEnv„„´³named³dir´³refµ„³ +ProcessDir„„´³named³clearEnv´³refµ„³ClearEnv„„„„³ ReadyOnStart´³orµµ±present´³dict·³ readyOnStart´³named³ readyOnStart´³atom³Boolean„„„„„µ±invalid´³dict·³ readyOnStart´³named³ readyOnStart³any„„„„µ±absent´³dict·„„„„„³ RestartField´³orµµ±present´³dict·³restart´³named³restart´³refµ„³ RestartPolicy„„„„„µ±invalid´³dict·³restart´³named³restart³any„„„„µ±absent´³dict·„„„„„³ DaemonProcess´³rec´³lit³daemon„´³tupleµ´³named³id³any„´³named³config´³refµ„³DaemonProcessSpec„„„„„³ DaemonService´³rec´³lit³daemon„´³tupleµ´³named³id³any„„„„³ ProtocolField´³orµµ±present´³dict·³protocol´³named³protocol´³refµ„³Protocol„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³ RestartPolicy´³orµµ±always´³lit³always„„µ±onError´³lit³on-error„„µ±all´³lit³all„„„„³FullCommandLine´³ tuplePrefixµ´³named³program´³atom³String„„„´³named³args´³seqof´³atom³String„„„„³DaemonProcessSpec´³orµµ±simple´³refµ„³ CommandLine„„µ±oneShot´³rec´³lit³one-shot„´³tupleµ´³named³setup´³refµ„³ CommandLine„„„„„„µ±full´³refµ„³FullDaemonProcess„„„„³FullDaemonProcess´³andµ´³named³process´³refµ„³ FullProcess„„´³named³ readyOnStart´³refµ„³ ReadyOnStart„„´³named³restart´³refµ„³ RestartField„„´³named³protocol´³refµ„³ ProtocolField„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³internalServices„´³schema·³version‘³ definitions·³ ConfigEnv´³dictof´³atom³Symbol„³any„³ Milestone´³rec´³lit³ milestone„´³tupleµ´³named³name³any„„„„³ DebtReporter´³rec´³lit³ debt-reporter„´³tupleµ´³named³intervalSeconds´³atom³Double„„„„„³ ConfigWatcher´³rec´³lit³config-watcher„´³tupleµ´³named³path´³atom³String„„´³named³env´³refµ„³ ConfigEnv„„„„„³TcpRelayListener´³rec´³lit³relay-listener„´³tupleµ´³named³addr´³refµ³TransportAddress„³Tcp„„´³named³ +gatekeeper´³embedded´³refµ³ +gatekeeper„³Resolve„„„„„„³UnixRelayListener´³rec´³lit³relay-listener„´³tupleµ´³named³addr´³refµ³TransportAddress„³Unix„„´³named³ +gatekeeper´³embedded´³refµ³ +gatekeeper„³Resolve„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„ \ No newline at end of file diff --git a/packaging/packages/syndicate-server/protocols/schemas/externalServices.prs b/packaging/packages/syndicate-server/protocols/schemas/externalServices.prs new file mode 100644 index 0000000..ae67f76 --- /dev/null +++ b/packaging/packages/syndicate-server/protocols/schemas/externalServices.prs @@ -0,0 +1,52 @@ +version 1 . +embeddedType EntityRef.Cap . + +Service = DaemonService . + +DaemonService = . +DaemonProcess = . + +DaemonProcessSpec = @simple CommandLine / @oneShot / @full FullDaemonProcess . +FullDaemonProcess = @process FullProcess & @readyOnStart ReadyOnStart & @restart RestartField & @protocol ProtocolField . +ReadyOnStart = @present { readyOnStart: bool } / @invalid { readyOnStart: any } / @absent {} . +RestartField = @present { restart: RestartPolicy } / @invalid { restart: any } / @absent {} . +ProtocolField = @present { protocol: Protocol } / @invalid { protocol: any } / @absent {} . + +Process = @simple CommandLine / @full FullProcess . +FullProcess = + & { argv: CommandLine } + & @env ProcessEnv + & @dir ProcessDir + & @clearEnv ClearEnv +. +ProcessEnv = @present { env: { EnvVariable: EnvValue ...:... } } / @invalid { env: any } / @absent {} . +ProcessDir = @present { dir: string } / @invalid { dir: any } / @absent {} . +ClearEnv = @present { clearEnv: bool } / @invalid { clearEnv: any } / @absent {} . + +CommandLine = @shell string / @full FullCommandLine . +FullCommandLine = [@program string, @args string ...] . + +EnvVariable = @string string / @symbol symbol / @invalid any . +EnvValue = @set string / @remove #f / @invalid any . + +RestartPolicy = +/ ; Whether the process terminates normally or abnormally, restart it + ; without affecting any peer processes within the service. + =always +/ ; If the process terminates normally, leave everything alone; if it + ; terminates abnormally, restart it without affecting peers. + @onError =on-error +/ ; If the process terminates normally, leave everything alone; if it + ; terminates abnormally, restart the whole daemon (all processes + ; within the daemon). + =all +. + +Protocol = +/ ; stdin is /dev/null, output and error are logged + =none +/ ; stdin and stdout are *binary* Syndicate-protocol channels + @binarySyndicate =application/syndicate +/ ; stdin and stdout are *text* Syndicate-protocol channels + @textSyndicate =text/syndicate +. diff --git a/packaging/packages/syndicate-server/protocols/schemas/internalServices.prs b/packaging/packages/syndicate-server/protocols/schemas/internalServices.prs new file mode 100644 index 0000000..c24360f --- /dev/null +++ b/packaging/packages/syndicate-server/protocols/schemas/internalServices.prs @@ -0,0 +1,11 @@ +version 1 . +embeddedType EntityRef.Cap . + +DebtReporter = . + +TcpRelayListener = . +UnixRelayListener = . +ConfigWatcher = . +Milestone = . + +ConfigEnv = { symbol: any ...:... }. diff --git a/packaging/packages/syndicate-server/sync-binaries-debug.sh b/packaging/packages/syndicate-server/sync-binaries-debug.sh new file mode 100755 index 0000000..d4dd342 --- /dev/null +++ b/packaging/packages/syndicate-server/sync-binaries-debug.sh @@ -0,0 +1,15 @@ +#!/bin/sh +cd "$(dirname "$0")" + +set -e + +build() { + make -C ~/src/syndicate-rs $1-binary-debug 2>&1 | tee buildlog.$1 + cp -p ~/src/syndicate-rs/target/$1-*/debug/syndicate-server syndicate-server.$1 +} + +cp -r ~/src/syndicate-rs/syndicate-server/protocols . +build x86_64 & +#build armv7 & +#build aarch64 & +wait diff --git a/packaging/packages/syndicate-server/sync-binaries.sh b/packaging/packages/syndicate-server/sync-binaries.sh index 0fa69d2..0d7d710 100755 --- a/packaging/packages/syndicate-server/sync-binaries.sh +++ b/packaging/packages/syndicate-server/sync-binaries.sh @@ -8,6 +8,7 @@ build() { cp -p ~/src/syndicate-rs/target/$1-*/release/syndicate-server syndicate-server.$1 } +cp -r ~/src/syndicate-rs/syndicate-server/protocols . build x86_64 & build armv7 & build aarch64 & diff --git a/packaging/packages/synit-config/.gitignore b/packaging/packages/synit-config/.gitignore new file mode 100644 index 0000000..e9d0fcf --- /dev/null +++ b/packaging/packages/synit-config/.gitignore @@ -0,0 +1,2 @@ +protocols/ +__pycache__/ diff --git a/packaging/packages/synit-config/APKBUILD b/packaging/packages/synit-config/APKBUILD index 1c24bd9..410e09d 100644 --- a/packaging/packages/synit-config/APKBUILD +++ b/packaging/packages/synit-config/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Tony Garnock-Jones # Maintainer: Tony Garnock-Jones pkgname=synit-config -pkgver=0.0.2 -pkgrel=1 +pkgver=0.0.5 +pkgrel=0 pkgdesc="synit system layer configuration" url="https://synit.org/" arch="noarch" @@ -10,6 +10,11 @@ license="GPLv3" depends=" synit-pid1 syndicate-server + syndicate-schemas + preserves-schemas + py3-syndicate + + py3-pyroute2 eudev nftables @@ -37,6 +42,13 @@ build() { package() { mkdir -p "$pkgdir" rsync -a "$startdir/files/." "$pkgdir/." + + mkdir -p "$pkgdir/usr/share/synit/schemas" + rsync -a \ + "$startdir/protocols/schema-bundle.bin" \ + "$startdir/protocols/schemas" \ + "$pkgdir/usr/share/synit/schemas" + ln -sf /sbin/synit-init.sh "$pkgdir/sbin/init" mkdir -p "$pkgdir/var/lock/synit" } diff --git a/packaging/packages/synit-config/files/etc/syndicate/eudev.pr b/packaging/packages/synit-config/files/etc/syndicate/eudev.pr index b3b2e1b..ec1a156 100644 --- a/packaging/packages/synit-config/files/etc/syndicate/eudev.pr +++ b/packaging/packages/synit-config/files/etc/syndicate/eudev.pr @@ -2,7 +2,7 @@ complete>> > -> + > ready>> diff --git a/packaging/packages/synit-config/files/etc/syndicate/network.pr b/packaging/packages/synit-config/files/etc/syndicate/network.pr index 06d55c5..64b3f87 100644 --- a/packaging/packages/synit-config/files/etc/syndicate/network.pr +++ b/packaging/packages/synit-config/files/etc/syndicate/network.pr @@ -23,3 +23,7 @@ ? >> [ ["udhcpc" "-i" $ifname "-fR"]> ] + +;--------------------------------------------------------------------------- + +; TODO: put interface-monitor in here diff --git a/packaging/packages/synit-config/files/usr/lib/synit/interface-monitor b/packaging/packages/synit-config/files/usr/lib/synit/interface-monitor new file mode 100755 index 0000000..3cda2e7 --- /dev/null +++ b/packaging/packages/synit-config/files/usr/lib/synit/interface-monitor @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 +import sys +import os +sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'python')) +import synit.daemon.interface_monitor diff --git a/packaging/packages/synit-config/files/usr/lib/synit/python/synit/daemon/interface_monitor.py b/packaging/packages/synit-config/files/usr/lib/synit/python/synit/daemon/interface_monitor.py new file mode 100644 index 0000000..44da22f --- /dev/null +++ b/packaging/packages/synit-config/files/usr/lib/synit/python/synit/daemon/interface_monitor.py @@ -0,0 +1,159 @@ +import sys +from syndicate import relay, turn, Symbol, Record, Formatter +from syndicate.actor import find_loop +from syndicate.during import During +from socket import AF_INET, AF_INET6 +from dataclasses import dataclass +from typing import Optional +import logging +import preserves.schema +import threading + +import pyroute2 + +schemas = preserves.schema.load_schema_file('/home/tonyg/src/syndicate-system/protocols/schema-bundle.bin') +network = schemas.network + +class LenientFormatter(Formatter): + def cannot_format(self, v): + if v is None: + self.append(Record(Symbol('null'), [])) + else: + super().cannot_format(v) + +def lenient_stringify(v, indent=None): + e = LenientFormatter(indent=indent) + e.append(v) + return e.contents() + +@dataclass +class Link: + handle: Optional[int] + record: Optional[network.Interface] + def update(self, machine_ds, newRecord): + if self.record != newRecord: + self.handle = turn.replace(machine_ds, self.handle, newRecord) + self.record = newRecord + +def parse_route(linktable, m): + af_number = m['family'] + if af_number == AF_INET6: af = network.AddressFamily.ipv6() + elif af_number == AF_INET: af = network.AddressFamily.ipv4() + else: af = network.AddressFamily.other(af_number) + + dst = m.get_attr('RTA_DST') + if dst is None: + dst = network.RouteDestination.default() + else: + dst = network.RouteDestination.prefix(dst, m['dst_len']) + + priority = m.get_attr('RTA_PRIORITY', 0) + tos = m['tos'] + + link = linktable.get(m.get_attr('RTA_OIF'), None) + if link is None: + ifname = network.RouteInterface.none() + else: + ifname = network.RouteInterface.name(link.record.name) + + gw = m.get_attr('RTA_GATEWAY') + gw = network.Gateway.addr(gw) if gw is not None else network.Gateway.none() + + return network.Route(af, dst, priority, tos, ifname, gw) + +operational_state_map = { + 'UP': network.OperationalState.up(), + 'DORMANT': network.OperationalState.dormant(), + 'TESTING': network.OperationalState.testing(), + 'LOWERLAYERDOWN': network.OperationalState.lowerLayerDown(), + 'DOWN': network.OperationalState.down(), +} + +administrative_state_map = { + 'up': network.AdministrativeState.up(), + 'down': network.AdministrativeState.down(), +} + +def parse_interface(m): + return network.Interface(m.get_attr('IFLA_IFNAME'), + m['index'], + administrative_state_map.get(m['state'], + network.AdministrativeState.unknown()), + operational_state_map.get(m.get_attr('IFLA_OPERSTATE', 'UNKNOWN'), + network.OperationalState.unknown()), + (network.CarrierState.carrier() + if m.get_attr('IFLA_CARRIER', 0) else + network.CarrierState.noCarrier()), + m.get_attr('IFLA_ADDRESS', '')) + +def gather_events_from_socket(facet, callback, ip, loop): + facet.log.debug('Background netlink socket read thread started') + try: + while True: + facet.log.debug('waiting for event...') + events = ip.get() + facet.log.debug(f'... got {len(events)} events') + turn.external(facet, lambda: callback(events), loop=loop) + except Exception as e: + facet.log.debug(e) + finally: + facet.log.debug('Background netlink socket read thread terminated') + +@relay.service(name='interface_monitor', debug=False) +@During().add_handler +def main(args): + machine_ds = args[Symbol('machine')].embeddedValue + + ip = pyroute2.IPRoute() + ip.bind() + + @turn.on_stop_or_crash + def shutdown(): + ip.close() + + linktable = {} + routetable = {} + + def handle_events(events): + for m in events: + event_type = m['event'] + if event_type == 'RTM_NEWLINK': + i = parse_interface(m) + if (wireless_extension := m.get_attr('IFLA_WIRELESS', None)) is not None \ + and wireless_extension.get_attr('SIOCGIWSCAN', None) is not None: + turn.log.info(f'Interface {i.name} is performing a rescan') + else: + with open('/tmp/' + i.name + '.info', 'w') as f: + f.write(lenient_stringify(m, indent=4)) + if i.index not in linktable: + linktable[i.index] = Link(None, None) + linktable[i.index].update(machine_ds, i) + elif event_type == 'RTM_DELLINK': + i = parse_interface(m) + link = linktable.pop(i.index, None) + if link is not None: + link.update(machine_ds, None) + elif event_type == 'RTM_NEWROUTE': + if m.get_attr('RTA_TABLE') == 254: # RT_TABLE_MAIN + r = parse_route(linktable, m) + if r not in routetable: + routetable[r] = turn.publish(machine_ds, r) + elif event_type == 'RTM_DELROUTE': + if m.get_attr('RTA_TABLE') == 254: # RT_TABLE_MAIN + r = parse_route(linktable, m) + turn.retract(routetable.pop(r, None)) + elif event_type in ['RTM_NEWNEIGH', 'RTM_DELNEIGH', + 'RTM_NEWADDR', 'RTM_DELADDR']: + # Ignored + pass + else: + turn.log.info(f'Unhandled netlink event: {lenient_stringify(m)}') + + handle_events(ip.get_links()) + handle_events(ip.get_routes()) + + facet = turn.active_facet() + loop = find_loop() + threading.Thread( + name='background-netlink-socket-read-thread', + target=lambda: gather_events_from_socket(facet, handle_events, ip, loop)).start() diff --git a/packaging/packages/synit-pid1/APKBUILD b/packaging/packages/synit-pid1/APKBUILD index b22091f..7bec74f 100644 --- a/packaging/packages/synit-pid1/APKBUILD +++ b/packaging/packages/synit-pid1/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Tony Garnock-Jones pkgname=synit-pid1 pkgver=0.0.1 -pkgrel=3 +pkgrel=4 pkgdesc="synit pid 1 program" url="https://synit.org/" arch="all" @@ -27,7 +27,7 @@ package() { } sha512sums=" -e4aa3c352701f56cf0d877a565106f62fff555b529b7b6bf439a9d6b6b7e153b5a4f7749b27cc8278d78e48efa9373d4c71a22a95e26a1d59e8e4da9789f3b6d synit-pid1.aarch64 -f286e403b944a2364d4ed74dd2c02e2a26de2c68908969600c353f03b523faf7daa11ea5f482fa32d83a112487a4af383e10235c1acdc0e332bf1176a1113f4b synit-pid1.armv7 -791b9b65e72ff863308748d26bb77492b129769c611b1b70975ff67a7f24c5eda34b432ff34c4b576f7e26f51a6ce305f2bc20689eba1334f08499ba8fb28185 synit-pid1.x86_64 +0877d5b04e6b7621c86caa1ba583643a7f9b16a769f51fed8dfbb2e54b972e60b7593b7808b5e9612f2364b46a535e16e8698fe263ddff20212a1dbc47732b52 synit-pid1.aarch64 +adf55af01f2fef6006f9c3cfc3516fe2ef143d82d4781e5c77a25ef4f990755790680934ccab0397b142f430fcf453991d0a678bd28d12e33824ed4fe4180d3a synit-pid1.armv7 +326050787363663b44d1d64424a139aed8a887f133bdae64a1710ad22523a700afba1b594d6580ceaf3127f419188bd026b2fa962132e53923113eccb199f191 synit-pid1.x86_64 " diff --git a/protocols/schema-bundle.bin b/protocols/schema-bundle.bin index adb40f3..33e029a 100644 --- a/protocols/schema-bundle.bin +++ b/protocols/schema-bundle.bin @@ -3,7 +3,8 @@ WidgetType horizontal´³refµ„³Sizing„„´³named³vertical´³refµ„³Sizing„„„„„³SortKey´³orµµ±double´³atom³Double„„µ±string´³atom³String„„„„³LeafType´³orµµ±blank´³lit³blank„„µ±text´³lit³text„„µ±slider´³lit³slider„„µ±image´³lit³image„„µ±icon´³lit³icon„„„„³NodeType´³orµµ±column´³lit³column„„µ±row´³lit³row„„„„³WidgetId³any³ Attribute´³rec´³lit³ attribute„´³tupleµ´³named³id´³refµ„³WidgetId„„´³named³key´³atom³Symbol„„´³named³value³any„„„„³ WidgetType´³orµµ±NodeType´³refµ„³NodeType„„µ±LeafType´³refµ„³LeafType„„„„³ WindowTitle´³rec´³lit³ window-title„´³tupleµ´³named³title´³atom³String„„„„„³WidgetInstance´³rec´³lit³widget-instance„´³tupleµ´³named³id´³refµ„³WidgetId„„´³named³instance´³embedded³any„„„„„³WindowCloseable´³rec´³lit³window-closeable„´³tupleµ„„„„³ embeddedType€„„µ³mime„´³schema·³version‘³ definitions·³Value´³rec´³lit³mime„´³tupleµ´³named³type´³atom³Symbol„„´³named³data´³atom³ ByteString„„„„„„³ embeddedType€„„µ³time„´³schema·³version‘³ definitions·³Stamp´³rec´³lit³rfc3339„´³tupleµ´³named³value´³atom³String„„„„„„³ embeddedType€„„µ³audio„´³schema·³version‘³ definitions·³Sink´³orµµ±speaker´³lit³speaker„„µ±headset´³lit³headset„„µ±earpiece´³lit³earpiece„„„„³Source´³orµµ± speakerphone´³lit³ speakerphone„„µ±headset´³lit³headset„„µ±handset´³lit³handset„„„„³ SinkMapping´³rec´³lit³alsa-sink-mapping„´³tupleµ´³named³abstract´³refµ„³Sink„„´³named³concrete´³atom³String„„„„„³HeadsetSpeakerPresent´³rec´³lit³headset-speaker-present„´³tupleµ„„„³HeadsetMicrophonePresent´³rec´³lit³headset-microphone-present„´³tupleµ„„„„³ embeddedType€„„µ³hayes„´³schema·³version‘³ definitions·³Result´³rec´³lit³result„´³tupleµ´³named³text´³atom³String„„´³named³tag´³refµ„³ MaybeString„„´³named³fields´³refµ„³ MaybeStrings„„„„„³ MaybeString´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³ MaybeStrings´³orµµ±present´³seqof´³atom³String„„„µ±absent´³lit€„„„„³ ModemPresent´³rec´³lit³modem„´³tupleµ´³lit³hayes„´³named³ -devicePath´³atom³String„„´³named³ dataspace´³embedded´³refµ„³InternalProtocol„„„„„„³ CommandResult´³rec´³lit³command-result„´³tupleµ´³named³ commandText´³atom³String„„´³named³results´³seqof´³refµ„³Result„„„´³named³ finalResult´³atom³String„„„„„³ExecuteCommand´³rec´³lit³execute-command„´³tupleµ´³named³ commandText´³atom³String„„´³named³replyTo´³refµ„³CommandContinuation„„„„„³InternalProtocol³any³CommandContinuation´³orµµ± replyWanted´³embedded´³refµ„³ CommandResult„„„µ± fireAndForget´³lit€„„„„³UnsolicitedResultCode´³rec´³lit³ unsolicited„´³tupleµ´³named³result´³refµ„³Result„„„„„„³ embeddedType€„„µ³ telephony„´³schema·³version‘³ definitions·³CallId´³atom³ SignedInteger„³Address´³rec´³lit³address„´³tupleµ´³named³ +devicePath´³atom³String„„´³named³ dataspace´³embedded´³refµ„³InternalProtocol„„„„„„³ CommandResult´³rec´³lit³command-result„´³tupleµ´³named³ commandText´³atom³String„„´³named³results´³seqof´³refµ„³Result„„„´³named³ finalResult´³atom³String„„„„„³ExecuteCommand´³rec´³lit³execute-command„´³tupleµ´³named³ commandText´³atom³String„„´³named³replyTo´³refµ„³CommandContinuation„„„„„³InternalProtocol³any³CommandContinuation´³orµµ± replyWanted´³embedded´³refµ„³ CommandResult„„„µ± fireAndForget´³lit€„„„„³UnsolicitedResultCode´³rec´³lit³ unsolicited„´³tupleµ´³named³result´³refµ„³Result„„„„„„³ embeddedType€„„µ³network„´³schema·³version‘³ definitions·³Route´³rec´³lit³route„´³tupleµ´³named³ addressFamily´³refµ„³ AddressFamily„„´³named³ destination´³refµ„³RouteDestination„„´³named³priority´³atom³ SignedInteger„„´³named³ typeOfService´³atom³ SignedInteger„„´³named³ interfaceName´³refµ„³RouteInterface„„´³named³gateway´³refµ„³Gateway„„„„„³Gateway´³orµµ±addr´³atom³String„„µ±none´³lit€„„„„³ Interface´³rec´³lit³ interface„´³tupleµ´³named³name´³atom³String„„´³named³index´³atom³ SignedInteger„„´³named³administrativeState´³refµ„³AdministrativeState„„´³named³operationalState´³refµ„³OperationalState„„´³named³carrier´³refµ„³ CarrierState„„´³named³linkAddr´³atom³String„„„„„³ CarrierState´³orµµ± noCarrier´³lit³ +no-carrier„„µ±carrier´³lit³carrier„„„„³ AddressFamily´³orµµ±ipv4´³lit³ipv4„„µ±ipv6´³lit³ipv6„„µ±other´³atom³ SignedInteger„„„„³RouteInterface´³orµµ±name´³atom³String„„µ±none´³lit€„„„„³OperationalState´³orµµ±unknown´³lit³unknown„„µ±down´³lit³down„„µ±lowerLayerDown´³lit³lower-layer-down„„µ±testing´³lit³testing„„µ±dormant´³lit³dormant„„µ±up´³lit³up„„„„³RouteDestination´³orµµ±default´³lit³default„„µ±prefix´³rec´³lit³prefix„´³tupleµ´³named³net´³atom³String„„´³named³bits´³atom³ SignedInteger„„„„„„„„³AdministrativeState´³orµµ±unknown´³lit³unknown„„µ±down´³lit³down„„µ±up´³lit³up„„„„„³ embeddedType€„„µ³ telephony„´³schema·³version‘³ definitions·³CallId´³atom³ SignedInteger„³Address´³rec´³lit³address„´³tupleµ´³named³ numberType´³refµ„³ NumberType„„´³named³number´³atom³String„„„„„³CallType´³orµµ±voice´³lit³voice„„µ±data´³lit³data„„µ±fax´³lit³fax„„„„³ CallState´³orµµ±hold´³lit³hold„„µ±original´³lit³original„„µ±connect´³lit³connect„„µ±incoming´³lit³incoming„„µ±waiting´³lit³waiting„„µ±end´³lit³end„„µ±alerting´³lit³alerting„„„„³ PlaceCall´³rec´³lit³ place-call„´³tupleµ´³named³ diff --git a/protocols/schemas/network.prs b/protocols/schemas/network.prs new file mode 100644 index 0000000..783d776 --- /dev/null +++ b/protocols/schemas/network.prs @@ -0,0 +1,58 @@ +version 1 . + +Interface = . + +AdministrativeState = +/ =unknown +/ =down +/ =up +. + +OperationalState = +/ =unknown +/ =down +/ @lowerLayerDown =lower-layer-down +/ =testing +/ =dormant +/ =up +. + +CarrierState = +/ @noCarrier =no-carrier +/ =carrier +. + +Route = . + +AddressFamily = +/ =ipv4 +/ =ipv6 +/ @other int +. + +RouteDestination = +/ =default +/ @prefix +. + +RouteInterface = +/ @name string +/ @none #f +. + +Gateway = +/ @addr string +/ @none #f +. diff --git a/run-scratch-system.sh b/run-scratch-system.sh index 8398679..5cc2226 100755 --- a/run-scratch-system.sh +++ b/run-scratch-system.sh @@ -29,6 +29,13 @@ then qemu-img create -f qcow2 -F qcow2 -b ${BASEIMG} ${TMPIMG} fi +if [ -z "${DISPLAY:-}" ] +then + displayopts="-display none" +else + displayopts="-display gtk" +fi + qemu-system-x86_64 \ -nodefaults \ -kernel ${ROOTDIR}/boot/vmlinuz-lts \ @@ -44,4 +51,4 @@ qemu-system-x86_64 \ -vga virtio \ -enable-kvm \ -cpu host \ - -display gtk + ${displayopts} diff --git a/squeak.pr b/squeak.pr new file mode 100644 index 0000000..199aaa4 --- /dev/null +++ b/squeak.pr @@ -0,0 +1,17 @@ +> + ready>> + complete>> + + /sys/class/graphics/fb0/state">> + + + +? ?cap> [ + $cap { + config: $config + } +] diff --git a/transmogrify.sh b/transmogrify.sh new file mode 100755 index 0000000..4afee5f --- /dev/null +++ b/transmogrify.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +# Transmogrifies a running, plain PostmarketOS system into a Synit system + +set -eu + +SUDOPASS=${SUDOPASS:-user} + +if [ $(id -u) -ne 0 ] +then + echo ${SUDOPASS} | sudo -S "$0" "$@" + exit $? +fi +echo + +cp synit-apk-key.pub /etc/apk/keys/. +. /etc/deviceinfo +ls packages/$deviceinfo_arch/ + +sudo apk add -X `pwd`/packages \ + preserves-tools \ + squeak-cog-vm \ + syndicate-sh \ + synit-config + +rm -f /etc/syndicate/squeak.pr +cp -p `pwd`/squeak.pr /etc/syndicate/squeak.pr diff --git a/upload-bundle.sh b/upload-bundle.sh new file mode 100755 index 0000000..1207f9e --- /dev/null +++ b/upload-bundle.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# Upload packages and scripts for converting a plain PostmarketOS system into a Synit system + +set -eu + +HOST=${1:-pm-qemu} +SUDOPASS=${SUDOPASS:-user} + +ssh ${HOST} "echo ${SUDOPASS} | sudo -S apk add rsync" +rsync -avu --delete \ + transmogrify.sh \ + squeak.pr \ + packaging/synit-apk-key.pub \ + packaging/target/packages \ + ../squeak-phone/images/current/squeak.changes \ + ../squeak-phone/images/current/squeak.image \ + ../squeak-phone/sounds \ + ${HOST}:.