From 6e9c3ccb0a40768f19950f096eb5d5fdcf1db198 Mon Sep 17 00:00:00 2001
From: Adar Nimrod <nimrod@shore.co.il>
Date: Sat, 13 Mar 2021 18:55:32 +0200
Subject: [PATCH] Periodic scrubbing of btrfs volumes.

---
 roles/debian_server/files/btrfs-scrub   | 16 ++++++++++++++++
 roles/debian_server/files/scrub.service |  8 ++++++++
 roles/debian_server/files/scrub.timer   |  8 ++++++++
 roles/debian_server/tasks/main.yml      | 21 +++++++++++++++++++++
 4 files changed, 53 insertions(+)
 create mode 100755 roles/debian_server/files/btrfs-scrub
 create mode 100644 roles/debian_server/files/scrub.service
 create mode 100644 roles/debian_server/files/scrub.timer

diff --git a/roles/debian_server/files/btrfs-scrub b/roles/debian_server/files/btrfs-scrub
new file mode 100755
index 0000000..ac980d3
--- /dev/null
+++ b/roles/debian_server/files/btrfs-scrub
@@ -0,0 +1,16 @@
+#!/bin/sh
+set -eu
+
+for mp in $(lsblk --list --noheadings --output fstype,mountpoint | \
+            awk '$1 == "btrfs" {print $2}' | \
+            sort -u)
+do
+    status="$(btrfs scrub status "$mp" | awk '$1 == "Status:" {print $2}')"
+    if [ "$status" = 'running' ]
+    then
+        echo "Scrub already running on $mp, skipping." >&2
+        continue
+    fi
+    btrfs scrub start "$mp"
+    echo "Started scrub on $mp." >&2
+done
diff --git a/roles/debian_server/files/scrub.service b/roles/debian_server/files/scrub.service
new file mode 100644
index 0000000..62f1c8d
--- /dev/null
+++ b/roles/debian_server/files/scrub.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Scrub btrfs volumes
+ConditionACPower=true
+After=local-fs.target
+
+[Service]
+Type=oneshot
+ExecStart=btrfs-scrub
diff --git a/roles/debian_server/files/scrub.timer b/roles/debian_server/files/scrub.timer
new file mode 100644
index 0000000..8496565
--- /dev/null
+++ b/roles/debian_server/files/scrub.timer
@@ -0,0 +1,8 @@
+[Unit]
+Description=Scrub btrfs volumes
+
+[Timer]
+OnCalendar=weekly
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/debian_server/tasks/main.yml b/roles/debian_server/tasks/main.yml
index 0a4df56..4abc176 100644
--- a/roles/debian_server/tasks/main.yml
+++ b/roles/debian_server/tasks/main.yml
@@ -233,3 +233,24 @@
     enabled: true
     name: update.timer
     state: started
+
+- name: Copy the btrfs scrub script
+  ansible.builtin.copy:
+    dest: /usr/local/sbin/btrfs-scrub
+    mode: 0o0755
+    src: btrfs-scrub
+
+- name: Copy btrfs scrub service and timer
+  loop:
+    - scrub.service
+    - scrub.timer
+  ansible.builtin.copy:
+    dest: /etc/systemd/system
+    mode: 0o0644
+    src: '{{ item }}'
+
+- name: Enable the btrfs scrub timer
+  ansible.builtin.systemd:
+    enabled: true
+    name: scrub.timer
+    state: started
-- 
GitLab