8 Commits
3.1.1 ... 3.2.0

Author SHA1 Message Date
97419c30f9 Use setuptools to build the project 2023-05-05 19:03:23 +02:00
c6871ac81a Bump PKGBUILD version 2023-05-04 23:42:55 +02:00
90120031e2 Update PKGBUILD 2023-05-04 23:21:12 +02:00
d61ffa199a Use setuptools 2023-05-04 23:16:15 +02:00
a4c4b88193 Fix PKGBUILD 2023-05-02 18:10:43 +02:00
eb8bdde1fc Rename configuration file 2023-05-02 18:07:41 +02:00
5d17aaf03a Update dependencies in PKGBUILD 2023-04-30 22:06:30 +02:00
d181d2970f Better handle missing parameters 2023-04-30 14:38:26 +02:00
10 changed files with 132 additions and 27 deletions

View File

@ -1,32 +1,48 @@
#Arch Linux PKGBUILD # PKGBUILD
#
#Maintainer: Daniele Fucini <dfucini@gmail.com> # Maintainer: Daniele Fucini <dfucini@gmail.com>
#
pkgname=simple_backup pkgname=simple_backup
pkgver=2.0.0.r3.gc61c704 pkgver=3.1.2.r1.ga4c4b88
pkgrel=1 pkgrel=1
pkgdesc='Simple backup script that uses rsync to copy files' pkgdesc='Simple backup script that uses rsync to copy files'
arch=('any') arch=('any')
url="https://github.com/Fuxino/simple_backup.git" url="https://github.com/Fuxino/simple_backup.git"
license=('GPL3') license=('GPL3')
makedepends=('git') makedepends=('git'
depends=('python3' 'python-setuptools'
'python-build'
'python-installer'
'python-wheel')
depends=('python'
'rsync' 'rsync'
'python-dotenv' 'python-dotenv'
'python-dbus') 'python-dbus'
'python-systemd')
install=${pkgname}.install install=${pkgname}.install
source=(git+https://github.com/Fuxino/${pkgname}.git) source=(git+https://github.com/Fuxino/${pkgname}.git)
sha256sums=('SKIP') sha256sums=('SKIP')
pkgver() pkgver()
{ {
cd "$pkgname" cd ${pkgname}
git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g' 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() package()
{ {
install -Dm755 "${srcdir}/${pkgname}/${pkgname}.py" "${pkgdir}/usr/bin/${pkgname}" cd ${srcdir}/${pkgname}
install -Dm644 "${srcdir}/${pkgname}/${pkgname}.config" "${pkgdir}/etc/${pkgname}/${pkgname}.config" python -m installer --destdir=${pkgdir} dist/*.whl
install -Dm644 ${srcdir}/${pkgname}/${pkgname}.conf ${pkgdir}/etc/${pkgname}/${pkgname}.conf
} }

View File

@ -1,10 +1,37 @@
# simple_backup simple_backup
============
A simple backup script A simple backup script
## Description ## Description
simple_backup is a Python script that allows you to backup your files. simple_backup is a Python script that allows you to backup your files.
It reads from a configuration file the files/directories that must be copied, Parameters like input files/directories, output directory etc. can be specified in a configuration file, or on the command line. Run:
the destination directory for the backup and a few other options.
```bash
simple_backup -h
```
to print all possible command line options.
## Dependencies ## Dependencies
rsync is used to perform the backup. The script uses rsync to actually run the backup, so you will have to install it on your system. For example on Arch Linux:
```bash
sudo pacman -Syu rsync
```
## Install
To install the program, first clone the repository:
```bash
git clone https://github.com/Fuxino/simple_backup.git
```
Then run:
```bash
cd simple_backup
python -m build --wheel
python -m installer dist/*.whl
For Arch Linux, a PKGBUILD that automates this process is provided.

3
pyproject.toml Normal file
View File

@ -0,0 +1,3 @@
[build-system]
requires = ['setuptools']
build-backend = 'setuptools.build_meta'

View File

@ -1 +0,0 @@
python-dotenv>=1.0.0

35
setup.cfg Normal file
View File

@ -0,0 +1,35 @@
[metadata]
name = simple_backup
version = attr: simple_backup.__version__
description = Simple backup script using rsync
long_description = file: README.md
author = Daniele Fucini
author_email = dfucini@gmail.com
license = GPL3
url = https://github.com/Fuxino/simple_backup
classifiers =
Development Status :: 5 - Production/Stable
Environment :: Console
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Natural Language :: English
Operating System :: POSIX :: Linux
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Topic :: System :: Archiving :: Backup
[options]
packages = simple_backup
python_requires = >=3.7
install_requires =
python-dotenv
systemd-python
[options.entry_points]
console_scripts =
simple_backup = simple_backup:simple_backup
[options.data_files]
../etc/simple_backup = simple_backup/simple_backup.conf

View File

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

View File

@ -0,0 +1,3 @@
"""Init."""
__version__ = '3.1.2'

View File

@ -0,0 +1,14 @@
#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

@ -103,11 +103,18 @@ class Backup:
logger.warning(f'Input {i} is a link and cannot be read. Skipping') logger.warning(f'Input {i} is a link and cannot be read. Skipping')
self.inputs.remove(i) self.inputs.remove(i)
if self.output is None:
logger.critical('No output path specified. Use -o argument or specify output path in configuration file')
return False
if not os.path.isdir(self.output): if not os.path.isdir(self.output):
logger.critical('Output path for backup does not exist') logger.critical('Output path for backup does not exist')
return False return False
self.output = os.path.abspath(self.output)
if self.keep is None: if self.keep is None:
self.keep = -1 self.keep = -1
@ -236,11 +243,11 @@ class Backup:
def _parse_arguments(): def _parse_arguments():
parser = argparse.ArgumentParser(prog='simple_backup', parser = argparse.ArgumentParser(prog='simple_backup',
description='A simple backup script written in Python that uses rsync to copy files', description='Simple backup script written in Python that uses rsync to copy files',
epilog='Report bugs to dfucini<at>gmail<dot>com', epilog='Report bugs to dfucini<at>gmail<dot>com',
formatter_class=MyFormatter) formatter_class=MyFormatter)
parser.add_argument('-c', '--config', default=f'{homedir}/.config/simple_backup/simple_backup.config', parser.add_argument('-c', '--config', default=f'{homedir}/.config/simple_backup/simple_backup.conf',
help='Specify location of configuration file') help='Specify location of configuration file')
parser.add_argument('-i', '--input', nargs='+', help='Paths/files to backup') parser.add_argument('-i', '--input', nargs='+', help='Paths/files to backup')
parser.add_argument('-o', '--output', help='Output directory for the backup') parser.add_argument('-o', '--output', help='Output directory for the backup')
@ -294,8 +301,6 @@ def simple_backup():
else: else:
backup_options = '-arvh -H -X' backup_options = '-arvh -H -X'
output = os.path.abspath(output)
backup = Backup(inputs, output, exclude, keep, backup_options) backup = Backup(inputs, output, exclude, keep, backup_options)
if backup.check_params(): if backup.check_params():
@ -304,17 +309,20 @@ def simple_backup():
obj = dbus.Interface(obj, "org.freedesktop.Notifications") obj = dbus.Interface(obj, "org.freedesktop.Notifications")
obj.Notify("simple_backup", 0, "", "Starting backup...", "", [], {"urgency": 1}, 10000) obj.Notify("simple_backup", 0, "", "Starting backup...", "", [], {"urgency": 1}, 10000)
except dbus.exceptions.DBusException: except dbus.exceptions.DBusException:
pass obj = None
status = backup.run() status = backup.run()
try: if obj is not None:
if status == 0: if status == 0:
obj.Notify("simple_backup", 0, "", "Backup finished.", "", [], {"urgency": 1}, 10000) obj.Notify("simple_backup", 0, "", "Backup finished.", "", [], {"urgency": 1}, 10000)
else: else:
obj.Notify("simple_backup", 0, "", "Backup finished. Some errors occurred.", "", [], {"urgency": 1}, 10000) obj.Notify("simple_backup", 0, "", "Backup finished. Some errors occurred.",
except NameError: "", [], {"urgency": 1}, 10000)
pass
return 0
return 1
if __name__ == '__main__': if __name__ == '__main__':