From 0af1b673a742f3f526877dc9baf2708ecbd1903a Mon Sep 17 00:00:00 2001 From: Mateusz Mojsiejuk Date: Sat, 9 Sep 2023 18:13:51 +0200 Subject: [PATCH 1/2] Switch Kodi to run under pulseaudio user mode Pulse audio system wide is a bit buggy and doesn't work great with all types of audio service. For user mode audio to work a user constantly has to be logged in so we auto login media user on tty --- roles/autottylogin/tasks/main.yml | 49 +++++++++++++++++++++++++++++++ roles/kodi/files/kodi.service | 10 +++---- roles/kodi/handlers/main.yml | 6 ++++ roles/kodi/tasks/main.yml | 45 ++++++++++++++++------------ roles/kodi/vars/main.yml | 9 +++--- 5 files changed, 90 insertions(+), 29 deletions(-) create mode 100644 roles/autottylogin/tasks/main.yml diff --git a/roles/autottylogin/tasks/main.yml b/roles/autottylogin/tasks/main.yml new file mode 100644 index 0000000..bc84b50 --- /dev/null +++ b/roles/autottylogin/tasks/main.yml @@ -0,0 +1,49 @@ +--- +- name: Add media user + ansible.builtin.user: + name: media + createhome: true + groups: video,input + +- name: Enable autologin + ansible.builtin.file: + src: /lib/systemd/system/getty@.service + dest: /etc/systemd/system/getty.target.wants/getty@tty1.service + state: link + +- name: Enable autologin + ansible.builtin.copy: + dest: /etc/systemd/system/getty@tty1.service.d/autologin.conf + content: | + [Service] + ExecStart= + ExecStart=-/sbin/agetty --autologin media --noclear %I $TERM + owner: root + group: root + mode: '0644' + +- name: Install ACL package (Required for ansible_become on media user in othe roles) + ansible.builtin.apt: + name: acl + state: present + install_recommends: false + +- name: Create .ssh folder + ansible.builtin.file: + path: /home/media/.ssh + state: directory + owner: media + group: media + mode: '0700' + +# This task is required because it's not possible to manage a systemd USER service +# with ansible if you are not doing it while being that user +# by enabling login with SSH for the media user we can handle enabling starting services as that user +# in other tasks (all audio related for enableing audio related user services +- name: Deploy current users public SSH key for media user + ansible.builtin.copy: + remote_src: true + src: "/home/{{ lookup('env','USER') }}/.ssh/authorized_keys" + dest: /home/media/.ssh/authorized_keys + owner: media + group: media diff --git a/roles/kodi/files/kodi.service b/roles/kodi/files/kodi.service index db8697c..e3c6823 100644 --- a/roles/kodi/files/kodi.service +++ b/roles/kodi/files/kodi.service @@ -1,15 +1,13 @@ [Unit] Description = Kodi Media Center -After = remote-fs.target network-online.target -Wants = network-online.target + +After=network-online.target +Wants=network-online.target [Service] -User=kodi -Group=kodi Type=simple ExecStart=/usr/lib/aarch64-linux-gnu/kodi/kodi.bin --pulse Restart=on-failure [Install] -WantedBy = multi-user.target - +WantedBy=default.target diff --git a/roles/kodi/handlers/main.yml b/roles/kodi/handlers/main.yml index a298cb9..f6633cd 100644 --- a/roles/kodi/handlers/main.yml +++ b/roles/kodi/handlers/main.yml @@ -1,11 +1,17 @@ --- - name: Restart kodi + become: false + remote_user: media ansible.builtin.systemd: name: kodi state: restarted + scope: user when: not ansible_check_mode - name: Reload systemd + become: false + remote_user: media ansible.builtin.systemd: daemon_reload: true + scope: user diff --git a/roles/kodi/tasks/main.yml b/roles/kodi/tasks/main.yml index 34da308..4f65061 100644 --- a/roles/kodi/tasks/main.yml +++ b/roles/kodi/tasks/main.yml @@ -1,51 +1,58 @@ --- +- name: enable auto login on tty for media user (required for pulseaudio to work) + include_role: + name: autottylogin + - name: Install packages ansible.builtin.apt: name: "{{ packages }}" update_cache: true -- name: Add kodi user - ansible.builtin.user: - name: kodi - createhome: true - shell: /bin/false - password: false - system: true - groups: video,input,pulse-access +- name: Create user systemd folder + ansible.builtin.file: + path: /home/media/.config/systemd/user/ + state: directory + owner: media + group: media + tags: directory - name: Create Kodi service ansible.builtin.copy: src: ./files/kodi.service - dest: /etc/systemd/system/kodi.service - owner: kodi - group: kodi + dest: /home/media/.config/systemd/user/kodi.service + owner: media + group: media mode: '600' notify: - Reload systemd - - Restart kodi -- name: Start Kodi on boot +- name: Enable Kodi service + become: false + remote_user: media ansible.builtin.systemd: name: kodi state: started enabled: true + scope: user + notify: + - Reload systemd when: not ansible_check_mode - name: Create kodi settings folders ansible.builtin.file: - path: /home/kodi/.kodi/userdata + path: /home/media/.kodi/userdata state: directory - owner: kodi - group: kodi + owner: media + group: media mode: '700' - name: Setup kodi media sources ansible.builtin.copy: src: sources.xml - dest: /home/kodi/.kodi/userdata/sources.xml - owner: kodi - group: kodi + dest: /home/media/.kodi/userdata/sources.xml + owner: media + group: media mode: '644' notify: Restart kodi tags: sources diff --git a/roles/kodi/vars/main.yml b/roles/kodi/vars/main.yml index fd8b696..b5f1c64 100644 --- a/roles/kodi/vars/main.yml +++ b/roles/kodi/vars/main.yml @@ -1,9 +1,10 @@ --- packages: - - kodi - - mesa-utils + - acl - ca-certificates - - samba-common-bin - cec-utils - - pulseaudio + - kodi - kodi-vfs-rar + - mesa-utils + - pulseaudio + - samba-common-bin From 3b3e768f02e6f002ca2e121a8ab9c7bdd2afa881 Mon Sep 17 00:00:00 2001 From: Mateusz Mojsiejuk Date: Sat, 9 Sep 2023 18:22:56 +0200 Subject: [PATCH 2/2] Switch librespot to run under pulseaudio user mode Pulse audio system wide is a bit buggy and doesn't work great with all types of audio service. For user mode audio to work a user constantly has to be logged in so we auto login media user on tty --- roles/autottylogin/tasks/main.yml | 2 +- roles/dns-over-tls/vars/main.yml | 2 - roles/librespot/tasks/main.yml | 71 ++++++++------------- roles/librespot/templates/librespot.service | 2 - 4 files changed, 26 insertions(+), 51 deletions(-) diff --git a/roles/autottylogin/tasks/main.yml b/roles/autottylogin/tasks/main.yml index bc84b50..89f6b13 100644 --- a/roles/autottylogin/tasks/main.yml +++ b/roles/autottylogin/tasks/main.yml @@ -39,7 +39,7 @@ # This task is required because it's not possible to manage a systemd USER service # with ansible if you are not doing it while being that user # by enabling login with SSH for the media user we can handle enabling starting services as that user -# in other tasks (all audio related for enableing audio related user services +# in other tasks (all audio related for enableing audio related user services - name: Deploy current users public SSH key for media user ansible.builtin.copy: remote_src: true diff --git a/roles/dns-over-tls/vars/main.yml b/roles/dns-over-tls/vars/main.yml index db72ec2..ad08d7a 100644 --- a/roles/dns-over-tls/vars/main.yml +++ b/roles/dns-over-tls/vars/main.yml @@ -1,5 +1,4 @@ --- - # Cloudflare DNS related settings cloudflared_release_ver: https://github.com/cloudflare/cloudflared/releases/download/2023.7.1/ @@ -8,7 +7,6 @@ cloudflared_release_arch: arm64: cloudflared-linux-arm64.deb armhf: cloudflared-linux-armhf.deb - doh_dns_1: "1.1.1.1" doh_dns_2: "1.0.0.1" diff --git a/roles/librespot/tasks/main.yml b/roles/librespot/tasks/main.yml index 220010c..7c595bd 100644 --- a/roles/librespot/tasks/main.yml +++ b/roles/librespot/tasks/main.yml @@ -1,6 +1,10 @@ --- -- name: Copy librespot for arm pulseaudio enabled version +- name: Enable auto login on TTY for media user (required for audio to work) + include_role: + name: autottylogin + +- name: Copy librespot for ARM pulseaudio enabled version become: true ansible.builtin.copy: src: files/librespot.arm64_pulse @@ -9,18 +13,21 @@ group: root mode: '655' -- name: Copy librespot and pulseaudio systemd service file - become: true +- name: Create user systemd folder + ansible.builtin.file: + path: /home/media/.config/systemd/user/ + state: directory + owner: media + group: media + +- name: Create librespot service ansible.builtin.template: - src: "{{ item }}" - dest: "/etc/systemd/system/{{ item }}" - owner: root - group: root - mode: '644' - loop: - - librespot.service - - pulseaudio-system-wide.service - tags: servicefile + src: librespot.service + dest: /home/media/.config/systemd/user/librespot.service + owner: media + group: media + mode: '600' + notify: Reload systemd - name: Install pulseaudio ansible.builtin.apt: @@ -28,17 +35,6 @@ state: present install_recommends: false -- name: Disable per user pulseaudio sessions - ansible.builtin.systemd: - name: "{{ item }}" - enabled: false - state: stopped - scope: global - loop: - - pulseaudio.service - - pulseaudio.socket - when: not ansible_check_mode - - name: Set default output to HDMI instead of analogue ansible.builtin.lineinfile: create: yes @@ -49,31 +45,14 @@ group: root mode: '0644' -- name: Disable pulsaudio autospawn - ansible.builtin.lineinfile: - create: yes - path: /etc/pulse/client.conf - line: autospawn = no - insertbefore: EOF - -- name: Create librespot service user - ansible.builtin.user: - name: librespot - groups: pulse-access - system: true - shell: /bin/false - create_home: true - state: present - - name: Enable librespot service - become: true + become: false + remote_user: media ansible.builtin.systemd: - name: "{{ item }}" + name: librespot state: started enabled: true - daemon_reload: true - when: not ansible_check_mode + scope: user + notify: Reload systemd - loop: - - librespot - - pulseaudio-system-wide + when: not ansible_check_mode diff --git a/roles/librespot/templates/librespot.service b/roles/librespot/templates/librespot.service index 14215ee..899f667 100644 --- a/roles/librespot/templates/librespot.service +++ b/roles/librespot/templates/librespot.service @@ -6,8 +6,6 @@ After=network-online.target Wants=network-online.target [Service] -User=librespot - ExecStart=/usr/local/bin/librespot.arm64_pulse -b 320 -n {{ spotify_connect_name }} -G -F speaker Restart=always RestartSec=5