securedrop_salt/sd-sys-vms.sls (125 lines of code) (raw):
# -*- coding: utf-8 -*-
# vim: set syntax=yaml ts=2 sw=2 sts=2 et :
#
# Ensures that sys-* VMs (viz. sys-net, sys-firewall, sys-usb) use
# an up-to-date version of Fedora, in order to receive security updates.
include:
# Import the upstream Qubes-maintained default-dispvm to ensure Fedora-based
# DispVM is created
- qvm.default-dispvm
# 4.2 fedora template is fedora-NN-xfce, but let's keep the dvm names to
# follow simple - like sd-fedora-NN-dvm
{% set sd_supported_fedora_version = 'fedora-40' %}
{% set sd_fedora_base_template = sd_supported_fedora_version + '-xfce' %}
# Install latest templates required for SDW VMs.
dom0-install-fedora-template:
cmd.run:
- name: >
qvm-template info --machine-readable {{ sd_fedora_base_template }} | grep -q "installed|{{ sd_fedora_base_template }}|" || qvm-template install {{ sd_fedora_base_template }}
# Update the mgmt VM before updating the new Fedora VM. The order is required
set-fedora-template-as-default-mgmt-dvm:
cmd.run:
- name: >
qvm-shutdown --wait default-mgmt-dvm &&
qvm-prefs default-mgmt-dvm template {{ sd_fedora_base_template }}
- require:
- cmd: dom0-install-fedora-template
# If the VM has just been installed via package manager, update it immediately
update-fedora-template-if-new:
cmd.wait:
- name: sudo qubesctl --skip-dom0 --targets {{ sd_supported_fedora_version }} state.sls update.qubes-vm
- require:
- cmd: dom0-install-fedora-template
# Update the mgmt-dvm setting first, to avoid problems during first update
- cmd: set-fedora-template-as-default-mgmt-dvm
- watch:
- cmd: dom0-install-fedora-template
# qvm.default-dispvm is not strictly required here, but we want it to be
# updated as soon as possible to ensure make clean completes successfully, as
# is sets the default_dispvm to the DispVM based on the wanted Fedora version.
set-fedora-default-template-version:
cmd.run:
- name: qubes-prefs default_template {{ sd_fedora_base_template }}
- require:
- cmd: dom0-install-fedora-template
- sls: qvm.default-dispvm
# On 4.1, several sys qubes are disposable by default - since we also want to
# upgrade the templates for those, we need to ensure that the respective dvms
# exist, as just installing a new template won't create a DispVM template
# automatically.
# sys-usb is also disposable by default but a special case as we want to
# customize the underlying DispVM template for usability purposes: we want to
# consistently auto-attach USB devices to our sd-devices qube
#
{% set required_dispvms = [ sd_supported_fedora_version + '-dvm' ] %}
{% if salt['pillar.get']('qvm:sys-usb:disposable', true) %}
{% set _ = required_dispvms.append("sd-" + sd_supported_fedora_version + "-dvm") %}
{% endif %}
{% for required_dispvm in required_dispvms %}
create-{{ required_dispvm }}:
qvm.vm:
- name: {{ required_dispvm }}
- present:
- template: {{ sd_fedora_base_template }}
- label: red
- prefs:
- template: {{ sd_fedora_base_template }}
- template_for_dispvms: True
{% if required_dispvm == 'sd-' + sd_supported_fedora_version + '-dvm' %}
- netvm: ""
{% endif %}
- require:
- cmd: dom0-install-fedora-template
{% endfor %}
# Now proceed with rebooting all the sys-* VMs, since the new template is up to date.
{% for sys_vm in ['sys-usb', 'sys-net', 'sys-firewall'] %}
{% if salt['pillar.get']('qvm:' + sys_vm + ':disposable', false) %}
# As of Qubes 4.1, certain sys-* VMs will be DispVMs by default.
{% if sys_vm == 'sys-usb' %}
# If sys-usb is disposable, we want it to use the template we just created so we
# can customize it later in the process
{% set sd_supported_fedora_template = 'sd-' + sd_supported_fedora_version + '-dvm' %}
{% else %}
{% set sd_supported_fedora_template = sd_supported_fedora_version + '-dvm' %}
{% endif %}
{% else %}
{% set sd_supported_fedora_template = sd_fedora_base_template %}
{% endif %}
{% if salt['cmd.shell']('qvm-prefs ' + sys_vm + ' template') != sd_supported_fedora_template %}
sd-{{ sys_vm }}-fedora-version-halt:
qvm.kill:
- name: {{ sys_vm }}
- require:
- cmd: dom0-install-fedora-template
sd-{{ sys_vm }}-fedora-version-halt-wait:
cmd.run:
- name: sleep 5
- require:
- cmd: dom0-install-fedora-template
sd-{{ sys_vm }}-fedora-version-update:
qvm.vm:
- name: {{ sys_vm }}
- prefs:
- template: {{ sd_supported_fedora_template }}
- require:
- cmd: sd-{{ sys_vm }}-fedora-version-halt-wait
{% if sd_supported_fedora_template.endswith("-dvm") %}
- qvm: create-{{ sd_supported_fedora_template }}
{% endif %}
# Finally, remove the old supported fedora DVM we created. We won't uninstall
# the template, in case it's being used elsewhere, but the `sd-` VMs we can
# reasonably manage (remove) ourselves.
{% if sys_vm == "sys-usb" %}
remove-sd-fedora-39-dvm:
qvm.absent:
- name: sd-fedora-39-dvm
- require:
- qvm: sd-sys-usb-fedora-version-update
{% endif %}
sd-{{ sys_vm }}-fedora-version-start:
qvm.start:
- name: {{ sys_vm }}
- require:
- qvm: sd-{{ sys_vm }}-fedora-version-update
{% endif %}
{% endfor %}