diff --git a/bundles/navidrome/metadata.py b/bundles/navidrome/metadata.py index d054a67..c7a2aa4 100644 --- a/bundles/navidrome/metadata.py +++ b/bundles/navidrome/metadata.py @@ -31,6 +31,17 @@ defaults = { }, } +if node.has_bundle('snapserver'): + defaults['navidrome']['config']['Jukebox'] = { + 'Enabled': True, + } + defaults['navidrome']['config']['MPVCmdTemplate'] = 'mpv --no-audio-display --pause %f --input-ipc-server=%s --audio-channels=stereo --audio-samplerate=48000 --audio-format=s16 --ao=pcm --ao-pcm-file=/tmp/snapserver_navidrome_fifo' + defaults['snapserver'] = { + 'sources': { + 'pipe:///tmp/snapserver_navidrome_fifo?name=Navidrome', + }, + } + @metadata_reactor.provides( 'zfs/datasets', diff --git a/bundles/snapserver/files/snapserver.conf b/bundles/snapserver/files/snapserver.conf new file mode 100644 index 0000000..46e9aa4 --- /dev/null +++ b/bundles/snapserver/files/snapserver.conf @@ -0,0 +1,24 @@ +[server] +threads = -1 + +[stream] +bind_to_address = 0.0.0.0 +port = 1704 + +% for source in sorted(node.metadata.get('snapserver/sources')): +source = ${source} +% endfor + +[streaming_client] +initial_volume = 100 + +[http] +enabled = true +port = 1780 +hostname = ${node.metadata.get('snapserver/domain')} +doc_root = /usr/share/snapweb/ + +[tcp] +enabled = true +bind_to_address = 0.0.0.0 +port = 1705 diff --git a/bundles/snapserver/items.py b/bundles/snapserver/items.py new file mode 100644 index 0000000..81aeda7 --- /dev/null +++ b/bundles/snapserver/items.py @@ -0,0 +1,13 @@ +files['/etc/snapserver.conf'] = { + 'content_type': 'mako', + 'triggers': { + 'svc_systemd:snapserver:restart', + }, +} + +svc_systemd['snapserver'] = { + 'needs': { + 'file:/etc/snapserver.conf', + 'pkg_apt:snapserver', + }, +} diff --git a/bundles/snapserver/metadata.py b/bundles/snapserver/metadata.py new file mode 100644 index 0000000..90a114c --- /dev/null +++ b/bundles/snapserver/metadata.py @@ -0,0 +1,58 @@ +from bundlewrap.metadata import atomic + +defaults = { + 'apt': { + 'packages': { + 'snapserver': {}, + }, + }, + 'snapserver': { + 'sources': set(), + }, + 'sysctl': { + 'options': { + 'fs.protected_fifos': '0', + }, + }, +} + + +@metadata_reactor.provides( + 'nginx/vhosts/snapserver', +) +def nginx(metadata): + if not node.has_bundle('nginx'): + raise DoNotRunAgain + + return { + 'nginx': { + 'vhosts': { + 'snapserver': { + 'domain': metadata.get('snapserver/domain'), + 'locations': { + '/': { + 'target': f'http://127.0.0.1:1780', + 'websockets': True, + }, + }, + 'website_check_path': '/', + 'website_check_string': 'Snapweb', + }, + }, + }, + } + + +@metadata_reactor.provides( + 'firewall/port_rules', + 'firewall/port_rules', +) +def firewall(metadata): + return { + 'firewall': { + 'port_rules': { + '1704/tcp': atomic(metadata.get('snapserver/restrict-to', set())), + '1705/tcp': atomic(metadata.get('snapserver/restrict-to', set())), + }, + }, + }