From d4d5c15566aecc12844843b2cacced35a1184f10 Mon Sep 17 00:00:00 2001 From: Michael Pimmer Date: Mon, 29 Oct 2018 10:11:30 +0000 Subject: [PATCH] Backups: show free disk space on upload+restore page Reviewed-by: James Valleroy --- .../backups/templates/backups_upload.html | 5 +++- plinth/modules/backups/views.py | 13 +++++++++- plinth/modules/storage/__init__.py | 21 ++++++++++++++- plinth/modules/storage/views.py | 26 +++++++------------ 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/plinth/modules/backups/templates/backups_upload.html b/plinth/modules/backups/templates/backups_upload.html index 4c75fc10c..51a6a8efb 100644 --- a/plinth/modules/backups/templates/backups_upload.html +++ b/plinth/modules/backups/templates/backups_upload.html @@ -32,7 +32,10 @@ You can choose the apps you wish to import after uploading a backup file. {% endblocktrans %}

-
+
{% csrf_token %} diff --git a/plinth/modules/backups/views.py b/plinth/modules/backups/views.py index 60920e376..dae3f5fc7 100644 --- a/plinth/modules/backups/views.py +++ b/plinth/modules/backups/views.py @@ -21,6 +21,7 @@ Views for the backups app. from datetime import datetime import gzip from io import BytesIO +import logging import mimetypes import os import tempfile @@ -36,12 +37,15 @@ from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy from django.views.generic import View, FormView, TemplateView -from plinth.modules import backups from plinth import actions +from plinth.errors import PlinthError +from plinth.modules import backups, storage from . import api, forms, SESSION_PATH_VARIABLE from .decorators import delete_tmp_backup_file +logger = logging.getLogger(__name__) + subsubmenu = [{ 'url': reverse_lazy('backups:index'), 'text': ugettext_lazy('Backups') @@ -142,6 +146,13 @@ class UploadArchiveView(SuccessMessageMixin, FormView): context = super().get_context_data(**kwargs) context['title'] = _('Upload and restore a backup file') context['subsubmenu'] = subsubmenu + try: + disk_info = storage.get_disk_info('/', self.request) + except (PlinthError, PermissionError): + logger.error('Error getting information about root partition.') + else: + context['free_space'] = storage.format_bytes( + disk_info["free_bytes"]) return context def form_valid(self, form): diff --git a/plinth/modules/storage/__init__.py b/plinth/modules/storage/__init__.py index d3d0f19ce..cb4fd3357 100644 --- a/plinth/modules/storage/__init__.py +++ b/plinth/modules/storage/__init__.py @@ -25,8 +25,9 @@ from django.utils.translation import ugettext_lazy as _ from plinth import service as service_module from plinth import action_utils, actions, cfg +from plinth.errors import PlinthError from plinth.menu import main_menu -from plinth.utils import format_lazy +from plinth.utils import format_lazy, is_user_admin from .manifest import backup @@ -77,6 +78,24 @@ def get_disks(): return combined_list +def get_disk_info(mountpoint, request): + """Get information about the free space of a drive""" + if not is_user_admin(request, cached=True): + raise PermissionError + disks = get_disks() + list_root = [disk for disk in disks if disk['mountpoint'] == mountpoint] + if not list_root: + raise PlinthError + percent_used = list_root[0]['percent_used'] + free_bytes = list_root[0]['free'] + free_gib = free_bytes / (1024**3) + return { + "percent_used": percent_used, + "free_bytes": free_bytes, + "free_gib": free_gib + } + + def _get_disks_from_df(): """Return the list of disks and free space available using 'df'.""" command = [ diff --git a/plinth/modules/storage/views.py b/plinth/modules/storage/views.py index 248aab9a2..87cdb8f09 100644 --- a/plinth/modules/storage/views.py +++ b/plinth/modules/storage/views.py @@ -30,10 +30,11 @@ from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST from plinth import actions +from plinth.errors import PlinthError from plinth.modules import storage -from plinth.utils import format_lazy, is_user_admin +from plinth.utils import format_lazy -from . import udisks2 +from . import udisks2, get_disk_info logger = logging.getLogger(__name__) @@ -91,29 +92,22 @@ def expand_partition(request, device): def warn_about_low_disk_space(request): """Warn about insufficient space on root partition.""" - if not is_user_admin(request, cached=True): - return - - disks = storage.get_disks() - list_root = [disk for disk in disks if disk['mountpoint'] == '/'] - if not list_root: + try: + root_info = get_disk_info('/', request) + except (PlinthError, PermissionError): logger.error('Error getting information about root partition.') return - percent_used = list_root[0]['percent_used'] - free_bytes = list_root[0]['free'] - free_gib = free_bytes / (1024**3) - message = format_lazy( # Translators: xgettext:no-python-format _('Warning: Low space on system partition ({percent_used}% used, ' '{free_space} free).'), - percent_used=percent_used, - free_space=storage.format_bytes(free_bytes)) + percent_used=root_info["percent_used"], + free_space=storage.format_bytes(root_info["free_bytes"])) - if percent_used > 90 or free_gib < 1: + if root_info["percent_used"] > 90 or root_info["free_gib"] < 1: messages.error(request, message) - elif percent_used > 75 or free_gib < 2: + elif root_info["percent_used"] > 75 or root_info["free_gib"] < 2: messages.warning(request, message)