10 Commits

Author SHA1 Message Date
Alexander Grothe
fbad7b65aa remove whitespace 2017-11-13 09:44:42 +01:00
Alexander Grothe
7c2b1ce55d update handlers 2017-11-13 09:30:42 +01:00
Alexander Grothe
c985a33229 run dpkg-reconfigure if necessary 2017-11-13 09:27:02 +01:00
Alexander Grothe
0358403073 fix indentation and quoting 2017-11-13 09:24:13 +01:00
Alexander Grothe
11a7f5478c Merge branch 'irmp' of https://github.com/yavdr/yavdr-ansible into irmp 2017-11-13 09:21:59 +01:00
Alexander Grothe
9d1eb3a6e3 use debconf module instead of shell command 2017-11-13 09:20:04 +01:00
Alexander Grothe
ca0bc806ca use debconf module instead of shell command 2017-11-13 09:14:11 +01:00
Alexander Grothe
9794d7b9ef Update Manual.conf 2017-11-13 09:03:02 +01:00
Alexander Grothe
36d189e31c Update Manual.org, fix file permissions for role 2017-11-13 09:00:53 +01:00
Luigi Di Carmino
896516242b yavdr-hardware-irmp added 2017-11-12 21:59:44 +01:00
19 changed files with 156 additions and 5847 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -166,7 +166,6 @@ The ~yavdr07.yml~ playbook sets up a fully-featured yaVDR installation:
become: true
roles:
- yavdr-common # install and configure the basic system
- collect-facts # query system facts
- autoinstall-ubuntu-drivers # use ubuntu-drivers to install proprietary dirvers
# (e.g. nvidia, virtualbox)
# - nvidia-387 # install very recent nvidia-387 from ppa:graphics-drivers/ppa
@@ -185,11 +184,9 @@ The ~yavdr07.yml~ playbook sets up a fully-featured yaVDR installation:
- autoinstall-hauppauge-pvr # install vdr-plugin-pvrinput if a matching card is found
- autoinstall-dvbsddevice # install vdr-plugin-dvbsddevice if a matching card is detected
- autoinstall-hardware-irmp # install yavdr-hardware-irmp if a matching usb device is detected
- autoinstall-dvbsky-firmware # download an install required firmware files for dvbsky cards
- kodi
- dvd # set up packages and a udev rule to allow kodi and other players
# to play and eject optical media
- wakeup # set up wakeup methods for rtc etc.
- grub-config # configure grub
tags:
- always
@@ -209,7 +206,6 @@ For a headless server installation ~yavdr07-headless.yml~ is a good choice
become: true
roles:
- yavdr-common
- collect-facts # query system facts
- vdr
- yavdr-network
- samba-server
@@ -217,7 +213,6 @@ For a headless server installation ~yavdr07-headless.yml~ is a good choice
- nfs-server
- grub-config
- autoinstall-satip
- wakeup
tags:
- always
handlers:
@@ -305,6 +300,7 @@ extra_packages:
- bpython3
- htop
- tree
- vdr-addon-acpiwakeup
- vim
- w-scan
#+END_SRC
@@ -313,7 +309,6 @@ extra_packages:
frontend: vdr
#system:
# shutdown: poweroff
wakeup_method: acpiwakeup
grub:
timeout: 0
boot_options: quiet nosplash
@@ -417,20 +412,9 @@ vdr:
*** tasks
yavdr-common executes the following tasks:
**** main.yml
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes :padline no
---
# file: roles/yavdr-common/tasks/main.yml
- name: basic installation
block:
- import_tasks: configure_apt.yml
- import_tasks: configure_system.yml
- import_tasks: create_directories.yml
tags: [install]
#+END_SRC
***** Disable default installation of recommended packages
This task prevents apt to automatically install all recommended dependencies for packages:
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_apt.yml :mkdirp yes :padline no
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes :padline no
---
- name: apt | prevent automatic installation of recommended packages
@@ -439,22 +423,8 @@ yavdr-common executes the following tasks:
dest: /etc/apt/apt.conf.d/90norecommends
#+END_SRC
***** Set up package repositories
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_apt.yml :mkdirp yes
- name: add PPAs
apt_repository:
repo: '{{ item }}'
state: present
update_cache: yes
with_items: '{{ repositories }}'
- name: run apt-get dist-upgrade
apt:
upgrade: dist
update_cache: yes
#+END_SRC
***** Use bash instead of dash
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_system.yml :mkdirp yes
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
- name: use bash instead of dash
shell: |
echo "set dash/sh false" | debconf-communicate
@@ -462,7 +432,7 @@ yavdr-common executes the following tasks:
#+END_SRC
***** create user vdr
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_system.yml :exports none :mkdirp yes
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :exports none :mkdirp yes
- name: create vdr group
group:
gid: '{{ vdr.gid }}'
@@ -481,7 +451,7 @@ yavdr-common executes the following tasks:
#+END_SRC
***** Disable release-upgrade notifications
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_system.yml :mkdirp yes
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
- name: disable release-upgrade notifications
lineinfile:
dest: /etc/update-manager/release-upgrades
@@ -490,8 +460,22 @@ yavdr-common executes the following tasks:
regexp: '^(Prompt=).*$'
line: '\1never'
#+END_SRC
***** Set up package repositories
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
- name: add PPAs
apt_repository:
repo: '{{ item }}'
state: present
update_cache: yes
with_items: '{{ repositories }}'
- name: run apt-get dist-upgrade
apt:
upgrade: dist
update_cache: yes
#+END_SRC
***** Install essential packages
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_system.yml :mkdirp yes
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
- name: apt | install basic packages
apt:
name: '{{ item }}'
@@ -519,7 +503,7 @@ yavdr-common executes the following tasks:
#+END_SRC
***** Install additional packages (user defined)
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/configure_system.yml
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml
- name: apt | install extra packages
apt:
name: '{{ item }}'
@@ -528,8 +512,26 @@ yavdr-common executes the following tasks:
with_items:
'{{ extra_packages }}'
#+END_SRC
***** Gather facts with custom modules
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
- name: get information about usb and pci hardware and loaded kernel modules
hardware_facts:
usb: True
pci: True
modules: True
gpus: True
- debug:
var: '{{ item }}'
verbosity: 1
with_items:
- usb
- pci
- gpus
- modules
#+END_SRC
***** create media directories
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/create_directories.yml :exports none :mkdirp yes
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :exports none :mkdirp yes
- name: create media directories
file:
dest: '{{ item.value }}'
@@ -546,28 +548,6 @@ yavdr-common executes the following tasks:
APT::Install-Recommends "0";
APT::Install-Suggests "0";
#+END_SRC
** collect facts about the system with custom modules
*** tasks
***** main.yml
#+BEGIN_SRC yaml :tangle roles/collect-facts/tasks/main.yml :mkdirp yes
- name: get information about usb and pci hardware and loaded kernel modules
hardware_facts:
usb: True
pci: True
modules: True
gpus: True
acpi_power_modes: True
- debug:
var: '{{ item }}'
verbosity: 1
with_items:
- usb
- pci
- gpus
- modules
- acpi_power_modes
#+END_SRC
** vdr
*** tasks
**** install the basic vdr packages
@@ -3182,7 +3162,6 @@ If a Sat>IP Server responds to a discovery request, the package vdr-plugin-satip
- name: apt | install vdr-plugin-satip if a Sat>IP server has been detected
apt:
name: vdr-plugin-satip
state: present
when: satip_devices
notify: [ 'Restart VDR' ]
#+END_SRC
@@ -3246,11 +3225,6 @@ If a Sat>IP Server responds to a discovery request, the package vdr-plugin-satip
when: '"0070:4000" in pci or "4444:0016" in pci'
notify: [ 'Restart VDR' ]
#+END_SRC
** autoinstall-dvbsky-firmware
*** defaults
#+INCLUDE: "roles/autoinstall-dvbsky-firmware/defaults/main.yml" src yaml
*** tasks
#+INCLUDE: "roles/autoinstall-dvbsky-firmware/tasks/main.yml" src yaml
** TODO autoinstall-dvbhddevice
Problem: woher kommt der Treiber (AFAIK noch nicht im Kernel)? Die Firmware sollte in yavdr-firmware stecken
*** tasks
@@ -3286,7 +3260,6 @@ Problem: woher kommt der Treiber (AFAIK noch nicht im Kernel)? Die Firmware soll
- name: apt | install yavdr-hardware-irmp if connected
apt:
name: yavdr-hardware-irmp
state: present
when: '"1209:4444" in usb'
#+END_SRC
@@ -3563,31 +3536,6 @@ system:
mode:
- "1280x720_60"
#+END_SRC
** wakeup
*** defaults
#+BEGIN_SRC yaml :tangle roles/wakeup/defaults/main.yml :padline no
---
# file roles/wakeup/defaults/main.yml
wakeup_method: "acpiwakeup"
#+END_SRC
*** tasks
#+BEGIN_SRC yaml :tangle roles/wakeup/tasks/main.yml :padline no
---
# file roles/wakeup/tasks/main.yml
- name: install and configure vdr-addon-acpiwakeup
block:
- apt:
name: vdr-addon-acpiwakeup
state: present
- lineinfile:
path: /etc/vdr/vdr-addon-acpiwakeup.conf
regexp: '^ACPI_ENABLED='
line: 'ACPI_ENABLED=true'
when: wakeup_method == "acpiwakeup"
#+END_SRC
** grub-config
*** default variables
#+BEGIN_SRC yaml :tangle roles/grub-config/defaults/main.yml :mkdirp yes :padline no
@@ -3685,12 +3633,6 @@ DOCUMENTATION = '''
default: True
description:
- return a list of devices of the pci gpu class (0x030000)
acpi_power_modes:
required: False
default: True
description:
- return a list of supported acpi power saving modes
notes:
- requres python-pyusb and python-kmodpy
requirements: [ ]
@@ -3703,7 +3645,6 @@ EXAMPLES = '''
usb: True
pci: True
modules: True
acpi_power_modes: True
- debug:
var: usb
- debug
@@ -3758,21 +3699,11 @@ def format_gpu_device_list(iterator):
"VendorID": d.idVendor, "ProductID": d.idProduct}
return [entry for entry in get_entries(iterator)]
def list_acpi_power_modes():
acpi_power_modes = []
try:
with open('/sys/power/state') as f:
acpi_power_modes = [l for l in f.readline().split()]
except IOError:
pass
return acpi_power_modes
arg_specs = {
'usb': dict(default=True, type='bool', required=False),
'pci': dict(default=True, type='bool', required=False),
'modules': dict(default=True, type='bool', required=False),
'gpus': dict(default=True, type='bool', required=False),
'acpi_power_modes': dict(default=True, type='bool', required=False),
}
@@ -3782,32 +3713,24 @@ def main():
collect_pci = module.params['pci']
collect_modules = module.params['modules']
collect_gpus = module.params['gpus']
collect_acpi_power_modes = module.params['acpi_power_modes']
usb_devices = []
pci_devices = []
modules = []
gpus = []
acpi_power_modes = []
if collect_usb:
usb_devices = format_device_list(usb.core.find(find_all=True))
else:
usb_device = []
if collect_pci:
pci_devices = format_device_list(get_pci_devices())
else:
pci_devices = []
if collect_modules:
k = kmodpy.Kmod()
modules = [m[0] for m in k.loaded()]
else:
modules = []
if collect_gpus:
gpus = format_gpu_device_list(get_pci_devices())
if collect_acpi_power_modes:
acpi_power_modes = list_acpi_power_modes()
data = {'usb': usb_devices, 'pci': pci_devices, 'modules': modules, 'gpus': gpus,
'acpi_power_modes': acpi_power_modes}
else:
gpus = []
data = {'usb': usb_devices, 'pci': pci_devices, 'modules': modules, 'gpus': gpus}
module.exit_json(changed=False, ansible_facts=data, msg=data)
@@ -4210,9 +4133,6 @@ if __name__ == '__main__':
#+BEGIN_SRC yaml :tangle handlers/main.yml :mkdirp yes
- name: Reconfigure unattended upgrades with dpkg
command: '/usr/sbin/dpkg-reconfigure --frontend noninteractive unattended-upgrades'
- name: Trigger Udev
command: 'udevadm trigger '
- name: Restart Samba
systemd:

View File

@@ -50,12 +50,12 @@ extra_packages:
- bpython3
- htop
- tree
- vdr-addon-acpiwakeup
- vim
- w-scan
frontend: vdr
#system:
# shutdown: poweroff
wakeup_method: acpiwakeup
grub:
timeout: 0
boot_options: quiet nosplash

View File

@@ -1,8 +1,5 @@
- name: Reconfigure unattended upgrades with dpkg
command: '/usr/sbin/dpkg-reconfigure --frontend noninteractive unattended-upgrades'
- name: Trigger Udev
command: 'udevadm trigger '
- name: Restart Samba
systemd:

View File

@@ -31,12 +31,6 @@ DOCUMENTATION = '''
default: True
description:
- return a list of devices of the pci gpu class (0x030000)
acpi_power_modes:
required: False
default: True
description:
- return a list of supported acpi power saving modes
notes:
- requres python-pyusb and python-kmodpy
requirements: [ ]
@@ -49,7 +43,6 @@ EXAMPLES = '''
usb: True
pci: True
modules: True
acpi_power_modes: True
- debug:
var: usb
- debug
@@ -104,21 +97,11 @@ def format_gpu_device_list(iterator):
"VendorID": d.idVendor, "ProductID": d.idProduct}
return [entry for entry in get_entries(iterator)]
def list_acpi_power_modes():
acpi_power_modes = []
try:
with open('/sys/power/state') as f:
acpi_power_modes = [l for l in f.readline().split()]
except IOError:
pass
return acpi_power_modes
arg_specs = {
'usb': dict(default=True, type='bool', required=False),
'pci': dict(default=True, type='bool', required=False),
'modules': dict(default=True, type='bool', required=False),
'gpus': dict(default=True, type='bool', required=False),
'acpi_power_modes': dict(default=True, type='bool', required=False),
}
@@ -128,32 +111,24 @@ def main():
collect_pci = module.params['pci']
collect_modules = module.params['modules']
collect_gpus = module.params['gpus']
collect_acpi_power_modes = module.params['acpi_power_modes']
usb_devices = []
pci_devices = []
modules = []
gpus = []
acpi_power_modes = []
if collect_usb:
usb_devices = format_device_list(usb.core.find(find_all=True))
else:
usb_device = []
if collect_pci:
pci_devices = format_device_list(get_pci_devices())
else:
pci_devices = []
if collect_modules:
k = kmodpy.Kmod()
modules = [m[0] for m in k.loaded()]
else:
modules = []
if collect_gpus:
gpus = format_gpu_device_list(get_pci_devices())
if collect_acpi_power_modes:
acpi_power_modes = list_acpi_power_modes()
data = {'usb': usb_devices, 'pci': pci_devices, 'modules': modules, 'gpus': gpus,
'acpi_power_modes': acpi_power_modes}
else:
gpus = []
data = {'usb': usb_devices, 'pci': pci_devices, 'modules': modules, 'gpus': gpus}
module.exit_json(changed=False, ansible_facts=data, msg=data)

View File

@@ -1,3 +0,0 @@
---
# file roles/autoinstall-dvbsky-firmware
dvbsky_firmware_files: []

View File

@@ -1,43 +0,0 @@
---
# file roles/autoinstall-dvbsky-firmware/tasks/main.yml
- name: determine needed firmware files by device ids
block:
- name: add firmware for DVBSky S952 V3 to variable dvbsky_firmware_files if a card has been detected
set_fact:
dvbsky_firmware_files: "{{dvbsky_firmware_files}} + ['dvb-demod-m88rs6000.fw']"
when:
- '"1ade:3038" in pci'
- ansible_distribution_version >= '15.04' #driver only included since Kernel 3.19
when:
- not dvbsky_firmware_files
- name: Download firmware for DVBSky cards and copy required files to /lib/firmware
block:
# download and extract firmware
- unarchive:
src: http://www.dvbsky.net/download/linux/dvbsky-firmware.tar.gz
dest: /tmp/
remote_src: yes
# copy firmware file
- copy:
src: "/tmp/dvbsky-firmware/{{ item }}"
dest: /lib/firmware/
owner: root
group: root
mode: 0644
with_items: '{{ dvbsky_firmware_files }}'
notify: ['Trigger Udev']
# Remove temporary files
- file:
path: /tmp/dvbsky-firmware
state: absent
when:
- dvbsky_firmware_files is defined
- dvbsky_firmware_files
tags:
- install
- autodetect
- dvbsky

View File

@@ -1,3 +0,0 @@
---
dependencies:
- { role: collect-facts }

View File

@@ -4,5 +4,4 @@
- name: apt | install yavdr-hardware-irmp if connected
apt:
name: yavdr-hardware-irmp
state: present
when: '"1209:4444" in usb'

View File

@@ -11,6 +11,5 @@
- name: apt | install vdr-plugin-satip if a Sat>IP server has been detected
apt:
name: vdr-plugin-satip
state: present
when: satip_devices
notify: [ 'Restart VDR' ]

View File

@@ -1,17 +0,0 @@
- name: get information about usb and pci hardware and loaded kernel modules
hardware_facts:
usb: True
pci: True
modules: True
gpus: True
acpi_power_modes: True
- debug:
var: '{{ item }}'
verbosity: 1
with_items:
- usb
- pci
- gpus
- modules
- acpi_power_modes

View File

@@ -1,3 +0,0 @@
---
# file roles/wakeup/defaults/main.yml
wakeup_method: "acpiwakeup"

View File

@@ -1,15 +0,0 @@
---
# file roles/wakeup/tasks/main.yml
- name: install and configure vdr-addon-acpiwakeup
block:
- apt:
name: vdr-addon-acpiwakeup
state: present
- lineinfile:
path: /etc/vdr/vdr-addon-acpiwakeup.conf
regexp: '^ACPI_ENABLED='
line: 'ACPI_ENABLED=true'
when: wakeup_method == "acpiwakeup"

View File

@@ -1,17 +0,0 @@
---
- name: apt | prevent automatic installation of recommended packages
template:
src: templates/90-norecommends.j2
dest: /etc/apt/apt.conf.d/90norecommends
- name: add PPAs
apt_repository:
repo: '{{ item }}'
state: present
update_cache: yes
with_items: '{{ repositories }}'
- name: run apt-get dist-upgrade
apt:
upgrade: dist
update_cache: yes

View File

@@ -1,57 +0,0 @@
- name: use bash instead of dash
shell: |
echo "set dash/sh false" | debconf-communicate
dpkg-reconfigure -f noninteractive dash
- name: create vdr group
group:
gid: '{{ vdr.gid }}'
state: present
name: '{{ vdr.group }}'
- name: create vdr user
user:
name: '{{ vdr.user }}'
group: '{{ vdr.group }}'
uid: '{{ vdr.uid }}'
home: '{{ vdr.home }}'
shell: '/bin/bash'
state: present
append: true
- name: disable release-upgrade notifications
lineinfile:
dest: /etc/update-manager/release-upgrades
backrefs: yes
state: present
regexp: '^(Prompt=).*$'
line: '\1never'
- name: apt | install basic packages
apt:
name: '{{ item }}'
state: present
install_recommends: no
with_items:
- anacron
- acl
- at
- bash-completion
#- biosdevname # caution: may change device names after a minimal installation!
- debconf-utils
- linux-firmware
- psmisc
- python-kmodpy
- python-requests
- python-usb
- python3-usb
- software-properties-common
- ssh
- wget
- wpasupplicant
- usbutils
- xfsprogs
- name: apt | install extra packages
apt:
name: '{{ item }}'
state: present
install_recommends: no
with_items:
'{{ extra_packages }}'

View File

@@ -1,8 +0,0 @@
- name: create media directories
file:
dest: '{{ item.value }}'
owner: '{{ vdr.user }}'
group: '{{ vdr.group }}'
state: directory
mode: '0777'
with_dict: '{{ media_dirs }}'

View File

@@ -1,9 +1,97 @@
---
# file: roles/yavdr-common/tasks/main.yml
- name: basic installation
block:
- import_tasks: configure_apt.yml
- import_tasks: configure_system.yml
- import_tasks: create_directories.yml
tags: [install]
- name: apt | prevent automatic installation of recommended packages
template:
src: templates/90-norecommends.j2
dest: /etc/apt/apt.conf.d/90norecommends
- name: use bash instead of dash
shell: |
echo "set dash/sh false" | debconf-communicate
dpkg-reconfigure -f noninteractive dash
- name: create vdr group
group:
gid: '{{ vdr.gid }}'
state: present
name: '{{ vdr.group }}'
- name: create vdr user
user:
name: '{{ vdr.user }}'
group: '{{ vdr.group }}'
uid: '{{ vdr.uid }}'
home: '{{ vdr.home }}'
shell: '/bin/bash'
state: present
append: true
- name: disable release-upgrade notifications
lineinfile:
dest: /etc/update-manager/release-upgrades
backrefs: yes
state: present
regexp: '^(Prompt=).*$'
line: '\1never'
- name: add PPAs
apt_repository:
repo: '{{ item }}'
state: present
update_cache: yes
with_items: '{{ repositories }}'
- name: run apt-get dist-upgrade
apt:
upgrade: dist
update_cache: yes
- name: apt | install basic packages
apt:
name: '{{ item }}'
state: present
install_recommends: no
with_items:
- anacron
- acl
- at
- bash-completion
#- biosdevname # caution: may change device names after a minimal installation!
- debconf-utils
- linux-firmware
- psmisc
- python-kmodpy
- python-requests
- python-usb
- python3-usb
- software-properties-common
- ssh
- wget
- wpasupplicant
- usbutils
- xfsprogs
- name: apt | install extra packages
apt:
name: '{{ item }}'
state: present
install_recommends: no
with_items:
'{{ extra_packages }}'
- name: get information about usb and pci hardware and loaded kernel modules
hardware_facts:
usb: True
pci: True
modules: True
gpus: True
- debug:
var: '{{ item }}'
verbosity: 1
with_items:
- usb
- pci
- gpus
- modules
- name: create media directories
file:
dest: '{{ item.value }}'
owner: '{{ vdr.user }}'
group: '{{ vdr.group }}'
state: directory
mode: '0777'
with_dict: '{{ media_dirs }}'

View File

@@ -7,7 +7,6 @@
become: true
roles:
- yavdr-common
- collect-facts # query system facts
- vdr
- yavdr-network
- samba-server
@@ -15,7 +14,6 @@
- nfs-server
- grub-config
- autoinstall-satip
- wakeup
tags:
- always
handlers:

View File

@@ -7,7 +7,6 @@
become: true
roles:
- yavdr-common # install and configure the basic system
- collect-facts # query system facts
- autoinstall-ubuntu-drivers # use ubuntu-drivers to install proprietary dirvers
# (e.g. nvidia, virtualbox)
# - nvidia-387 # install very recent nvidia-387 from ppa:graphics-drivers/ppa
@@ -26,11 +25,9 @@
- autoinstall-hauppauge-pvr # install vdr-plugin-pvrinput if a matching card is found
- autoinstall-dvbsddevice # install vdr-plugin-dvbsddevice if a matching card is detected
- autoinstall-hardware-irmp # install yavdr-hardware-irmp if a matching usb device is detected
- autoinstall-dvbsky-firmware # download an install required firmware files for dvbsky cards
- kodi
- dvd # set up packages and a udev rule to allow kodi and other players
# to play and eject optical media
- wakeup # set up wakeup methods for rtc etc.
- grub-config # configure grub
tags:
- always