add mount functionality

This commit is contained in:
Andreas Zweili 2019-02-03 21:34:36 +01:00
parent df95a80b37
commit 1ae842f81e
4 changed files with 81 additions and 1 deletions

View File

@ -179,3 +179,17 @@ def get_repository_stats():
json_output, json_err = p.communicate() json_output, json_err = p.communicate()
_process_json_error(json_err) _process_json_error(json_err)
return _process_json_repo_stats(json_output) return _process_json_repo_stats(json_output)
def mount(archive_name, mount_path):
p = subprocess.Popen(['borg', 'mount', '--log-json',
('::'
+ archive_name),
mount_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding='utf8')
json_output, json_err = p.communicate()
p.wait()
_process_json_error(json_err)

View File

@ -1,5 +1,6 @@
import os import os
import math import math
import shutil
from PyQt5.QtCore import QCoreApplication, QUrl from PyQt5.QtCore import QCoreApplication, QUrl
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
@ -36,3 +37,13 @@ def open_path(target_path):
if os.path.exists(target_path): if os.path.exists(target_path):
QDesktopServices.openUrl(QUrl.fromLocalFile( QDesktopServices.openUrl(QUrl.fromLocalFile(
os.path.abspath(target_path))) os.path.abspath(target_path)))
def create_path(path):
if not os.path.exists(path):
os.makedirs(path)
def remove_path(path):
if os.path.exists(path):
shutil.rmtree(path)

View File

@ -6,7 +6,8 @@ from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QMainWindow, QFileSystemModel, QFileDialog from PyQt5.QtWidgets import QMainWindow, QFileSystemModel, QFileDialog
from config import Config from config import Config
from helper import BorgException, show_error, convert_size, open_path from helper import (BorgException, show_error, convert_size, open_path,
create_path, remove_path)
import borg_interface as borg import borg_interface as borg
from progress import ProgressDialog from progress import ProgressDialog
@ -30,6 +31,9 @@ class MainWindow(QMainWindow):
# Create a Config object for storing the configuration. # Create a Config object for storing the configuration.
self.config = Config() self.config = Config()
# list of mounted archives
self.mount_paths = []
# File tree # File tree
model = QFileSystemModel() model = QFileSystemModel()
# model.setRootPath('/') # model.setRootPath('/')
@ -50,6 +54,7 @@ class MainWindow(QMainWindow):
self.action_backup.triggered.connect(self.create_backup) self.action_backup.triggered.connect(self.create_backup)
self.action_restore.triggered.connect(self.restore_backup) self.action_restore.triggered.connect(self.restore_backup)
self.action_delete.triggered.connect(self.delete_backup) self.action_delete.triggered.connect(self.delete_backup)
self.action_mount.triggered.connect(self.mount_backup)
def start(self): def start(self):
"""This method is intendet to be used only once at the application """This method is intendet to be used only once at the application
@ -64,6 +69,14 @@ class MainWindow(QMainWindow):
show_error(e) show_error(e)
sys.exit(1) sys.exit(1)
def closeEvent(self, *args, **kwargs):
super(QMainWindow, self).closeEvent(*args, **kwargs)
if self.mount_paths:
for path in self.mount_paths:
if os.path.exists(path):
os.system('borg umount ' + path)
remove_path(path)
def show_settings(self): def show_settings(self):
"""Display the settings dialog.""" """Display the settings dialog."""
self.config.set_form_values() self.config.set_form_values()
@ -175,3 +188,24 @@ class MainWindow(QMainWindow):
self.label_repo_deduplicated_size.setText( self.label_repo_deduplicated_size.setText(
"Deduplicated Size: " "Deduplicated Size: "
+ convert_size(stats['unique_csize'])) + convert_size(stats['unique_csize']))
def mount_backup(self):
try:
archive_name = self.selected_archive
except AttributeError:
error = BorgException("Please create or select a backup first.")
archive_name = None
show_error(error)
if archive_name:
mount_path = os.path.join('/tmp/', archive_name)
create_path(mount_path)
if os.access(mount_path, os.W_OK):
self.mount_paths.append(mount_path)
try:
borg.mount(archive_name, mount_path)
open_path(mount_path)
except BorgException as e:
show_error(e)
else:
open_path(mount_path)

View File

@ -10,6 +10,7 @@ from PyQt5.QtWidgets import QApplication
import context import context
from testcase import BorgInterfaceTest from testcase import BorgInterfaceTest
import borg_interface as borg import borg_interface as borg
from helper import create_path, remove_path
app = QApplication(sys.argv) app = QApplication(sys.argv)
@ -55,3 +56,23 @@ class DeleteTestCase(BorgInterfaceTest):
thread.run() thread.run()
repo_archives = borg.get_archives() repo_archives = borg.get_archives()
self.assertEqual(repo_archives, []) self.assertEqual(repo_archives, [])
class MountTestCase(BorgInterfaceTest):
def setUp(self):
super().setUp()
borg.backup(['.'])
def tearDown(self):
os.system('borg umount ' + self.mount_path)
remove_path(self.mount_path)
super().tearDown()
def test_restore(self):
repo_archives = borg.get_archives()
archive_name = repo_archives[0]['name']
self.mount_path = os.path.join('/tmp/', archive_name)
create_path(self.mount_path)
borg.mount(archive_name, self.mount_path)
self.assertTrue(os.path.exists(
os.path.join(self.mount_path, os.path.realpath(__file__))))