Replies: 12 comments 15 replies
|
First part with the manifest done. Version diff with odio.love/manifest.json reports available upgrades. 2 options regarding packages upgrade, because of pi_imager, and minimal system tweaks in ansible, either make sure odio user is in cloud init passwordless sudoers, and manage package upgrades in the upgrade process, or let users do the apt part by themselves. that'd need a lot work of compatiblity config, not sure i wanna get into that. but are users ok with letting me with an automatic sudo user when the claim is rootless ? feedback appreciated. |
A long time without a proper upgrade: Playbook completed in 119m 54sbobby@bobby-desktop:~/DEV/odio-pwa ssh pi Linux raspodio 6.12.75+rpt-rpi-v6 #1 Raspbian 1:6.12.75-1+rpt1 (2026-03-11) armv6lThe programs included with the Debian GNU/Linux system are free software; Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/2026.4.1rc1/odio-2026.4.1rc1.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************************************************* TASK [common : Check odio gpg file] ******************************************************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************************************************** TASK [branding : Install odio-check-upgrade script] **************************************************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************************************************** TASK [branding : Deploy odio-check-upgrade systemd units] ********************************************************************************************************************************************************** TASK [branding : Enable odio-check-upgrade timer] ****************************************************************************************************************************************************************** TASK [branding : Enable user service - live] *********************************************************************************************************************************************************************** TASK [branding : Enable user service - image build] **************************************************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************************************************** TASK [mpd : Remove mpdris2 distro package if present] ************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 dependencies] ************************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 download directory] ********************************************************************************************************************************************************************* TASK [mpd : Download mpDris2 fork release] ************************************************************************************************************************************************************************* TASK [mpd : Install mpDris2 binary] ******************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 systemd user service] ****************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 D-Bus service] ************************************************************************************************************************************************************************* TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install pip] ************************************************************************************************************************************************************************************** TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************************************************** RUNNING HANDLER [pulseaudio : Restart pulseaudio] ****************************************************************************************************************************************************************** RUNNING HANDLER [bluetooth : Restart bluetooth] ******************************************************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mpd] ******************************************************************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mpDris2] **************************************************************************************************************************************************************************** RUNNING HANDLER [shairport_sync : Reload dbus] ********************************************************************************************************************************************************************* RUNNING HANDLER [shairport_sync : Restart shairport-sync] ********************************************************************************************************************************************************** RUNNING HANDLER [odio_api : Restart odio-api] ********************************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Write installation state] ************************************************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************************************************** TASK [Ensure ~/.cache/odio exists] ********************************************************************************************************************************************************************************* TASK [Write ~/.cache/odio/state.json] ****************************************************************************************************************************************************************************** TASK [Display installation summary] ******************************************************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************************************************* Playbook completed in 119m 54s ═══════════════════════════════════════════════════════════ Cleaning up... Had to reboot to finish properly... Upgrade CI and process is my next priority |
I have to leave and my update isn't finished so i can't poweroff my computer...odio@raspodio:~ $ systemctl --user status pulse-tcp.service ● pulse-tcp.service - PulseAudio TCP and Zeroconf modules Loaded: loaded (/usr/lib/systemd/user/pulse-tcp.service; enabled; preset: enabled) Active: active (exited) since Sat 2026-04-18 18:26:31 CEST; 52s ago Invocation: 14cdd0d288484d21947293405589a0b4 Process: 652 ExecStart=/usr/local/bin/pulse-tcp.sh start (code=exited, status=0/SUCCESS) Main PID: 652 (code=exited, status=0/SUCCESS) CPU: 854msApr 18 18:26:26 raspodio systemd[591]: Starting pulse-tcp.service - PulseAudio TCP and Zeroconf modules... Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ^C^C^C Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/pr-45/odio-dev.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************************************************* TASK [common : Check odio gpg file] ******************************************************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************************************************** TASK [branding : Install odio-check-upgrade script] **************************************************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************************************************** TASK [branding : Deploy odio-check-upgrade systemd units] ********************************************************************************************************************************************************** TASK [branding : Enable odio-check-upgrade timer] ****************************************************************************************************************************************************************** TASK [branding : Enable user service - live] *********************************************************************************************************************************************************************** TASK [branding : Enable user service - image build] **************************************************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************************************************** TASK [mpd : Remove mpdris2 distro package if present] ************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 dependencies] ************************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 download directory] ********************************************************************************************************************************************************************* TASK [mpd : Download mpDris2 fork release] ************************************************************************************************************************************************************************* TASK [mpd : Install mpDris2 binary] ******************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 systemd user service] ****************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 D-Bus service] ************************************************************************************************************************************************************************* TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Create MPD config directory] ***************************************************************************************************************************************************************************
I'll do that remotely Another use case I had predicted 🤓 Damn I love this soft |
|
Well I'm really happy to test this much, really interesting for good iterations to prepare a clean slate for the upgrade process, and UX. Many updates, much timebobby@bobby-desktop:~/DEV/odio-docs ssh odio@192.168.1.76 The authenticity of host '192.168.1.76 (192.168.1.76)' can't be established. ED25519 key fingerprint is SHA256:Uj+NvHA8uL7UlELTkDY75B0xzH2+1ascDX3AzWzb+1o. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.76' (ED25519) to the list of known hosts. .----------------. .----------------. .----------------. | .--------------. | | .--------------. | | .--------------. | | | ____ | | | | | | | | ____ | | | | .' `. | | | | ___ | | | | .' `. | | | | / .--. \ | | | | _| (_) | | | | / .--. \ | | | | | | | | | | | | / _` | | | | | | | | | | | | | | \ `--' / | | | | | (_| | | | | | | \ `--' / | | | | `.____.' | | | | \__,_|_| | | | | `.____.' | | | '--------------' | | '--------------' | | '--------------' | '----------------' '----------------' '----------------' Linux raspodio3bwifi 6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64 odio vdev-8e978895odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the ⬆ Update available: dev-8e978895 → 2026.4.1rc1 odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/pr-45/odio-dev.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************************************************* TASK [common : Check odio gpg file] ******************************************************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************************************************** TASK [branding : Install odio-check-upgrade script] **************************************************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************************************************** TASK [branding : Deploy odio-check-upgrade systemd units] ********************************************************************************************************************************************************** TASK [branding : Enable odio-check-upgrade timer] ****************************************************************************************************************************************************************** TASK [branding : Enable user service - live] *********************************************************************************************************************************************************************** TASK [branding : Enable user service - image build] **************************************************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************************************************** TASK [mpd : Remove mpdris2 distro package if present] ************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 dependencies] ************************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 download directory] ********************************************************************************************************************************************************************* TASK [mpd : Download mpDris2 fork release] ************************************************************************************************************************************************************************* TASK [mpd : Install mpDris2 binary] ******************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 systemd user service] ****************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 D-Bus service] ************************************************************************************************************************************************************************* TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-qobuz] *************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz user] ***************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz password] ************************************************************************************************************************************************************************* TASK [upmpdcli : Configure Qobuz title] **************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz quality] ************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-tidal] *************************************************************************************************************************************************************************** TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install pip] ************************************************************************************************************************************************************************************** TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mpDris2] **************************************************************************************************************************************************************************** RUNNING HANDLER [upmpdcli : Restart upmpdcli] ********************************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Write installation state] ************************************************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************************************************** TASK [Ensure ~/.cache/odio exists] ********************************************************************************************************************************************************************************* TASK [Write ~/.cache/odio/state.json] ****************************************************************************************************************************************************************************** TASK [Display installation summary] ******************************************************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************************************************* Playbook completed in 9m 26s ═══════════════════════════════════════════════════════════ Cleaning up... ⬆ Update available: dev-8e978895 → 2026.4.1rc1 odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/pr-45/odio-dev.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************************************************* TASK [common : Check odio gpg file] ******************************************************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************************************************** TASK [branding : Install odio-check-upgrade script] **************************************************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************************************************** TASK [branding : Deploy odio-check-upgrade systemd units] ********************************************************************************************************************************************************** TASK [branding : Enable odio-check-upgrade timer] ****************************************************************************************************************************************************************** TASK [branding : Enable user service - live] *********************************************************************************************************************************************************************** TASK [branding : Enable user service - image build] **************************************************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************************************************** TASK [mpd : Remove mpdris2 distro package if present] ************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 dependencies] ************************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 download directory] ********************************************************************************************************************************************************************* TASK [mpd : Download mpDris2 fork release] ************************************************************************************************************************************************************************* TASK [mpd : Install mpDris2 binary] ******************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 systemd user service] ****************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 D-Bus service] ************************************************************************************************************************************************************************* TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-qobuz] *************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz user] ***************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz password] ************************************************************************************************************************************************************************* TASK [upmpdcli : Configure Qobuz title] **************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz quality] ************************************************************************************************************************************************************************** TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-tidal] *************************************************************************************************************************************************************************** TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install pip] ************************************************************************************************************************************************************************************** TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Write installation state] ************************************************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************************************************** TASK [Ensure ~/.cache/odio exists] ********************************************************************************************************************************************************************************* TASK [Write ~/.cache/odio/state.json] ****************************************************************************************************************************************************************************** TASK [Refresh ~/.cache/odio/upgrades.json] ************************************************************************************************************************************************************************* TASK [Display installation summary] ******************************************************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************************************************* Playbook completed in 9m 8s ═══════════════════════════════════════════════════════════ Cleaning up... odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the |
Now we talking. 25min less cause Pi B+ was not busy playing music during upgrade.Linux raspodio 6.12.75+rpt-rpi-v6 #1 Raspbian 1:6.12.75-1+rpt1 (2026-03-11) armv6l odio vdev-8e978895⬆ Update available: dev-8e978895 → 2026.4.1rc2 odio - Raspbian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the Configuration Target user [odio]: Install PulseAudio? [Y/n]: y Streaming services (upmpdcli) — leave blank to skip Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Fetching latest release info... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************************************************* TASK [common : Check odio gpg file] ******************************************************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************************************************** TASK [branding : Install odio-check-upgrade script] **************************************************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************************************************** TASK [branding : Deploy odio-check-upgrade systemd units] ********************************************************************************************************************************************************** TASK [branding : Enable odio-check-upgrade timer] ****************************************************************************************************************************************************************** TASK [branding : Enable user service - live] *********************************************************************************************************************************************************************** TASK [branding : Enable user service - image build] **************************************************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************************************************** TASK [mpd : Remove mpdris2 distro package if present] ************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 dependencies] ************************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 download directory] ********************************************************************************************************************************************************************* TASK [mpd : Download mpDris2 fork release] ************************************************************************************************************************************************************************* TASK [mpd : Install mpDris2 binary] ******************************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 systemd user service] ****************************************************************************************************************************************************************** TASK [mpd : Install mpDris2 D-Bus service] ************************************************************************************************************************************************************************* TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-tidal] *************************************************************************************************************************************************************************** TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************************************************ TASK [upmpdcli : Install pip] ************************************************************************************************************************************************************************************** TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************************************************* TASK [Write installation state] ************************************************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************************************************** TASK [Ensure ~/.cache/odio exists] ********************************************************************************************************************************************************************************* TASK [Write ~/.cache/odio/state.json] ****************************************************************************************************************************************************************************** TASK [Refresh ~/.cache/odio/upgrades.json] ************************************************************************************************************************************************************************* TASK [Display installation summary] ******************************************************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************************************************* Playbook completed in 95m 8s ═══════════════════════════════════════════════════════════ Cleaning up... |
|
PR Implementation of the upgrade system from this RFC, plus a few design shifts learned along the way. State file (
CI
Tests
Adjacent changes bundled in
|
|
installer will ship everything by default, always [Y/n] ease future upgrades, and a good way to make odio-upgrade set N for non-updated role need a go-odio-api config change, either soft and ansible wise, or just ansible, but soft with include config makes more sense. stil unclear so probably in the release after mympd which is a test version for the basic upgrade system |
odio v2026.4.1rc2 -> pre-odio v2026.4.2b2bobby@bobby-desktop:~ ssh odio@192.168.1.76 The authenticity of host '192.168.1.76 (192.168.1.76)' can't be established. ED25519 key fingerprint is SHA256:FIwsYt+M2inHbuaMMFr/4bSFo/dBiysPX32Tp+tmTCM. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.76' (ED25519) to the list of known hosts. .----------------. .----------------. .----------------. | .--------------. | | .--------------. | | .--------------. | | | ____ | | | | | | | | ____ | | | | .' `. | | | | ___ | | | | .' `. | | | | / .--. \ | | | | _| (_) | | | | / .--. \ | | | | | | | | | | | | / _` | | | | | | | | | | | | | | \ `--' / | | | | | (_| | | | | | | \ `--' / | | | | `.____.' | | | | \__,_|_| | | | | `.____.' | | | '--------------' | | '--------------' | | '--------------' | '----------------' '----------------' '----------------' Linux raspodio3bwifi 6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64 odio v2026.4.1rc2odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/pr-52/odio-dev.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************** TASK [common : Check odio gpg file] ******************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************* TASK [common : Update apt cache] *********************************************************************************************************************************************** TASK [common : Install acl (needed by become_user)] **************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************** TASK [upgrade : Remove legacy per-user upgrade scripts] ************************************************************************************************************************ TASK [upgrade : Remove legacy per-user upgrade unit files] ********************************************************************************************************************* TASK [upgrade : Install odio-check-upgrade script] ***************************************************************************************************************************** TASK [upgrade : Install odio-upgrade script] *********************************************************************************************************************************** TASK [upgrade : Deploy odio-upgrade systemd user units (system-wide)] ********************************************************************************************************** TASK [upgrade : Enable odio-check-upgrade timer] ******************************************************************************************************************************* TASK [upgrade : Enable user service - live] ************************************************************************************************************************************ TASK [upgrade : Enable user service - image build] ***************************************************************************************************************************** TASK [upgrade : Install unattended-upgrades (image mode)] ********************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 binary from /usr/local/bin] ****************************************************************************************************************** TASK [mpd : Install mpdris2] *************************************************************************************************************************************************** TASK [mpd : Upgrade mpdris2] *************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd : Install myMPD web UI] ********************************************************************************************************************************************** TASK [mpd : Install mympd] ***************************************************************************************************************************************************** TASK [mpd : Upgrade mympd] ***************************************************************************************************************************************************** TASK [mpd : Create mympd config directory] ************************************************************************************************************************************* TASK [mpd : Deploy odio custom_css] ******************************************************************************************************************************************** TASK [mpd : Disable mympd ssl] ************************************************************************************************************************************************* TASK [mpd : Create mympd state directory] ************************************************************************************************************************************** TASK [mpd : Configure mympd MPD host (user socket)] **************************************************************************************************************************** TASK [mpd : Configure mympd MPD port (0 = socket)] ***************************************************************************************************************************** TASK [mpd : Enable user mympd service] ***************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************* TASK [mpd_discplayer : Upgrade mpd-discplayer] ********************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************** TASK [upmpdcli : Install pip] ************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-qobuz] *************************************************************************************************************************************** TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************ TASK [upmpdcli : Install tidalapi python package] ****************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli-tidal] *************************************************************************************************************************************** TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************ TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************* TASK [spotifyd : Upgrade spotifyd] ********************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************** TASK [odio_api : Upgrade go-odio-api] ****************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************** RUNNING HANDLER [pulseaudio : Restart pulse-tcp] ******************************************************************************************************************************* RUNNING HANDLER [mpd : Restart mpDris2] **************************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mympd] ****************************************************************************************************************************************** RUNNING HANDLER [odio_api : Restart odio-api] ********************************************************************************************************************************** TASK [Write installation state] ************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************** TASK [Build list of excluded roles] ******************************************************************************************************************************************** TASK [Build list of enabled features] ****************************************************************************************************************************************** TASK [Build list of excluded features] ***************************************************************************************************************************************** TASK [Ensure /var/cache/odio exists] ******************************************************************************************************************************************* TASK [Read existing state.json (system path)] ********************************************************************************************************************************** TASK [Read existing state.json (legacy per-user path)] ************************************************************************************************************************* TASK [Parse existing state] **************************************************************************************************************************************************** TASK [Seed prior release history] ********************************************************************************************************************************************** TASK [Append current version to release history (dedup consecutive)] *********************************************************************************************************** TASK [Assemble state.json payload] ********************************************************************************************************************************************* TASK [Write /var/cache/odio/state.json] **************************************************************************************************************************************** TASK [Refresh /var/cache/odio/upgrades.json] *********************************************************************************************************************************** TASK [Restart odio-api] ******************************************************************************************************************************************************** TASK [Restart odio-api to pick up freshly-restarted dependencies] ************************************************************************************************************** TASK [Verify services are running] ********************************************************************************************************************************************* TASK [Skip service health-check in image-build mode] *************************************************************************************************************************** TASK [Detect container environment (relax system-service checks)] ************************************************************************************************************** TASK [Compute expected system services] **************************************************************************************************************************************** TASK [Compute expected user services] ****************************************************************************************************************************************** TASK [Verify system services are active] *************************************************************************************************************************************** TASK [Verify system services are enabled (container fallback)] ***************************************************************************************************************** TASK [Verify user services are active] ***************************************************************************************************************************************** TASK [Health-check summary] **************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************* TASK [Display installation summary] ******************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************* Playbook completed in 11m 59s ═══════════════════════════════════════════════════════════ Cleaning up... Details |
odio v2026.4.2b1 -> pre-odio v2026.4.2b2bobby@bobby-desktop:~ ssh odio@192.168.1.76 odio - Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the Running pre-flight checks... ✓ python3-jinja2 and python3-cryptography available Downloading https://github.com/b0bbywan/odios/releases/download/pr-52/odio-dev.tar.gz... Running Ansible playbook... PLAY [Odio Streamer Installation] ********************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************* TASK [Ensure install_mode is valid] ******************************************************************************************************************************************** TASK [Ensure target user is not root] ****************************************************************************************************************************************** TASK [Ensure dbus running] ***************************************************************************************************************************************************** TASK [Set hostname] ************************************************************************************************************************************************************ TASK [Set hostname - live] ***************************************************************************************************************************************************** TASK [Set hostname - image build (/etc/hostname)] ****************************************************************************************************************************** TASK [Set hostname - image build (/etc/hosts)] ********************************************************************************************************************************* TASK [Create target user] ****************************************************************************************************************************************************** TASK [Create ansible remote_tmp directory] ************************************************************************************************************************************* TASK [Get target user UID] ***************************************************************************************************************************************************** TASK [Detect variables] ******************************************************************************************************************************************************** TASK [common : Check odio gpg file] ******************************************************************************************************************************************** TASK [common : Add apt.odio.love gpg key] ************************************************************************************************************************************** TASK [common : Dearmor GPG key] ************************************************************************************************************************************************ TASK [common : Copy odio apt source] ******************************************************************************************************************************************* TASK [common : Update apt cache] *********************************************************************************************************************************************** TASK [common : Install acl (needed by become_user)] **************************************************************************************************************************** TASK [common : Ensure required groups exist] *********************************************************************************************************************************** TASK [common : Ensure user in audio group] ************************************************************************************************************************************* TASK [common : User systemd directories] *************************************************************************************************************************************** TASK [common : Check linger status] ******************************************************************************************************************************************** TASK [common : Enable user session persistence (linger) - live] **************************************************************************************************************** TASK [common : Ensure linger directory exists - image build] ******************************************************************************************************************* TASK [common : Enable user session persistence (linger) - image build] ********************************************************************************************************* TASK [common : Setup polkit] *************************************************************************************************************************************************** TASK [common : Install polkit] ************************************************************************************************************************************************* TASK [common : Ensure polkit rules directory exists] *************************************************************************************************************************** TASK [upgrade : Remove legacy per-user upgrade scripts] ************************************************************************************************************************ TASK [upgrade : Remove legacy per-user upgrade unit files] ********************************************************************************************************************* TASK [upgrade : Install odio-check-upgrade script] ***************************************************************************************************************************** TASK [upgrade : Install odio-upgrade script] *********************************************************************************************************************************** TASK [upgrade : Deploy odio-upgrade systemd user units (system-wide)] ********************************************************************************************************** TASK [upgrade : Enable odio-check-upgrade timer] ******************************************************************************************************************************* TASK [upgrade : Enable user service - live] ************************************************************************************************************************************ TASK [upgrade : Enable user service - image build] ***************************************************************************************************************************** TASK [upgrade : Install unattended-upgrades (image mode)] ********************************************************************************************************************** TASK [branding : Ensure ~/.local/bin exists] *********************************************************************************************************************************** TASK [branding : Install odio-motd script] ************************************************************************************************************************************* TASK [branding : Hook odio-motd into ~/.profile] ******************************************************************************************************************************* TASK [branding : Suppress system motd for odio user] *************************************************************************************************************************** TASK [pulseaudio : Install PulseAudio packages] ******************************************************************************************************************************** TASK [pulseaudio : Copy pulse-tcp script] ************************************************************************************************************************************** TASK [pulseaudio : Deploy pulse-tcp service] *********************************************************************************************************************************** TASK [pulseaudio : Check if pipewire is installed] ***************************************************************************************************************************** TASK [pulseaudio : Find existing PipeWire unit files] ************************************************************************************************************************** TASK [pulseaudio : Disable and stop existing PipeWire units for target user] *************************************************************************************************** TASK [pulseaudio : Mask existing PipeWire units for target user] *************************************************************************************************************** TASK [pulseaudio : Enable user PulseAudio services] **************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************** TASK [pulseaudio : Enable user service - live] ********************************************************************************************************************************* TASK [pulseaudio : Enable user service - image build] ************************************************************************************************************************** TASK [bluetooth : Check if pi-bluetooth is available] ************************************************************************************************************************** TASK [bluetooth : Install pi-bluetooth] **************************************************************************************************************************************** TASK [bluetooth : Install Bluetooth packages] ********************************************************************************************************************************** TASK [bluetooth : Ensure bluetooth group exists] ******************************************************************************************************************************* TASK [bluetooth : Ensure user in bluetooth group] ****************************************************************************************************************************** TASK [bluetooth : Backup Bluetooth config before changes] ********************************************************************************************************************** TASK [bluetooth : Stat config before changes] ********************************************************************************************************************************** TASK [bluetooth : Create temp backup of config] ******************************************************************************************************************************** TASK [bluetooth : Configure Bluetooth main.conf] ******************************************************************************************************************************* TASK [bluetooth : Backup Bluetooth config after changes] *********************************************************************************************************************** TASK [bluetooth : Stat config after changes] *********************************************************************************************************************************** TASK [bluetooth : Promote temp backup to .bak if config changed] *************************************************************************************************************** TASK [bluetooth : Remove temp backup if config unchanged] ********************************************************************************************************************** TASK [bluetooth : Check for graphical session] ********************************************************************************************************************************* TASK [bluetooth : Check systemd default target] ******************************************************************************************************************************** TASK [bluetooth : Set is_headless fact] **************************************************************************************************************************************** TASK [bluetooth : Deploy rfkill udev rule] ************************************************************************************************************************************* TASK [bluetooth : Enable Bluetooth service] ************************************************************************************************************************************ TASK [bluetooth : Enable system service] *************************************************************************************************************************************** TASK [bluetooth : Unblock bluetooth via rfkill] ******************************************************************************************************************************** TASK [mpd : Install MPD packages] ********************************************************************************************************************************************** TASK [mpd : Install mpDris2 fork] ********************************************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 binary from /usr/local/bin] ****************************************************************************************************************** TASK [mpd : Remove legacy mpDris2 systemd override directory] ****************************************************************************************************************** TASK [mpd : Install mpdris2] *************************************************************************************************************************************************** TASK [mpd : Upgrade mpdris2] *************************************************************************************************************************************************** TASK [mpd : Create mpDris2 config directory] *********************************************************************************************************************************** TASK [mpd : Create mpDris2 config file] **************************************************************************************************************************************** TASK [mpd : Enable user mpDris2 service] *************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd : Install myMPD web UI] ********************************************************************************************************************************************** TASK [mpd : Install mympd] ***************************************************************************************************************************************************** TASK [mpd : Upgrade mympd] ***************************************************************************************************************************************************** TASK [mpd : Create mympd config directory] ************************************************************************************************************************************* TASK [mpd : Deploy odio custom_css] ******************************************************************************************************************************************** TASK [mpd : Disable mympd ssl] ************************************************************************************************************************************************* TASK [mpd : Create mympd state directory] ************************************************************************************************************************************** TASK [mpd : Configure mympd MPD host (user socket)] **************************************************************************************************************************** TASK [mpd : Configure mympd MPD port (0 = socket)] ***************************************************************************************************************************** TASK [mpd : Enable user mympd service] ***************************************************************************************************************************************** TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd : Disable system MPD service] **************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************** TASK [mpd : Disable system service] ******************************************************************************************************************************************** TASK [mpd : Stop system service] *********************************************************************************************************************************************** TASK [mpd : Create MPD config directory] *************************************************************************************************************************************** TASK [mpd : Create MPD data directories] *************************************************************************************************************************************** TASK [mpd : Backup MPD config before changes] ********************************************************************************************************************************** TASK [mpd : Stat config before changes] **************************************************************************************************************************************** TASK [mpd : Create temp backup of config] ************************************************************************************************************************************** TASK [mpd : Create empty MPD config file] ************************************************************************************************************************************** TASK [mpd : MPD config - paths] ************************************************************************************************************************************************ TASK [mpd : MPD config - network] ********************************************************************************************************************************************** TASK [mpd : MPD config - zeroconf] ********************************************************************************************************************************************* TASK [mpd : MPD config - wildmidi decoder] ************************************************************************************************************************************* TASK [mpd : MPD config - pulseaudio output] ************************************************************************************************************************************ TASK [mpd : Backup MPD config after changes] *********************************************************************************************************************************** TASK [mpd : Stat config after changes] ***************************************************************************************************************************************** TASK [mpd : Promote temp backup to .bak if config changed] ********************************************************************************************************************* TASK [mpd : Remove temp backup if config unchanged] **************************************************************************************************************************** TASK [mpd : Create empty MPD state file] *************************************************************************************************************************************** TASK [mpd : Create music directory] ******************************************************************************************************************************************** TASK [mpd : Enable user MPD service] ******************************************************************************************************************************************* TASK [mpd : Enable user service - live] **************************************************************************************************************************************** TASK [mpd : Enable user service - image build] ********************************************************************************************************************************* TASK [mpd_discplayer : Set MPD config path (managed by odios)] ***************************************************************************************************************** TASK [mpd_discplayer : Validate external MPD installation] ********************************************************************************************************************* TASK [mpd_discplayer : Ensure cdrom group exists] ****************************************************************************************************************************** TASK [mpd_discplayer : Ensure user in cdrom group] ***************************************************************************************************************************** TASK [mpd_discplayer : Deploy udisk polkit rule] ******************************************************************************************************************************* TASK [mpd_discplayer : Backup MPD config before changes (external MPD only)] *************************************************************************************************** TASK [mpd_discplayer : Configure mpd cdio] ************************************************************************************************************************************* TASK [mpd_discplayer : Configure mpd playlist plugin] ************************************************************************************************************************** TASK [mpd_discplayer : Configure mpd udisk neighbor] *************************************************************************************************************************** TASK [mpd_discplayer : Backup MPD config after changes (external MPD only)] **************************************************************************************************** TASK [mpd_discplayer : Install mpd-discplayer] ********************************************************************************************************************************* TASK [mpd_discplayer : Upgrade mpd-discplayer] ********************************************************************************************************************************* TASK [mpd_discplayer : Copy .mpdignore to music directory] ********************************************************************************************************************* TASK [mpd_discplayer : Create mpd-discplayer config directory] ***************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config before changes] ************************************************************************************************************ TASK [mpd_discplayer : Stat config before changes] ***************************************************************************************************************************** TASK [mpd_discplayer : Create temp backup of config] *************************************************************************************************************************** TASK [mpd_discplayer : Deploy mpd-discplayer configuration] ******************************************************************************************************************** TASK [mpd_discplayer : Backup mpd-discplayer config after changes] ************************************************************************************************************* TASK [mpd_discplayer : Stat config after changes] ****************************************************************************************************************************** TASK [mpd_discplayer : Promote temp backup to .bak if config changed] ********************************************************************************************************** TASK [mpd_discplayer : Remove temp backup if config unchanged] ***************************************************************************************************************** TASK [mpd_discplayer : Enable mpd-discplayer service] ************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - live] ***************************************************************************************************************************** TASK [mpd_discplayer : Enable user service - image build] ********************************************************************************************************************** TASK [shairport_sync : Install shairport-sync] ********************************************************************************************************************************* TASK [shairport_sync : Create user shairport-sync config directory] ************************************************************************************************************ TASK [shairport_sync : Copy shairport-sync system config to user directory] **************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config before changes] ************************************************************************************************************ TASK [shairport_sync : Stat config before changes] ***************************************************************************************************************************** TASK [shairport_sync : Create temp backup of config] *************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync name] ************************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync output backend] **************************************************************************************************************** TASK [shairport_sync : Configure shairport-sync mdns backend] ****************************************************************************************************************** TASK [shairport_sync : Remove legacy shairport-sync pulseaudio TCP server setting] ********************************************************************************************* TASK [shairport_sync : Configure shairport-sync application name] ************************************************************************************************************** TASK [shairport_sync : Backup shairport-sync config after changes] ************************************************************************************************************* TASK [shairport_sync : Stat config after changes] ****************************************************************************************************************************** TASK [shairport_sync : Promote temp backup to .bak if config changed] ********************************************************************************************************** TASK [shairport_sync : Remove temp backup if config unchanged] ***************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync] *************************************************************************************************************** TASK [shairport_sync : Configure dbus policy for shairport-sync MPRIS] ********************************************************************************************************* TASK [shairport_sync : Deploy shairport-sync user service] ********************************************************************************************************************* TASK [shairport_sync : Disable system shairport-sync service] ****************************************************************************************************************** TASK [shairport_sync : Disable system service] ********************************************************************************************************************************* TASK [shairport_sync : Stop system service] ************************************************************************************************************************************ TASK [shairport_sync : Enable user shairport-sync service] ********************************************************************************************************************* TASK [shairport_sync : Enable user service - live] ***************************************************************************************************************************** TASK [shairport_sync : Enable user service - image build] ********************************************************************************************************************** TASK [snapclient : Install snapclient] ***************************************************************************************************************************************** TASK [snapclient : Disable system snapclient service] ************************************************************************************************************************** TASK [snapclient : Disable system service] ************************************************************************************************************************************* TASK [snapclient : Stop system service] **************************************************************************************************************************************** TASK [snapclient : Copy user snapclient service] ******************************************************************************************************************************* TASK [snapclient : Enable user snapclient service] ***************************************************************************************************************************** TASK [snapclient : Enable user service - live] ********************************************************************************************************************************* TASK [snapclient : Enable user service - image build] ************************************************************************************************************************** TASK [upmpdcli : Download lesbonscomptes GPG key] ****************************************************************************************************************************** TASK [upmpdcli : Download upmpdcli apt sources] ******************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli] ********************************************************************************************************************************************* TASK [upmpdcli : Create user upmpdcli config directory] ************************************************************************************************************************ TASK [upmpdcli : Copy upmpdcli system config to user directory] **************************************************************************************************************** TASK [upmpdcli : Backup upmpdcli config before changes] ************************************************************************************************************************ TASK [upmpdcli : Stat config before changes] *********************************************************************************************************************************** TASK [upmpdcli : Create temp backup of config] ********************************************************************************************************************************* TASK [upmpdcli : Configure upmpdcli friendly name] ***************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli upnpav] ************************************************************************************************************************************ TASK [upmpdcli : Configure upmpdcli openhome] ********************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdhost] *********************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli mpdport] *********************************************************************************************************************************** TASK [upmpdcli : Install pip] ************************************************************************************************************************************************** TASK [upmpdcli : Configure Qobuz streaming] ************************************************************************************************************************************ TASK [upmpdcli : Install upmpdcli-qobuz] *************************************************************************************************************************************** TASK [upmpdcli : Configure Deezer streaming] *********************************************************************************************************************************** TASK [upmpdcli : Configure Tidal streaming] ************************************************************************************************************************************ TASK [upmpdcli : Install tidalapi python package] ****************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli-tidal] *************************************************************************************************************************************** TASK [upmpdcli : Configure UPnP web radios] ************************************************************************************************************************************ TASK [upmpdcli : Install pyradios python package] ****************************************************************************************************************************** TASK [upmpdcli : Install upmpdcli web radio plugins] *************************************************************************************************************************** TASK [upmpdcli : Configure upmpdcli web radio plugins] ************************************************************************************************************************* TASK [upmpdcli : Backup upmpdcli config after changes] ************************************************************************************************************************* TASK [upmpdcli : Stat config after changes] ************************************************************************************************************************************ TASK [upmpdcli : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [upmpdcli : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [upmpdcli : Disable upmpdcli system service] ****************************************************************************************************************************** TASK [upmpdcli : Disable system service] *************************************************************************************************************************************** TASK [upmpdcli : Stop system service] ****************************************************************************************************************************************** TASK [upmpdcli : Deploy upmpdcli user service] ********************************************************************************************************************************* TASK [upmpdcli : Enable user upmpdcli service] ********************************************************************************************************************************* TASK [upmpdcli : Enable user service - live] *********************************************************************************************************************************** TASK [upmpdcli : Enable user service - image build] **************************************************************************************************************************** TASK [spotifyd : Install spotifyd] ********************************************************************************************************************************************* TASK [spotifyd : Upgrade spotifyd] ********************************************************************************************************************************************* TASK [spotifyd : Create spotifyd config directory] ***************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config before changes] ************************************************************************************************************************ TASK [spotifyd : Stat config before changes] *********************************************************************************************************************************** TASK [spotifyd : Create temp backup of config] ********************************************************************************************************************************* TASK [spotifyd : Deploy spotifyd config] *************************************************************************************************************************************** TASK [spotifyd : Backup spotifyd config after changes] ************************************************************************************************************************* TASK [spotifyd : Stat config after changes] ************************************************************************************************************************************ TASK [spotifyd : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [spotifyd : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [spotifyd : Enable user spotifyd service] ********************************************************************************************************************************* TASK [spotifyd : Enable user service - live] *********************************************************************************************************************************** TASK [spotifyd : Enable user service - image build] **************************************************************************************************************************** TASK [odio_api : Install go-odio-api] ****************************************************************************************************************************************** TASK [odio_api : Upgrade go-odio-api] ****************************************************************************************************************************************** TASK [odio_api : Create odio-api config directory] ***************************************************************************************************************************** TASK [odio_api : Check for graphical session] ********************************************************************************************************************************** TASK [odio_api : Check systemd default target] ********************************************************************************************************************************* TASK [odio_api : Set is_headless fact] ***************************************************************************************************************************************** TASK [odio_api : Deploy polkit shutdown rule] ********************************************************************************************************************************** TASK [odio_api : Set power capability facts (image build)] ********************************************************************************************************************* TASK [odio_api : Check CanReboot via logind DBus] ****************************************************************************************************************************** TASK [odio_api : Check CanPoweroff via logind DBus] **************************************************************************************************************************** TASK [odio_api : Set power capability facts (live)] **************************************************************************************************************************** TASK [odio_api : Backup odio-api config before changes] ************************************************************************************************************************ TASK [odio_api : Stat config before changes] *********************************************************************************************************************************** TASK [odio_api : Create temp backup of config] ********************************************************************************************************************************* TASK [odio_api : Deploy odio-api configuration] ******************************************************************************************************************************** TASK [odio_api : Backup odio-api config after changes] ************************************************************************************************************************* TASK [odio_api : Stat config after changes] ************************************************************************************************************************************ TASK [odio_api : Promote temp backup to .bak if config changed] **************************************************************************************************************** TASK [odio_api : Remove temp backup if config unchanged] *********************************************************************************************************************** TASK [odio_api : Enable odio-api service] ************************************************************************************************************************************** TASK [odio_api : Enable user service - live] *********************************************************************************************************************************** TASK [odio_api : Enable user service - image build] **************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mpDris2] **************************************************************************************************************************************** RUNNING HANDLER [mpd : Restart mympd] ****************************************************************************************************************************************** RUNNING HANDLER [odio_api : Restart odio-api] ********************************************************************************************************************************** TASK [Write installation state] ************************************************************************************************************************************************ TASK [Build list of installed roles] ******************************************************************************************************************************************* TASK [Aggregate role versions from vars/main.yml] ****************************************************************************************************************************** TASK [Build list of excluded roles] ******************************************************************************************************************************************** TASK [Build list of enabled features] ****************************************************************************************************************************************** TASK [Build list of excluded features] ***************************************************************************************************************************************** TASK [Ensure /var/cache/odio exists] ******************************************************************************************************************************************* TASK [Read existing state.json (system path)] ********************************************************************************************************************************** TASK [Read existing state.json (legacy per-user path)] ************************************************************************************************************************* TASK [Parse existing state] **************************************************************************************************************************************************** TASK [Seed prior release history] ********************************************************************************************************************************************** TASK [Append current version to release history (dedup consecutive)] *********************************************************************************************************** TASK [Assemble state.json payload] ********************************************************************************************************************************************* TASK [Write /var/cache/odio/state.json] **************************************************************************************************************************************** TASK [Refresh /var/cache/odio/upgrades.json] *********************************************************************************************************************************** TASK [Restart odio-api] ******************************************************************************************************************************************************** TASK [Restart odio-api to pick up freshly-restarted dependencies] ************************************************************************************************************** TASK [Verify services are running] ********************************************************************************************************************************************* TASK [Skip service health-check in image-build mode] *************************************************************************************************************************** TASK [Detect container environment (relax system-service checks)] ************************************************************************************************************** TASK [Compute expected system services] **************************************************************************************************************************************** TASK [Compute expected user services] ****************************************************************************************************************************************** TASK [Verify system services are active] *************************************************************************************************************************************** TASK [Verify system services are enabled (container fallback)] ***************************************************************************************************************** TASK [Verify user services are active] ***************************************************************************************************************************************** TASK [Health-check summary] **************************************************************************************************************************************************** TASK [Remove ansible remote_tmp directory] ************************************************************************************************************************************* TASK [Display installation summary] ******************************************************************************************************************************************** PLAY RECAP ********************************************************************************************************************************************************************* Playbook completed in 11m 42s ═══════════════════════════════════════════════════════════ Cleaning up... |
|
Update — 2026.4.2b1 shipped, 2026.4.2b2 follows Continuing from #16711242. Shipped in 2026.4.2b1
Added in 2026.4.2b2
Live upgrade tested on the pi
Direction shift on smart upgrade |
|
Upgrade speed — PR #60 recap The upgrade system from this RFC works, but a near-full upgrade still took ~2h on the Pi 1B+ (700MHz ARMv6) — too long to be practical. PR #60 (Bluetoothoutput) carries a batch of perf work that brings a run touching almost every role down to ~43 min (~3× faster). That run rebuilds nearly all roles, so it's close to a worst case; a typical upgrade touching one or two roles should be much shorter. Reasoning — the dominant cost on slow armhf is per-task overhead: each module forks a fresh Iterations in this PR
Net: ~2h → ~43 min on a near-full run, and gating means the lighter the update, the bigger the relative win. |



Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
RFC: Targeted upgrade system for odio
Context
Currently, upgrading odios means re-running the full
curl | bashwhich executes all Ansible playbooks. We want to upgrade only the roles that actually changed, with automatic detection and triggering from the PWA.go-odio-api: generic upgrade backend
go-odio-api provides an agnostic, optional upgrade backend (disabled by default) with two components:
Detector
Periodically triggers a user-configured systemd user oneshot service. The service is responsible for checking whatever source of truth it needs and writing a result file. go-odio-api reads the result and exposes upgrade availability via SSE/REST. go-odio-api does not know how detection works, only where to read the result.
Executor
Triggers a user-configured systemd user oneshot service. go-odio-api does not know or care what the service does.
Both follow the same pattern: go-odio-api runs
systemctl --user start <configured-unit>, the developer writes the unit. Logs go to journald, status is visible viasystemctl --user status. This is consistent with how go-odio-api already interacts with systemd services. Documentation will provide example units.Odios-specific implementation
1. Manifest (
odio.love/manifest.json)Published by CI on each release. Lists the last odios version that modified each role:
{ "odios": "2026.4.1", "roles": { "common": "2026.4.1", "bluetooth": "2026.3.0", "mpd": "2026.4.0", "pulseaudio": "2026.3.0", "odio_api": "2026.4.1", "mpd_discplayer": "2026.2.0", "spotifyd": "2026.1.0", "shairport_sync": "2026.1.0" } }Versioning: CalVer
YYYY.M.patch[-rcN].2. Local state (
~/.config/odio/state.json)Same format as the manifest. Written by Ansible as a post-task after each successful run. Each role declares its version in
vars/main.yml, and a post-task aggregates everything into the state file.3. CI: manifest generation
On each git tag, the GitHub Actions workflow:
installer/ansible/roles/*/4. Detector unit (
odio-check-upgrade.service)A systemd user oneshot service that fetches
odio.love/manifest.json, compares it with~/.config/odio/state.json, and writes the delta to a result file. Installed by the odios Ansible playbook.5. Upgrade unit (
odio-upgrade.service)A systemd user oneshot service that runs
ansible-pull -U <repo> -C <tag> --tags <changed_roles>. Installed by the odios Ansible playbook itself. Roles requiringbecome: true(package installs, system configs) rely on the user having configured passwordless sudo.6. Dependency model
Role configs may depend on minimum package versions. This is handled within each Ansible role (asserts, package version constraints), not in the manifest. The manifest stays simple: role name to version mapping.
Summary
All reactions