From 64b3512084fef5ef1fc52073eb3959de5e5686cc Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Tue, 18 Feb 2020 15:13:09 +1100 Subject: [PATCH] DEV: use DiskSpace module for all disk space calculations This normalizes it so we only carry one place for grabbing disk space size It also normalizes the command made so it uses Discourse.execute_command which splits off params in a far cleaner way. --- app/controllers/admin/backups_controller.rb | 2 +- lib/cooked_post_processor.rb | 2 +- lib/disk_space.rb | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/backups_controller.rb b/app/controllers/admin/backups_controller.rb index 3eb3f627720..c49b6aeeb8f 100644 --- a/app/controllers/admin/backups_controller.rb +++ b/app/controllers/admin/backups_controller.rb @@ -215,7 +215,7 @@ class Admin::BackupsController < Admin::AdminController private def has_enough_space_on_disk?(size) - `df -Pk #{Rails.root}/public/backups | awk 'NR==2 {printf "%.0f", $4 * 1024;}'`.to_i > size + DiskSpace.free("#{Rails.root}/public/backups") > size end def ensure_backups_enabled diff --git a/lib/cooked_post_processor.rb b/lib/cooked_post_processor.rb index 9846c9e0bb2..3d85718fb56 100644 --- a/lib/cooked_post_processor.rb +++ b/lib/cooked_post_processor.rb @@ -685,7 +685,7 @@ class CookedPostProcessor end def available_disk_space - 100 - `df -P #{Rails.root}/public/uploads | tail -1 | tr -s ' ' | cut -d ' ' -f 5`.to_i + 100 - DiskSpace.percent_free("#{Rails.root}/public/uploads") end def dirty? diff --git a/lib/disk_space.rb b/lib/disk_space.rb index 96121b0cc73..f3cfd256127 100644 --- a/lib/disk_space.rb +++ b/lib/disk_space.rb @@ -12,11 +12,19 @@ class DiskSpace end def self.free(path) - `df -Pk #{path} | awk 'NR==2 {print $4;}'`.to_i * 1024 + output = Discourse::Utils.execute_command('df', '-Pk', path) + size_line = output.split("\n")[1] + size_line.split(/\s+/)[3].to_i * 1024 + end + + def self.percent_free(path) + output = Discourse::Utils.execute_command('df', '-P', path) + size_line = output.split("\n")[1] + size_line.split(/\s+/)[4].to_i end def self.used(path) - `du -s #{path}`.to_i * 1024 + Discourse::Utils.execute_command("du", "-s", path).to_i * 1024 end def self.uploads_path