mirror of https://github.com/borgbase/vorta
Implement borg v2 compatibility for most commands.
Adjust available encryptions for borg v2. Use `-r` for all/most commands. Implement `rinfo`. Use `ssh://` style URL as a placeholder. Implement compatibility for `borg extract`. Adjust for beta3, use --match-archives for deletions Co-authored-by: real-yfprojects <real-yfprojects@users.noreply.github.com> Co-authored-by: Manu <manu@snapdragon.cc>
This commit is contained in:
parent
fa3a6cf7e6
commit
2b2d61baa5
|
@ -1,279 +1,278 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AddRepository</class>
|
||||
<widget class="QDialog" name="AddRepository">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>464</width>
|
||||
<height>274</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="modal">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="verticalSpacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="errorText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>11</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<class>AddRepository</class>
|
||||
<widget class="QDialog" name="AddRepository">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>466</width>
|
||||
<height>274</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="modal">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tabWidgetPage1">
|
||||
<attribute name="title">
|
||||
<string>General</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="repoDataFormLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="title">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Initialize New Backup Repository</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="repoLabel">
|
||||
<property name="text">
|
||||
<string>Repository URL:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="repoURL">
|
||||
<property name="placeholderText">
|
||||
<string>ssh://abc123@abc123.repo.borgbase.com/./repo</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="chooseLocalFolderButton">
|
||||
<property name="toolTip">
|
||||
<string>Choose a local folder</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>:/icons/folder-open.svg</normaloff>:/icons/folder-open.svg</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="useRemoteRepoButton">
|
||||
<property name="toolTip">
|
||||
<string>Choose a remote repository</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>:/icons/globe.svg</normaloff>:/icons/globe.svg</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Borg passphrase:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="passwordLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="confirmLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="confirmLabel">
|
||||
<property name="text">
|
||||
<string>Confirm passphrase:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QLabel" name="passwordLabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabWidgetPage2">
|
||||
<attribute name="title">
|
||||
<string>Advanced</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="advancedFormLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>SSH Key:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="sshComboBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Automatically choose SSH Key (default)</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="verticalSpacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="errorText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>11</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string />
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="encryptionLabel">
|
||||
<property name="text">
|
||||
<string>Encryption:</string>
|
||||
</property>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tabWidgetPage1">
|
||||
<attribute name="title">
|
||||
<string>General</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="repoDataFormLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="title">
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Initialize New Backup Repository</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="repoLabel">
|
||||
<property name="text">
|
||||
<string>Repository URL:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="repoURL">
|
||||
<property name="placeholderText">
|
||||
<string>ssh://abc123@abc123.repo.borgbase.com/./repo</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="chooseLocalFolderButton">
|
||||
<property name="toolTip">
|
||||
<string>Choose a local folder</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>:/icons/folder-open.svg</normaloff>:/icons/folder-open.svg</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="useRemoteRepoButton">
|
||||
<property name="toolTip">
|
||||
<string>Choose a remote repository</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>:/icons/globe.svg</normaloff>:/icons/globe.svg</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Borg passphrase:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="passwordLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="confirmLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="confirmLabel">
|
||||
<property name="text">
|
||||
<string>Confirm passphrase:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QLabel" name="passwordLabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabWidgetPage2">
|
||||
<attribute name="title">
|
||||
<string>Advanced</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="advancedFormLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>SSH Key:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="sshComboBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Automatically choose SSH Key (default)</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="encryptionLabel">
|
||||
<property name="text">
|
||||
<string>Encryption:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="encryptionComboBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Extra Borg Arguments:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="extraBorgArgumentsLineEdit" />
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="encryptionComboBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Extra Borg Arguments:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="extraBorgArgumentsLineEdit"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources />
|
||||
<connections />
|
||||
</ui>
|
|
@ -286,7 +286,7 @@ class BorgJob(JobInterface, BackupProfileMixin):
|
|||
msg = (
|
||||
f"{translate('BorgJob','Files')}: {parsed['nfiles']}, "
|
||||
f"{translate('BorgJob','Original')}: {pretty_bytes(parsed['original_size'])}, "
|
||||
f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, "
|
||||
# f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, "
|
||||
f"{translate('BorgJob','Deduplicated')}: {pretty_bytes(parsed['deduplicated_size'])}" # noqa: E501
|
||||
)
|
||||
self.app.backup_progress_event.emit(msg)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from typing import Any, Dict
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -33,7 +34,10 @@ class BorgCheckJob(BorgJob):
|
|||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ['borg', 'check', '--info', '--log-json', '--progress']
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
if borg_compat.check('V2'):
|
||||
cmd = cmd + ["-r", profile.repo.url]
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -38,8 +38,11 @@ class BorgCompactJob(BorgJob):
|
|||
ret['message'] = trans_late('messages', 'This feature needs Borg 1.2.0 or higher.')
|
||||
return ret
|
||||
|
||||
cmd = ['borg', '--info', '--log-json', 'compact', '--cleanup-commits', '--progress']
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
cmd = ['borg', '--info', '--log-json', 'compact', '--progress']
|
||||
if borg_compat.check('V2'):
|
||||
cmd = cmd + ["-r", profile.repo.url]
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -168,7 +168,11 @@ class BorgCreateJob(BorgJob):
|
|||
|
||||
# Add repo url and source dirs.
|
||||
new_archive_name = format_archive_name(profile, profile.new_archive_name)
|
||||
cmd.append(f"{profile.repo.url}::{new_archive_name}")
|
||||
|
||||
if borg_compat.check('V2'):
|
||||
cmd += ["-r", profile.repo.url, new_archive_name]
|
||||
else:
|
||||
cmd.append(f"{profile.repo.url}::{new_archive_name}")
|
||||
|
||||
for f in SourceFileModel.select().where(SourceFileModel.profile == profile.id):
|
||||
cmd.append(f.dir)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from typing import List
|
||||
from vorta.store.models import RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -33,8 +34,12 @@ class BorgDeleteJob(BorgJob):
|
|||
return ret
|
||||
|
||||
cmd = ['borg', 'delete', '--info', '--log-json']
|
||||
cmd.append(f'{profile.repo.url}::{archives[0]}')
|
||||
cmd.extend(archives[1:])
|
||||
if borg_compat.check('V2'):
|
||||
cmd = cmd + ["-r", profile.repo.url, '-a']
|
||||
cmd.append(f"re:({'|'.join(archives)})")
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}::{archives[0]}')
|
||||
cmd.extend(archives[1:])
|
||||
|
||||
ret['archives'] = archives
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -24,7 +24,11 @@ class BorgDiffJob(BorgJob):
|
|||
ret['cmd'].append('--json-lines')
|
||||
ret['json_lines'] = True
|
||||
|
||||
ret['cmd'].extend([f'{profile.repo.url}::{archive_name_1}', f'{archive_name_2}'])
|
||||
if borg_compat.check('V2'):
|
||||
ret['cmd'].extend(['-r', profile.repo.url, archive_name_1, archive_name_2])
|
||||
else:
|
||||
ret['cmd'].extend([f'{profile.repo.url}::{archive_name_1}', archive_name_2])
|
||||
|
||||
ret['ok'] = True
|
||||
ret['archive_name_older'] = archive_name_1
|
||||
ret['archive_name_newer'] = archive_name_2
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import tempfile
|
||||
from PyQt5.QtCore import QModelIndex, Qt
|
||||
from vorta.utils import borg_compat
|
||||
from vorta.views.extract_dialog import ExtractTree, FileData
|
||||
from vorta.views.partials.treemodel import FileSystemItem, path_to_str
|
||||
from .borg_job import BorgJob
|
||||
|
@ -24,7 +25,10 @@ class BorgExtractJob(BorgJob):
|
|||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ['borg', 'extract', '--list', '--info', '--log-json']
|
||||
cmd.append(f'{profile.repo.url}::{archive_name}')
|
||||
if borg_compat.check('V2'):
|
||||
cmd += ['-r', profile.repo.url, archive_name]
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}::{archive_name}')
|
||||
|
||||
# process selected items
|
||||
# all items will be excluded beside the one actively selected in the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from vorta.store.models import ArchiveModel, RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -19,13 +20,11 @@ class BorgInfoArchiveJob(BorgJob):
|
|||
return ret
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = [
|
||||
'borg',
|
||||
'info',
|
||||
'--log-json',
|
||||
'--json',
|
||||
f'{profile.repo.url}::{archive_name}',
|
||||
]
|
||||
ret['cmd'] = ['borg', 'info', '--log-json', '--json']
|
||||
if borg_compat.check('V2'):
|
||||
ret['cmd'].extend(["-r", profile.repo.url, '-a', archive_name])
|
||||
else:
|
||||
ret['cmd'].append(f'{profile.repo.url}::{archive_name}')
|
||||
ret['archive_name'] = archive_name
|
||||
|
||||
return ret
|
||||
|
@ -52,7 +51,6 @@ class BorgInfoArchiveJob(BorgJob):
|
|||
stats = result['data']['cache']['stats']
|
||||
repo = RepoModel.get(id=result['params']['repo_id'])
|
||||
repo.total_size = stats['total_size']
|
||||
repo.unique_csize = stats['unique_csize']
|
||||
repo.unique_size = stats['unique_size']
|
||||
repo.total_unique_chunks = stats['total_unique_chunks']
|
||||
repo.save()
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from vorta.i18n import trans_late
|
||||
from vorta.store.models import RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob, FakeProfile, FakeRepo
|
||||
|
||||
|
||||
|
@ -27,7 +28,10 @@ class BorgInfoRepoJob(BorgJob):
|
|||
else:
|
||||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ["borg", "info", "--info", "--json", "--log-json"]
|
||||
if borg_compat.check('V2'):
|
||||
cmd = ["borg", "rinfo", "--info", "--json", "--log-json", "-r"]
|
||||
else:
|
||||
cmd = ["borg", "info", "--info", "--json", "--log-json"]
|
||||
cmd.append(profile.repo.url)
|
||||
|
||||
ret['additional_env'] = {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from vorta.store.models import RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob, FakeProfile, FakeRepo
|
||||
|
||||
|
||||
|
@ -28,9 +29,20 @@ class BorgInitJob(BorgJob):
|
|||
else:
|
||||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ["borg", "init", "--info", "--log-json"]
|
||||
cmd.append(f"--encryption={params['encryption']}")
|
||||
cmd.append(params['repo_url'])
|
||||
if borg_compat.check('V2'):
|
||||
cmd = [
|
||||
"borg",
|
||||
"rcreate",
|
||||
"--info",
|
||||
"--log-json",
|
||||
f"--encryption={params['encryption']}",
|
||||
"-r",
|
||||
params['repo_url'],
|
||||
]
|
||||
else:
|
||||
cmd = ["borg", "init", "--info", "--log-json"]
|
||||
cmd.append(f"--encryption={params['encryption']}")
|
||||
cmd.append(params['repo_url'])
|
||||
|
||||
ret['additional_env'] = {'BORG_RSH': 'ssh -oStrictHostKeyChecking=accept-new'}
|
||||
|
||||
|
|
|
@ -30,8 +30,13 @@ class BorgListArchiveJob(BorgJob):
|
|||
"{mode}{user}{group}{size}{"
|
||||
+ ('isomtime' if borg_compat.check('V122') else 'mtime')
|
||||
+ "}{path}{source}{health}{NL}",
|
||||
f'{profile.repo.url}::{archive_name}',
|
||||
]
|
||||
|
||||
if borg_compat.check('V2'):
|
||||
ret['cmd'].extend(["-r", profile.repo.url, archive_name])
|
||||
else:
|
||||
ret['cmd'].append(f'{profile.repo.url}::{archive_name}')
|
||||
|
||||
ret['ok'] = True
|
||||
|
||||
return ret
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from datetime import datetime as dt
|
||||
from vorta.store.models import ArchiveModel, RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -21,7 +22,10 @@ class BorgListRepoJob(BorgJob):
|
|||
else:
|
||||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ['borg', 'list', '--info', '--log-json', '--json']
|
||||
if borg_compat.check('V2'):
|
||||
cmd = ['borg', 'rlist', '--info', '--log-json', '--json', '-r']
|
||||
else:
|
||||
cmd = ['borg', 'list', '--info', '--log-json', '--json']
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import os
|
||||
from vorta.store.models import SettingsModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -23,7 +24,10 @@ class BorgMountJob(BorgJob):
|
|||
if override_mount_permissions:
|
||||
cmd += ['-o', f"umask=0277,uid={os.getuid()}"]
|
||||
|
||||
cmd += [f"{profile.repo.url}"]
|
||||
if borg_compat.check('V2'):
|
||||
cmd.extend(["-r", profile.repo.url])
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -55,7 +55,10 @@ class BorgPruneJob(BorgJob):
|
|||
if profile.prune_keep_within:
|
||||
pruning_opts += ['--keep-within', profile.prune_keep_within]
|
||||
cmd += pruning_opts
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
if borg_compat.check('V2'):
|
||||
cmd.extend(["-r", profile.repo.url])
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from vorta.store.models import ArchiveModel, RepoModel
|
||||
from vorta.utils import borg_compat
|
||||
from .borg_job import BorgJob
|
||||
|
||||
|
||||
|
@ -15,7 +16,10 @@ class BorgRenameJob(BorgJob):
|
|||
ret['ok'] = False # Set back to false, so we can do our own checks here.
|
||||
|
||||
cmd = ['borg', 'rename', '--info', '--log-json']
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
if borg_compat.check('V2'):
|
||||
cmd.extend(["-r", profile.repo.url])
|
||||
else:
|
||||
cmd.append(f'{profile.repo.url}')
|
||||
|
||||
ret['ok'] = True
|
||||
ret['cmd'] = cmd
|
||||
|
|
|
@ -148,19 +148,28 @@ class AddRepoWindow(AddRepoBase, AddRepoUI):
|
|||
self._set_status(self.tr('Unable to add your repository.'))
|
||||
|
||||
def init_encryption(self):
|
||||
encryption_algos = [
|
||||
[
|
||||
self.tr('Repokey-Blake2 (Recommended, key stored in repository)'),
|
||||
'repokey-blake2',
|
||||
],
|
||||
[self.tr('Repokey'), 'repokey'],
|
||||
[
|
||||
self.tr('Keyfile-Blake2 (Key stored in home directory)'),
|
||||
'keyfile-blake2',
|
||||
],
|
||||
[self.tr('Keyfile'), 'keyfile'],
|
||||
[self.tr('None (not recommended)'), 'none'],
|
||||
]
|
||||
if borg_compat.check('V2'):
|
||||
encryption_algos = [
|
||||
[
|
||||
self.tr('Repokey-ChaCha20-Poly1305 (Recommended, key stored in repository)'),
|
||||
'repokey-blake2-chacha20-poly1305',
|
||||
],
|
||||
[
|
||||
self.tr('Keyfile-ChaCha20-Poly1305 (Key stored in home directory)'),
|
||||
'keyfile-blake2-chacha20-poly1305',
|
||||
],
|
||||
[self.tr('Repokey-AES256-OCB'), 'repokey-blake2-aes-ocb'],
|
||||
[self.tr('Keyfile-AES256-OCB'), 'keyfile-blake2-aes-ocb'],
|
||||
[self.tr('None (not recommended)'), 'none'],
|
||||
]
|
||||
else:
|
||||
encryption_algos = [
|
||||
[self.tr('Repokey-Blake2 (Recommended, key stored in repository)'), 'repokey-blake2'],
|
||||
[self.tr('Repokey'), 'repokey'],
|
||||
[self.tr('Keyfile-Blake2 (Key stored in home directory)'), 'keyfile-blake2'],
|
||||
[self.tr('Keyfile'), 'keyfile'],
|
||||
[self.tr('None (not recommended)'), 'none'],
|
||||
]
|
||||
|
||||
for desc, name in encryption_algos:
|
||||
self.encryptionComboBox.addItem(desc, name)
|
||||
|
|
Loading…
Reference in New Issue