From fa5b932c133f6bbbbe01bfd729ca19f88df6473d Mon Sep 17 00:00:00 2001 From: dlandon Date: Wed, 5 Jun 2024 15:15:37 -0500 Subject: [PATCH] Add more info to btrfs pools and more user friendly xfs repairs. --- emhttp/plugins/dynamix/DeviceInfo.page | 89 +++++++++++++++----- emhttp/plugins/dynamix/scripts/btrfs_check | 66 +++++++++++---- emhttp/plugins/dynamix/scripts/xfs_check | 97 +++++++++++++++++++--- 3 files changed, 207 insertions(+), 45 deletions(-) diff --git a/emhttp/plugins/dynamix/DeviceInfo.page b/emhttp/plugins/dynamix/DeviceInfo.page index c84550011..739bd8978 100755 --- a/emhttp/plugins/dynamix/DeviceInfo.page +++ b/emhttp/plugins/dynamix/DeviceInfo.page @@ -756,14 +756,30 @@ _(Critical disk utilization threshold)_ (%): + +
_(Pool Device Status)_
+
+ +_(pool device stats)_: +: ".shell_exec("/sbin/btrfs dev stats -T /mnt/$tag").""?> + + + + + +  +: +
+ +
_(Balance Status)_
-_(btrfs filesystem df)_: -: ".shell_exec("/sbin/btrfs filesystem df /mnt/$tag").""?> +_(btrfs filesystem usage)_: +: ".shell_exec("/sbin/btrfs fi usage -T /mnt/$tag").""?> _(btrfs balance status)_: : ".implode("\n", $balance_status).""?> @@ -803,7 +819,7 @@ _(btrfs balance status)_:   -: +: *_(Running)_* :info_balance_cancel_help: @@ -811,7 +827,7 @@ _(btrfs balance status)_:   -: "._('Balance')." "._('is only available when array is Started') : sprintf(_('See %s Settings'),ucfirst(prefix($tag)))?> +: _(Balance)_ _(is only available when the filesyestem is mounted)_
@@ -885,10 +901,10 @@ _(btrfs scrub status)_: - +   -: +: :info_btrfs_scrub_help: @@ -898,7 +914,7 @@ _(btrfs scrub status)_:   -: +: *_(Running)_* :info_scrub_cancel_help: @@ -906,7 +922,7 @@ _(btrfs scrub status)_:   -: "._('Scrub')." "._('is only available when array is Started') : sprintf(_('See %s Settings'),ucfirst(prefix($tag)))?> +: _(Scrub)_ _(is only available when the filesyestem is mounted)_ @@ -973,7 +989,7 @@ _(Time of the day)_: _(btrfs check status)_: : ".implode("\n", $check_status).""?> - + @@ -998,15 +1014,9 @@ _(btrfs check status)_: -   : **_(Check)_** _(is only available when array is Started in **Maintenance** mode)_. - -  -: . - - @@ -1036,7 +1046,7 @@ _(zfs pool status)_:   -: +: *_(Running)_* :info_scrub_cancel_help: @@ -1044,7 +1054,7 @@ _(zfs pool status)_:   -: "._('Scrub')." "._('is only available when array is Started') : sprintf(_('See %s Settings'),ucfirst(prefix($tag)))?> +: "._('Scrub')." "._('is only available when the filesyestem is mounted') : sprintf(_('See %s Settings'),ucfirst(prefix($tag)))?> @@ -1152,18 +1162,57 @@ _(reiserfsck status)_: _(xfs_repair status)_: : ".implode("\n", $check_status).""?> - + +   -: _(Options (see Help))_ +: _(No file system corruption detected)_. :info_xfs_check_help: - + + + + + + + +  +: _(File system corruption detected)_. + +:info_xfs_check_help: + + + + + + + + +  +: _(Dirty log detected)_. + +

_(Note)_: _(While there is some risk, if it is not possible to first mount the filesystem to clear the log, zeroing it is the only option to try and repair the filesystem, and in most cases it results in little or no data loss)_.

+ +:info_xfs_check_help: + + + + + + + + +  +: _(File system corruption fixed)_ + +:info_xfs_check_help: + + diff --git a/emhttp/plugins/dynamix/scripts/btrfs_check b/emhttp/plugins/dynamix/scripts/btrfs_check index bafdb0cd0..3454bbc80 100755 --- a/emhttp/plugins/dynamix/scripts/btrfs_check +++ b/emhttp/plugins/dynamix/scripts/btrfs_check @@ -1,28 +1,64 @@ #!/bin/bash -# btrfs_check start +# btrfs_check start # btrfs_check status # btrfs_check cancel +# btrfs_check reset -# by default btrfs-check outputs to /var/lib/btrfs +# By default btrfs-check outputs to /var/lib/btrfs mkdir -p /var/lib/btrfs + case "$1" in 'start') - exec /sbin/btrfs check $4 $2 &> /var/lib/btrfs/check.status.$3 & + # Start the btrfs check process in the background and log output + /sbin/btrfs check $4 $2 &> /var/lib/btrfs/check.status.$3 & + pid=$! + echo $pid > /var/lib/btrfs/check.pid.$3 + exit 0 ;; 'status') - if [ -f /var/lib/btrfs/check.status.$3 ]; then - cat /var/lib/btrfs/check.status.$3 - else - echo "Not available" - fi; - # establish retval of this script: 0 running, 1 not running - pgrep -f "/sbin/btrfs check .*$2" >/dev/null + # Check if the process is running and set the return value accordingly + if [ -f /var/lib/btrfs/check.pid.$3 ]; then + cat /var/lib/btrfs/check.status.$3 + pid=$(cat /var/lib/btrfs/check.pid.$3) + if kill -0 $pid 2>/dev/null; then + # Process is running + exit 9 + else + if [ -f /var/lib/btrfs/check.status.$3 ]; then + rm -f /var/lib/btrfs/check.pid.$3 + fi + fi + else + if [ -f /var/lib/btrfs/check.status.$3 ]; then + cat /var/lib/btrfs/check.status.$3 + else + echo "Not available" + fi + fi + + exit 0 ;; 'cancel') - pkill -f "/sbin/btrfs_check.*$2" - while pgrep -f "/sbin/btrfs check .*$2" >/dev/null ; do - sleep 1 - done - echo "Cancelled" >> /var/lib/btrfs/check.status.$3 + # Cancel the btrfs check process + if [ -f /var/lib/btrfs/check.pid.$3 ]; then + pid=$(cat /var/lib/btrfs/check.pid.$3) + kill $pid + while kill -0 $pid 2>/dev/null; do + sleep 1 + done + echo -e "\nCancelled" >> /var/lib/btrfs/check.status.$3 + rm -f /var/lib/btrfs/check.pid.$3 + else + echo "No process to cancel" + fi + + exit 0 +;; +'reset') + exec /sbin/btrfs device stats -z $2 +;; +*) + echo "Invalid command" + exit 0 ;; esac diff --git a/emhttp/plugins/dynamix/scripts/xfs_check b/emhttp/plugins/dynamix/scripts/xfs_check index 6358b4610..86d5ad8cb 100755 --- a/emhttp/plugins/dynamix/scripts/xfs_check +++ b/emhttp/plugins/dynamix/scripts/xfs_check @@ -1,23 +1,100 @@ #!/bin/bash # xfs_check start # xfs_check status -# xfs_check cancel +# xfs_check cancel +# xfs_check zero_log -# using /var/lib because that's where btrfs puts status +# Exit codes: +# 0 - No corruption detected or process not found. +# 1 - Corruption detected. +# 2 - Dirty log. +# 4 - File system corruption fixed. +# 8 - No check has been run yet. +# 9 - Process is still running. + +# Using /var/lib because that's where btrfs puts status mkdir -p /var/lib/xfs + case "$1" in 'start') - exec /sbin/xfs_repair $4 $2 &> /var/lib/xfs/check.status.$3 & + # Start the xfs_repair process in the background and log output + nohup bash -c "( + /sbin/xfs_repair $4 $2 &> /var/lib/xfs/check.status.$3 + echo \$? > /var/lib/xfs/check.status.$3.exit + rm -f /var/lib/xfs/check.pid.$3 + ) &" & + pid=$! + echo $pid > /var/lib/xfs/check.pid.$3 + exit 0 ;; 'status') - if [ -f /var/lib/xfs/check.status.$3 ]; then - cat /var/lib/xfs/check.status.$3 - else - echo "Not available" - fi; - pgrep -f "/sbin/xfs_repair.*$2" >/dev/null + # Check if the process is still running + if [ -f /var/lib/xfs/check.pid.$3 ]; then + pid=$(cat /var/lib/xfs/check.pid.$3) + if kill -0 $pid 2>/dev/null; then + # Process is running, return status and exit code 9 + cat /var/lib/xfs/check.status.$3 + exit 9 + else + # Process is not running, read the exit status if available + if [ -f /var/lib/xfs/check.status.$3.exit ]; then + exit_status=$(cat /var/lib/xfs/check.status.$3.exit) + cat /var/lib/xfs/check.status.$3 + rm -f /var/lib/xfs/check.pid.$3 + if [[ $exit_status -eq 0 || $exit_status -eq 1 || $exit_status -eq 2 || $exit_status -eq 4 ]]; then + exit $exit_status + else + exit 0 + fi + else + # Exit status file does not exist, but return status file if available + if [ -f /var/lib/xfs/check.status.$3 ]; then + cat /var/lib/xfs/check.status.$3 + fi + exit 8 + fi + fi + else + # No PID file found, check for existing status + if [ -f /var/lib/xfs/check.status.$3 ]; then + cat /var/lib/xfs/check.status.$3 + # If no exit status file, assume process completed successfully + if [ -f /var/lib/xfs/check.status.$3.exit ]; then + exit_status=$(cat /var/lib/xfs/check.status.$3.exit) + if [[ $exit_status -eq 0 || $exit_status -eq 1 || $exit_status -eq 2 || $exit_status -eq 4 ]]; then + exit $exit_status + else + exit 0 + fi + else + exit 8 + fi + else + # No status file found + echo "Not available" + exit 8 + fi + fi ;; 'cancel') - pkill -f "/sbin/xfs_repair.*$2" + # Cancel the xfs_repair process + if [ -f /var/lib/xfs/check.pid.$3 ]; then + pid=$(cat /var/lib/xfs/check.pid.$3) + kill $pid + while kill -0 $pid 2>/dev/null; do + sleep 1 + done + echo -e "\nCancelled" >> /var/lib/xfs/check.status.$3 + rm -f /var/lib/xfs/check.pid.$3 + else + echo "No process to cancel" + fi + + exit 0 +;; +*) + # Handle invalid commands + echo "Invalid command" + exit 0 ;; esac