8 Commits
3.2.4 ... 3.2.8

Author SHA1 Message Date
6c07c147ae Version bump 2023-06-02 17:04:53 +02:00
5ddd374350 Fix notification bug
Correctly handle exception when trying to display notification if
dbus-python is not available
2023-06-02 17:01:37 +02:00
525f381094 Remove PKGBUILD
Removed PKGBUILD since the packages is available in the AUR. Added
a note about AUR in README.md
2023-06-01 17:23:58 +02:00
e1ba388296 Update version 2023-06-01 17:18:42 +02:00
e84cf81b13 Add man page 2023-06-01 17:08:31 +02:00
06620a4dba Fix bug when exclude pattern is None 2023-05-31 19:07:50 +02:00
0dd7b887f7 Update PKGBUILD to use release version 2023-05-28 11:07:03 +02:00
7684bc43b0 Add desktop notifications 2023-05-25 23:44:59 +02:00
9 changed files with 129 additions and 82 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.idea/ .idea/
__pycache__/
test/ test/

View File

@ -1,47 +0,0 @@
# PKGBUILD
# Maintainer: Daniele Fucini <dfucini@gmail.com>
pkgname=simple_backup
pkgver=3.2.3.r1.ga42ade4
pkgrel=1
pkgdesc='Simple backup script that uses rsync to copy files'
arch=('any')
url="https://github.com/Fuxino/simple_backup.git"
license=('GPL3')
makedepends=('git'
'python-setuptools'
'python-build'
'python-installer'
'python-wheel')
depends=('python'
'rsync'
'python-dotenv')
optdepends=('python-systemd: use systemd log')
install=${pkgname}.install
source=(git+https://github.com/Fuxino/${pkgname}.git)
sha256sums=('SKIP')
pkgver()
{
cd ${pkgname}
git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
}
prepare()
{
git -C ${srcdir}/${pkgname} clean -dfx
}
build()
{
cd ${srcdir}/${pkgname}
python -m build --wheel --no-isolation
}
package()
{
cd ${srcdir}/${pkgname}
python -m installer --destdir=${pkgdir} dist/*.whl
install -Dm644 ${srcdir}/${pkgname}/${pkgname}.conf ${pkgdir}/etc/${pkgname}/${pkgname}.conf
}

View File

@ -20,6 +20,10 @@ The script uses rsync to actually run the backup, so you will have to install it
sudo pacman -Syu rsync sudo pacman -Syu rsync
``` ```
It's also required to have python-dotenv
Optional dependencies are systemd-python to enable using systemd journal for logging, and dbus-python for desktop notifications.
## Install ## Install
To install the program, first clone the repository: To install the program, first clone the repository:
@ -27,21 +31,21 @@ To install the program, first clone the repository:
git clone https://github.com/Fuxino/simple_backup.git git clone https://github.com/Fuxino/simple_backup.git
``` ```
Install tools required to build and install the package: Then install the tools required to build the package:
```bash ```bash
pip install --upgrade build installer wheel pip install --upgrade build wheel
``` ```
Then run: Finally, run:
```bash ```bash
cd simple_backup cd simple_backup
python -m build --wheel python -m build --wheel
python -m installer dist/*.whl python -m pip install dist/*.whl
``` ```
For Arch Linux, a PKGBUILD that automates this process is provided. For Arch Linux and Arch-based distros, two packages are available in the AUR (aur.archlinux.org):
- **simple_backup** for the release version
After installing, copy simple_backup.conf (if you used the PKGBUILD on Arch, it will be in /etc/simple_backup/) to $HOME/.config/simple_backup and edit is as needed. - **simple_backup-git** for the git version

67
man/simple_backup.1 Normal file
View File

@ -0,0 +1,67 @@
.TH SIMPLE_BACKUP 1 2023-06-01 SIMPLE_BACKUP 3.2.6
.SH NAME
simple_backup \- Backup files and folders using rsync
.SH SYNOPSIS
.BR simple_backup
\-h, \-\-help
.PD 0
.P
.PD
.BR simple_backup
[\-c, \-\-config FILE]
[\-i, \-\-input INPUT [INPUT...]]
[\-o, \-\-output DIR]
.PD 0
.P
.PD
.RS 14 [\-e, \-\-exclude FILE|DIR|PATTERN [FILE|...]]
[\-k, \-\-keep N]
[\-s, \-\-checksum]
[\-\-remove\-before\-backup]
.RE
.SH DESCRIPTION
.BR simple_backup
is a python script for performing backup of files and folders. It uses rsync to copy the files to the specified location.
Parameters for the backup such as input files/directories, output location and files or folders to exclude can be specified
in a configuration file (default location $HOME/.config/simple_backup/simple_backup.conf) or directly on the command line.
Parameters specified on the command line will override those in the configuration file.
.SH OPTIONS
.TP
.B \-h, \-\-help
Print a short help message and exit
.TP
.B \-c, \-\-config FILE
Specify the configuration file, useful to specify a different one from the default.
.TP
.B \-i, \-\-input INPUT [INPUT...]
Specify the files and directories to backup. Multiple inputs can be specified, just separate them with a space.
If filenames or paths contain spaces, don't forget to escape them, or to use single or double quotes around them.
.TP
.B \-o, \-\-output DIR
Specify the directory where the files will be copied. The program will automatically create a subdirectory called
\(aqsimple_backup\(aq (if it does not already exist) and inside this directory the actual backup directory (using
the current date and time)
.TP
.B \-e, \-\-exclude FILE|DIR|PATTERN [FILE|...]]
Specify files, directories or patterns to exclude from the backup. Matching files and directories will not be copied.
Multiple elements can be specified, in the same way as for the \-\-input option
.TP
.B \-k, \-\-keep N
Specify how many old backups (so excluding the current one) will be kept. The default behavior is to keep them all
(same as N=\-1)
.TP
.B \-s, \-\-checksums
Same as rsync option \(aq\-\-checksum\(aq, use checksums instead of mod\-time and size to skip files.
.TP
.B \-\-remove\-before\-backup
Remove old backups (if necessary) before creating the new backup. Useful to free some space before performing the backup.
Default behavior is to remove old backups after successfully completing the backup.
.SH CONFIGURATION
An example configuration file is provided at \(aq/etc/simple_backup/simple_backup.conf\(aq. Copy it to the default location
($HOME/.config/simple_backup) and edit it as needed.
.SH SEE ALSO
.BR rsync (1)
.SH AUTHORS
.MT https://github.com/Fuxino
Daniele Fucini
.ME

View File

@ -25,7 +25,12 @@ packages = simple_backup
python_requires = >=3.7 python_requires = >=3.7
install_requires = install_requires =
python-dotenv python-dotenv
[options.extras_require]
JOURNAL =
systemd-python systemd-python
NOTIFICATIONS =
dbus-python
[options.entry_points] [options.entry_points]
console_scripts = console_scripts =

View File

@ -1,8 +0,0 @@
post_install() {
echo "An example configuration file is found in /etc/simple_backup/simple_backup.conf."
echo "Copy it to ~/config/simple_backup/simple_backup.conf and modify it as needed"
}
post_upgrade() {
post_install
}

View File

@ -1,3 +1,3 @@
"""Init.""" """Init."""
__version__ = '3.2.4' __version__ = '3.2.8'

View File

@ -1,14 +0,0 @@
#Example config file for simple_backup
[default]
#Input directories. Use a comma to separate items
inputs=/home/my_home,/etc
#Output directory
backup_dir=/media/Backup
#Exclude patterns. Use a comma to separate items
exclude=.gvfs,.local/share/gvfs-metadata,.cache,.dbus,.Trash,.local/share/Trash,.macromedia,.adobe,.recently-used,.recently-used.xbel,.thumbnails
#Number of snapshots to keep (use -1 to keep all)
keep=-1

View File

@ -19,12 +19,17 @@ try:
except ImportError: except ImportError:
journal = None journal = None
try:
import dbus
except ImportError:
pass
load_dotenv() load_dotenv()
euid = os.geteuid() euid = os.geteuid()
if euid == 0: if euid == 0:
user = os.getenv("SUDO_USER") user = os.getenv('SUDO_USER')
homedir = os.path.expanduser(f'~{user}') homedir = os.path.expanduser(f'~{user}')
else: else:
homedir = os.getenv('HOME') homedir = os.getenv('HOME')
@ -160,6 +165,11 @@ class Backup:
def run(self): def run(self):
logger.info('Starting backup...') logger.info('Starting backup...')
try:
notify('Starting backup...')
except NameError:
pass
self.create_backup_dir() self.create_backup_dir()
self.find_last_backup() self.find_last_backup()
@ -175,6 +185,7 @@ class Backup:
fp.write('\n') fp.write('\n')
with open(self._exclude_path, 'w') as fp: with open(self._exclude_path, 'w') as fp:
if self.exclude is not None:
for e in self.exclude: for e in self.exclude:
fp.write(e) fp.write(e)
fp.write('\n') fp.write('\n')
@ -234,6 +245,16 @@ class Backup:
if self._err_flag: if self._err_flag:
logger.warning('Some errors occurred (check log for details)') logger.warning('Some errors occurred (check log for details)')
try:
notify('Backup finished with errors (check log for details)')
except NameError:
pass
else:
try:
notify('Backup finished')
except NameError:
pass
def _parse_arguments(): def _parse_arguments():
parser = argparse.ArgumentParser(prog='simple_backup', parser = argparse.ArgumentParser(prog='simple_backup',
@ -276,6 +297,24 @@ def _read_config(config_file):
return inputs, output, exclude, keep return inputs, output, exclude, keep
def notify(text):
euid = os.geteuid()
if euid == 0:
uid = os.getenv('SUDO_UID')
else:
uid = os.geteuid()
os.seteuid(int(uid))
os.environ['DBUS_SESSION_BUS_ADDRESS'] = f'unix:path=/run/user/{uid}/bus'
obj = dbus.SessionBus().get_object('org.freedesktop.Notifications', '/org/freedesktop/Notifications')
obj = dbus.Interface(obj, 'org.freedesktop.Notifications')
obj.Notify('', 0, '', 'simple_backup', text, [], {'urgency': 1}, 10000)
os.seteuid(int(euid))
def simple_backup(): def simple_backup():
args = _parse_arguments() args = _parse_arguments()
inputs, output, exclude, keep = _read_config(args.config) inputs, output, exclude, keep = _read_config(args.config)