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 3eb3f62772..c49b6aeeb8 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 9846c9e0bb..3d85718fb5 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 96121b0cc7..f3cfd25612 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