From f6c31f80ba9e7ea404b049c96b784d2f9d7592ff Mon Sep 17 00:00:00 2001 From: Jerry Vonau Date: Sun, 2 Aug 2020 13:36:56 -0500 Subject: [PATCH] handle firmware downgrade --- roles/firmware/tasks/install.yml | 23 +++++++++++++++++++ roles/firmware/tasks/main.yml | 20 ++++++++++++++++ .../firmware/templates/check-firmware.service | 11 +++++++++ roles/firmware/templates/check-firmware.sh | 22 ++++++++++++++++++ roles/firmware/templates/fw_warn.sh | 6 +++++ roles/network/tasks/main.yml | 5 ++++ 6 files changed, 87 insertions(+) create mode 100644 roles/firmware/tasks/install.yml create mode 100644 roles/firmware/tasks/main.yml create mode 100644 roles/firmware/templates/check-firmware.service create mode 100644 roles/firmware/templates/check-firmware.sh create mode 100644 roles/firmware/templates/fw_warn.sh diff --git a/roles/firmware/tasks/install.yml b/roles/firmware/tasks/install.yml new file mode 100644 index 000000000..0bfe74f63 --- /dev/null +++ b/roles/firmware/tasks/install.yml @@ -0,0 +1,23 @@ +# check the timestamps, might want to preserve the old ones +- name: Backup OS provided Firmware + copy: + src: "/lib/firmware/brcm/{{ item }}" + dest: "/lib/firmware/brcm/{{ item }}.orig" + with_items: + - brcmfmac43430-sdio.bin + - brcmfmac43455-sdio.bin + +# grab the old firmware +- name: Retrieve older firmware + get_url: + url: "{{ item.url }}" + dest: "{{ item.dest }}" + with_items: + - { url: 'http://download.iiab.io/packages/brcmfmac43430-sdio.bin_2020-02-16_7.45.98.97' dest:/lib/firmware/brcm/brcmfmac43430-sdio.bin_iiab } + - { url: 'http://download.iiab.io/packages/brcmfmac43455-sdio.bin_2015-03-01_7.45.18.0_ub19.10.1' dest: '/lib/firmware/brcm/brcmfmac43455-sdio.bin_iiab' } + +- name: "Add 'firmware_retrieved: True' to {{ iiab_state_file }}" + lineinfile: + path: "{{ iiab_state_file }}" # /etc/iiab/iiab_state.yml + regexp: '^RPi_firmware_retrieved' + line: 'RPi_firmware_retrieved: True' diff --git a/roles/firmware/tasks/main.yml b/roles/firmware/tasks/main.yml new file mode 100644 index 000000000..0a6ca75bb --- /dev/null +++ b/roles/firmware/tasks/main.yml @@ -0,0 +1,20 @@ +- name: Include older RPi Firmware + include_tasks: install.yml + when: RPi_firmware_retrieved is undefined + +- name: Install check-firmware service files + template: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode }}" + with_items: + - { src: 'fw-warn.sh', dest: '/usr/sbin/' mode: '0644' } + - { src: 'check-firmware.service', dest: '/etc/systemd/system/' mode: '0644'} + - { src: 'check-firmware.sh', dest: '/usr/sbin/' mode: '0755' } + +- name: Enable and Start check-firmware.service + systemd: + name: check-firmware.service + state: reloaded + enabled: yes + status: started diff --git a/roles/firmware/templates/check-firmware.service b/roles/firmware/templates/check-firmware.service new file mode 100644 index 000000000..3181897df --- /dev/null +++ b/roles/firmware/templates/check-firmware.service @@ -0,0 +1,11 @@ +[Unit] +Description=Check Firmware service +Before=clone-wifi.service + +[Service] +Type=oneshot +ExecStart=/usr/sbin/check-firmware + +[Install] +WantedBy=multi-user.target + diff --git a/roles/firmware/templates/check-firmware.sh b/roles/firmware/templates/check-firmware.sh new file mode 100644 index 000000000..7a0bc5d9c --- /dev/null +++ b/roles/firmware/templates/check-firmware.sh @@ -0,0 +1,22 @@ +#!/bin/bash +FW_MODE=$(grep wifi_hotspot_capacity_rpi_fix /etc/iiab/local_vars.yml| grep True) +WARN=0 +if [ -z "$FW_MODE" ]; then + echo "FW marker not found" +else + echo "$FW_MODE" + if ! $(diff -q /lib/firmware/brcm/brcmfmac43455-sdio.bin.iiab /lib/firmware/brcm/brcmfmac43455-sdio.bin); then + cp /lib/firmware/brcm/brcmfmac43455-sdio.bin.iiab /lib/firmware/brcm/brcmfmac43455-sdio.bin + WARN=1 + fi + if ! $(diff -q /lib/firmware/brcm/brcmfmac43430-sdio.bin.iiab /lib/firmware/brcm/brcmfmac43430-sdio.bin); then + cp /lib/firmware/brcm/brcmfmac43430-sdio.bin.iiab /lib/firmware/brcm/brcmfmac43430-sdio.bin + WARN=1 + fi +fi +if [ "$WARN" = "1" ] + touch /.fw_replaced +else + rm /.fw_replaced +fi +exit 0 diff --git a/roles/firmware/templates/fw_warn.sh b/roles/firmware/templates/fw_warn.sh new file mode 100644 index 000000000..c6a6e2bfe --- /dev/null +++ b/roles/firmware/templates/fw_warn.sh @@ -0,0 +1,6 @@ +#!/bin/bash +if [ -f /.fw_replaced ]; then + echo -e " \033[31;5mFirmware has been replaced\033[0m" + echo -e " \033[31;5mReboot is required to activate\033[0m" +fi + diff --git a/roles/network/tasks/main.yml b/roles/network/tasks/main.yml index 1ffc904d0..35bd3c66d 100644 --- a/roles/network/tasks/main.yml +++ b/roles/network/tasks/main.yml @@ -1,3 +1,8 @@ +- name: Select RPi firmware mode + include_role: + name: firmware + when: rpi_model != "none" + - name: detected_network include_tasks: detected_network.yml